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

Compare commits

...

226 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
ericdecanini
aa24debd87 Adds new space list controller 2022-08-02 22:49:58 +02:00
ericdecanini
55d8b6a819 Merge remote-tracking branch 'origin/develop' into feature/eric/space-list-modal 2022-08-02 18:07:34 +02:00
ericdecanini
ab4eda18bf Adds SpacesBottomSheet 2022-08-02 17:44:27 +02:00
ericdecanini
b0a9b482e7 Adds issue numbers to unimplemented FAB clicks 2022-08-02 15:18:45 +02: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
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
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
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
ericdecanini
8e7e320e40 Finalises new layout FABs 2022-07-29 15:28:55 +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
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
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
308 changed files with 4602 additions and 7359 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:

View File

@@ -16,3 +16,5 @@ jobs:
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

@@ -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:
@@ -51,8 +49,8 @@ jobs:
- name: Run lint
# Not always, if ktlint or detekt fail, avoid running the long lint check.
run: |
./gradlew lintGplayRelease --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew lintFdroidRelease --stacktrace $CI_GRADLE_ARG_PROPERTIES
./gradlew lintGplayRelease $CI_GRADLE_ARG_PROPERTIES
./gradlew lintFdroidRelease $CI_GRADLE_ARG_PROPERTIES
- name: Upload reports
if: always()
uses: actions/upload-artifact@v3
@@ -73,6 +71,8 @@ jobs:
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:

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,9 +65,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
- run: ./gradlew sonarqube $CI_GRADLE_ARG_PROPERTIES
if: always() # we may have failed a previous step and retried, that's OK
env:
@@ -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

View File

@@ -1,3 +1,38 @@
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)
=======================================

View File

@@ -24,7 +24,7 @@ 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'
@@ -44,7 +44,7 @@ plugins {
id "io.gitlab.arturbosch.detekt" version "1.21.0"
// Dependency Analysis
id 'com.autonomousapps.dependency-analysis' version "1.11.2"
id 'com.autonomousapps.dependency-analysis' version "1.12.0"
}
// https://github.com/jeremylong/DependencyCheck
@@ -151,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

View File

@@ -1 +0,0 @@
[Modularization] Provides abstraction to avoids direct usages of BuildConfig

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

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

View File

@@ -1 +0,0 @@
Refactors SpaceStateHandler (previously AppStateHandler) and adds unit tests for it

View File

@@ -1 +0,0 @@
Setup Danger to the project

View File

@@ -1 +0,0 @@
[Location Share] Open maximized map on tapping on live sharing notification

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

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

View File

@@ -1 +0,0 @@
[Location sharing] Align naming of components for live location feature

View File

@@ -1 +0,0 @@
Adds new app layout toolbar (feature flagged)

View File

@@ -1 +0,0 @@
[Location sharing] - Fix the memory leaks

View File

@@ -1 +0,0 @@
[FTUE] Memory leak on FtueAuthSplashCarouselFragment

View File

@@ -1 +0,0 @@
[Location sharing] Invisible text on map symbol

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

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

View File

@@ -1 +0,0 @@
Fix message content sometimes appearing in the log

View File

@@ -1 +0,0 @@
Disable 'Enable biometrics' option if there are not biometric authenticators enrolled.

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

@@ -22,7 +22,7 @@ def markwon = "4.6.2"
def moshi = "1.13.0"
def lifecycle = "2.5.1"
def flowBinding = "1.2.0"
def flipper = "0.156.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.1"
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

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',

View File

@@ -23,6 +23,7 @@ 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
@@ -84,6 +85,8 @@ To let Danger check all the PRs, including PRs form forks, a GitHub account have
- 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/

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: 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,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

@@ -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

@@ -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

@@ -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.32\""
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,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

@@ -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

@@ -52,6 +52,19 @@ if (requiresChangelog) {
}
}
// 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:"
@@ -83,7 +96,7 @@ 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.")
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).")
}
}

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

@@ -18,6 +18,5 @@ package im.vector.app.config
enum class OnboardingVariant {
LEGACY,
LOGIN_2,
FTUE_AUTH
}

View File

