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

Compare commits

...

362 Commits

Author SHA1 Message Date
ericdecanini
6121468422 Fixes add subspace not working in new layout 2022-08-18 18:19:54 +02:00
Florian Renaud
ac0af80e48 Merge pull request #6866 from vector-im/feature/fre/start_dm_from_room_member_details
Start DM on first message when selecting "direct message" from the room member details screen
2022-08-18 13:04:17 +02:00
Florian Renaud
519855445e Start DM on first message when selecting "direct message" from the room member details 2022-08-18 11:37:55 +02:00
Florian Renaud
0dcab56e34 Merge pull request #6870 from vector-im/bugfix/fre/fix_emoji_unit_test
Fix broken unit test on emoji search
2022-08-18 11:36:28 +02:00
Florian Renaud
66092cfa25 Fix broken unit test on emoji search 2022-08-18 09:48:51 +02:00
Benoit Marty
7a30c72828 Merge pull request #6865 from vector-im/revert-6838-dependabot/gradle/com.likethesalad.android-stem-plugin-2.2.0
Revert "Bump stem-plugin from 2.1.1 to 2.2.0"
2022-08-17 17:52:42 +02:00
Benoit Marty
0be7f3c356 Revert "Bump stem-plugin from 2.1.1 to 2.2.0" 2022-08-17 17:51:59 +02:00
Adam Brown
cc74dcfb90 Merge pull request #6589 from vector-im/dependabot/gradle/io.realm-realm-gradle-plugin-10.11.1
Bump realm-gradle-plugin from 10.11.0 to 10.11.1
2022-08-17 16:19:14 +01:00
Benoit Marty
aef4c14b20 Merge pull request #6838 from vector-im/dependabot/gradle/com.likethesalad.android-stem-plugin-2.2.0
Bump stem-plugin from 2.1.1 to 2.2.0
2022-08-17 17:08:02 +02:00
Benoit Marty
5e308e02a0 Merge pull request #6716 from vector-im/dependabot/gradle/com.autonomousapps.dependency-analysis-1.12.0
Bump com.autonomousapps.dependency-analysis from 1.11.2 to 1.12.0
2022-08-17 17:06:55 +02:00
Benoit Marty
4485673db9 Merge pull request #6734 from vector-im/dependabot/gradle/flipper-0.157.0
Bump flipper from 0.156.0 to 0.157.0
2022-08-17 17:03:01 +02:00
Benoit Marty
2c82bf1990 Merge pull request #6743 from vector-im/dependabot/gradle/com.google.firebase-firebase-appdistribution-gradle-3.0.3
Bump firebase-appdistribution-gradle from 3.0.2 to 3.0.3
2022-08-17 17:02:11 +02:00
Benoit Marty
593c6e4b54 Merge pull request #6802 from vector-im/dependabot/gradle/fragment-1.5.2
Bump fragment from 1.5.1 to 1.5.2
2022-08-17 17:01:36 +02:00
Benoit Marty
8857decc87 Merge pull request #6701 from vector-im/sync-emojis
Sync Emojis
2022-08-17 16:32:55 +02:00
Benoit Marty
6031c50313 Merge pull request #6857 from vector-im/feature/bma/DANGER_GITHUB_API_TOKEN
Try to fix Danger job
2022-08-17 15:15:17 +02:00
Benoit Marty
6c860710bd Merge pull request #6843 from vector-im/feature/bma/detect_object_log
Fix some string template
2022-08-17 14:37:42 +02:00
Benoit Marty
520d6f9b97 Merge pull request #6854 from vector-im/dependabot/gradle/com.gabrielittner.threetenbp-lazythreetenbp-0.11.0
Bump lazythreetenbp from 0.10.0 to 0.11.0
2022-08-17 14:37:09 +02:00
Benoit Marty
c5e601d726 Set GITHUB_TOKEN to let Danger be able to work on PR from forks. 2022-08-17 13:18:57 +02:00
Eric Decanini
b6bcefbb92 Merge pull request #6795 from vector-im/feature/eric/toolbar-space-name
New App Layout: Space name reflected in toolbar
2022-08-17 10:52:07 +02:00
Eric Decanini
4fedafc1be Merge pull request #6749 from vector-im/feature/eric/space-list-modal
Adds Space List Bottom Sheet
2022-08-17 10:51:56 +02:00
dependabot[bot]
f0dc938fd0 Bump lazythreetenbp from 0.10.0 to 0.11.0
Bumps [lazythreetenbp](https://github.com/gabrielittner/lazythreetenbp) from 0.10.0 to 0.11.0.
- [Release notes](https://github.com/gabrielittner/lazythreetenbp/releases)
- [Changelog](https://github.com/gabrielittner/lazythreetenbp/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gabrielittner/lazythreetenbp/compare/0.10.0...0.11.0)

---
updated-dependencies:
- dependency-name: com.gabrielittner.threetenbp:lazythreetenbp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-16 23:11:40 +00:00
Benoit Marty
27de9230b1 Ignore ktlint string-template. 2022-08-16 16:28:27 +02:00
Benoit Marty
446bf7e0aa changelog 2022-08-16 16:10:15 +02:00
Benoit Marty
ea465a1b86 Fix false positive on string template suspicious usage. 2022-08-16 16:06:08 +02:00
Benoit Marty
6089d24409 Fix some string template issue. 2022-08-16 16:05:50 +02:00
Benoit Marty
6ac88a9420 Add a check on suspicious string template.
Especially we want to ensure that the app does not log unexpected content.
2022-08-16 16:05:40 +02:00
Adam Brown
74d99b156f Merge pull request #6833 from vector-im/feature/adm/removing-login-poc
Removing `Login2` proof of concept
2022-08-16 13:02:40 +01:00
ericdecanini
8b0fba2ef5 Merge remote-tracking branch 'origin/develop' into feature/eric/space-list-modal
# Conflicts:
#	vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
2022-08-16 11:58:25 +02:00
Benoit Marty
680dc207c0 Merge pull request #6841 from vector-im/feature/bma/frozen_classes
Feature/bma/frozen classes
2022-08-16 11:53:39 +02:00
Benoit Marty
1389262c3f Let danger check for frozen classes 2022-08-16 11:41:30 +02:00
Benoit Marty
08fff48065 Revert "Simple check to prevent frozen class modificaiton"
This reverts commit 28ca03cc67.
2022-08-16 11:14:01 +02:00
Benoit Marty
8a4bd0c467 Merge pull request #6805 from vector-im/cgizard/ISSUE-6645
Add inputType for room name creation and settings
2022-08-16 11:05:57 +02:00
dependabot[bot]
6c767de148 Bump stem-plugin from 2.1.1 to 2.2.0
Bumps [stem-plugin](https://github.com/LikeTheSalad/android-stem) from 2.1.1 to 2.2.0.
- [Release notes](https://github.com/LikeTheSalad/android-stem/releases)
- [Changelog](https://github.com/LikeTheSalad/android-stem/blob/master/CHANGELOG.md)
- [Commits](https://github.com/LikeTheSalad/android-stem/compare/2.1.1...2.2.0)

---
updated-dependencies:
- dependency-name: com.likethesalad.android:stem-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-15 23:09:41 +00:00
Onuray Sahin
6c65b0a9e0 Merge pull request #6807 from vector-im/feature/mna/device-management-header-list
[Devices Management] Header view for sessions lists in new layout (PSG-668)
2022-08-15 23:09:53 +03:00
Onuray Sahin
d92cf04b6f Fix string resource. 2022-08-15 15:33:42 +03:00
Onuray Sahin
54d8c9de48 Remove unnecessary background color. 2022-08-15 15:19:49 +03:00
Adam Brown
314b077fbd adding changelog entry 2022-08-15 11:58:04 +01:00
Adam Brown
d365ccdc21 removing unused login2 resources 2022-08-15 11:51:13 +01:00
Adam Brown
19261ab2d0 removing login2 classes 2022-08-15 11:51:13 +01:00
bmarty
ecfa7db07d Sync Emojis 2022-08-15 00:03:34 +00:00
Florian Renaud
62f7b40a3e Add changelog entry 2022-08-12 13:10:49 +02:00
Florian Renaud
9eb6969456 Use Content models in CreateRoomBodyBuilder 2022-08-12 13:10:49 +02:00
Florian Renaud
a1152ff72c Improve RoomHistoryVisibility enum mapping 2022-08-12 13:10:49 +02:00
Florian Renaud
a124b514b8 Improve GuestAccess enum mapping 2022-08-12 13:10:49 +02:00
Florian Renaud
969689cdb9 Use CreateRoomStateEvent in RoomFeaturePreset.setupInitialStates 2022-08-12 13:10:49 +02:00
Adam Brown
d702210f26 Merge pull request #6810 from vector-im/revert-6732-dependabot/gradle/dagger-2.43.2
Revert "Bump dagger from 2.42 to 2.43.2"
2022-08-11 17:15:55 +01:00
Adam Brown
ef3615594b Revert "Bump dagger from 2.42 to 2.43.2" 2022-08-11 17:15:29 +01:00
Adam Brown
3b7fd2dfde Merge pull request #6492 from vector-im/dependabot/gradle/com.github.UnifiedPush-android-connector-2.0.1
Bump android-connector from 2.0.0 to 2.0.1
2022-08-11 16:21:47 +01:00
Maxime NATUREL
971ad26deb Merge pull request #6809 from vector-im/fix/mna/leak-in-call
[Call] Memory leak after a call
2022-08-11 16:44:33 +02:00
Adam Brown
b58aeaad9e Merge pull request #6732 from vector-im/dependabot/gradle/dagger-2.43.2
Bump dagger from 2.42 to 2.43.2
2022-08-11 15:29:34 +01:00
Nikita Fedrunov
e0e21d4282 filtered room list at home (#6724) 2022-08-11 16:26:24 +02:00
Claire G
2364b68907 improve configure InputType 2022-08-11 16:13:36 +02:00
Claire G
5bb67ec253 clean imports 2022-08-11 16:01:07 +02:00
Claire G
d9fbc4a011 add autoCapitalize in FormEditTextItem 2022-08-11 15:59:26 +02:00
Maxime NATUREL
292f6622bd Adding changelog entry 2022-08-11 15:28:18 +02:00
Maxime NATUREL
8667de423a Unbinding callback from Call screen when view is destroyed 2022-08-11 15:22:20 +02:00
Maxime NATUREL
ef2aa6f829 Adding changelog entry 2022-08-11 14:26:15 +02:00
Maxime NATUREL
60eb9b428d "Learn more" button with click listener 2022-08-11 12:11:14 +02:00
Maxime NATUREL
8f218ce773 Custom header view without "Learn more" 2022-08-11 12:11:14 +02:00
Maxime NATUREL
2158661e77 Fixing title in the settings entry 2022-08-11 12:11:14 +02:00
Maxime NATUREL
fa8f72c909 Merge pull request #6792 from vector-im/feature/mna/enable-leakcanary
Add a developer setting to enable LeakCanary at runtime
2022-08-11 12:10:26 +02:00
Adam Brown
616c16f8c6 Merge pull request #6783 from vector-im/feature/adm/decouple-variants
Decouple `:vector` variants/build types
2022-08-11 10:59:42 +01:00
Claire G
ce23303b97 Add inputType for room name creation and settings 2022-08-11 11:53:43 +02:00
Adam Brown
439224e4de using american english for consistency 2022-08-11 09:32:36 +01:00
Maxime NATUREL
0515303c8c Merge pull request #6800 from vector-im/feature/mna/new-device-management-screen
[Devices management] Add a feature flag and empty screen for future new layout (PSG-676)
2022-08-11 08:59:57 +02:00
dependabot[bot]
fde0039027 Bump fragment from 1.5.1 to 1.5.2
Bumps `fragment` from 1.5.1 to 1.5.2.

Updates `fragment-ktx` from 1.5.1 to 1.5.2

Updates `fragment-testing` from 1.5.1 to 1.5.2

---
updated-dependencies:
- dependency-name: androidx.fragment:fragment-ktx
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: androidx.fragment:fragment-testing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-10 23:11:18 +00:00
Adam Brown
5d1750675b Merge pull request #6758 from vector-im/gradlew-update-7.5.1
Update Gradle Wrapper from 7.5 to 7.5.1
2022-08-10 17:08:58 +01:00
Maxime NATUREL
73e437de0b Merge pull request #6747 from vector-im/fix/mna/notification-lls-poll-start
[Notification] - Handle creation of notification for live location and poll start (PSG-41)
2022-08-10 17:14:25 +02:00
dependabot[bot]
cd929a203e Bump android-connector from 2.0.0 to 2.0.1
Bumps [android-connector](https://github.com/UnifiedPush/android-connector) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/UnifiedPush/android-connector/releases)
- [Commits](https://github.com/UnifiedPush/android-connector/compare/2.0.0...2.0.1)

---
updated-dependencies:
- dependency-name: com.github.UnifiedPush:android-connector
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-10 14:09:31 +00:00
Adam Brown
bcd038deb2 trigger CI 2022-08-10 14:49:07 +01:00
gradle-update-robot
5120cf7a76 Update Gradle Wrapper from 7.5 to 7.5.1.
Signed-off-by: gradle-update-robot <gradle-update-robot@regolo.cc>
2022-08-10 14:49:07 +01:00
Maxime NATUREL
3a9aa7472a Fixing wrong view reference in title assignment 2022-08-10 15:44:16 +02:00
Maxime NATUREL
a2c39c079a Adding changelog entry 2022-08-10 15:28:51 +02:00
Maxime NATUREL
89f31b093e Handling notifications for beacon_info and poll_start events 2022-08-10 15:28:51 +02:00
Maxime NATUREL
de240b7318 Fixing comment in beacon content model 2022-08-10 15:28:51 +02:00
Adam Brown
6526cf3c2e removing unused file, the release flipper proxy instance is provided by the debug module 2022-08-10 14:14:39 +01:00
Maxime NATUREL
2764a6e103 Fixing code formatting issues 2022-08-10 14:57:16 +02:00
Maxime NATUREL
3ff9ab1bc8 Interface for LeakDetector 2022-08-10 14:47:09 +02:00
Maxime NATUREL
250ee1faa1 Moving the new setting inside debug screen 2022-08-10 14:47:08 +02:00
Maxime NATUREL
12405527e1 Adding changelog entry 2022-08-10 14:47:08 +02:00
Maxime NATUREL
36c69a46fd Adding way to enable leak canary at runtime 2022-08-10 14:47:08 +02:00
Maxime NATUREL
31a350eea7 Enabling leakcanary on debug builds 2022-08-10 14:47:08 +02:00
Jorge Martin Espinosa
aecf460c96 Improve tests for lockscreen (#6796)
* Improve tests

* Address review comments.

* Refactor pin code tests and code to improve testability.

* Fix lint issues
2022-08-10 12:00:36 +00:00
Adam Brown
fcc7bbadfa Merge branch 'release/v1.4.32' into develop 2022-08-10 12:30:42 +01:00
Adam Brown
defd848363 updating version for next release cycle 2022-08-10 12:30:38 +01:00
ericdecanini
527bcf2e6f Adds changelog file 2022-08-10 11:30:15 +02:00
ericdecanini
fd37b31c44 Changes changelog file extension 2022-08-10 11:28:14 +02:00
Maxime NATUREL
b9fa4ddfc8 Renaming v2 setting key 2022-08-10 10:54:16 +02:00
Maxime NATUREL
ed00685514 Adding changelog entry 2022-08-10 10:40:06 +02:00
Maxime NATUREL
1ebc2a9a8c New empty devices list screen 2022-08-10 10:40:06 +02:00
Maxime NATUREL
db1d0daec0 Adding a new setting entry behind feature flag 2022-08-10 10:40:06 +02:00
Maxime NATUREL
fb0b38bb49 Adding new feature flag for new device management 2022-08-10 10:40:06 +02:00
Adam Brown
e81da5d8b4 generating 1.4.32 changelog 2022-08-10 09:02:04 +01:00
ericdecanini
358ec5a722 Fixes post merge errors 2022-08-10 08:25:51 +02:00
ericdecanini
e87eefb319 Merge remote-tracking branch 'origin/develop' into feature/eric/space-list-modal
# Conflicts:
#	vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
2022-08-10 08:24:55 +02:00
ericdecanini
ddaf5397b1 Removes params passed into HomeRoomListFragment and fixes lint error 2022-08-10 08:24:03 +02:00
Eric Decanini
ce4ab78f13 Merge pull request #6693 from vector-im/feature/eric/new_fab
New App Layout FABs
2022-08-10 08:13:36 +02:00
ericdecanini
9505d196e4 Changes space title in toolbar 2022-08-10 08:10:33 +02:00
Adam Brown
f9a6839f72 Merge pull request #6793 from vector-im/feature/adm/unsupported-play-language
Disabling unsupported play store language
2022-08-09 20:20:36 +01:00
Adam Brown
a2768ccab7 ignoring the gl locale from the play store upload step as it's unsupported 2022-08-09 16:22:21 +01:00
Adam Brown
ac6b0a908a Merge pull request #6790 from RiotTranslateBot/weblate-element-android-element-app
Translations update from Weblate
2022-08-09 16:05:48 +01:00
Weblate
53e396d337 Merge branch 'origin/develop' into Weblate. 2022-08-09 14:27:46 +00:00
Adam Brown
fe61fa844e Merge pull request #6784 from vector-im/fix/jorgem/lockscreen-device-locked
Fix lockscreen's 'device locked' crash on Android 12 and 12L devices
2022-08-09 15:18:28 +01:00
Adam Brown
d7949307a4 adding changelog entry 2022-08-09 14:01:00 +01:00
ericdecanini
f94aad65dd Merge branch 'feature/eric/new_fab' into feature/eric/space-list-modal
# Conflicts:
#	vector/src/main/res/layout/fragment_room_list.xml
2022-08-09 14:31:39 +02:00
Nikita Fedrunov
6045eac87a recents carousel for new home screen layout (#6707) 2022-08-09 14:31:26 +02:00
ericdecanini
af04221ad9 Improves content descriptions 2022-08-09 14:30:36 +02:00
ericdecanini
65b7a31728 Fixes toMvRxBundle import 2022-08-09 14:23:56 +02:00
Jorge Martín
9888e15f2a Improve logic to trigger LockScreenViewEvents 2022-08-09 14:04:45 +02:00
Jorge Martín
cc59b9e695 Address review comments. 2022-08-09 14:03:39 +02:00
Jorge Martín
dfc8526b47 Refactor lockscreen implementation.
Try to fix issues and simplify flow.
2022-08-09 14:03:39 +02:00
Jorge Martín
2f4725cfe9 Prevent crash while validating biometric key. 2022-08-09 14:03:39 +02:00
Jorge Martín
6e1e31bac1 Avoid crashes from unknown exceptions on lockscreen key migration. 2022-08-09 12:52:28 +02:00
Adam Brown
58d47df37b Merge pull request #6736 from vector-im/feature/adm/non-ascii-username
Fixes crash when entering non ascii username during account creation
2022-08-09 11:52:02 +01:00
Adam Brown
319ec6fbf4 removing now unused gplay resource 2022-08-09 11:25:55 +01:00
Adam Brown
045398d06f fixing import ordering and duplicated documentation 2022-08-09 10:42:44 +01:00
Adam Brown
ed3b73a989 decouples the flavor code / OSS licenses activity launching 2022-08-09 10:32:43 +01:00
ericdecanini
9892c66d27 Fixes lint errors 2022-08-09 10:54:28 +02:00
ericdecanini
7b61460fa2 Merge branch 'feature/eric/new_fab' into feature/eric/space-list-modal 2022-08-09 10:52:39 +02:00
ericdecanini
f2c3b5cb43 Merge remote-tracking branch 'origin/develop' into feature/eric/new_fab 2022-08-09 10:51:33 +02:00
Nui Harime
b2d1915227 Translated using Weblate (Russian)
Currently translated at 99.0% (2306 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2022-08-08 23:32:32 +00:00
Adam Brown
0c61595ace decoupling the fcm helper from the vector module 2022-08-08 18:05:04 +01:00
Adam Brown
f605e0c479 decoupling the notification test factory from the vector module 2022-08-08 17:51:08 +01:00
Adam Brown
02286b96b0 decoupling the flipper proxy from the vector module 2022-08-08 17:32:23 +01:00
Adam Brown
8156a646a1 moving debug interfaces to debug package 2022-08-08 17:06:57 +01:00
Adam Brown
19c8b2a630 moving debug menu access to only the debug sourceset and providing an injectable interface to decouple from the direct access 2022-08-08 17:02:08 +01:00
Adam Brown
e02cf61f2f decoupling debug receiver from the variants by introducing vector layer interface 2022-08-08 16:57:51 +01:00
Adam Brown
7e7b98a3c1 Merge pull request #6668 from vector-im/feature/adm/onboarding-vm-tests
`OnboardingViewModel` tests
2022-08-08 13:37:53 +01:00
Adam Brown
dd496dc1a3 Merge pull request #6748 from vector-im/feature/adm/flaky-verification-test
Fixing flaky `CantVerifyTest`
2022-08-08 08:46:29 +01:00
Dinh Quang Tuyen
ac047afd27 Translated using Weblate (Vietnamese)
Currently translated at 88.6% (2062 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/vi/
2022-08-06 15:32:50 +00:00
Jeff Huang
77ae291c15 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/
2022-08-06 15:32:50 +00:00
phardyle
ec9199cb18 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/
2022-08-06 15:32:49 +00:00
phardyle
e15e941e49 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/
2022-08-06 15:32:49 +00:00
Ihor Hordiichuk
fde0d81c1e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/
2022-08-06 15:32:49 +00:00
Jozef Gaal
2aac0c9d64 Translated using Weblate (Slovak)
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/
2022-08-06 15:32:48 +00:00
Nui Harime
05816d00ae Translated using Weblate (Russian)
Currently translated at 99.0% (2306 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2022-08-06 15:32:47 +00:00
lvre
ee1f294327 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/
2022-08-06 15:32:44 +00:00
Przemysław Romanik
a41ad6625e Translated using Weblate (Polish)
Currently translated at 99.6% (2319 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
2022-08-06 15:32:43 +00:00
Johan Smits
721c4c0d9c Translated using Weblate (Dutch)
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/nl/
2022-08-06 15:32:42 +00:00
random
804880cc9c Translated using Weblate (Italian)
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/it/
2022-08-06 15:32:42 +00:00
notramo
8cbdd6e130 Translated using Weblate (Hungarian)
Currently translated at 98.8% (2301 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/
2022-08-06 15:32:41 +00:00
Glandos
4a3b6baaf7 Translated using Weblate (French)
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
2022-08-06 15:32:38 +00:00
Danial Behzadi
dbbdc1791a Translated using Weblate (Persian)
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/
2022-08-06 15:32:37 +00:00
Priit Jõerüüt
7b96597d56 Translated using Weblate (Estonian)
Currently translated at 99.6% (2319 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/et/
2022-08-06 15:32:37 +00:00
Vri
4af4f3f88c Translated using Weblate (German)
Currently translated at 98.6% (2296 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
2022-08-06 15:32:36 +00:00
waclaw66
a56d8a23f5 Translated using Weblate (Czech)
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/
2022-08-06 15:32:33 +00:00
Auri B. P
f33e2fd656 Translated using Weblate (Catalan)
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ca/
2022-08-06 15:32:32 +00:00
Mr.Narsus
c2fbb74e4b Translated using Weblate (Arabic)
Currently translated at 42.0% (979 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ar/
2022-08-06 15:32:31 +00:00
Adam Brown
20b3dbc6e6 documenting the rule and reflection helper 2022-08-05 17:55:12 +01:00
ericdecanini
756570793f Adds changelog file 2022-08-05 17:12:47 +02:00
ericdecanini
1ffa02c287 Merge remote-tracking branch 'origin/feature/eric/new_fab' into feature/eric/space-list-modal
# Conflicts:
#	vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
2022-08-05 17:11:57 +02:00
ericdecanini
1bf36dce92 Merge remote-tracking branch 'origin/develop' into feature/eric/new_fab 2022-08-05 17:11:00 +02:00
ericdecanini
41d859dc5b Merge remote-tracking branch 'origin/develop' into feature/eric/space-list-modal
# Conflicts:
#	vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt
2022-08-05 17:10:36 +02:00
Adam Brown
81897a179e Merge pull request #6741 from vector-im/feature/adm/focus-errors
FTUE - Focus errors showing on wrong page
2022-08-05 15:12:47 +01:00
ericdecanini
e6508e8a5a Cleans up epoxy class for NewSpaceSummaryItem and adds ellipsize to header 2022-08-05 16:08:05 +02:00
ericdecanini
0567fa3e53 Changes header text of bottom sheet to Change Space 2022-08-05 15:45:53 +02:00
Adam Brown
2683e9209b resetting the analytics datastore via reflection 2022-08-05 14:24:53 +01:00
Nikita Fedrunov
03afd2932c NewHomeDetailFragment now shows correct list fragment (#6740) 2022-08-05 14:51:47 +02:00
Adam Brown
5864ce4348 adding rule to force a new session to be started for instrumentation tests 2022-08-05 13:08:21 +01:00
ericdecanini
90f2b93763 Appends to comment in SpaceListFragment and refactors SpaceListBottomSheet class name 2022-08-05 12:39:52 +02:00
ericdecanini
a821f34fc0 Adds drag and drop to space list 2022-08-05 12:37:02 +02:00
Adam Brown
b375dd14f7 removing unused line 2022-08-05 11:18:53 +01:00
ericdecanini
0506c9abfd Fixes bottom sheet intermittently not having the correct height 2022-08-05 11:59:22 +02:00
ericdecanini
ff71e69b0e Makes space list work inside spaces 2022-08-05 11:48:11 +02:00
Maxime NATUREL
2dc92caa30 Merge pull request #6712 from vector-im/feature/mna/map-loading-error
[Location Share] Render fallback UI when map fails to load (PSG-607)
2022-08-05 11:17:37 +02:00
Adam Brown
f0bd5dc2dd Merge pull request #6744 from vector-im/dependabot/gradle/com.googlecode.libphonenumber-libphonenumber-8.12.53
Bump libphonenumber from 8.12.52 to 8.12.53
2022-08-05 08:45:02 +01:00
Maxime NATUREL
619cb29707 Merge pull request #6679 from vector-im/fix/mna/audio-controller-leak
[Timeline] Memory leak in audio message playback tracker
2022-08-05 09:06:50 +02:00
dependabot[bot]
30a8f22028 Bump libphonenumber from 8.12.52 to 8.12.53
Bumps [libphonenumber](https://github.com/google/libphonenumber) from 8.12.52 to 8.12.53.
- [Release notes](https://github.com/google/libphonenumber/releases)
- [Changelog](https://github.com/google/libphonenumber/blob/master/making-metadata-changes.md)
- [Commits](https://github.com/google/libphonenumber/compare/v8.12.52...v8.12.53)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-04 23:10:43 +00:00
dependabot[bot]
68e55c01f9 Bump firebase-appdistribution-gradle from 3.0.2 to 3.0.3
Bumps firebase-appdistribution-gradle from 3.0.2 to 3.0.3.

---
updated-dependencies:
- dependency-name: com.google.firebase:firebase-appdistribution-gradle
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-04 23:09:28 +00:00
Maxime NATUREL
65c6e578eb Moving setup of map in onViewCreated + moving reference assignment of MapView 2022-08-04 16:58:28 +02:00
Maxime NATUREL
2b8632ebe7 Adding missing trailing comma 2022-08-04 16:58:28 +02:00
Maxime NATUREL
72377c9e7e Fixing after rebase 2022-08-04 16:58:28 +02:00
Maxime NATUREL
ec5f874a81 Fixing code formatting issues 2022-08-04 16:58:28 +02:00
Maxime NATUREL
6590cf5524 adding changelog entry 2022-08-04 16:58:28 +02:00
Maxime NATUREL
008e07d03e Handling map loading error in live location maximized map 2022-08-04 16:58:28 +02:00
Maxime NATUREL
a30076a2ab Creating location.preview package 2022-08-04 16:58:28 +02:00
Maxime NATUREL
6972622bc6 Handling map loading error in timeline 2022-08-04 16:58:28 +02:00
Maxime NATUREL
e0e06c6ac8 Handling map loading error in sharing and preview fragment 2022-08-04 16:58:28 +02:00
Maxime NATUREL
87ca9606b3 Keep the previous loading map error string for timeline 2022-08-04 16:58:28 +02:00
Maxime NATUREL
6572a1a331 Fix missing icon in error view 2022-08-04 16:58:28 +02:00
Maxime NATUREL
b83acf373d Adding error view in preview and sharing fragments 2022-08-04 16:58:28 +02:00
Maxime NATUREL
8f91278d1a Creating custom view for map loading error 2022-08-04 16:58:28 +02:00
Maxime NATUREL
64c25f073c Calling directly the ViewModel clear method instead of using a view action 2022-08-04 16:57:14 +02:00
Maxime NATUREL
81cba3d275 Using ViewModel to handle clearing of audio controller 2022-08-04 16:57:14 +02:00
Maxime NATUREL
018772ca9a Adding changelog entry 2022-08-04 16:57:14 +02:00
Maxime NATUREL
8b8a4f3d7b Fixing missing clear on audio tracker listeners 2022-08-04 16:57:14 +02:00
Michael Kaye
09a91c4541 Make it easier to find developer sign-off instructions (#6739)
* Make it easier to find sign-off instructions by linking directly to DCO docs from danger message.
2022-08-04 15:54:53 +01:00
Adam Brown
e26d87c73d Merge pull request #6728 from vector-im/feature/adm/limited-ci-memory
Fixing CI crashing during compilation/linting
2022-08-04 15:44:44 +01:00
Adam Brown
8470ac9731 removing unneeded --stacktrace flag, it's part of the CI_GRADLE_ARG_PROPERTIES 2022-08-04 15:03:00 +01:00
Adam Brown
b6582c4144 adding changelog entry 2022-08-04 14:29:26 +01:00
Adam Brown
f40cf13048 fixing login/account creation errors showing when navigating to another screen
- was caused by the lost focus callback being triggered by onPause, fixed by only triggering if the current view is in the resumed state
2022-08-04 14:25:05 +01:00
Adam Brown
99de618bed adding edit text ids so that the content can automatically be restored by the fragment manager 2022-08-04 14:18:03 +01:00
Maxime NATUREL
dd69b254f9 Merge pull request #6654 from vector-im/feature/mna/update-sending-period-lls
[Location share] Update minimum sending period to 5 seconds for a live
2022-08-04 14:17:00 +02:00
Adam Brown
9a97e0bf61 adding changelog entry 2022-08-04 12:04:51 +01:00
Adam Brown
a4ea47e740 catching username availabilty exceptions and handling as user facing error 2022-08-04 11:58:31 +01:00
Adam Brown
825ba77bb2 taking into account non ascii characters as invalid username error 2022-08-04 11:58:01 +01:00
ericdecanini
79e6dd074a Makes bottom sheet dismiss on space change 2022-08-04 11:41:00 +02:00
Adam Brown
b0f73b029c upping the jvm limit but keeping the kotlin daemon constrained 2022-08-04 10:00:47 +01:00
dependabot[bot]
7bf8a41959 Bump flipper from 0.156.0 to 0.157.0
Bumps `flipper` from 0.156.0 to 0.157.0.

Updates `flipper` from 0.156.0 to 0.157.0
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.156.0...v0.157.0)

Updates `flipper-network-plugin` from 0.156.0 to 0.157.0
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.156.0...v0.157.0)

---
updated-dependencies:
- dependency-name: com.facebook.flipper:flipper
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.facebook.flipper:flipper-network-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-03 23:09:11 +00:00
dependabot[bot]
b73c097f3c Bump dagger from 2.42 to 2.43.2
Bumps `dagger` from 2.42 to 2.43.2.

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

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

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

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

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

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-03 23:08:10 +00:00
ericdecanini
b4ed380caf Finalises home and add bottom sheet buttons 2022-08-03 22:49:21 +02:00
ericdecanini
5d183654b1 Fixes bug where bottom sheet sometimes renders with the wrong height 2022-08-03 21:54:05 +02:00
Adam Brown
b625d6a9bc reducing CI workers to github VM limit 2022-08-03 15:53:27 +01:00
Adam Brown
c6e263a6d3 allowing parallel builds to occur now that the memory is constrained 2022-08-03 15:45:57 +01:00
Adam Brown
ee553d6693 making use of gradle_opts environment var to attempt to limit the jvm environment and fix gradle crashing 2022-08-03 15:40:01 +01:00
Maxime NATUREL
bfd9dcbca2 Merge pull request #6681 from vector-im/fix/mna/leak-tab-layout-mediator
[FTUE] Memory leak on FtueAuthSplashCarouselFragment
2022-08-03 14:18:41 +02:00
Adam Brown
4bff816056 fixing auto merge compile error 2022-08-03 08:30:10 +01:00
ericdecanini
aa24debd87 Adds new space list controller 2022-08-02 22:49:58 +02:00
Adam Brown
8aaf185a8e Merge pull request #6517 from vector-im/feature/adm/build-config
Avoiding direct `BuildConfig` usage
2022-08-02 18:07:17 +01:00
ericdecanini
55d8b6a819 Merge remote-tracking branch 'origin/develop' into feature/eric/space-list-modal 2022-08-02 18:07:34 +02:00
Maxime NATUREL
ac8597e745 Merge pull request #6676 from vector-im/fix/mna/fix-memory-leaks-lls
[Location sharing] - Fix the memory leaks (PSG-656)
2022-08-02 18:01:48 +02:00
Eric Decanini
e2ed4b4ae1 Merge pull request #6655 from vector-im/feature/eric/app-layout-toolbar
New App Layout Toolbar
2022-08-02 17:44:53 +02:00
ericdecanini
ab4eda18bf Adds SpacesBottomSheet 2022-08-02 17:44:27 +02:00
Maxime NATUREL
a53de92b10 Merge pull request #6688 from vector-im/fix/mna/missing-text-on-map-symbol
[Location sharing] Invisible text on map symbol
2022-08-02 16:38:11 +02:00
Adam Brown
2ee52f2062 fixing import ordering 2022-08-02 15:31:13 +01:00
Adam Brown
d1a63ccd2d removing unused import 2022-08-02 14:32:12 +01:00
Adam Brown
3c1e183ed6 using low privacy log from the vector module for code within vector, instead of the sdk flag 2022-08-02 14:32:12 +01:00
Adam Brown
9b1def3c1d updating variable casing as they're no longer const val or file level 2022-08-02 14:32:12 +01:00
Adam Brown
8b9d1bb0d8 making use of the existing sdk int provider instead of supplying it via the BuildMeta 2022-08-02 14:32:12 +01:00
Adam Brown
cb59d82846 extracting the notification action ids to their own file 2022-08-02 14:31:46 +01:00
Adam Brown
fe1019f29f using Config strict mode flag directly within the Application as the build meta can't be injected before super application.onCreate 2022-08-02 14:31:46 +01:00
Adam Brown
3d207f93f1 removing unused imports and fixing missing full stop on docs 2022-08-02 14:31:46 +01:00
Adam Brown
c07296c94d adding changelog entry 2022-08-02 14:31:46 +01:00
Adam Brown
cceac66504 moving build flavor information to the build meta 2022-08-02 14:31:46 +01:00
Adam Brown
18943e3453 removing unused buildconfig option 2022-08-02 14:31:46 +01:00
Adam Brown
df02f505ad moving git versioning to the buildMeta abstraction 2022-08-02 14:31:46 +01:00
Adam Brown
d42c27bfe0 lifting the low privacy build config to the config 2022-08-02 14:31:46 +01:00
Adam Brown
811b2e8c75 accessing the notification action ids via a dedicated class which builds upon the application id 2022-08-02 14:31:46 +01:00
Adam Brown
9fe3fc69dd extracting the config models to their own files 2022-08-02 14:31:46 +01:00
Adam Brown
cc4aae0f4a replacing DEBUG build config flag with injectable property 2022-08-02 14:31:46 +01:00
Adam Brown
b6d052e58d lifting voip setting to a voip config 2022-08-02 14:31:46 +01:00
Adam Brown
56afac26ad creating a location sharing config for holding the map tiler key 2022-08-02 14:31:46 +01:00
Adam Brown
012485b8e3 lifting the live location sharing build flag to the config along with debug toggle 2022-08-02 14:31:46 +01:00
Adam Brown
f14aabcd22 ports the key sharing strategy to the config 2022-08-02 14:31:46 +01:00
Adam Brown
e795e9da52 porting the onboarding variant selection to the config 2022-08-02 14:31:45 +01:00
Adam Brown
87a8c786f7 moving the voice message limit to the config module 2022-08-02 14:31:24 +01:00
Adam Brown
274b1a149c moving analytics config to the config module, it's now up to forks to opt out rather than relying on the package name to not be vector 2022-08-02 14:31:23 +01:00
Jorge Martin Espinosa
c848615636 Disable 'Enable biometrics' option if there are not biometric authenticators enrolled. (#6714)
* Disable 'Enable biometrics' option if there are not biometric authenticators enrolled.

* Improve biometric pref enabled check

* Fix changelog issue

* Address review comments. Add extra catch clauses to key migrations.

* Add tests for key migrators
2022-08-02 15:31:08 +02:00
ericdecanini
b0a9b482e7 Adds issue numbers to unimplemented FAB clicks 2022-08-02 15:18:45 +02:00
Adam Brown
1497650146 Merge pull request #6715 from vector-im/feature/adm/danger-reviewers
Fix danger reviewers PR comment
2022-08-02 14:15:26 +01:00
dependabot[bot]
927b51413c Bump com.autonomousapps.dependency-analysis from 1.11.2 to 1.12.0
Bumps com.autonomousapps.dependency-analysis from 1.11.2 to 1.12.0.

---
updated-dependencies:
- dependency-name: com.autonomousapps.dependency-analysis
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-02 11:57:41 +00:00
Adam Brown
3fe7a9d8d5 Merge pull request #6588 from vector-im/dependabot/gradle/io.gitlab.arturbosch.detekt-1.21.0
Bump io.gitlab.arturbosch.detekt from 1.20.0 to 1.21.0
2022-08-02 12:56:45 +01:00
Adam Brown
c99f67bea4 reading users field from the reviews object for calculating if reviewers have been set 2022-08-02 12:34:36 +01:00
Adam Brown
ba5d6c9108 replacing all danger mutable lets with const 2022-08-02 12:19:16 +01:00
Adam Brown
7d120f94f6 reading the reviewers length from the github object as per the dsl 2022-08-02 12:17:48 +01:00
Adam Brown
5d30026726 Merge pull request #6692 from vector-im/feature/bma/no_signoff_dependabot
No signoff, no changelog for dependabot's PR
2022-08-02 12:14:36 +01:00
Maxime NATUREL
c926b4cc69 Fix moving some components to dedicated package 2022-08-02 10:47:38 +02:00
Maxime NATUREL
1ef809c633 Adding changelog entry 2022-08-02 10:36:34 +02:00
Maxime NATUREL
e311d0e469 Fixing missing cleanUp of the LocationSharingAndroidService 2022-08-02 10:36:32 +02:00
Maxime NATUREL
2c10d9dcaa Fixing missing call to timer.cancel() when view is detached 2022-08-02 10:35:42 +02:00
Maxime NATUREL
f44d8b0b20 Fixing missing call to SymbolManager.onDestroy() 2022-08-02 10:35:42 +02:00
Maxime NATUREL
72e2951c3e Fixing missing cleanUp on RecyclerView 2022-08-02 10:35:42 +02:00
Maxime NATUREL
9781656c1d Fixing leak on bottomSheetController callback 2022-08-02 10:35:42 +02:00
Maxime NATUREL
4f71741107 Fixing leak on OnSymbolClickListener 2022-08-02 10:35:42 +02:00
Maxime NATUREL
74c9a71cbd Merge pull request #6648 from vector-im/feature/mna/align-naming-lls
[Location sharing] Align naming of components for live location feature
2022-08-02 10:32:39 +02:00
Maxime NATUREL
49ad37a7f6 Using Duration to have clearer syntax 2022-08-02 09:27:27 +02:00
Maxime NATUREL
0944b2ff39 Adding changelog entry 2022-08-02 09:13:16 +02:00
Maxime NATUREL
004f40bff5 Setting 5 seconds for min period of update for location tracking 2022-08-02 09:13:16 +02:00
Maxime NATUREL
8571fd0ba9 Fix after rebase 2022-08-02 09:09:19 +02:00
Maxime NATUREL
c616229d53 Missing renaming of stylable file 2022-08-02 09:09:19 +02:00
Maxime NATUREL
a8df1af6fd Adding changelog entry 2022-08-02 09:09:19 +02:00
Maxime NATUREL
be696f5a5c Align naming of components for the live location feature 2022-08-02 09:09:19 +02:00
Adam Brown
1411fdd99f Merge branch 'hotfix/v1.4.31' into develop 2022-08-01 18:29:55 +01:00
Adam Brown
e1c572e46c generating 1.4.31 changelog 2022-08-01 17:52:14 +01:00
Adam Brown
fde2aee69a Merge branch 'hotfix/v1.4.31' of github.com:vector-im/element-android into hotfix/v1.4.31 2022-08-01 17:50:22 +01:00
Adam Brown
cf5745e966 Merge pull request #6710 from vector-im/feature/adm/always-initialise-session
Fixing `IllegalStateException: You should authenticate before using this` when restoring app
2022-08-01 17:49:55 +01:00
Adam Brown
0c4c695b9c adding missing fullstops in to docs 2022-08-01 17:15:50 +01:00
Adam Brown
e0349b27ed updating version for hotfix release 2022-08-01 16:51:19 +01:00
Adam Brown
9114630bba replacing single context thread with semaphore
- avoids the need for a dedicated long living thread instance
2022-08-01 16:23:41 +01:00
Adam Brown
3725921400 using injectable dispatchers instead of direct usage 2022-08-01 16:14:49 +01:00
SpiritCroc
9ea0f88181 Fix cleartext leak in log
Change-Id: Ifb9faaa52f63bcf9c88a8499c2b078dd1a2de62e
2022-08-01 16:11:28 +01:00
Adam Brown
cf247eafb7 Merge pull request #6706 from SpiritCroc/leak
Fix cleartext leak in log
2022-08-01 16:08:07 +01:00
Adam Brown
dbe5b35ad4 adding changelog entry 2022-08-01 15:38:51 +01:00
Adam Brown
6b754f3e03 avoiding unneeded main context switch 2022-08-01 15:12:39 +01:00
Adam Brown
410a7b525f reusing the suspend scope 2022-08-01 13:13:00 +01:00
Adam Brown
fedbe048ba creating a dedicated threadsafe Session instance initializer in order to attempt to restore session when they're not yet created in memory 2022-08-01 13:11:19 +01:00
SpiritCroc
3845e1435c Fix cleartext leak in log
Change-Id: Ifb9faaa52f63bcf9c88a8499c2b078dd1a2de62e
2022-08-01 13:00:30 +02:00
Maxime NATUREL
21e88efaff Merge pull request #6657 from vector-im/dependabot/gradle/fragment-1.5.1
Bump fragment from 1.5.0 to 1.5.1
2022-08-01 10:29:50 +02:00
phardyle
6671a100ad Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/
2022-08-01 03:50:35 +00:00
Fork Liang
91b0465caa Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (2327 of 2327 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/
2022-08-01 03:50:33 +00:00
Benoit Marty
68cd7d487a Merge pull request #6524 from vector-im/dependabot/gradle/org.jetbrains.dokka-dokka-gradle-plugin-1.7.10
Bump dokka-gradle-plugin from 1.7.0 to 1.7.10
2022-07-29 17:15:45 +02:00
Benoit Marty
302edb44dc Merge pull request #6659 from vector-im/dependabot/gradle/flipper-0.156.0
Bump flipper from 0.154.0 to 0.156.0
2022-07-29 17:14:25 +02:00
Eric Decanini
ddaf1128ac Merge pull request #6598 from vector-im/task/eric/space-switching-unit-tests
Space Switching Refactoring and Unit Tests
2022-07-29 16:21:33 +02:00
ericdecanini
d116d98080 Adds changelog file 2022-07-29 15:48:58 +02:00
ericdecanini
406a67827c Adds scroll behaviour to FABs 2022-07-29 15:48:21 +02:00
Benoit Marty
725ed00759 Change some severities 2022-07-29 15:41:36 +02:00
Benoit Marty
5e19838108 Merge pull request #6691 from vector-im/feature/bma/validateGradleWrapper
Avoid running this workflow twice on PR. #6690
2022-07-29 15:32:56 +02:00
Benoit Marty
fa8f110579 Merge pull request #6667 from vector-im/feature/bma/group_cleanup_2
Group cleanup
2022-07-29 15:32:05 +02:00
ericdecanini
8e7e320e40 Finalises new layout FABs 2022-07-29 15:28:55 +02:00
dependabot[bot]
a83f714657 Bump lifecycle from 2.5.0 to 2.5.1
Bumps `lifecycle` from 2.5.0 to 2.5.1.

Updates `lifecycle-common` from 2.5.0 to 2.5.1

Updates `lifecycle-livedata-ktx` from 2.5.0 to 2.5.1

Updates `lifecycle-process` from 2.5.0 to 2.5.1

Updates `lifecycle-runtime-ktx` from 2.5.0 to 2.5.1

---
updated-dependencies:
- dependency-name: androidx.lifecycle:lifecycle-common
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: androidx.lifecycle:lifecycle-livedata-ktx
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: androidx.lifecycle:lifecycle-process
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: androidx.lifecycle:lifecycle-runtime-ktx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-29 15:23:30 +02:00
dependabot[bot]
c20c3a741a Bump activity from 1.5.0 to 1.5.1
Bumps activity from 1.5.0 to 1.5.1.

---
updated-dependencies:
- dependency-name: androidx.activity:activity
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-29 15:23:10 +02:00
Benoit Marty
d60695806f Do not require a changelog file for PR created by Dependabot. 2022-07-29 15:18:04 +02:00
Benoit Marty
c41f0dd0cf Do not request PR created by Dependabot to include a Sign-off.
Dependabot includes a sign-off in its commits, but if the team adds extra commits, we will have the warning that a sign off is required.
2022-07-29 15:13:55 +02:00
Benoit Marty
619e5dd7d1 Try to use a token from ElementBot, to let PR created from fork be able to run this step. 2022-07-29 14:56:46 +02:00
Benoit Marty
3d722118ca Avoid running this workflow twice on PR. #6690 2022-07-29 13:19:18 +02:00
Benoit Marty
b161e5eb2e Add Kdoc on SpaceListFragment 2022-07-29 13:06:37 +02:00
Benoit Marty
07dc0d2e54 Rename layout for clarity 2022-07-29 13:06:37 +02:00
Benoit Marty
e9aab6331a Improve layout preview, item_group does not exist anymore. 2022-07-29 13:06:37 +02:00
Benoit Marty
59f00cd196 Merge pull request #6637 from vector-im/feature/bma/danger
Danger
2022-07-29 12:55:32 +02:00
Benoit Marty
c863b90d42 Merge pull request #6683 from vector-im/dependabot/gradle/com.autonomousapps.dependency-analysis-1.11.2
Bump com.autonomousapps.dependency-analysis from 1.9.0 to 1.11.2
2022-07-29 12:37:53 +02:00
Maxime NATUREL
c7d5ceca5d Merge pull request #6644 from vector-im/feature/mna/notification-tap-lls
[Location Share] Open maximized map on tapping on live sharing notification (PSG-616)
2022-07-29 11:27:53 +02:00
ericdecanini
4f5ad816f1 Fixes AppStateHandlers in code after merge 2022-07-29 10:56:33 +02:00
Maxime NATUREL
79ea66890f Adding changelog entry 2022-07-29 10:20:32 +02:00
Maxime NATUREL
3a5c139759 Converting drawable to bitmap for map symbol to fix invisible text 2022-07-29 10:14:00 +02:00
Benoit Marty
fb67499657 Knit: do not check node_modules folder 2022-07-29 10:02:40 +02:00
Benoit Marty
66fa285910 Call the correct command for knit
See https://github.com/Kotlin/kotlinx-knit#tasks
2022-07-29 10:02:40 +02:00
Benoit Marty
4d62e75c65 Get all the reports, in all the formats 2022-07-29 10:02:40 +02:00
Benoit Marty
cc6dad3fce Ignore PluralsCandidate, I do not know why it is reported by Danger, since this is a warning. Also make this issue an error. 2022-07-29 10:02:40 +02:00
Benoit Marty
b77475a3d9 Gradle daemon does not stop to get killed, try to split lint check in 2 steps 2022-07-29 10:02:40 +02:00
Benoit Marty
036521af94 Add changelog 2022-07-29 10:02:40 +02:00
Benoit Marty
a062093acf Merge jobs that generate XML reports together
So that Danger can report all errors from generated XML files
2022-07-29 10:02:40 +02:00
Benoit Marty
630a981864 No need for ktlint comment, Danger will inline comment 2022-07-29 10:02:40 +02:00
Benoit Marty
56691f613e Setup Danger to Element Android project. 2022-07-29 10:02:40 +02:00
Benoit Marty
a52a2504ef We do not use TravisCI anymore. 2022-07-29 10:02:40 +02:00
Adam Brown
67d4afa012 updating build versions for next release cycle 2022-07-29 09:02:17 +01:00
Adam Brown
ca49cce759 Merge branch 'release/v1.4.30' into develop 2022-07-29 09:01:17 +01:00
dependabot[bot]
2c5504ffce Bump com.autonomousapps.dependency-analysis from 1.9.0 to 1.11.2
Bumps com.autonomousapps.dependency-analysis from 1.9.0 to 1.11.2.

---
updated-dependencies:
- dependency-name: com.autonomousapps.dependency-analysis
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-28 23:08:40 +00:00
Maxime NATUREL
2b58c42c8b Adding changelog entry 2022-07-28 17:30:05 +02:00
Maxime NATUREL
b2e64e6265 Fixing missing clear on TabLayoutMediator when view is destroyed 2022-07-28 17:25:42 +02:00
ericdecanini
d49f104332 Adds fab buttons 2022-07-28 15:09:57 +02:00
Adam Brown
d304624878 removing extra blank lines 2022-07-28 11:49:50 +01:00
Adam Brown
bb9459fcab adding test around sso url fetching 2022-07-28 11:41:40 +01:00
ericdecanini
590f99a5c2 Adds comments to SpaceStateHandler 2022-07-28 11:33:54 +02:00
ericdecanini
e6addd1319 Merge remote-tracking branch 'origin/develop' into task/eric/space-switching-unit-tests
# Conflicts:
#	vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt
2022-07-28 11:25:14 +02:00
ericdecanini
a11d5ebdd9 Replaces TODOs 2022-07-28 11:24:00 +02:00
dependabot[bot]
5b9c7c3b27 Bump flipper from 0.154.0 to 0.156.0
Bumps `flipper` from 0.154.0 to 0.156.0.

Updates `flipper` from 0.154.0 to 0.156.0
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.154.0...v0.156.0)

Updates `flipper-network-plugin` from 0.154.0 to 0.156.0
- [Release notes](https://github.com/facebook/flipper/releases)
- [Commits](https://github.com/facebook/flipper/compare/v0.154.0...v0.156.0)

---
updated-dependencies:
- dependency-name: com.facebook.flipper:flipper
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.facebook.flipper:flipper-network-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-27 23:09:51 +00:00
dependabot[bot]
4958b8ae7b Bump fragment from 1.5.0 to 1.5.1
Bumps `fragment` from 1.5.0 to 1.5.1.

Updates `fragment-ktx` from 1.5.0 to 1.5.1

Updates `fragment-testing` from 1.5.0 to 1.5.1

---
updated-dependencies:
- dependency-name: androidx.fragment:fragment-ktx
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: androidx.fragment:fragment-testing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-27 23:09:20 +00:00
Adam Brown
c4831510ac adding tests around the state resetting 2022-07-27 17:17:36 +01:00
Adam Brown
a32a78751a adding test around login with username and password 2022-07-27 16:40:12 +01:00
Adam Brown
87a0957d9a adding test around login with token 2022-07-27 16:37:35 +01:00
Adam Brown
e77688b3f4 adding splash action tests 2022-07-27 16:37:17 +01:00
ericdecanini
3c8401bc24 Adds changelog file 2022-07-27 16:21:12 +02:00
ericdecanini
d3a1783e57 Adds invites to new home menu 2022-07-27 16:05:25 +02:00
ericdecanini
9a981bb1d5 Adds profile icon to toolbar 2022-07-27 15:37:31 +02:00
ericdecanini
7de82e0204 Adds white status and navigation bars 2022-07-27 11:04:53 +02:00
ericdecanini
7334d909d5 Adds options menu 2022-07-26 16:00:46 +02:00
Maxime NATUREL
fb82b1d1ce Adding changelog entry 2022-07-26 15:37:08 +02:00
Maxime NATUREL
f3ad9e38c3 Update the notification when starting/stopping new live in room 2022-07-26 15:28:27 +02:00
Maxime NATUREL
f56c315207 Dedicated notification builder and opening map on tap of notification 2022-07-26 14:33:40 +02:00
ericdecanini
5958559186 Styles collapsed title text 2022-07-26 14:31:02 +02:00
ericdecanini
a5039287b2 Adds feature flag functionality 2022-07-26 13:38:15 +02:00
ericdecanini
3df337fa07 Adds new layout toolbar 2022-07-26 12:38:29 +02:00
ericdecanini
d8668f70bc Rearranges imports 2022-07-21 11:34:49 +02:00
ericdecanini
8b220de952 Adds changelog file 2022-07-21 10:50:21 +02:00
ericdecanini
a909779e08 Merge remote-tracking branch 'origin/develop' into task/eric/space-switching-unit-tests
# Conflicts:
#	vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt
2022-07-21 10:48:57 +02:00
ericdecanini
d8fdaf0477 Moves UiStateRepository stubbing to fake class 2022-07-21 10:38:31 +02:00
ericdecanini
1d77f99148 Adds RoomSummaryFixture 2022-07-21 10:37:33 +02:00
ericdecanini
f0ae458a54 Changes AppStateHandler to SpaceStateHandler 2022-07-21 10:10:44 +02:00
ericdecanini
9a649b6093 Adds tests for selectedSpaceFlow and activeSpaceId 2022-07-21 09:39:12 +02:00
ericdecanini
f770ae0653 Adds tests for persist space and backstack 2022-07-21 08:53:08 +02:00
ericdecanini
49992f682e Adds test for existing space 2022-07-21 08:12:04 +02:00
dependabot[bot]
f0165f69d3 Bump realm-gradle-plugin from 10.11.0 to 10.11.1
Bumps [realm-gradle-plugin](https://github.com/realm/realm-java) from 10.11.0 to 10.11.1.
- [Release notes](https://github.com/realm/realm-java/releases)
- [Changelog](https://github.com/realm/realm-java/blob/v10.11.1/CHANGELOG.md)
- [Commits](https://github.com/realm/realm-java/compare/v10.11.0...v10.11.1)

---
updated-dependencies:
- dependency-name: io.realm:realm-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-20 13:21:00 +00:00
ericdecanini
fbdbfb6be2 Post cherry pick fix 2022-07-19 16:20:59 +02:00
ericdecanini
e4c8c88cee Refactors AppStateHandler into interface implementation pattern 2022-07-19 16:19:44 +02:00
ericdecanini
4dccff4d78 Improves formatting in AppStateHandler 2022-07-19 16:19:25 +02:00
Benoit Marty
2d761385a1 Detekt: disable rule UseCheckOrError 2022-07-19 15:02:21 +02:00
Benoit Marty
62f2fe1c16 Detekt: This explicit usage of it as the lambda parameter name can be omitted. [ExplicitItLambdaParameter] 2022-07-19 15:02:21 +02:00
Benoit Marty
40f8d94954 Detekt: Use require() instead of throwing an IllegalArgumentException. [UseRequire] 2022-07-19 15:02:21 +02:00
Benoit Marty
b4f833cb0d Detekt: disable rule InstanceOfCheckForException 2022-07-19 15:02:21 +02:00
Benoit Marty
50b7f3ef2c Ad group io.github.davidburstrom.contester for detekt 1.21.0 2022-07-19 15:02:21 +02:00
dependabot[bot]
6ed36e804b Bump io.gitlab.arturbosch.detekt from 1.20.0 to 1.21.0
Bumps io.gitlab.arturbosch.detekt from 1.20.0 to 1.21.0.

---
updated-dependencies:
- dependency-name: io.gitlab.arturbosch.detekt
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-19 15:02:21 +02:00
dependabot[bot]
0dc80db9b7 Bump dokka-gradle-plugin from 1.7.0 to 1.7.10
Bumps dokka-gradle-plugin from 1.7.0 to 1.7.10.

---
updated-dependencies:
- dependency-name: org.jetbrains.dokka:dokka-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-12 23:06:02 +00:00
424 changed files with 7203 additions and 8283 deletions

View File

@@ -7,10 +7,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
jobs:
debug:
@@ -36,7 +34,7 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Assemble ${{ matrix.target }} debug apk
run: ./gradlew assemble${{ matrix.target }}Debug $CI_GRADLE_ARG_PROPERTIES --stacktrace
run: ./gradlew assemble${{ matrix.target }}Debug $CI_GRADLE_ARG_PROPERTIES
- name: Upload ${{ matrix.target }} debug APKs
uses: actions/upload-artifact@v3
with:
@@ -61,7 +59,7 @@ jobs:
restore-keys: |
${{ runner.os }}-gradle-
- name: Assemble GPlay unsigned apk
run: ./gradlew clean assembleGplayRelease $CI_GRADLE_ARG_PROPERTIES --stacktrace
run: ./gradlew clean assembleGplayRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload Gplay unsigned APKs
uses: actions/upload-artifact@v3
with:

20
.github/workflows/danger.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: Danger CI
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
name: Danger
steps:
- uses: actions/checkout@v3
- run: |
npm install --save-dev @babel/plugin-transform-flow-strip-types
- name: Danger
uses: danger/danger-js@11.1.1
with:
args: "--dangerfile tools/danger/dangerfile.js"
env:
DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }}
# Fallback for forks
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,5 +1,8 @@
name: "Validate Gradle Wrapper"
on: [push, pull_request]
on:
pull_request: { }
push:
branches: [ main, develop ]
jobs:
validation:

View File

@@ -6,10 +6,8 @@ on:
- cron: "0 4 * * *"
env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
jobs:
nightly:
@@ -40,7 +38,7 @@ jobs:
yes n | towncrier build --version nightly
- name: Build and upload Gplay Nightly APK
run: |
./gradlew assembleGplayNightly appDistributionUploadGplayNightly $CI_GRADLE_ARG_PROPERTIES --stacktrace
./gradlew assembleGplayNightly appDistributionUploadGplayNightly $CI_GRADLE_ARG_PROPERTIES
env:
ELEMENT_ANDROID_NIGHTLY_KEYID: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_KEYID }}
ELEMENT_ANDROID_NIGHTLY_KEYPASSWORD: ${{ secrets.ELEMENT_ANDROID_NIGHTLY_KEYPASSWORD }}

View File

@@ -10,10 +10,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
jobs:

View File

@@ -7,10 +7,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
jobs:
check:
@@ -29,80 +27,52 @@ jobs:
- uses: actions/checkout@v3
- name: Run knit
run: |
./gradlew knit
./gradlew knitCheck
# ktlint for all the modules
ktlint:
name: Kotlin Linter
# Check the project: ktlint, detekt, lint
lint:
name: Android Linter
runs-on: ubuntu-latest
# Allow all jobs on main and develop. Just one per PR.
concurrency:
group: ${{ github.ref == 'refs/heads/main' && format('ktlint-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('ktlint-develop-{0}', github.sha) || format('ktlint-{0}', github.ref) }}
group: ${{ github.ref == 'refs/heads/main' && format('lint-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('lint-develop-{0}', github.sha) || format('lint-{0}', github.ref) }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v3
- name: Run ktlint
run: |
./gradlew ktlintCheck --continue
- name: Run detekt
if: always()
run: |
./gradlew detekt $CI_GRADLE_ARG_PROPERTIES
- name: Run lint
# Not always, if ktlint or detekt fail, avoid running the long lint check.
run: |
./gradlew lintGplayRelease $CI_GRADLE_ARG_PROPERTIES
./gradlew lintFdroidRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload reports
if: always()
uses: actions/upload-artifact@v3
with:
name: ktlinting-report
name: linting-report
path: |
*/build/reports/ktlint/ktlint*/ktlint*.txt
- name: Handle Results
*/build/reports/**/*.*
- name: Prepare Danger
if: always()
id: ktlint-results
run: |
results="$(cat */*/build/reports/ktlint/ktlint*/ktlint*.txt */build/reports/ktlint/ktlint*/ktlint*.txt | sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2})?)?[mGK]//g")"
if [ -z "$results" ]; then
echo "::set-output name=add_comment::false"
else
body="👎\`Failed${results}\`"
body="${body//'%'/'%25'}"
body="${body//$'\n'/'%0A'}"
body="${body//$'\r'/'%0D'}"
body="$( echo $body | sed 's/\/home\/runner\/work\/element-android\/element-android\//\`<br\/>\`/g')"
body="$( echo $body | sed 's/\/src\/main\/java\// 🔸 /g')"
body="$( echo $body | sed 's/im\/vector\/app\///g')"
body="$( echo $body | sed 's/im\/vector\/lib\/attachmentviewer\///g')"
body="$( echo $body | sed 's/im\/vector\/lib\/multipicker\///g')"
body="$( echo $body | sed 's/im\/vector\/lib\///g')"
body="$( echo $body | sed 's/org\/matrix\/android\/sdk\///g')"
body="$( echo $body | sed 's/\/src\/androidTest\/java\// 🔸 /g')"
echo "::set-output name=add_comment::true"
echo "::set-output name=body::$body"
fi
- name: Find Comment
if: always() && github.event_name == 'pull_request'
uses: peter-evans/find-comment@v2
id: fc
npm install --save-dev @babel/core
npm install --save-dev @babel/plugin-transform-flow-strip-types
yarn add danger-plugin-lint-report --dev
- name: Danger lint
if: always()
uses: danger/danger-js@11.1.1
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: Ktlint Results
- name: Add comment if needed
if: always() && github.event_name == 'pull_request' && steps.ktlint-results.outputs.add_comment == 'true'
uses: peter-evans/create-or-update-comment@v2
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
### Ktlint Results
${{ steps.ktlint-results.outputs.body }}
edit-mode: replace
- name: Delete comment if needed
if: always() && github.event_name == 'pull_request' && steps.fc.outputs.comment-id != '' && steps.ktlint-results.outputs.add_comment == 'false'
uses: actions/github-script@v3
with:
script: |
github.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: ${{ steps.fc.outputs.comment-id }}
})
args: "--dangerfile tools/danger/dangerfile-lint.js"
env:
DANGER_GITHUB_API_TOKEN: ${{ secrets.DANGER_GITHUB_API_TOKEN }}
# Fallback for forks
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Gradle dependency analysis using https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin
dependency-analysis:
@@ -122,107 +92,3 @@ jobs:
with:
name: dependency-analysis
path: build/reports/dependency-check-report.html
# Lint for main module
android-lint:
name: Android Linter
runs-on: ubuntu-latest
# Allow all jobs on main and develop. Just one per PR.
concurrency:
group: ${{ github.ref == 'refs/heads/main' && format('android-lint-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('android-lint-develop-{0}', github.sha) || format('android-lint-{0}', github.ref) }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v3
- uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Lint analysis
run: ./gradlew clean :vector:lint --stacktrace $CI_GRADLE_ARG_PROPERTIES
- name: Upload reports
if: always()
uses: actions/upload-artifact@v3
with:
name: lint-report
path: |
vector/build/reports/*.*
# Lint for Gplay and Fdroid release APK
apk-lint:
name: Lint APK (${{ matrix.target }})
runs-on: ubuntu-latest
if: github.ref != 'refs/heads/main'
strategy:
fail-fast: false
matrix:
target: [ Gplay, Fdroid ]
# Allow all jobs on develop. Just one per PR.
concurrency:
group: ${{ github.ref == 'refs/heads/develop' && format('apk-lint-develop-{0}-{1}', matrix.target, github.sha) || format('apk-lint-{0}-{1}', matrix.target, github.ref) }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v3
- uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Lint ${{ matrix.target }} release
run: ./gradlew clean lint${{ matrix.target }}Release --stacktrace $CI_GRADLE_ARG_PROPERTIES
- name: Upload ${{ matrix.target }} linting report
if: always()
uses: actions/upload-artifact@v3
with:
name: release-lint-report-${{ matrix.target }}
path: |
vector/build/reports/*.*
detekt:
name: Detekt Analysis
runs-on: ubuntu-latest
# Allow all jobs on main and develop. Just one per PR.
concurrency:
group: ${{ github.ref == 'refs/heads/main' && format('detekt-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('detekt-develop-{0}', github.sha) || format('detekt-{0}', github.ref) }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v3
- name: Run detekt
run: |
./gradlew detekt $CI_GRADLE_ARG_PROPERTIES
- name: Upload reports
if: always()
uses: actions/upload-artifact@v3
with:
name: detekt-report
path: |
*/build/reports/detekt/detekt.html
# towncrier:
# name: Towncrier check
# runs-on: ubuntu-latest
# if: github.event_name == 'pull_request' && github.head_ref == 'develop'
# steps:
# - uses: actions/checkout@v3
# - name: Set up Python 3.8
# uses: actions/setup-python@v4
# with:
# python-version: 3.8
# - name: Install towncrier
# run: |
# python3 -m pip install towncrier
# - name: Run towncrier
# # Fetch the pull request' base branch so towncrier will be able to
# # compare the current branch with the base branch.
# # Source: https://github.com/actions/checkout/#fetch-all-branches.
# run: |
# git fetch --no-tags origin +refs/heads/${BASE_BRANCH}:refs/remotes/origin/${BASE_BRANCH}
# towncrier check --compare-with origin/${BASE_BRANCH}
# env:
# BASE_BRANCH: ${{ github.base_ref }}

View File

@@ -7,10 +7,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
CI_GRADLE_ARG_PROPERTIES: >
-Porg.gradle.jvmargs=-Xmx4g
-Porg.gradle.parallel=false
--no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3072m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
jobs:
tests:
@@ -51,9 +49,9 @@ jobs:
disable-animations: true
emulator-build: 7425822
script: |
./gradlew unitTestsWithCoverage --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew instrumentationTestsWithCoverage --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew generateCoverageReport --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew unitTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
./gradlew instrumentationTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
./gradlew generateCoverageReport $CI_GRADLE_ARG_PROPERTIES
# NB: continue-on-error marks steps.tests.conclusion = 'success' but leaves stes.tests.outcome = 'failure'
- name: Run all the codecoverage tests at once (retry if emulator failed)
uses: reactivecircus/android-emulator-runner@v2
@@ -67,13 +65,13 @@ jobs:
disable-animations: true
emulator-build: 7425822
script: |
./gradlew unitTestsWithCoverage --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew instrumentationTestsWithCoverage --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew generateCoverageReport --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew unitTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
./gradlew instrumentationTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
./gradlew generateCoverageReport $CI_GRADLE_ARG_PROPERTIES
- run: ./gradlew sonarqube $CI_GRADLE_ARG_PROPERTIES
if: always() # we may have failed a previous step and retried, that's OK
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
GITHUB_TOKEN: ${{ secrets.SONARQUBE_GITHUB_API_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
ORG_GRADLE_PROJECT_SONAR_LOGIN: ${{ secrets.SONAR_TOKEN }}
@@ -114,5 +112,5 @@ jobs:
# restore-keys: |
# ${{ runner.os }}-gradle-
# - name: Build Android Tests
# run: ./gradlew clean assembleAndroidTest $CI_GRADLE_ARG_PROPERTIES --stacktrace
# run: ./gradlew clean assembleAndroidTest $CI_GRADLE_ARG_PROPERTIES

5
.gitignore vendored
View File

@@ -17,3 +17,8 @@
/fastlane/report.xml
/**/build
# Added by yarn
/package.json
/yarn.lock
/node_modules

View File

@@ -1,18 +0,0 @@
# FTR: Configuration on https://travis-ci.org/github/vector-im/element-android/settings
#
# - Build only if .travis.yml is present -> On
# - Limit concurrent jobs -> Off
# - Build pushed branches -> On (build the branch)
# - Build pushed pull request -> On (build the PR after auto-merge)
#
# - Auto cancel branch builds -> On
# - Auto cancel pull request builds -> On
sudo: false
notifications:
email: false
# Just run a simple script here
script:
- ./tools/travis/check_pr.sh

View File

@@ -1,3 +1,47 @@
Changes in Element v1.4.32 (2022-08-10)
=======================================
Features ✨
----------
- [Location Share] Render fallback UI when map fails to load ([#6711](https://github.com/vector-im/element-android/issues/6711))
Bugfixes 🐛
----------
- Fix message content sometimes appearing in the log ([#6706](https://github.com/vector-im/element-android/issues/6706))
- Disable 'Enable biometrics' option if there are not biometric authenticators enrolled. ([#6713](https://github.com/vector-im/element-android/issues/6713))
- Fix crash when biometric key is used when coming back to foreground and KeyStore reports that the device is still locked. ([#6768](https://github.com/vector-im/element-android/issues/6768))
- Catch all exceptions on lockscreen system key migrations. ([#6769](https://github.com/vector-im/element-android/issues/6769))
- Fixes crash when entering non ascii characters during account creation ([#6735](https://github.com/vector-im/element-android/issues/6735))
- Fixes onboarding login/account creation errors showing after navigation ([#6737](https://github.com/vector-im/element-android/issues/6737))
- [Location sharing] Invisible text on map symbol ([#6687](https://github.com/vector-im/element-android/issues/6687))
In development 🚧
----------------
- Adds new app layout toolbar ([#6655](https://github.com/vector-im/element-android/issues/6655))
Other changes
-------------
- [Modularization] Provides abstraction to avoid direct usages of BuildConfig ([#6406](https://github.com/vector-im/element-android/issues/6406))
- Refactors SpaceStateHandler (previously AppStateHandler) and adds unit tests for it ([#6598](https://github.com/vector-im/element-android/issues/6598))
- Setup Danger to the project ([#6637](https://github.com/vector-im/element-android/issues/6637))
- [Location Share] Open maximized map on tapping on live sharing notification ([#6642](https://github.com/vector-im/element-android/issues/6642))
- [Location sharing] Align naming of components for live location feature ([#6647](https://github.com/vector-im/element-android/issues/6647))
- [Location share] Update minimum sending period to 5 seconds for a live ([#6653](https://github.com/vector-im/element-android/issues/6653))
- [Location sharing] - Fix the memory leaks ([#6674](https://github.com/vector-im/element-android/issues/6674))
- [Timeline] Memory leak in audio message playback tracker ([#6678](https://github.com/vector-im/element-android/issues/6678))
- [FTUE] Memory leak on FtueAuthSplashCarouselFragment ([#6680](https://github.com/vector-im/element-android/issues/6680))
- Link directly to DCO docs from danger message. ([#6739](https://github.com/vector-im/element-android/issues/6739))
Changes in Element v1.4.31 (2022-08-01)
=======================================
Bugfixes 🐛
----------
- Fixes crash when returning to the app after backgrounding ([#6709](https://github.com/vector-im/element-android/issues/6709))
- Fix message content sometimes appearing in the log ([#6706](https://github.com/vector-im/element-android/issues/6706))
Changes in Element v1.4.30 (2022-07-29)
=======================================

View File

@@ -1,3 +1,4 @@
source "https://rubygems.org"
gem "fastlane"
gem 'danger'

View File

@@ -24,10 +24,29 @@ GEM
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.0.3)
claide-plugins (0.9.2)
cork
nap
open4 (~> 1.3)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
cork (0.3.0)
colored2 (~> 3.1)
danger (8.6.1)
claide (~> 1.0)
claide-plugins (>= 0.9.2)
colored2 (~> 3.1)
cork (~> 0.1)
faraday (>= 0.9.0, < 2.0)
faraday-http-cache (~> 2.0)
git (~> 1.7)
kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.0)
no_proxy_fix
octokit (~> 4.7)
terminal-table (>= 1, < 4)
declarative (0.0.20)
digest-crc (0.6.3)
rake (>= 12.0.0, < 14.0.0)
@@ -52,6 +71,8 @@ GEM
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-http-cache (2.4.0)
faraday (>= 0.8)
faraday-httpclient (1.0.1)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0)
@@ -98,6 +119,8 @@ GEM
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3)
git (1.11.0)
rchardet (~> 1.8)
google-apis-androidpublisher_v3 (0.8.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-core (0.4.0)
@@ -143,17 +166,28 @@ GEM
jmespath (1.4.0)
json (2.5.1)
jwt (2.2.3)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
memoist (0.16.2)
mini_magick (4.11.0)
mini_mime (1.1.0)
multi_json (1.15.0)
multipart-post (2.0.0)
nanaimo (0.3.0)
nap (1.1.0)
naturally (2.2.1)
no_proxy_fix (0.1.2)
octokit (4.25.1)
faraday (>= 1, < 3)
sawyer (~> 0.9)
open4 (1.3.4)
os (1.1.1)
plist (3.6.0)
public_suffix (4.0.6)
rake (13.0.6)
rchardet (1.8.0)
representable (3.1.1)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
@@ -163,6 +197,9 @@ GEM
rouge (2.0.7)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
sawyer (0.9.2)
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
security (0.1.3)
signet (0.15.0)
addressable (~> 2.3)
@@ -200,9 +237,11 @@ GEM
xcpretty (~> 0.2, >= 0.0.7)
PLATFORMS
universal-darwin-21
x86_64-darwin-20
DEPENDENCIES
danger
fastlane
BUNDLED WITH

View File

@@ -24,13 +24,13 @@ buildscript {
classpath libs.gradle.gradlePlugin
classpath libs.gradle.kotlinPlugin
classpath libs.gradle.hiltPlugin
classpath 'com.google.firebase:firebase-appdistribution-gradle:3.0.2'
classpath 'com.google.firebase:firebase-appdistribution-gradle:3.0.3'
classpath 'com.google.gms:google-services:4.3.13'
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5'
classpath "com.likethesalad.android:stem-plugin:2.1.1"
classpath 'org.owasp:dependency-check-gradle:7.1.1'
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.0"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.10"
classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -41,10 +41,10 @@ plugins {
// ktlint Plugin
id "org.jlleitschuh.gradle.ktlint" version "10.3.0"
// Detekt
id "io.gitlab.arturbosch.detekt" version "1.20.0"
id "io.gitlab.arturbosch.detekt" version "1.21.0"
// Dependency Analysis
id 'com.autonomousapps.dependency-analysis' version "1.9.0"
id 'com.autonomousapps.dependency-analysis' version "1.12.0"
}
// https://github.com/jeremylong/DependencyCheck
@@ -126,6 +126,11 @@ allprojects {
enableExperimentalRules = true
// display the corresponding rule
verbose = true
reporters {
reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.PLAIN)
// To have XML report for Danger
reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.CHECKSTYLE)
}
disabledRules = [
// TODO Re-enable these 4 rules after reformatting project
"indent",
@@ -146,6 +151,8 @@ allprojects {
"experimental:comment-wrapping",
// - A KDoc comment after any other element on the same line must be separated by a new line
"experimental:kdoc-wrapping",
// Ignore error "Redundant curly braces", since we use it to fix false positives, for instance in "elementLogs.${i}.txt"
"string-template",
]
}

1
changelog.d/5525.wip Normal file
View File

@@ -0,0 +1 @@
Create DM room only on first message - Trigger the flow when the "Direct Message" action is selected from the room member details screen

1
changelog.d/5974.misc Normal file
View File

@@ -0,0 +1 @@
Removes the Login2 proof of concept - replaced by the FTUE changes

1
changelog.d/6505.wip Normal file
View File

@@ -0,0 +1 @@
added filter tabs for new App layout's Home screen

1
changelog.d/6645.misc Normal file
View File

@@ -0,0 +1 @@
Enable auto-capitalization for Room creation Title field

1
changelog.d/6693.feature Normal file
View File

@@ -0,0 +1 @@
Adds New App Layout FABs (hidden behind feature flag)

1
changelog.d/6746.feature Normal file
View File

@@ -0,0 +1 @@
[Notification] - Handle creation of notification for live location and poll start

1
changelog.d/6749.wip Normal file
View File

@@ -0,0 +1 @@
Adds space list bottom sheet for new app layout

1
changelog.d/6783.misc Normal file
View File

@@ -0,0 +1 @@
Decouples the variant logic from the vector module

1
changelog.d/6786.misc Normal file
View File

@@ -0,0 +1 @@
Add a developer setting to enable LeakCanary at runtime

1
changelog.d/6795.wip Normal file
View File

@@ -0,0 +1 @@
Makes toolbar switch title based on space in New App Layout

1
changelog.d/6798.wip Normal file
View File

@@ -0,0 +1 @@
[Devices management] Add a feature flag and empty screen for future new layout

1
changelog.d/6799.misc Normal file
View File

@@ -0,0 +1 @@
[Create Room] Reduce some boilerplate with room state event contents

1
changelog.d/6806.wip Normal file
View File

@@ -0,0 +1 @@
[Devices management] Other sessions section in new layout

1
changelog.d/6808.misc Normal file
View File

@@ -0,0 +1 @@
[Call] Memory leak after a call

1
changelog.d/6843.misc Normal file
View File

@@ -0,0 +1 @@
Fix some string template

View File

@@ -20,9 +20,9 @@ def retrofit = "2.9.0"
def arrow = "0.8.2"
def markwon = "4.6.2"
def moshi = "1.13.0"
def lifecycle = "2.5.0"
def lifecycle = "2.5.1"
def flowBinding = "1.2.0"
def flipper = "0.154.0"
def flipper = "0.157.0"
def epoxy = "4.6.2"
def mavericks = "2.7.0"
def glide = "4.13.2"
@@ -30,7 +30,7 @@ def bigImageViewer = "1.8.1"
def jjwt = "0.11.5"
def vanniktechEmoji = "0.15.0"
def fragment = "1.5.0"
def fragment = "1.5.2"
// Testing
def mockk = "1.12.3" // We need to use 1.12.3 to have mocking in androidTest until a new version is released: https://github.com/mockk/mockk/issues/819
@@ -50,7 +50,7 @@ ext.libs = [
'coroutinesTest' : "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinCoroutines"
],
androidx : [
'activity' : "androidx.activity:activity:1.5.0",
'activity' : "androidx.activity:activity:1.5.1",
'appCompat' : "androidx.appcompat:appcompat:1.4.2",
'biometric' : "androidx.biometric:biometric:1.1.0",
'core' : "androidx.core:core-ktx:1.8.0",

View File

@@ -74,6 +74,7 @@ ext.groups = [
'com.github.javaparser',
'com.github.piasy',
'com.github.shyiko.klob',
'com.github.rubensousa',
'com.google',
'com.google.android',
'com.google.api.grpc',
@@ -106,7 +107,9 @@ ext.groups = [
'com.pinterest.ktlint',
'com.posthog.android',
'com.squareup',
'com.squareup.curtains',
'com.squareup.duktape',
'com.squareup.leakcanary',
'com.squareup.moshi',
'com.squareup.okhttp3',
'com.squareup.okio',
@@ -125,6 +128,7 @@ ext.groups = [
'info.picocli',
'io.arrow-kt',
'io.element.android',
'io.github.davidburstrom.contester',
'io.github.detekt.sarif4k',
'io.github.microutils',
'io.github.reactivecircus.flowbinding',

105
docs/danger.md Normal file
View File

@@ -0,0 +1,105 @@
## Danger
<!--- TOC -->
* [What does danger checks](#what-does-danger-checks)
* [PR check](#pr-check)
* [Quality check](#quality-check)
* [Setup](#setup)
* [Run danger locally](#run-danger-locally)
* [Danger user](#danger-user)
* [Useful links](#useful-links)
<!--- END -->
## What does danger checks
### PR check
See the [dangerfile](../tools/danger/dangerfile.js). If you add rules in the dangerfile, please update the list below!
Here are the checks that Danger does so far:
- PR description is not empty
- Big PR got a warning to recommend to split
- PR contains a file for towncrier and extension is checked
- PR does not modify frozen classes
- PR contains a Sign-Off, with exception for Element employee contributors
- PR with change on layout should include screenshot in the description
- PR which adds png file warn about the usage of vector drawables
- non draft PR should have a reviewer
### Quality check
After all the checks that generate checkstyle XML report, such as Ktlint, lint, or Detekt, Danger is run with this [dangerfile](../tools/danger/dangerfile-lint.js), in order to post comments to the PR with the detected error and warnings.
To run locally, you will have to install the plugin `danger-plugin-lint-report` using:
```shell
yarn add danger-plugin-lint-report --dev
```
## Setup
This operation should not be necessary, since Danger is already setup for the project.
To setup danger to the project, run:
```shell
bundle exec danger init
```
## Run danger locally
When modifying the [dangerfile](../tools/danger/dangerfile.js), you can check it by running Danger locally.
To run danger locally, install it and run:
```shell
bundle exec danger pr <PR_URL> --dangerfile=./tools/danger/dangerfile.js
```
For instance:
```shell
bundle exec danger pr https://github.com/vector-im/element-android/pull/6637 --dangerfile=./tools/danger/dangerfile.js
```
We may need to create a GitHub token to have less API rate limiting, and then set the env var:
```shell
export DANGER_GITHUB_API_TOKEN='YOUR_TOKEN'
```
Swift and Kotlin (just in case)
```shell
bundle exec danger-swift pr <PR_URL> --dangerfile=./tools/danger/dangerfile.js
bundle exec danger-kotlin pr <PR_URL> --dangerfile=./tools/danger/dangerfile.js
```
## Danger user
To let Danger check all the PRs, including PRs form forks, a GitHub account have been created:
- login: ElementBot
- password: Stored on Passbolt
- GitHub token: A token with limited access has been created and added to the repository https://github.com/vector-im/element-android as secret DANGER_GITHUB_API_TOKEN. This token is not saved anywhere else. In case of problem, just delete it and create a new one, then update the secret.
PRs from forks do not always have access to the secret `secrets.DANGER_GITHUB_API_TOKEN`, so `secrets.GITHUB_TOKEN` is also provided to the job environment. If `secrets.DANGER_GITHUB_API_TOKEN` is available, it will be used, so user `ElementBot` will comment the PR. Else `secrets.GITHUB_TOKEN` will be used, and bot `github-actions` will comment the PR.
## Useful links
- https://danger.systems/
- https://danger.systems/js/
- https://danger.systems/js/guides/getting_started.html
- https://danger.systems/js/reference.html
- https://github.com/danger/awesome-danger
Some danger files to get inspired from
- https://github.com/artsy/emission/blob/master/dangerfile.ts
- https://github.com/facebook/react-native/blob/master/bots/dangerfile.js
- https://github.com/apollographql/apollo-client/blob/master/config/dangerfile.ts
- https://github.com/styleguidist/react-styleguidist/blob/master/dangerfile.js
- https://github.com/storybooks/storybook/blob/master/dangerfile.js
- https://github.com/ReactiveX/rxjs/blob/master/dangerfile.js

View File

@@ -48,7 +48,7 @@ mv towncrier.toml towncrier.toml.bak
sed 's/CHANGES\.md/CHANGES_NIGHTLY\.md/' towncrier.toml.bak > towncrier.toml
rm towncrier.toml.bak
yes n | towncrier --version nightly
./gradlew assembleGplayNightly appDistributionUploadGplayNightly $CI_GRADLE_ARG_PROPERTIES --stacktrace
./gradlew assembleGplayNightly appDistributionUploadGplayNightly $CI_GRADLE_ARG_PROPERTIES
```
Then you can reset the change on the codebase.

View File

@@ -0,0 +1,2 @@
Main changes in this version: Enables the improved sign in and sign up journeys.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Main changes in this version: Various bug fixes and stability improvements.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=97a52d145762adc241bad7fd18289bf7f6801e08ece6badf80402fe2b9f250b1
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
distributionSha256Sum=db9c8211ed63f61f60292c69e80d89196f9eb36665e369e7f00ac4cc841c2219
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -0,0 +1,4 @@
<vector android:height="22dp" android:viewportHeight="22"
android:viewportWidth="22" android:width="22dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#737D8C" android:fillType="evenOdd" android:pathData="M16.999,14.899C18.07,13.407 18.7,11.577 18.7,9.6C18.7,4.574 14.626,0.5 9.6,0.5C4.574,0.5 0.5,4.574 0.5,9.6C0.5,14.626 4.574,18.7 9.6,18.7C11.577,18.7 13.406,18.07 14.899,16.999C14.941,17.055 14.988,17.109 15.039,17.161L18.939,21.061C19.525,21.646 20.475,21.646 21.06,21.061C21.646,20.475 21.646,19.525 21.06,18.939L17.16,15.039C17.109,14.988 17.055,14.941 16.999,14.899ZM15.7,9.6C15.7,12.969 12.969,15.7 9.6,15.7C6.231,15.7 3.5,12.969 3.5,9.6C3.5,6.231 6.231,3.5 9.6,3.5C12.969,3.5 15.7,6.231 15.7,9.6Z"/>
</vector>

View File

@@ -71,4 +71,7 @@
<dimen name="location_sharing_compass_button_margin_horizontal">8dp</dimen>
<dimen name="location_sharing_live_duration_choice_margin_horizontal">12dp</dimen>
<dimen name="location_sharing_live_duration_choice_margin_vertical">22dp</dimen>
<!-- Material 3 -->
<dimen name="collapsing_toolbar_layout_medium_size">112dp</dimen>
</resources>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="DevicesListHeaderView">
<attr name="devicesListHeaderTitle" format="string" />
<attr name="devicesListHeaderDescription" format="string" />
</declare-styleable>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="LocationLiveEndedBannerView">
<declare-styleable name="LiveLocationEndedBannerView">
<attr name="locLiveEndedBkgWithAlpha" format="boolean" />
<attr name="locLiveEndedIconMarginStart" format="dimension" />
</declare-styleable>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MapLoadingErrorView">
<attr name="mapErrorDescription" format="string" />
</declare-styleable>
</resources>

View File

@@ -65,4 +65,8 @@
<item name="colorPrimary">?colorOnPrimary</item>
</style>
<style name="Widget.Vector.FloatingActionButton" parent="Widget.MaterialComponents.FloatingActionButton">
<item name="shapeAppearanceOverlay">@style/ShapeAppearanceOverlay.Material3.FloatingActionButton</item>
</style>
</resources>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="TextAppearance.Vector.Subtitle.Medium.DevicesManagement">
<item name="android:textColor">?vctr_content_primary</item>
</style>
<style name="TextAppearance.Vector.Body.DevicesManagement">
<item name="android:textColor">?vctr_content_secondary</item>
</style>
</resources>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Widget.Vector.Button.Text.OnPrimary.LocationLive">
<style name="Widget.Vector.Button.Text.OnPrimary.LiveLocation">
<item name="android:foreground">?selectableItemBackground</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:textSize">12sp</item>
@@ -12,7 +12,7 @@
<item name="android:insetLeft">8dp</item>
</style>
<style name="Widget.Vector.Button.Text.LocationLive">
<style name="Widget.Vector.Button.Text.LiveLocation">
<item name="android:foreground">?selectableItemBackground</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:textAppearance">@style/TextAppearance.Vector.Body.Medium</item>

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Widget.Vector.TabLayout" parent="Widget.MaterialComponents.TabLayout">
<item name="materialThemeOverlay">@style/ThemeOverlay.Vector.HomeFilterTabLayout</item>
<item name="tabTextAppearance">@style/TextAppearance.Vector.FilterTabTextAppearance</item>
</style>
<style name="TextAppearance.Vector.FilterTabTextAppearance" parent="TextAppearance.Vector.Subtitle">
<item name="textAllCaps">false</item>
</style>
<style name="ThemeOverlay.Vector.HomeFilterTabLayout" parent="Theme.Vector.Launcher">
<item name="colorSurface">?vctr_toolbar_background</item>
<item name="colorOnSurface">?vctr_content_secondary</item>
</style>
</resources>

View File

@@ -39,4 +39,14 @@
<item name="android:textSize">12sp</item>
</style>
</resources>
<!-- Material 3 -->
<style name="Widget.Vector.Material3.Toolbar" parent="Widget.Material3.Toolbar" />
<style name="Widget.Vector.Material3.CollapsingToolbar.Medium" parent="Widget.Material3.CollapsingToolbar.Medium">
<item name="expandedTitleTextAppearance">@style/TextAppearance.Vector.Title.Medium</item>
<item name="expandedTitleMarginBottom">20dp</item>
<item name="collapsedTitleTextAppearance">@style/TextAppearance.Vector.Headline.Bold</item>
</style>
</resources>

View File

@@ -32,6 +32,15 @@
<item name="android:textColor">?vctr_content_primary</item>
</style>
<style name="TextAppearance.Vector.Headline.Bold" parent="TextAppearance.MaterialComponents.Headline1">
<item name="fontFamily">sans-serif</item>
<item name="android:fontFamily">sans-serif</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">@dimen/text_size_headline</item>
<item name="android:letterSpacing">0</item>
<item name="android:textColor">?vctr_content_primary</item>
</style>
<style name="TextAppearance.Vector.Subtitle" parent="TextAppearance.MaterialComponents.Subtitle1">
<item name="fontFamily">sans-serif</item>
<item name="android:fontFamily">sans-serif</item>

View File

@@ -25,4 +25,4 @@
<item name="android:backgroundDimEnabled">false</item>
</style>
</resources>
</resources>

View File

@@ -149,6 +149,9 @@
<!-- Location sharing -->
<item name="vctr_live_location">@color/vctr_live_location_dark</item>
<!-- Material 3 -->
<item name="collapsingToolbarLayoutMediumSize">@dimen/collapsing_toolbar_layout_medium_size</item>
</style>
<style name="Theme.Vector.Dark" parent="Base.Theme.Vector.Dark" />

View File

@@ -150,8 +150,12 @@
<!-- Location sharing -->
<item name="vctr_live_location">@color/vctr_live_location_light</item>
<!-- Material 3 -->
<item name="collapsingToolbarLayoutMediumSize">@dimen/collapsing_toolbar_layout_medium_size</item>
</style>
<style name="Theme.Vector.Light" parent="Base.Theme.Vector.Light" />
</resources>

View File

@@ -17,7 +17,7 @@ buildscript {
}
}
dependencies {
classpath "io.realm:realm-gradle-plugin:10.11.0"
classpath "io.realm:realm-gradle-plugin:10.11.1"
}
}
@@ -60,7 +60,7 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
buildConfigField "String", "SDK_VERSION", "\"1.4.30\""
buildConfigField "String", "SDK_VERSION", "\"1.4.34\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""
@@ -199,7 +199,7 @@ dependencies {
implementation libs.apache.commonsImaging
// Phone number https://github.com/google/libphonenumber
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.52'
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.53'
testImplementation libs.tests.junit
// Note: version sticks to 1.9.2 due to https://github.com/mockk/mockk/issues/281

View File

@@ -62,7 +62,10 @@ fun Throwable.isUsernameInUse() = this is Failure.ServerError &&
error.code == MatrixError.M_USER_IN_USE
fun Throwable.isInvalidUsername() = this is Failure.ServerError &&
error.code == MatrixError.M_INVALID_USERNAME
(error.code == MatrixError.M_INVALID_USERNAME || usernameContainsNonAsciiCharacters())
private fun Failure.ServerError.usernameContainsNonAsciiCharacters() = error.code == MatrixError.M_UNKNOWN &&
error.message == "Query parameter \'username\' must be ascii"
fun Throwable.isInvalidPassword() = this is Failure.ServerError &&
error.code == MatrixError.M_FORBIDDEN &&

View File

@@ -29,14 +29,12 @@ data class RoomGuestAccessContent(
// Required. Whether guests can join the room. One of: ["can_join", "forbidden"]
@Json(name = "guest_access") val guestAccessStr: String? = null
) {
val guestAccess: GuestAccess? = when (guestAccessStr) {
"can_join" -> GuestAccess.CanJoin
"forbidden" -> GuestAccess.Forbidden
else -> {
Timber.w("Invalid value for GuestAccess: `$guestAccessStr`")
null
}
}
val guestAccess: GuestAccess? = GuestAccess.values()
.find { it.value == guestAccessStr }
?: run {
Timber.w("Invalid value for GuestAccess: `$guestAccessStr`")
null
}
}
@JsonClass(generateAdapter = false)

View File

@@ -23,30 +23,30 @@ import com.squareup.moshi.JsonClass
* Ref: https://matrix.org/docs/spec/client_server/latest#room-history-visibility
*/
@JsonClass(generateAdapter = false)
enum class RoomHistoryVisibility {
enum class RoomHistoryVisibility(val value: String) {
/**
* All events while this is the m.room.history_visibility value may be shared by any
* participating homeserver with anyone, regardless of whether they have ever joined the room.
*/
@Json(name = "world_readable") WORLD_READABLE,
@Json(name = "world_readable") WORLD_READABLE("world_readable"),
/**
* Previous events are always accessible to newly joined members. All events in the
* room are accessible, even those sent when the member was not a part of the room.
*/
@Json(name = "shared") SHARED,
@Json(name = "shared") SHARED("shared"),
/**
* Events are accessible to newly joined members from the point they were invited onwards.
* Events stop being accessible when the member's state changes to something other than invite or join.
*/
@Json(name = "invited") INVITED,
@Json(name = "invited") INVITED("invited"),
/**
* Events are accessible to newly joined members from the point they joined the room onwards.
* Events stop being accessible when the member's state changes to something other than join.
*/
@Json(name = "joined") JOINED
@Json(name = "joined") JOINED("joined")
}
/**

View File

@@ -24,14 +24,10 @@ import timber.log.Timber
data class RoomHistoryVisibilityContent(
@Json(name = "history_visibility") val historyVisibilityStr: String? = null
) {
val historyVisibility: RoomHistoryVisibility? = when (historyVisibilityStr) {
"world_readable" -> RoomHistoryVisibility.WORLD_READABLE
"shared" -> RoomHistoryVisibility.SHARED
"invited" -> RoomHistoryVisibility.INVITED
"joined" -> RoomHistoryVisibility.JOINED
else -> {
Timber.w("Invalid value for RoomHistoryVisibility: `$historyVisibilityStr`")
null
}
}
val historyVisibility: RoomHistoryVisibility? = RoomHistoryVisibility.values()
.find { it.value == historyVisibilityStr }
?: run {
Timber.w("Invalid value for RoomHistoryVisibility: `$historyVisibilityStr`")
null
}
}

View File

@@ -16,7 +16,6 @@
package org.matrix.android.sdk.api.session.room.model.create
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toContent
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
@@ -30,7 +29,7 @@ interface RoomFeaturePreset {
fun updateRoomParams(params: CreateRoomParams)
fun setupInitialStates(): List<Event>?
fun setupInitialStates(): List<CreateRoomStateEvent>?
}
class RestrictedRoomPreset(val homeServerCapabilities: HomeServerCapabilities, val restrictedList: List<RoomJoinRulesAllowEntry>) : RoomFeaturePreset {
@@ -41,9 +40,9 @@ class RestrictedRoomPreset(val homeServerCapabilities: HomeServerCapabilities, v
params.roomVersion = homeServerCapabilities.versionOverrideForFeature(HomeServerCapabilities.ROOM_CAP_RESTRICTED)
}
override fun setupInitialStates(): List<Event>? {
override fun setupInitialStates(): List<CreateRoomStateEvent> {
return listOf(
Event(
CreateRoomStateEvent(
type = EventType.STATE_ROOM_JOIN_RULES,
stateKey = "",
content = RoomJoinRulesContent(

View File

@@ -22,7 +22,7 @@ import org.matrix.android.sdk.api.session.events.model.Content
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
/**
* Content of the state event of type
* Content of the event of type
* [EventType.BEACON_LOCATION_DATA][org.matrix.android.sdk.api.session.events.model.EventType.BEACON_LOCATION_DATA]
*
* It contains location data related to a live location share.

View File

@@ -76,7 +76,7 @@ object StringOrderUtils {
}
fun stringToBase(x: String, alphabet: CharArray): BigInteger {
if (x.isEmpty()) throw IllegalArgumentException()
require(x.isNotEmpty())
val len = alphabet.size.toBigInteger()
var result = BigInteger("0")
x.reversed().forEachIndexed { index, c ->

View File

@@ -535,7 +535,7 @@ internal class MXMegolmEncryption(
@Throws
override suspend fun shareHistoryKeysWithDevice(inboundSessionWrapper: InboundGroupSessionHolder, deviceInfo: CryptoDeviceInfo) {
if (!inboundSessionWrapper.wrapper.sessionData.sharedHistory) throw IllegalArgumentException("This key can't be shared")
require(inboundSessionWrapper.wrapper.sessionData.sharedHistory) { "This key can't be shared" }
Timber.tag(loggerTag.value).i("process shareHistoryKeys for ${inboundSessionWrapper.wrapper.safeSessionId} to ${deviceInfo.shortDebugString()}")
val userId = deviceInfo.userId
val deviceId = deviceInfo.deviceId

View File

@@ -63,7 +63,7 @@ internal class VerificationMessageProcessor @Inject constructor(
// the message should be ignored by the receiver.
if (!VerificationService.isValidRequest(event.ageLocalTs, clock.epochMillis())) return Unit.also {
Timber.d("## SAS Verification live observer: msgId: ${event.eventId} is outdated age:$event.ageLocalTs ms")
Timber.d("## SAS Verification live observer: msgId: ${event.eventId} is outdated age:${event.ageLocalTs} ms")
}
Timber.v("## SAS Verification live observer: received msgId: ${event.eventId} type: ${event.getClearType()}")

View File

@@ -76,12 +76,12 @@ internal class VerificationTransportToDevice(
.configureWith(SendToDeviceTask.Params(MessageType.MSGTYPE_VERIFICATION_REQUEST, contentMap)) {
this.callback = object : MatrixCallback<Unit> {
override fun onSuccess(data: Unit) {
Timber.v("## verification [$tx.transactionId] send toDevice request success")
Timber.v("## verification [${tx?.transactionId}] send toDevice request success")
callback.invoke(localId, validKeyReq)
}
override fun onFailure(failure: Throwable) {
Timber.e("## verification [$tx.transactionId] failed to send toDevice request")
Timber.e("## verification [${tx?.transactionId}] failed to send toDevice request")
}
}
}
@@ -103,12 +103,12 @@ internal class VerificationTransportToDevice(
.configureWith(SendToDeviceTask.Params(EventType.KEY_VERIFICATION_READY, contentMap)) {
this.callback = object : MatrixCallback<Unit> {
override fun onSuccess(data: Unit) {
Timber.v("## verification [$tx.transactionId] send toDevice request success")
Timber.v("## verification [${tx?.transactionId}] send toDevice request success")
callback?.invoke()
}
override fun onFailure(failure: Throwable) {
Timber.e("## verification [$tx.transactionId] failed to send toDevice request")
Timber.e("## verification [${tx?.transactionId}] failed to send toDevice request")
}
}
}
@@ -136,7 +136,7 @@ internal class VerificationTransportToDevice(
.configureWith(SendToDeviceTask.Params(type, contentMap)) {
this.callback = object : MatrixCallback<Unit> {
override fun onSuccess(data: Unit) {
Timber.v("## SAS verification [$tx.transactionId] toDevice type '$type' success.")
Timber.v("## SAS verification [${tx.transactionId}] toDevice type '$type' success.")
if (onDone != null) {
onDone()
} else {
@@ -149,7 +149,7 @@ internal class VerificationTransportToDevice(
}
override fun onFailure(failure: Throwable) {
Timber.e("## SAS verification [$tx.transactionId] failed to send toDevice in state : $tx.state")
Timber.e("## SAS verification [${tx.transactionId}] failed to send toDevice in state : ${tx.state}")
tx.cancel(onErrorReason)
}
}

View File

@@ -93,7 +93,7 @@ internal class SessionRealmConfigurationFactory @Inject constructor(
return
}
listOf(REALM_NAME, "$REALM_NAME.lock", "$REALM_NAME.note", "$REALM_NAME.management").forEach { file ->
listOf(REALM_NAME, "${REALM_NAME}.lock", "${REALM_NAME}.note", "${REALM_NAME}.management").forEach { file ->
try {
File(directory, file).deleteRecursively()
} catch (e: Exception) {

View File

@@ -20,8 +20,13 @@ import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.content.EncryptionEventContent
import org.matrix.android.sdk.api.session.events.model.toContent
import org.matrix.android.sdk.api.session.identity.IdentityServiceError
import org.matrix.android.sdk.api.session.identity.toMedium
import org.matrix.android.sdk.api.session.room.model.RoomAvatarContent
import org.matrix.android.sdk.api.session.room.model.RoomGuestAccessContent
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibilityContent
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
import org.matrix.android.sdk.api.util.MimeTypes
import org.matrix.android.sdk.internal.crypto.DeviceListManager
@@ -78,7 +83,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
buildAvatarEvent(params),
buildGuestAccess(params)
) +
params.featurePreset?.setupInitialStates().orEmpty() +
buildFeaturePresetInitialStates(params) +
buildCustomInitialStates(params)
)
.takeIf { it.isNotEmpty() }
@@ -99,6 +104,16 @@ internal class CreateRoomBodyBuilder @Inject constructor(
)
}
private fun buildFeaturePresetInitialStates(params: CreateRoomParams): List<Event> {
return params.featurePreset?.setupInitialStates().orEmpty().map {
Event(
type = it.type,
stateKey = it.stateKey,
content = it.content
)
}
}
private fun buildCustomInitialStates(params: CreateRoomParams): List<Event> {
return params.initialStates.map {
Event(
@@ -123,7 +138,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
Event(
type = EventType.STATE_ROOM_AVATAR,
stateKey = "",
content = mapOf("url" to response.contentUri)
content = RoomAvatarContent(response.contentUri).toContent()
)
}
}
@@ -134,7 +149,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
Event(
type = EventType.STATE_ROOM_HISTORY_VISIBILITY,
stateKey = "",
content = mapOf("history_visibility" to it)
content = RoomHistoryVisibilityContent(it.value).toContent()
)
}
}
@@ -145,7 +160,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
Event(
type = EventType.STATE_ROOM_GUEST_ACCESS,
stateKey = "",
content = mapOf("guest_access" to it.value)
content = RoomGuestAccessContent(it.value).toContent()
)
}
}
@@ -167,7 +182,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
Event(
type = EventType.STATE_ROOM_ENCRYPTION,
stateKey = "",
content = mapOf("algorithm" to it)
content = EncryptionEventContent(it).toContent()
)
}
}

View File

@@ -119,7 +119,7 @@ internal class EventSenderProcessorThread @Inject constructor(
override fun cancel(eventId: String, roomId: String) {
(currentTask as? SendEventQueuedTask)
?.takeIf { it -> it.event.eventId == eventId && it.event.roomId == roomId }
?.takeIf { it.event.eventId == eventId && it.event.roomId == roomId }
?.cancel()
}

View File

@@ -16,21 +16,6 @@
# limitations under the License.
#
#######################################################################################################################
# Check frozen class modification
#######################################################################################################################
echo "Check if frozen class modified"
git diff "HEAD@{1}" --name-only | grep -e OlmInboundGroupSessionWrapper.kt -e OlmInboundGroupSessionWrapper2.kt
FROZEN_CHANGED=$?
if [ ${FROZEN_CHANGED} -eq 0 ]; then
echo "❌ FROZEN CLASS CHANGED ERROR"
exit 1
else
echo "Frozen check OK"
fi
#######################################################################################################################
# Check drawable quantity
#######################################################################################################################

View File

@@ -185,3 +185,6 @@ System\.currentTimeMillis\(\)===2
onCreateOptionsMenu
onOptionsItemSelected
onPrepareOptionsMenu
### Suspicious String template. Please check that the string template will behave as expected, i.e. the class field and not the whole object will be used. For instance `Timber.d("$event.type")` is not correct, you should write `Timber.d("${event.type}")`. In the former the whole event content will be logged, since it's a data class. If this is expected (i.e. to fix false positive), please add explicit curly braces (`{` and `}`) around the variable, for instance `"elementLogs.${i}.txt"`
\$[a-zA-Z_]\w*\??\.[a-zA-Z_]

View File

@@ -0,0 +1,29 @@
import { schedule } from 'danger'
/**
* Ref and documentation: https://github.com/damian-burke/danger-plugin-lint-report
* This file will check all the error in XML Checkstyle format.
* It covers, lint, ktlint, and detekt errors
*/
const reporter = require("danger-plugin-lint-report")
schedule(reporter.scan({
/**
* File mask used to find XML checkstyle reports.
*/
fileMask: "**/reports/**/**.xml",
/**
* If set to true, the severity will be used to switch between the different message formats (message, warn, fail).
*/
reportSeverity: true,
/**
* If set to true, only issues will be reported that are contained in the current changeset (line comparison).
* If set to false, all issues that are in modified files will be reported.
*/
requireLineModification: false,
/**
* Optional: Sets a prefix foreach violation message.
* This can be useful if there are multiple reports being parsed to make them distinguishable.
*/
// outputPrefix?: ""
}))

120
tools/danger/dangerfile.js Normal file
View File

@@ -0,0 +1,120 @@
const {danger, warn} = require('danger')
/**
* Note: if you update the checks in this file, please also update the file ./docs/danger.md
*/
// Useful to see what we got in danger object
// warn(JSON.stringify(danger))
const pr = danger.github.pr
const github = danger.github
// User who has created the PR.
const user = pr.user.login
const modified = danger.git.modified_files
const created = danger.git.created_files
const editedFiles = [...modified, ...created]
// Check that the PR has a description
if (pr.body.length == 0) {
warn("Please provide a description for this PR.")
}
// Warn when there is a big PR
if (editedFiles.length > 50) {
message("This pull request seems relatively large. Please consider splitting it into multiple smaller ones.")
}
// Request a changelog for each PR
const changelogAllowList = [
"dependabot[bot]",
]
const requiresChangelog = !changelogAllowList.includes(user)
if (requiresChangelog) {
const changelogFiles = editedFiles.filter(file => file.startsWith("changelog.d/"))
if (changelogFiles.length == 0) {
warn("Please add a changelog. See instructions [here](https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#changelog)")
} else {
const validTowncrierExtensions = [
"bugfix",
"doc",
"feature",
"misc",
"sdk",
"wip",
]
if (!changelogFiles.every(file => validTowncrierExtensions.includes(file.split(".").pop()))) {
fail("Invalid extension for changelog. See instructions [here](https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#changelog)")
}
}
}
// check that frozen classes have not been modified
const frozenClasses = [
"OlmInboundGroupSessionWrapper.kt",
"OlmInboundGroupSessionWrapper2.kt",
]
frozenClasses.forEach(frozen => {
if (editedFiles.some(file => file.endsWith(frozen))) {
fail("Frozen class `" + frozen + "` has been modified. Please do not modify frozen class.")
}
}
)
// Check for a sign-off
const signOff = "Signed-off-by:"
// Please add new names following the alphabetical order.
const allowList = [
"aringenbach",
"BillCarsonFr",
"bmarty",
"Claire1817",
"dependabot[bot]",
"ericdecanini",
"fedrunov",
"Florian14",
"ganfra",
"jmartinesp",
"langleyd",
"MadLittleMods",
"manuroe",
"mnaturel",
"onurays",
"ouchadam",
"stefanceriu",
"yostyle",
]
const requiresSignOff = !allowList.includes(user)
if (requiresSignOff) {
const hasPRBodySignOff = pr.body.includes(signOff)
const hasCommitSignOff = danger.git.commits.every(commit => commit.message.includes(signOff))
if (!hasPRBodySignOff && !hasCommitSignOff) {
fail("Please add a sign-off to either the PR description or to the commits themselves. See instructions [here](https://matrix-org.github.io/synapse/latest/development/contributing_guide.html#sign-off).")
}
}
// Check for screenshots on view changes
const hasChangedViews = editedFiles.filter(file => file.includes("/layout")).length > 0
if (hasChangedViews) {
if (!pr.body.includes("user-images")) {
warn("You seem to have made changes to views. Please consider adding screenshots.")
}
}
// Check for pngs on resources
const hasPngs = editedFiles.filter(file => file.toLowerCase().endsWith(".png")).length > 0
if (hasPngs) {
warn("You seem to have made changes to some images. Please consider using an vector drawable.")
}
// Check for reviewers
if (github.requested_reviewers.users.length == 0 && !pr.draft) {
warn("Please add a reviewer to your PR.")
}

View File

@@ -23,6 +23,8 @@ style:
active: false
ProtectedMemberInFinalClass:
active: false
UseCheckOrError:
active: false
empty-blocks:
EmptyFunctionBlock:
@@ -43,6 +45,8 @@ exceptions:
active: false
TooGenericExceptionThrown:
active: false
InstanceOfCheckForException:
active: false
complexity:
TooManyFunctions:

View File

@@ -2634,7 +2634,8 @@
"mask",
"sick",
"ill",
"disease"
"disease",
"covid"
]
},
"face-with-thermometer": {
@@ -2647,7 +2648,8 @@
"thermometer",
"temperature",
"cold",
"fever"
"fever",
"covid"
]
},
"face-with-headbandage": {
@@ -4481,7 +4483,9 @@
"hope",
"wish",
"namaste",
"highfive"
"highfive",
"thank you",
"appreciate"
]
},
"writing-hand": {
@@ -9581,7 +9585,8 @@
"amoeba",
"bacteria",
"virus",
"germs"
"germs",
"covid"
]
},
"bouquet": {
@@ -10260,7 +10265,9 @@
"baguette",
"bread",
"food",
"french"
"french",
"france",
"bakery"
]
},
"flatbread": {
@@ -10272,7 +10279,8 @@
"naan",
"pita",
"flour",
"food"
"food",
"bakery"
]
},
"pretzel": {
@@ -10282,7 +10290,9 @@
"twisted",
"convoluted",
"food",
"bread"
"bread",
"germany",
"bakery"
]
},
"bagel": {
@@ -10293,7 +10303,8 @@
"breakfast",
"schmear",
"food",
"bread"
"bread",
"jewish"
]
},
"pancakes": {
@@ -10306,7 +10317,8 @@
"hotcake",
"pancake",
"flapjacks",
"hotcakes"
"hotcakes",
"brunch"
]
},
"waffle": {
@@ -10316,7 +10328,8 @@
"breakfast",
"indecisive",
"iron",
"food"
"food",
"brunch"
]
},
"cheese-wedge": {
@@ -10325,7 +10338,8 @@
"j": [
"cheese",
"food",
"chadder"
"chadder",
"swiss"
]
},
"meat-on-bone": {
@@ -10376,7 +10390,8 @@
"food",
"meat",
"pork",
"pig"
"pig",
"brunch"
]
},
"hamburger": {
@@ -10400,7 +10415,8 @@
"fries",
"chips",
"snack",
"fast food"
"fast food",
"potato"
]
},
"pizza": {
@@ -10410,7 +10426,8 @@
"cheese",
"slice",
"food",
"party"
"party",
"italy"
]
},
"hot-dog": {
@@ -10420,7 +10437,8 @@
"frankfurter",
"hotdog",
"sausage",
"food"
"food",
"america"
]
},
"sandwich": {
@@ -10429,7 +10447,9 @@
"j": [
"bread",
"food",
"lunch"
"lunch",
"toast",
"bakery"
]
},
"taco": {
@@ -10468,7 +10488,8 @@
"food",
"gyro",
"kebab",
"stuffed"
"stuffed",
"mediterranean"
]
},
"falafel": {
@@ -10477,7 +10498,8 @@
"j": [
"chickpea",
"meatball",
"food"
"food",
"mediterranean"
]
},
"egg": {
@@ -10498,7 +10520,8 @@
"frying",
"pan",
"food",
"kitchen"
"kitchen",
"skillet"
]
},
"shallow-pan-of-food": {
@@ -10510,7 +10533,8 @@
"paella",
"pan",
"shallow",
"cooking"
"cooking",
"skillet"
]
},
"pot-of-food": {
@@ -10521,7 +10545,8 @@
"stew",
"food",
"meat",
"soup"
"soup",
"hot pot"
]
},
"fondue": {
@@ -10556,7 +10581,8 @@
"green",
"salad",
"healthy",
"lettuce"
"lettuce",
"vegetable"
]
},
"popcorn": {
@@ -10566,7 +10592,8 @@
"food",
"movie theater",
"films",
"snack"
"snack",
"drama"
]
},
"butter": {
@@ -10592,7 +10619,8 @@
"j": [
"can",
"food",
"soup"
"soup",
"tomatoes"
]
},
"bento-box": {
@@ -10602,7 +10630,8 @@
"bento",
"box",
"food",
"japanese"
"japanese",
"lunch"
]
},
"rice-cracker": {
@@ -10612,7 +10641,8 @@
"cracker",
"rice",
"food",
"japanese"
"japanese",
"snack"
]
},
"rice-ball": {
@@ -10633,7 +10663,6 @@
"cooked",
"rice",
"food",
"china",
"asian"
]
},
@@ -10680,7 +10709,8 @@
"roasted",
"sweet",
"food",
"nature"
"nature",
"plant"
]
},
"oden": {
@@ -10745,7 +10775,8 @@
"autumn",
"festival",
"yuèbǐng",
"food"
"food",
"dessert"
]
},
"dango": {
@@ -10772,7 +10803,8 @@
"jiaozi",
"pierogi",
"potsticker",
"food"
"food",
"gyoza"
]
},
"fortune-cookie": {
@@ -10780,7 +10812,8 @@
"b": "1F960",
"j": [
"prophecy",
"food"
"food",
"dessert"
]
},
"takeout-box": {
@@ -22169,7 +22202,9 @@
"nation",
"country",
"banner",
"japan"
"japan",
"jp",
"ja"
]
},
"flag-kenya": {

View File

@@ -28,6 +28,7 @@ mv ./fastlane/metadata/android/fy ./fastlane_tmp
mv ./fastlane/metadata/android/ga ./fastlane_tmp
mv ./fastlane/metadata/android/kab ./fastlane_tmp
mv ./fastlane/metadata/android/nb ./fastlane_tmp
mv ./fastlane/metadata/android/gl ./fastlane_tmp
# Fastlane / PlayStore require longDescription and shortDescription file to be set, so copy the default
# one for languages where they are missing

View File

@@ -1,45 +0,0 @@
#!/usr/bin/env bash
#
# 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.
#
branch=${TRAVIS_BRANCH}
# echo ${TRAVIS_BRANCH}
# If not on develop, exit, else we cannot get the list of modified files
# It is ok to check only when on develop branch
if [[ "${branch}" -eq 'develop' ]]; then
echo "Check that a file has been added to /changelog.d"
else
echo "Not on develop branch"
exit 0
fi
# git status
listOfModifiedFiles=`git diff --name-only HEAD ${branch}`
# echo "List of modified files by this PR:"
# echo ${listOfModifiedFiles}
if [[ ${listOfModifiedFiles} = *"changelog.d"* ]]; then
echo "A file has been added to /changelog.d!"
else
echo "❌ Please add a file describing your changes in /changelog.d. See https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#changelog"
exit 1
fi

View File

@@ -0,0 +1,48 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.config
/**
* The types of analytics Element currently supports.
*/
sealed interface Analytics {
/**
* Disables the analytics integrations.
*/
object Disabled : Analytics
/**
* Analytics integration via PostHog.
*/
data class PostHog(
/**
* The PostHog instance url.
*/
val postHogHost: String,
/**
* The PostHog instance API key.
*/
val postHogApiKey: String,
/**
* A URL to more information about the analytics collection.
*/
val policyLink: String,
) : Analytics
}

View File

@@ -36,4 +36,57 @@ object Config {
* - Changing the value from `true` to `false` will force the app to return to the background sync / Firebase Push.
*/
const val ALLOW_EXTERNAL_UNIFIED_PUSH_DISTRIBUTORS = true
const val ENABLE_LOCATION_SHARING = true
const val LOCATION_MAP_TILER_KEY = "fU3vlMsMn4Jb6dnEIFsx"
/**
* The maximum length of voice messages in milliseconds.
*/
const val VOICE_MESSAGE_LIMIT_MS = 120_000L
/**
* The strategy for sharing device keys.
*/
val KEY_SHARING_STRATEGY = KeySharingStrategy.WhenTyping
/**
* The onboarding flow.
*/
val ONBOARDING_VARIANT = OnboardingVariant.FTUE_AUTH
/**
* If set, MSC3086 asserted identity messages sent on VoIP calls will cause the call to appear in the room corresponding to the asserted identity.
* This *must* only be set in trusted environments.
*/
const val HANDLE_CALL_ASSERTED_IDENTITY_EVENTS = false
const val LOW_PRIVACY_LOG_ENABLE = false
const val ENABLE_STRICT_MODE_LOGS = false
/**
* The analytics configuration to use for the Debug build type.
* Can be disabled by providing Analytics.Disabled
*/
val DEBUG_ANALYTICS_CONFIG = Analytics.PostHog(
postHogHost = "https://posthog.element.dev",
postHogApiKey = "phc_VtA1L35nw3aeAtHIx1ayrGdzGkss7k1xINeXcoIQzXN",
policyLink = "https://element.io/cookie-policy",
)
/**
* The analytics configuration to use for the Release build type.
* Can be disabled by providing Analytics.Disabled
*/
val RELEASE_ANALYTICS_CONFIG = Analytics.PostHog(
postHogHost = "https://posthog.hss.element.io",
postHogApiKey = "phc_Jzsm6DTm6V2705zeU5dcNvQDlonOR68XvX2sh1sEOHO",
policyLink = "https://element.io/cookie-policy",
)
/**
* The analytics configuration to use for the Nightly build type.
* Can be disabled by providing Analytics.Disabled
*/
val NIGHTLY_ANALYTICS_CONFIG = RELEASE_ANALYTICS_CONFIG
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.config
enum class KeySharingStrategy {
/**
* Keys will be sent for the first time when the first message is sent.
* This is handled by the Matrix SDK so there's no need to do it in Vector.
*/
WhenSendingEvent,
/**
* Keys will be sent for the first time when the timeline displayed.
*/
WhenEnteringRoom,
/**
* Keys will be sent for the first time when a typing started.
*/
WhenTyping
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2019 New Vector Ltd
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,14 +14,9 @@
* limitations under the License.
*/
package im.vector.app.features.login2
package im.vector.app.config
enum class SignMode2 {
Unknown,
// Account creation
SignUp,
// Login
SignIn
enum class OnboardingVariant {
LEGACY,
FTUE_AUTH
}

View File

@@ -27,6 +27,7 @@ knit {
exclude '**/.gradle/**'
exclude '**/towncrier/template.md'
exclude '**/CHANGES.md'
exclude '/node_modules'
}
}
@@ -36,7 +37,7 @@ ext.versionMinor = 4
// Note: even values are reserved for regular release, odd values for hotfix release.
// When creating a hotfix, you should decrease the value, since the current value
// is the value for the next regular release.
ext.versionPatch = 30
ext.versionPatch = 34
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'
@@ -155,19 +156,6 @@ android {
buildConfigField "String", "GIT_BRANCH_NAME", "\"${gitBranchName()}\""
buildConfigField "String", "BUILD_NUMBER", "\"${buildNumber}\""
buildConfigField "im.vector.app.features.VectorFeatures.OnboardingVariant", "ONBOARDING_VARIANT", "im.vector.app.features.VectorFeatures.OnboardingVariant.FTUE_AUTH"
buildConfigField "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy", "outboundSessionKeySharingStrategy", "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy.WhenTyping"
buildConfigField "Long", "VOICE_MESSAGE_DURATION_LIMIT_MS", "120_000L"
// If set, MSC3086 asserted identity messages sent on VoIP calls will cause the call to appear in the room corresponding to the asserted identity.
// This *must* only be set in trusted environments.
buildConfigField "Boolean", "handleCallAssertedIdentityEvents", "false"
buildConfigField "Boolean", "enableLocationSharing", "true"
buildConfigField "String", "mapTilerKey", "\"fU3vlMsMn4Jb6dnEIFsx\""
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// Keep abiFilter for the universalApk
@@ -249,10 +237,6 @@ android {
resValue "string", "app_name", "Element dbg"
resValue "color", "launcher_background", "#0DBD8B"
buildConfigField "boolean", "LOW_PRIVACY_LOG_ENABLE", "false"
// Set to true if you want to enable strict mode in debug
buildConfigField "boolean", "ENABLE_STRICT_MODE_LOGS", "false"
signingConfig signingConfigs.debug
if (project.hasProperty("coverage")) {
@@ -264,10 +248,6 @@ android {
resValue "string", "app_name", "Element"
resValue "color", "launcher_background", "#0DBD8B"
buildConfigField "boolean", "LOW_PRIVACY_LOG_ENABLE", "false"
buildConfigField "boolean", "ENABLE_STRICT_MODE_LOGS", "false"
// When updating this block, please also update the same block in the `nightly` buildType below
postprocessing {
removeUnusedCode true
removeUnusedResources true
@@ -327,8 +307,6 @@ android {
isDefault = true
versionName "${versionMajor}.${versionMinor}.${versionPatch}${getGplayVersionSuffix()}"
resValue "bool", "isGplay", "true"
buildConfigField "boolean", "ALLOW_FCM_USE", "true"
buildConfigField "String", "SHORT_FLAVOR_DESCRIPTION", "\"G\""
buildConfigField "String", "FLAVOR_DESCRIPTION", "\"GooglePlay\""
}
@@ -338,8 +316,6 @@ android {
versionName "${versionMajor}.${versionMinor}.${versionPatch}${getFdroidVersionSuffix()}"
resValue "bool", "isGplay", "false"
buildConfigField "boolean", "ALLOW_FCM_USE", "false"
buildConfigField "String", "SHORT_FLAVOR_DESCRIPTION", "\"F\""
buildConfigField "String", "FLAVOR_DESCRIPTION", "\"FDroid\""
}
@@ -415,7 +391,7 @@ dependencies {
implementation libs.androidx.biometric
implementation "org.threeten:threetenbp:1.4.0:no-tzdb"
implementation "com.gabrielittner.threetenbp:lazythreetenbp:0.10.0"
implementation "com.gabrielittner.threetenbp:lazythreetenbp:0.11.0"
implementation libs.squareup.moshi
kapt libs.squareup.moshiKotlin
@@ -437,7 +413,7 @@ dependencies {
implementation 'com.facebook.stetho:stetho:1.6.0'
// Phone number https://github.com/google/libphonenumber
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.52'
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.53'
// FlowBinding
implementation libs.github.flowBinding
@@ -449,6 +425,9 @@ dependencies {
implementation libs.airbnb.epoxyPaging
implementation libs.airbnb.mavericks
// Snap Helper https://github.com/rubensousa/GravitySnapHelper
implementation 'com.github.rubensousa:gravitysnaphelper:2.2.2'
// Nightly
// API-only library
gplayImplementation libs.google.appdistributionApi
@@ -521,7 +500,7 @@ dependencies {
implementation 'com.posthog.android:posthog:1.1.2'
// UnifiedPush
implementation 'com.github.UnifiedPush:android-connector:2.0.0'
implementation 'com.github.UnifiedPush:android-connector:2.0.1'
// UnifiedPush gplay flavor only
gplayImplementation('com.github.UnifiedPush:android-embedded_fcm_distributor:2.1.1') {
exclude group: 'com.google.firebase', module: 'firebase-core'
@@ -597,7 +576,7 @@ dependencies {
debugImplementation "com.kgurgul.flipper:flipper-realm-android:2.2.0"
// Activate when you want to check for leaks, from time to time.
//debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3'
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
androidTestImplementation libs.androidx.testCore
androidTestImplementation libs.androidx.testRunner
@@ -620,4 +599,5 @@ dependencies {
androidTestImplementation libs.mockk.mockkAndroid
androidTestUtil libs.androidx.orchestrator
debugImplementation libs.androidx.fragmentTesting
androidTestImplementation "org.jetbrains.kotlin:kotlin-reflect:1.7.10"
}

View File

@@ -102,6 +102,7 @@
<!-- Wording -->
<issue id="Typos" severity="error" />
<issue id="TypographyDashes" severity="error" />
<issue id="PluralsCandidate" severity="error" />
<!-- DI -->
<issue id="JvmStaticProvidesInObjectDetector" severity="error" />

View File

@@ -27,6 +27,7 @@ import im.vector.app.features.MainActivity
import im.vector.app.ui.robot.ElementRobot
import org.junit.Rule
import org.junit.Test
import org.junit.rules.RuleChain
import org.junit.runner.RunWith
import java.util.UUID
@@ -35,7 +36,9 @@ import java.util.UUID
class CantVerifyTest : VerificationTestBase() {
@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)
val testRule = RuleChain
.outerRule(ActivityScenarioRule(MainActivity::class.java))
.around(ClearCurrentSessionRule())
private val elementRobot = ElementRobot()
var userName: String = "loginTest_${UUID.randomUUID()}"

View File

@@ -0,0 +1,63 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.test.platform.app.InstrumentationRegistry
import im.vector.app.features.analytics.store.AnalyticsStore
import kotlinx.coroutines.runBlocking
import org.junit.rules.TestWatcher
import org.junit.runner.Description
import org.junit.runners.model.Statement
import kotlin.reflect.KClass
/**
* A TestRule to reset and clear the current Session.
* If a Session is active it will be signed out and cleared from the ActiveSessionHolder.
* The VectorPreferences and AnalyticsDatastore are also cleared in an attempt to recreate a fresh base.
*/
class ClearCurrentSessionRule : TestWatcher() {
override fun apply(base: Statement, description: Description): Statement {
val context = InstrumentationRegistry.getInstrumentation().targetContext
runBlocking {
reflectAnalyticDatastore(context).edit { it.clear() }
runCatching {
val holder = (context.applicationContext as VectorApplication).activeSessionHolder
holder.getSafeActiveSession()?.signOutService()?.signOut(true)
(context.applicationContext as VectorApplication).vectorPreferences.clearPreferences()
holder.clearActiveSession()
}
}
return super.apply(base, description)
}
}
private fun KClass<*>.asTopLevel() = Class.forName("${qualifiedName}Kt")
/**
* Fetches the top level, private [Context.dataStore] extension property from [im.vector.app.features.analytics.store.AnalyticsStore]
* via reflection to avoid exposing property to all callers.
*/
@Suppress("UNCHECKED_CAST")
private fun reflectAnalyticDatastore(context: Context): DataStore<Preferences> {
val klass = AnalyticsStore::class.asTopLevel()
val method = klass.getMethod("access\$getDataStore", Context::class.java)
return method.invoke(klass, context) as DataStore<Preferences>
}

View File

@@ -83,7 +83,7 @@ private fun useMediaStoreScreenshotStorage(
screenshotLocation: String,
bitmap: Bitmap
) {
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "$screenshotName.jpeg")
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "${screenshotName}.jpeg")
contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, screenshotLocation)
val uri: Uri? = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
if (uri != null) {
@@ -104,7 +104,7 @@ private fun usePublicExternalScreenshotStorage(
if (!directory.exists()) {
directory.mkdirs()
}
val file = File(directory, "$screenshotName.jpeg")
val file = File(directory, "${screenshotName}.jpeg")
saveScreenshotToStream(bitmap, FileOutputStream(file))
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
}

View File

@@ -31,7 +31,6 @@ import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import im.vector.app.TestBuildVersionSdkIntProvider
import im.vector.app.features.pin.lockscreen.configuration.LockScreenConfiguration
import im.vector.app.features.pin.lockscreen.configuration.LockScreenConfiguratorProvider
import im.vector.app.features.pin.lockscreen.configuration.LockScreenMode
import im.vector.app.features.pin.lockscreen.crypto.LockScreenCryptoConstants
import im.vector.app.features.pin.lockscreen.crypto.LockScreenKeyRepository
@@ -40,6 +39,7 @@ import im.vector.app.features.pin.lockscreen.ui.fallbackprompt.FallbackBiometric
import im.vector.app.features.pin.lockscreen.utils.DevicePromptCheck
import io.mockk.clearAllMocks
import io.mockk.every
import io.mockk.justRun
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.mockkStatic
@@ -54,8 +54,10 @@ import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.receiveAsFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.runTest
import org.amshove.kluent.coInvoking
import org.amshove.kluent.shouldBeFalse
import org.amshove.kluent.shouldBeTrue
import org.amshove.kluent.shouldThrow
import org.junit.Before
import org.junit.Ignore
import org.junit.Test
@@ -239,36 +241,35 @@ class BiometricHelperTests {
@Test
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.R) // Due to some issues with mockk and CryptoObject initialization
fun authenticateCreatesSystemKeyIfNeededOnSuccessOnAndroidM() = runTest {
fun enableAuthenticationDeletesSystemKeyOnFailure() = runTest {
buildVersionSdkIntProvider.value = Build.VERSION_CODES.M
every { lockScreenKeyRepository.isSystemKeyValid() } returns true
val mockAuthChannel = Channel<Boolean>(capacity = 1)
val biometricUtils = spyk(createBiometricHelper(createDefaultConfiguration(isBiometricsEnabled = true))) {
every { createAuthChannel() } returns mockAuthChannel
every { authenticateWithPromptInternal(any(), any(), any()) } returns mockk()
}
justRun { lockScreenKeyRepository.deleteSystemKey() }
val latch = CountDownLatch(1)
val intent = Intent(InstrumentationRegistry.getInstrumentation().targetContext, LockScreenTestActivity::class.java)
ActivityScenario.launch<LockScreenTestActivity>(intent).onActivity { activity ->
activity.lifecycleScope.launch {
val exception = IllegalStateException("Some error")
launch {
mockAuthChannel.send(true)
mockAuthChannel.close()
mockAuthChannel.close(exception)
}
biometricUtils.authenticate(activity).collect()
coInvoking { biometricUtils.enableAuthentication(activity).collect() } shouldThrow exception
latch.countDown()
}
}
latch.await(1, TimeUnit.SECONDS)
verify { lockScreenKeyRepository.ensureSystemKey() }
verify { lockScreenKeyRepository.deleteSystemKey() }
}
private fun createBiometricHelper(configuration: LockScreenConfiguration): BiometricHelper {
val context = InstrumentationRegistry.getInstrumentation().targetContext
val configProvider = LockScreenConfiguratorProvider(configuration)
return BiometricHelper(context, lockScreenKeyRepository, configProvider, biometricManager, buildVersionSdkIntProvider)
return BiometricHelper(configuration, context, lockScreenKeyRepository, biometricManager, buildVersionSdkIntProvider)
}
private fun createDefaultConfiguration(

View File

@@ -18,6 +18,7 @@ package im.vector.app.features.pin.lockscreen.crypto
import android.os.Build
import android.security.keystore.KeyPermanentlyInvalidatedException
import android.security.keystore.UserNotAuthenticatedException
import androidx.test.platform.app.InstrumentationRegistry
import im.vector.app.TestBuildVersionSdkIntProvider
import io.mockk.every
@@ -69,10 +70,12 @@ class KeyStoreCryptoTests {
runCatching { keyStoreCrypto.ensureKey() }
keyStoreCrypto.hasValidKey() shouldBe true
val exception = KeyPermanentlyInvalidatedException()
every { secretStoringUtils.getEncryptCipher(any()) } throws exception
val keyInvalidatedException = KeyPermanentlyInvalidatedException()
every { secretStoringUtils.getEncryptCipher(any()) } throws keyInvalidatedException
keyStoreCrypto.hasValidKey() shouldBe false
runCatching { keyStoreCrypto.ensureKey() }
val userNotAuthenticatedException = UserNotAuthenticatedException()
every { secretStoringUtils.getEncryptCipher(any()) } throws userNotAuthenticatedException
keyStoreCrypto.hasValidKey() shouldBe false
}

View File

@@ -17,8 +17,6 @@
package im.vector.app.features.pin.lockscreen.crypto
import androidx.test.platform.app.InstrumentationRegistry
import im.vector.app.features.pin.lockscreen.crypto.migrations.LegacyPinCodeMigrator
import im.vector.app.features.settings.VectorPreferences
import io.mockk.clearAllMocks
import io.mockk.every
import io.mockk.mockk
@@ -44,8 +42,6 @@ class LockScreenKeyRepositoryTests {
}
private lateinit var lockScreenKeyRepository: LockScreenKeyRepository
private val legacyPinCodeMigrator: LegacyPinCodeMigrator = mockk(relaxed = true)
private val vectorPreferences: VectorPreferences = mockk(relaxed = true)
private val keyStore: KeyStore by lazy {
KeyStore.getInstance(LockScreenCryptoConstants.ANDROID_KEY_STORE).also { it.load(null) }

View File

@@ -76,7 +76,7 @@ class EmojiDataSourceTest : InstrumentedTest {
fun searchTestOneResult() {
val emojiDataSource = createEmojiDataSource()
val result = runBlocking {
emojiDataSource.filterWith("france")
emojiDataSource.filterWith("flag-france")
}
assertEquals("Should have 1 result", 1, result.size)
}

View File

@@ -9,6 +9,8 @@
<activity android:name=".features.debug.settings.DebugPrivateSettingsActivity" />
<activity android:name=".features.debug.sas.DebugSasEmojiActivity" />
<activity android:name=".features.debug.features.DebugFeaturesSettingsActivity" />
<activity android:name=".features.debug.DebugMenuActivity" />
<activity android:name=".features.debug.leak.DebugMemoryLeaksActivity" />
<activity
android:name="com.facebook.flipper.android.diagnostics.FlipperDiagnosticActivity"

View File

@@ -1,27 +0,0 @@
/*
* Copyright (c) 2021 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.config
import im.vector.app.BuildConfig
import im.vector.app.features.analytics.AnalyticsConfig
val analyticsConfig: AnalyticsConfig = object : AnalyticsConfig {
override val isEnabled = BuildConfig.APPLICATION_ID == "im.vector.app.debug"
override val postHogHost = "https://posthog.element.dev"
override val postHogApiKey = "phc_VtA1L35nw3aeAtHIx1ayrGdzGkss7k1xINeXcoIQzXN"
override val policyLink = "https://element.io/cookie-policy"
}

View File

@@ -37,6 +37,7 @@ import im.vector.app.core.utils.toast
import im.vector.app.databinding.ActivityDebugMenuBinding
import im.vector.app.features.debug.analytics.DebugAnalyticsActivity
import im.vector.app.features.debug.features.DebugFeaturesSettingsActivity
import im.vector.app.features.debug.leak.DebugMemoryLeaksActivity
import im.vector.app.features.debug.sas.DebugSasEmojiActivity
import im.vector.app.features.debug.settings.DebugPrivateSettingsActivity
import im.vector.app.features.qrcode.QrCodeScannerActivity
@@ -86,6 +87,7 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
views.debugAnalytics.setOnClickListener {
startActivity(Intent(this, DebugAnalyticsActivity::class.java))
}
views.debugMemoryLeaks.setOnClickListener { openMemoryLeaksSettings() }
views.debugTestTextViewLink.setOnClickListener { testTextViewLink() }
views.debugOpenButtonStylesLight.setOnClickListener {
startActivity(Intent(this, DebugVectorButtonStylesLightActivity::class.java))
@@ -130,6 +132,10 @@ class DebugMenuActivity : VectorBaseActivity<ActivityDebugMenuBinding>() {
startActivity(Intent(this, DebugPrivateSettingsActivity::class.java))
}
private fun openMemoryLeaksSettings() {
startActivity(Intent(this, DebugMemoryLeaksActivity::class.java))
}
private fun renderQrCode(text: String) {
views.debugQrCode.setData(text)
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.debug.di
import android.content.Context
import android.content.Intent
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import im.vector.app.core.debug.DebugNavigator
import im.vector.app.core.debug.DebugReceiver
import im.vector.app.core.debug.FlipperProxy
import im.vector.app.core.debug.LeakDetector
import im.vector.app.features.debug.DebugMenuActivity
import im.vector.app.flipper.VectorFlipperProxy
import im.vector.app.leakcanary.LeakCanaryLeakDetector
import im.vector.app.receivers.VectorDebugReceiver
@InstallIn(SingletonComponent::class)
@Module
abstract class DebugModule {
companion object {
@Provides
fun providesDebugNavigator() = object : DebugNavigator {
override fun openDebugMenu(context: Context) {
context.startActivity(Intent(context, DebugMenuActivity::class.java))
}
}
}
@Binds
abstract fun bindsDebugReceiver(receiver: VectorDebugReceiver): DebugReceiver
@Binds
abstract fun bindsFlipperProxy(flipperProxy: VectorFlipperProxy): FlipperProxy
@Binds
abstract fun bindsLeakDetector(leakDetector: LeakCanaryLeakDetector): LeakDetector
}

View File

@@ -24,6 +24,7 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.MavericksViewModelComponent
import im.vector.app.core.di.MavericksViewModelKey
import im.vector.app.features.debug.analytics.DebugAnalyticsViewModel
import im.vector.app.features.debug.leak.DebugMemoryLeaksViewModel
import im.vector.app.features.debug.settings.DebugPrivateSettingsViewModel
@InstallIn(MavericksViewModelComponent::class)
@@ -39,4 +40,9 @@ interface MavericksViewModelDebugModule {
@IntoMap
@MavericksViewModelKey(DebugPrivateSettingsViewModel::class)
fun debugPrivateSettingsViewModelFactory(factory: DebugPrivateSettingsViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
@Binds
@IntoMap
@MavericksViewModelKey(DebugMemoryLeaksViewModel::class)
fun debugMemoryLeaksViewModelFactory(factory: DebugMemoryLeaksViewModel.Factory): MavericksAssistedViewModelFactory<*, *>
}

View File

@@ -70,6 +70,11 @@ class DebugFeaturesStateFactory @Inject constructor(
key = DebugFeatureKeys.allowExternalUnifiedPushDistributors,
factory = VectorFeatures::allowExternalUnifiedPushDistributors
),
createBooleanFeature(
label = "Enable Live Location Sharing",
key = DebugFeatureKeys.liveLocationSharing,
factory = VectorFeatures::isLocationSharingEnabled
),
createBooleanFeature(
label = "Force usage of OpusEncoder library",
key = DebugFeatureKeys.forceUsageOfOpusEncoder,
@@ -85,6 +90,11 @@ class DebugFeaturesStateFactory @Inject constructor(
key = DebugFeatureKeys.newAppLayoutEnabled,
factory = VectorFeatures::isNewAppLayoutEnabled
),
createBooleanFeature(
label = "Enable New Device Management",
key = DebugFeatureKeys.newDeviceManagementEnabled,
factory = VectorFeatures::isNewDeviceManagementEnabled
),
)
)
}

View File

@@ -24,6 +24,7 @@ import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import im.vector.app.config.OnboardingVariant
import im.vector.app.features.DefaultVectorFeatures
import im.vector.app.features.VectorFeatures
import kotlinx.coroutines.flow.first
@@ -39,8 +40,8 @@ class DebugVectorFeatures(
private val dataStore = context.dataStore
override fun onboardingVariant(): VectorFeatures.OnboardingVariant {
return readPreferences().getEnum<VectorFeatures.OnboardingVariant>() ?: vectorFeatures.onboardingVariant()
override fun onboardingVariant(): OnboardingVariant {
return readPreferences().getEnum<OnboardingVariant>() ?: vectorFeatures.onboardingVariant()
}
override fun isOnboardingAlreadyHaveAccountSplashEnabled(): Boolean = read(DebugFeatureKeys.onboardingAlreadyHaveAnAccount)
@@ -66,6 +67,9 @@ class DebugVectorFeatures(
override fun isScreenSharingEnabled(): Boolean = read(DebugFeatureKeys.screenSharing)
?: vectorFeatures.isScreenSharingEnabled()
override fun isLocationSharingEnabled(): Boolean = read(DebugFeatureKeys.liveLocationSharing)
?: vectorFeatures.isLocationSharingEnabled()
override fun forceUsageOfOpusEncoder(): Boolean = read(DebugFeatureKeys.forceUsageOfOpusEncoder)
?: vectorFeatures.forceUsageOfOpusEncoder()
@@ -75,6 +79,9 @@ class DebugVectorFeatures(
override fun isNewAppLayoutEnabled(): Boolean = read(DebugFeatureKeys.newAppLayoutEnabled)
?: vectorFeatures.isNewAppLayoutEnabled()
override fun isNewDeviceManagementEnabled(): Boolean = read(DebugFeatureKeys.newDeviceManagementEnabled)
?: vectorFeatures.isNewDeviceManagementEnabled()
fun <T> override(value: T?, key: Preferences.Key<T>) = updatePreferences {
if (value == null) {
it.remove(key)
@@ -135,4 +142,5 @@ object DebugFeatureKeys {
val forceUsageOfOpusEncoder = booleanPreferencesKey("force-usage-of-opus-encoder")
val startDmOnFirstMsg = booleanPreferencesKey("start-dm-on-first-msg")
val newAppLayoutEnabled = booleanPreferencesKey("new-app-layout-enabled")
val newDeviceManagementEnabled = booleanPreferencesKey("new-device-management-enabled")
}

View File

@@ -0,0 +1,37 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.debug.leak
import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.core.extensions.addFragment
import im.vector.app.core.platform.VectorBaseActivity
import im.vector.app.databinding.ActivitySimpleBinding
@AndroidEntryPoint
class DebugMemoryLeaksActivity : VectorBaseActivity<ActivitySimpleBinding>() {
override fun getBinding() = ActivitySimpleBinding.inflate(layoutInflater)
override fun initUiAndData() {
if (isFirstCreation()) {
addFragment(
views.simpleFragmentContainer,
DebugMemoryLeaksFragment::class.java
)
}
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.debug.leak
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.core.epoxy.onClick
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentDebugMemoryLeaksBinding
@AndroidEntryPoint
class DebugMemoryLeaksFragment : VectorBaseFragment<FragmentDebugMemoryLeaksBinding>() {
private val viewModel: DebugMemoryLeaksViewModel by fragmentViewModel()
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentDebugMemoryLeaksBinding {
return FragmentDebugMemoryLeaksBinding.inflate(inflater, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setViewListeners()
}
private fun setViewListeners() {
views.enableMemoryLeakAnalysis.onClick {
viewModel.handle(DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis(views.enableMemoryLeakAnalysis.isChecked))
}
}
override fun invalidate() = withState(viewModel) { viewState ->
views.enableMemoryLeakAnalysis.isChecked = viewState.isMemoryLeaksAnalysisEnabled
}
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.debug.leak
import im.vector.app.core.platform.VectorViewModelAction
sealed interface DebugMemoryLeaksViewActions : VectorViewModelAction {
data class EnableMemoryLeaksAnalysis(val isEnabled: Boolean) : DebugMemoryLeaksViewActions
}

View File

@@ -0,0 +1,67 @@
/*
* Copyright (c) 2021 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.debug.leak
import com.airbnb.mvrx.MavericksViewModelFactory
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import im.vector.app.core.debug.LeakDetector
import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.EmptyViewEvents
import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.settings.VectorPreferences
import kotlinx.coroutines.launch
class DebugMemoryLeaksViewModel @AssistedInject constructor(
@Assisted initialState: DebugMemoryLeaksViewState,
private val vectorPreferences: VectorPreferences,
private val leakDetector: LeakDetector,
) : VectorViewModel<DebugMemoryLeaksViewState, DebugMemoryLeaksViewActions, EmptyViewEvents>(initialState) {
@AssistedFactory
interface Factory : MavericksAssistedViewModelFactory<DebugMemoryLeaksViewModel, DebugMemoryLeaksViewState> {
override fun create(initialState: DebugMemoryLeaksViewState): DebugMemoryLeaksViewModel
}
companion object : MavericksViewModelFactory<DebugMemoryLeaksViewModel, DebugMemoryLeaksViewState> by hiltMavericksViewModelFactory()
init {
viewModelScope.launch {
refreshStateFromPreferences()
}
}
override fun handle(action: DebugMemoryLeaksViewActions) {
when (action) {
is DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis -> handleEnableMemoryLeaksAnalysis(action)
}
}
private fun handleEnableMemoryLeaksAnalysis(action: DebugMemoryLeaksViewActions.EnableMemoryLeaksAnalysis) {
viewModelScope.launch {
vectorPreferences.enableMemoryLeakAnalysis(action.isEnabled)
leakDetector.enable(action.isEnabled)
refreshStateFromPreferences()
}
}
private fun refreshStateFromPreferences() {
setState { copy(isMemoryLeaksAnalysisEnabled = vectorPreferences.isMemoryLeakAnalysisEnabled()) }
}
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.features.debug.leak
import com.airbnb.mvrx.MavericksState
data class DebugMemoryLeaksViewState(
val isMemoryLeaksAnalysisEnabled: Boolean = false
) : MavericksState

View File

@@ -29,19 +29,19 @@ import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPl
import com.facebook.soloader.SoLoader
import com.kgurgul.flipper.RealmDatabaseDriver
import com.kgurgul.flipper.RealmDatabaseProvider
import im.vector.app.core.debug.FlipperProxy
import io.realm.RealmConfiguration
import okhttp3.Interceptor
import org.matrix.android.sdk.api.Matrix
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class FlipperProxy @Inject constructor(
class VectorFlipperProxy @Inject constructor(
private val context: Context,
) {
) : FlipperProxy {
private val networkFlipperPlugin = NetworkFlipperPlugin()
fun init(matrix: Matrix) {
override fun init(matrix: Matrix) {
SoLoader.init(context, false)
if (FlipperUtils.shouldEnableFlipper(context)) {
@@ -65,8 +65,5 @@ class FlipperProxy @Inject constructor(
}
}
@Suppress("RedundantNullableReturnType")
fun getNetworkInterceptor(): Interceptor? {
return FlipperOkhttpInterceptor(networkFlipperPlugin)
}
override fun networkInterceptor() = FlipperOkhttpInterceptor(networkFlipperPlugin)
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (c) 2022 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.app.leakcanary
import im.vector.app.core.debug.LeakDetector
import leakcanary.LeakCanary
import javax.inject.Inject
class LeakCanaryLeakDetector @Inject constructor() : LeakDetector {
override fun enable(enable: Boolean) {
LeakCanary.config = LeakCanary.config.copy(dumpHeap = enable)
}
}

View File

@@ -22,14 +22,24 @@ import android.content.Intent
import android.content.IntentFilter
import android.content.SharedPreferences
import androidx.core.content.edit
import im.vector.app.core.debug.DebugReceiver
import im.vector.app.core.di.DefaultSharedPreferences
import im.vector.app.core.utils.lsFiles
import timber.log.Timber
import javax.inject.Inject
/**
* Receiver to handle some command from ADB
*/
class DebugReceiver : BroadcastReceiver() {
class VectorDebugReceiver @Inject constructor() : BroadcastReceiver(), DebugReceiver {
override fun register(context: Context) {
context.registerReceiver(this, getIntentFilter(context))
}
override fun unregister(context: Context) {
context.unregisterReceiver(this)
}
override fun onReceive(context: Context, intent: Intent) {
Timber.v("Received debug action: ${intent.action}")

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
@@ -8,8 +9,11 @@
tools:ignore="HardcodedText">
<ScrollView
android:id="@+id/scrollView2"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
app:layout_anchor="@+id/scrollView2"
app:layout_anchorGravity="center">
<LinearLayout
android:layout_width="match_parent"
@@ -38,6 +42,12 @@
android:layout_height="wrap_content"
android:text="Analytics" />
<Button
android:id="@+id/debug_memory_leaks"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Memory leaks" />
<Button
android:id="@+id/debug_test_text_view_link"
android:layout_width="wrap_content"

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