@@ -37,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 = 32
ext.versionPatch = 34
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'
@@ -307,7 +307,6 @@ android {
isDefault = true
versionName "${versionMajor}.${versionMinor}.${versionPatch}${getGplayVersionSuffix()}"
resValue "bool", "isGplay", "true"
buildConfigField "String", "SHORT_FLAVOR_DESCRIPTION", "\"G\""
buildConfigField "String", "FLAVOR_DESCRIPTION", "\"GooglePlay\""
}
@@ -317,7 +316,6 @@ android {
versionName "${versionMajor}.${versionMinor}.${versionPatch}${getFdroidVersionSuffix()}"
resValue "bool", "isGplay", "false"
buildConfigField "String", "SHORT_FLAVOR_DESCRIPTION", "\"F\""
buildConfigField "String", "FLAVOR_DESCRIPTION", "\"FDroid\""
}
@@ -393,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
@@ -415,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
@@ -427,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
@@ -499,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'
@@ -575,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
@@ -598,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

@@ -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

@@ -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

@@ -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

@@ -90,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

@@ -79,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)
@@ -139,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"

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/coordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".features.debug.settings.DebugPrivateSettingsActivity"
tools:ignore="HardcodedText">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/linear_divider"
android:orientation="vertical"
android:padding="@dimen/layout_horizontal_margin"
android:showDividers="middle">
<CheckBox
android:id="@+id/enableMemoryLeakAnalysis"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enable memory leak analysis" />
</LinearLayout>
</ScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -17,20 +17,46 @@
package im.vector.app.di
import android.content.Context
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import im.vector.app.core.pushers.FcmHelper
import im.vector.app.core.services.GuardServiceStarter
import im.vector.app.fdroid.service.FDroidGuardServiceStarter
import im.vector.app.features.home.NightlyProxy
import im.vector.app.features.settings.VectorPreferences
import im.vector.app.features.settings.legals.FlavorLegals
import im.vector.app.push.fcm.FdroidFcmHelper
@InstallIn(SingletonComponent::class)
@Module
object FlavorModule {
abstract class FlavorModule {
@Provides
fun provideGuardServiceStarter(preferences: VectorPreferences, appContext: Context): GuardServiceStarter {
return FDroidGuardServiceStarter(preferences, appContext)
companion object {
@Provides
fun provideGuardServiceStarter(preferences: VectorPreferences, appContext: Context): GuardServiceStarter {
return FDroidGuardServiceStarter(preferences, appContext)
}
@Provides
fun provideNightlyProxy() = object : NightlyProxy {
override fun onHomeResumed() {
// no op
}
}
@Provides
fun providesFlavorLegals() = object : FlavorLegals {
override fun hasThirdPartyNotices() = false
override fun navigateToThirdPartyNotices(context: Context) {
// no op
}
}
}
@Binds
abstract fun bindsFcmHelper(fcmHelper: FdroidFcmHelper): FcmHelper
}

View File

@@ -0,0 +1,31 @@
/*
* 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.di
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import im.vector.app.features.push.NotificationTroubleshootTestManagerFactory
import im.vector.app.push.fcm.FdroidNotificationTroubleshootTestManagerFactory
@InstallIn(ActivityComponent::class)
@Module
abstract class NotificationTestModule {
@Binds
abstract fun bindsNotificationTestFactory(factory: FdroidNotificationTroubleshootTestManagerFactory): NotificationTroubleshootTestManagerFactory
}

View File

@@ -20,6 +20,7 @@ package im.vector.app.push.fcm
import android.app.Activity
import android.content.Context
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.pushers.FcmHelper
import im.vector.app.core.pushers.PushersManager
import im.vector.app.fdroid.BackgroundSyncStarter
import im.vector.app.fdroid.receiver.AlarmSyncBroadcastReceiver
@@ -28,47 +29,32 @@ import javax.inject.Inject
/**
* This class has an alter ego in the gplay variant.
*/
class FcmHelper @Inject constructor(
class FdroidFcmHelper @Inject constructor(
private val context: Context,
private val backgroundSyncStarter: BackgroundSyncStarter,
) {
) : FcmHelper {
fun isFirebaseAvailable(): Boolean = false
override fun isFirebaseAvailable(): Boolean = false
/**
* Retrieves the FCM registration token.
*
* @return the FCM token or null if not received from FCM
*/
fun getFcmToken(): String? {
override fun getFcmToken(): String? {
return null
}
/**
* Store FCM token to the SharedPrefs
*
* @param token the token to store
*/
fun storeFcmToken(token: String?) {
override fun storeFcmToken(token: String?) {
// No op
}
/**
* onNewToken may not be called on application upgrade, so ensure my shared pref is set
*
* @param activity the first launch Activity
*/
fun ensureFcmTokenIsRetrieved(activity: Activity, pushersManager: PushersManager, registerPusher: Boolean) {
override fun ensureFcmTokenIsRetrieved(activity: Activity, pushersManager: PushersManager, registerPusher: Boolean) {
// No op
}
fun onEnterForeground(activeSessionHolder: ActiveSessionHolder) {
override fun onEnterForeground(activeSessionHolder: ActiveSessionHolder) {
// try to stop all regardless of background mode
activeSessionHolder.getSafeActiveSession()?.syncService()?.stopAnyBackgroundSync()
AlarmSyncBroadcastReceiver.cancelAlarm(context)
}
fun onEnterBackground(activeSessionHolder: ActiveSessionHolder) {
override fun onEnterBackground(activeSessionHolder: ActiveSessionHolder) {
backgroundSyncStarter.start(activeSessionHolder)
}
}

View File

@@ -21,6 +21,7 @@ import im.vector.app.fdroid.features.settings.troubleshoot.TestAutoStartBoot
import im.vector.app.fdroid.features.settings.troubleshoot.TestBackgroundRestrictions
import im.vector.app.fdroid.features.settings.troubleshoot.TestBatteryOptimization
import im.vector.app.features.VectorFeatures
import im.vector.app.features.push.NotificationTroubleshootTestManagerFactory
import im.vector.app.features.settings.troubleshoot.NotificationTroubleshootTestManager
import im.vector.app.features.settings.troubleshoot.TestAccountSettings
import im.vector.app.features.settings.troubleshoot.TestAvailableUnifiedPushDistributors
@@ -35,7 +36,7 @@ import im.vector.app.features.settings.troubleshoot.TestUnifiedPushEndpoint
import im.vector.app.features.settings.troubleshoot.TestUnifiedPushGateway
import javax.inject.Inject
class NotificationTroubleshootTestManagerFactory @Inject constructor(
class FdroidNotificationTroubleshootTestManagerFactory @Inject constructor(
private val unifiedPushHelper: UnifiedPushHelper,
private val testSystemSettings: TestSystemSettings,
private val testAccountSettings: TestAccountSettings,
@@ -52,9 +53,9 @@ class NotificationTroubleshootTestManagerFactory @Inject constructor(
private val testBatteryOptimization: TestBatteryOptimization,
private val testNotification: TestNotification,
private val vectorFeatures: VectorFeatures,
) {
) : NotificationTroubleshootTestManagerFactory {
fun create(fragment: Fragment): NotificationTroubleshootTestManager {
override fun create(fragment: Fragment): NotificationTroubleshootTestManager {
val mgr = NotificationTroubleshootTestManager(fragment)
mgr.addTest(testSystemSettings)
mgr.addTest(testAccountSettings)

View File

@@ -0,0 +1,33 @@
/*
* 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 android.content.Intent
import com.google.android.gms.oss.licenses.OssLicensesMenuActivity
import im.vector.app.features.settings.legals.FlavorLegals
import javax.inject.Inject
class GoogleFlavorLegals @Inject constructor() : FlavorLegals {
override fun hasThirdPartyNotices() = true
override fun navigateToThirdPartyNotices(context: Context) {
// See https://developers.google.com/android/guides/opensource
context.startActivity(Intent(context, OssLicensesMenuActivity::class.java))
}
}

View File

@@ -16,18 +16,36 @@
package im.vector.app.di
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import im.vector.app.GoogleFlavorLegals
import im.vector.app.core.pushers.FcmHelper
import im.vector.app.core.services.GuardServiceStarter
import im.vector.app.features.home.NightlyProxy
import im.vector.app.features.settings.legals.FlavorLegals
import im.vector.app.nightly.FirebaseNightlyProxy
import im.vector.app.push.fcm.GoogleFcmHelper
@InstallIn(SingletonComponent::class)
@Module
object FlavorModule {
abstract class FlavorModule {
@Provides
fun provideGuardServiceStarter(): GuardServiceStarter {
return object : GuardServiceStarter {}
companion object {
@Provides
fun provideGuardServiceStarter(): GuardServiceStarter {
return object : GuardServiceStarter {}
}
}
@Binds
abstract fun bindsNightlyProxy(nightlyProxy: FirebaseNightlyProxy): NightlyProxy
@Binds
abstract fun bindsFcmHelper(fcmHelper: GoogleFcmHelper): FcmHelper
@Binds
abstract fun bindsFlavorLegals(legals: GoogleFlavorLegals): FlavorLegals
}

View File

@@ -0,0 +1,31 @@
/*
* 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.di
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import im.vector.app.features.push.NotificationTroubleshootTestManagerFactory
import im.vector.app.push.fcm.GoogleNotificationTroubleshootTestManagerFactory
@InstallIn(ActivityComponent::class)
@Module
abstract class NotificationTestModule {
@Binds
abstract fun bindsNotificationTestFactory(factory: GoogleNotificationTroubleshootTestManagerFactory): NotificationTroubleshootTestManagerFactory
}

View File

@@ -20,10 +20,10 @@ import androidx.activity.result.ActivityResultLauncher
import androidx.fragment.app.FragmentActivity
import com.google.firebase.messaging.FirebaseMessaging
import im.vector.app.R
import im.vector.app.core.pushers.FcmHelper
import im.vector.app.core.resources.StringProvider
import im.vector.app.core.utils.startAddGoogleAccountIntent
import im.vector.app.features.settings.troubleshoot.TroubleshootTest
import im.vector.app.push.fcm.FcmHelper
import timber.log.Timber
import javax.inject.Inject

View File

@@ -23,10 +23,10 @@ import androidx.work.WorkInfo
import androidx.work.WorkManager
import im.vector.app.R
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.pushers.FcmHelper
import im.vector.app.core.pushers.PushersManager
import im.vector.app.core.resources.StringProvider
import im.vector.app.features.settings.troubleshoot.TroubleshootTest
import im.vector.app.push.fcm.FcmHelper
import org.matrix.android.sdk.api.session.pushers.PusherState
import javax.inject.Inject

View File

@@ -23,15 +23,17 @@ import com.google.firebase.appdistribution.FirebaseAppDistributionException
import im.vector.app.BuildConfig
import im.vector.app.core.di.DefaultPreferences
import im.vector.app.core.time.Clock
import im.vector.app.features.home.NightlyProxy
import timber.log.Timber
import javax.inject.Inject
class NightlyProxy @Inject constructor(
class FirebaseNightlyProxy @Inject constructor(
private val clock: Clock,
@DefaultPreferences
private val sharedPreferences: SharedPreferences,
) {
fun onHomeResumed() {
) : NightlyProxy {
override fun onHomeResumed() {
if (!canDisplayPopup()) return
val firebaseAppDistribution = FirebaseAppDistribution.getInstance()
firebaseAppDistribution.updateIfNewReleaseAvailable()

View File

@@ -25,6 +25,7 @@ import com.google.firebase.messaging.FirebaseMessaging
import im.vector.app.R
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.di.DefaultSharedPreferences
import im.vector.app.core.pushers.FcmHelper
import im.vector.app.core.pushers.PushersManager
import timber.log.Timber
import javax.inject.Inject
@@ -33,44 +34,29 @@ import javax.inject.Inject
* This class store the FCM token in SharedPrefs and ensure this token is retrieved.
* It has an alter ego in the fdroid variant.
*/
class FcmHelper @Inject constructor(
class GoogleFcmHelper @Inject constructor(
context: Context,
) {
) : FcmHelper {
companion object {
private const val PREFS_KEY_FCM_TOKEN = "FCM_TOKEN"
}
private val sharedPrefs = DefaultSharedPreferences.getInstance(context)
fun isFirebaseAvailable(): Boolean = true
override fun isFirebaseAvailable(): Boolean = true
/**
* Retrieves the FCM registration token.
*
* @return the FCM token or null if not received from FCM
*/
fun getFcmToken(): String? {
override fun getFcmToken(): String? {
return sharedPrefs.getString(PREFS_KEY_FCM_TOKEN, null)
}
/**
* Store FCM token to the SharedPrefs
* TODO Store in realm
*
* @param token the token to store
*/
fun storeFcmToken(token: String?) {
override fun storeFcmToken(token: String?) {
// TODO Store in realm
sharedPrefs.edit {
putString(PREFS_KEY_FCM_TOKEN, token)
}
}
/**
* onNewToken may not be called on application upgrade, so ensure my shared pref is set
*
* @param activity the first launch Activity
*/
fun ensureFcmTokenIsRetrieved(activity: Activity, pushersManager: PushersManager, registerPusher: Boolean) {
override fun ensureFcmTokenIsRetrieved(activity: Activity, pushersManager: PushersManager, registerPusher: Boolean) {
// if (TextUtils.isEmpty(getFcmToken(activity))) {
// 'app should always check the device for a compatible Google Play services APK before accessing Google Play services features'
if (checkPlayServices(activity)) {
@@ -105,13 +91,11 @@ class FcmHelper @Inject constructor(
return resultCode == ConnectionResult.SUCCESS
}
@Suppress("UNUSED_PARAMETER")
fun onEnterForeground(activeSessionHolder: ActiveSessionHolder) {
override fun onEnterForeground(activeSessionHolder: ActiveSessionHolder) {
// No op
}
@Suppress("UNUSED_PARAMETER")
fun onEnterBackground(activeSessionHolder: ActiveSessionHolder) {
override fun onEnterBackground(activeSessionHolder: ActiveSessionHolder) {
// No op
}
}

View File

@@ -18,6 +18,7 @@ package im.vector.app.push.fcm
import androidx.fragment.app.Fragment
import im.vector.app.core.pushers.UnifiedPushHelper
import im.vector.app.features.VectorFeatures
import im.vector.app.features.push.NotificationTroubleshootTestManagerFactory
import im.vector.app.features.settings.troubleshoot.NotificationTroubleshootTestManager
import im.vector.app.features.settings.troubleshoot.TestAccountSettings
import im.vector.app.features.settings.troubleshoot.TestAvailableUnifiedPushDistributors
@@ -35,7 +36,7 @@ import im.vector.app.gplay.features.settings.troubleshoot.TestPlayServices
import im.vector.app.gplay.features.settings.troubleshoot.TestTokenRegistration
import javax.inject.Inject
class NotificationTroubleshootTestManagerFactory @Inject constructor(
class GoogleNotificationTroubleshootTestManagerFactory @Inject constructor(
private val unifiedPushHelper: UnifiedPushHelper,
private val testSystemSettings: TestSystemSettings,
private val testAccountSettings: TestAccountSettings,
@@ -52,9 +53,9 @@ class NotificationTroubleshootTestManagerFactory @Inject constructor(
private val testPushFromPushGateway: TestPushFromPushGateway,
private val testNotification: TestNotification,
private val vectorFeatures: VectorFeatures,
) {
) : NotificationTroubleshootTestManagerFactory {
fun create(fragment: Fragment): NotificationTroubleshootTestManager {
override fun create(fragment: Fragment): NotificationTroubleshootTestManager {
val mgr = NotificationTroubleshootTestManager(fragment)
mgr.addTest(testSystemSettings)
mgr.addTest(testAccountSettings)

View File

@@ -187,7 +187,6 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".features.home.HomeActivity" />
</activity>
<activity android:name=".features.debug.DebugMenuActivity" />
<activity android:name=".features.createdirect.CreateDirectRoomActivity" />
<activity android:name=".features.invite.InviteUsersToRoomActivity" />
<activity android:name=".features.webview.VectorWebViewActivity" />

View File

@@ -25,23 +25,30 @@ import android.content.res.Configuration
import android.os.Handler
import android.os.HandlerThread
import android.os.StrictMode
import android.view.Gravity
import androidx.core.provider.FontRequest
import androidx.core.provider.FontsContractCompat
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.multidex.MultiDex
import androidx.recyclerview.widget.SnapHelper
import com.airbnb.epoxy.Carousel
import com.airbnb.epoxy.EpoxyAsyncUtil
import com.airbnb.epoxy.EpoxyController
import com.airbnb.mvrx.Mavericks
import com.facebook.stetho.Stetho
import com.gabrielittner.threetenbp.LazyThreeTen
import com.github.rubensousa.gravitysnaphelper.GravitySnapHelper
import com.mapbox.mapboxsdk.Mapbox
import com.vanniktech.emoji.EmojiManager
import com.vanniktech.emoji.google.GoogleEmojiProvider
import dagger.hilt.android.HiltAndroidApp
import im.vector.app.config.Config
import im.vector.app.core.debug.FlipperProxy
import im.vector.app.core.debug.LeakDetector
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.pushers.FcmHelper
import im.vector.app.core.resources.BuildMeta
import im.vector.app.features.analytics.VectorAnalytics
import im.vector.app.features.call.webrtc.WebRtcCallManager
@@ -59,8 +66,6 @@ import im.vector.app.features.settings.VectorLocale
import im.vector.app.features.settings.VectorPreferences
import im.vector.app.features.themes.ThemeUtils
import im.vector.app.features.version.VersionProvider
import im.vector.app.flipper.FlipperProxy
import im.vector.app.push.fcm.FcmHelper
import org.jitsi.meet.sdk.log.JitsiMeetDefaultLogHandler
import org.matrix.android.sdk.api.Matrix
import org.matrix.android.sdk.api.auth.AuthenticationService
@@ -102,6 +107,7 @@ class VectorApplication :
@Inject lateinit var matrix: Matrix
@Inject lateinit var fcmHelper: FcmHelper
@Inject lateinit var buildMeta: BuildMeta
@Inject lateinit var leakDetector: LeakDetector
// font thread handler
private var fontThreadHandler: Handler? = null
@@ -141,8 +147,9 @@ class VectorApplication :
logInfo()
LazyThreeTen.init(this)
Mavericks.initialize(debugMode = false)
EpoxyController.defaultDiffingHandler = EpoxyAsyncUtil.getAsyncBackgroundHandler()
EpoxyController.defaultModelBuildingHandler = EpoxyAsyncUtil.getAsyncBackgroundHandler()
configureEpoxy()
registerActivityLifecycleCallbacks(VectorActivityLifecycleCallbacks(popupAlertManager))
val fontRequest = FontRequest(
"com.google.android.gms.fonts",
@@ -196,6 +203,18 @@ class VectorApplication :
// Initialize Mapbox before inflating mapViews
Mapbox.getInstance(this)
initMemoryLeakAnalysis()
}
private fun configureEpoxy() {
EpoxyController.defaultDiffingHandler = EpoxyAsyncUtil.getAsyncBackgroundHandler()
EpoxyController.defaultModelBuildingHandler = EpoxyAsyncUtil.getAsyncBackgroundHandler()
Carousel.setDefaultGlobalSnapHelperFactory(object : Carousel.SnapHelperFactory() {
override fun buildSnapHelper(context: Context?): SnapHelper {
return GravitySnapHelper(Gravity.START)
}
})
}
private fun enableStrictModeIfNeeded() {
@@ -251,4 +270,8 @@ class VectorApplication :
handlerThread.start()
return Handler(handlerThread.looper)
}
private fun initMemoryLeakAnalysis() {
leakDetector.enable(vectorPreferences.isMemoryLeakAnalysisEnabled())
}
}

View File

@@ -14,10 +14,10 @@
* limitations under the License.
*/
package im.vector.app.nightly
package im.vector.app.core.debug
import javax.inject.Inject
import android.content.Context
class NightlyProxy @Inject constructor() {
fun onHomeResumed() = Unit
interface DebugNavigator {
fun openDebugMenu(context: Context)
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2020 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,9 +14,11 @@
* limitations under the License.
*/
package im.vector.app
package im.vector.app.core.debug
import android.content.Context
// No op
fun openOssLicensesMenuActivity(@Suppress("UNUSED_PARAMETER") context: Context) = Unit
interface DebugReceiver {
fun register(context: Context)
fun unregister(context: Context)
}

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