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

Compare commits

...

390 Commits

Author SHA1 Message Date
Benoit Marty
f6411d673f Merge branch 'release/1.5.2' into main 2022-10-05 17:17:27 +02:00
Benoit Marty
b49585bde3 Fastlane 2022-10-05 17:17:08 +02:00
Benoit Marty
a6cb936ae6 Reorder changes 2022-10-05 17:08:19 +02:00
Benoit Marty
94fa3343b4 Run towncrier 2022-10-05 17:06:58 +02:00
Benoit Marty
c76945f9c6 Fix tests, there is a new item in the list 2022-10-05 16:46:15 +02:00
Benoit Marty
8934eabc99 Remove TODO, the string a11y_create_room is actually used. 2022-10-05 16:33:05 +02:00
Benoit Marty
47457b39d0 Fix typo 2022-10-05 16:03:26 +02:00
Benoit Marty
3f27df81bd Merge pull request #7298 from RiotTranslateBot/weblate-element-android-element-app
Translations update from Weblate
2022-10-05 15:57:19 +02:00
Weblate
5d8a8545f4 Merge branch 'origin/develop' into Weblate. 2022-10-05 13:54:54 +00:00
Valere
502b12a07e Merge pull request #7290 from vector-im/feature/bca/hinder_verification
E2ee dos not hinder verification
2022-10-05 14:34:34 +02:00
Weblate
672ad3a5e5 Merge branch 'origin/develop' into Weblate. 2022-10-05 12:32:46 +00:00
Valere
ec7c8c8b31 Merge pull request #6726 from vector-im/feature/bca/block_unverified
Per room block unverified devices
2022-10-05 14:29:59 +02:00
Weblate
d13606bdcc Merge branch 'origin/develop' into Weblate. 2022-10-05 12:28:06 +00:00
Nui Harime
111f77b017 Translated using Weblate (Russian)
Currently translated at 98.3% (2380 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2022-10-05 12:27:54 +00:00
lvre
4de0f0a1e8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/
2022-10-05 12:27:53 +00:00
Sveinn í Felli
c39e64dfc7 Translated using Weblate (Icelandic)
Currently translated at 84.5% (2046 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/is/
2022-10-05 12:27:53 +00:00
Vri
d5f542095c Translated using Weblate (German)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
2022-10-05 12:27:39 +00:00
Amit Kumar
aad2eed396 Add initial Sentry setup for crashes and perf tracking (#7141)
* Add initial Sentry setup for crashes and perf tracking

* Fix failing analytics tests

* Reformat code to fix style issue

* Close sentry when user signs out

* Add initial unit tests for Sentry

* Remove unused import

* Exclude amitkma from signoff requirements for PRs
2022-10-05 16:49:14 +05:30
Benoit Marty
70976c355a Merge pull request #7291 from vector-im/tech/fix-room-member-list-controller-test
Try to fix flaky RoomMemberListControllerTest
2022-10-05 11:04:00 +02:00
Benoit Marty
a036cc6d75 Merge pull request #7287 from vector-im/feature/bma/en-us
Use American English by default.
2022-10-05 11:02:58 +02:00
Benoit Marty
2cd78282d9 Fix typo
Co-authored-by: Andrew Morgan <1342360+anoadragon453@users.noreply.github.com>
2022-10-05 11:02:33 +02:00
Valere
fddeddacc7 fix outdated doc 2022-10-05 10:42:29 +02:00
Valere
37458d41f2 E2ee dos not hinder verification 2022-10-05 10:42:29 +02:00
Valere
b567fc5be6 remove commented code 2022-10-05 10:27:12 +02:00
Valere
68d4ac34c7 Move setting to room profile 2022-10-05 10:27:12 +02:00
Valere
8de2fe8917 Update library/ui-strings/src/main/res/values/strings.xml
Co-authored-by: Benoit Marty <benoitm@matrix.org>
2022-10-05 10:27:12 +02:00
Valere
8c7e7a8f35 open global settings from room settings 2022-10-05 10:27:12 +02:00
Valere
f7d8356327 post rebase fix & cleaning 2022-10-05 10:27:12 +02:00
Valere
92a72cb1e9 cleaning 2022-10-05 10:27:12 +02:00
Valere
e9b33f6234 Per room block unverified devices 2022-10-05 10:27:12 +02:00
Jorge Martín
ed545c7e2b Try to fix flaky RoomMemberListControllerTest 2022-10-05 08:50:12 +02:00
Jorge Martín
0b7e52e60b Fix EventHtmlRendererTest 2022-10-05 07:46:05 +02:00
Benoit Marty
4974fdf905 Merge pull request #6633 from Benjiko99/feature/incognito-keyboard
Add privacy setting to disable personalized learning by the keyboard
2022-10-04 18:22:22 +02:00
SpiritCroc
af9548dfdd Support inline images in the timeline (#5877)
* Support inline images in the timeline

Co-authored-by: Benoit Marty <benoitm@matrix.org>
2022-10-04 17:59:52 +02:00
Benoit Marty
2cb16d9f11 Merge pull request #6215 from networkException/fix-animated-only-fetching-thumbnail
Fix animated images only autoplaying sometimes
2022-10-04 17:44:25 +02:00
Benoit Marty
ca6813b5d8 Merge pull request #6906 from bwi-de/develop
Clean up pin code key and biometrics key on logout
2022-10-04 16:19:03 +02:00
Benoit Marty
304fb09f57 Merge pull request #6757 from eidonia/bugfix/#5029-disbale-emoji-keyboard-not-applies-reply
[Bugfix #5029] disable emoji keyboard not applies to reply
2022-10-04 16:16:36 +02:00
Benoit Marty
8311138bf1 Merge pull request #6762 from rudmannn/develop
replace android:gravity for backward compatibility
2022-10-04 16:14:41 +02:00
Benoit Marty
00248404c0 Merge pull request #7188 from vector-im/dependabot/gradle/org.owasp-dependency-check-gradle-7.2.1
Bump dependency-check-gradle from 7.2.0 to 7.2.1
2022-10-04 16:11:52 +02:00
Benoit Marty
5a7483eb38 Merge pull request #7203 from vector-im/dependabot/gradle/dagger-2.44
Bump dagger from 2.42 to 2.44
2022-10-04 16:09:12 +02:00
Benoit Marty
984995dcb9 Merge pull request #7265 from vector-im/dependabot/gradle/org.jetbrains.kotlin-kotlin-gradle-plugin-1.7.20
Bump kotlin-gradle-plugin from 1.7.10 to 1.7.20
2022-10-04 16:06:58 +02:00
Benoit Marty
17cd2a3302 Merge pull request #7266 from vector-im/dependabot/gradle/org.jetbrains.kotlin-kotlin-reflect-1.7.20
Bump kotlin-reflect from 1.7.10 to 1.7.20
2022-10-04 16:06:25 +02:00
Benoit Marty
90643510f2 Merge pull request #7269 from vector-im/dependabot/gradle/glide-4.14.1
Bump glide from 4.13.2 to 4.14.1
2022-10-04 15:53:26 +02:00
Benoit Marty
caffdbd8a5 Merge pull request #7286 from vector-im/tech/remove-robolectric-dependency
Remove Robolectric, make previous Robolectric test an instrumentation test
2022-10-04 15:52:49 +02:00
Benoit Marty
fe3540f6eb Changelog 2022-10-04 15:51:29 +02:00
Benoit Marty
c35fa978a7 Use American English by default. 2022-10-04 15:49:23 +02:00
Benoit Marty
4f61585ce5 Merge pull request #7279 from vector-im/dependabot/github_actions/danger/danger-js-11.1.3
Bump danger/danger-js from 11.1.2 to 11.1.3
2022-10-04 15:37:32 +02:00
Paul
d205202e52 [Bugfix] Fix crash on previewing image to upload on Android P (#7184)
* Fix crash on image upload preview on Android P

Using hardware bitmap allocation on Android framework versions prior to
Android Q causes a crash when decoding a bitmap if GL context wasn't
initialised. The issue is not documented in ImageDecoder reference but
it is mentioned in the comments of glide[1] with a link to internal
google discussion.

[1] f83cc274b4/library/src/main/java/com/bumptech/glide/load/resource/bitmap/HardwareConfigState.java (L22)

Signed-off-by: Paweł Matuszewski <pamat@protonmail.com>
2022-10-04 15:34:13 +02:00
Benoit Marty
81b5fcdc7d Merge pull request #5716 from thefirstofthe300/styling-tweaks
Styling tweaks
2022-10-04 15:32:32 +02:00
Jorge Martín
8d54a0d759 Remove Robolectric, make Robolectric test an instrumentation test 2022-10-04 14:15:54 +02:00
Yoan Pintas
ef82cc6aa7 Merge pull request #7225 from vector-im/yostyle/fix_strandhogg_detection
Add Activities of android permission controller in the whitelist
2022-10-04 11:51:06 +02:00
Nikita Fedrunov
8eea2ef923 fixing bug when room list is not updated being on background (#7278) 2022-10-04 11:29:34 +02:00
Florian Renaud
8e3b9735c1 Merge pull request #7258 from vector-im/feature/fre/voice_broadcast_feature_flag
Voice Broadcast - Add a feature flag with the composer action
2022-10-04 11:25:33 +02:00
dependabot[bot]
3bd3283d43 Bump danger/danger-js from 11.1.2 to 11.1.3
Bumps [danger/danger-js](https://github.com/danger/danger-js) from 11.1.2 to 11.1.3.
- [Release notes](https://github.com/danger/danger-js/releases)
- [Changelog](https://github.com/danger/danger-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/danger/danger-js/compare/11.1.2...11.1.3)

---
updated-dependencies:
- dependency-name: danger/danger-js
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 23:15:43 +00:00
Maxime NATUREL
07a2e3254a Merge pull request #7110 from vector-im/feature/mna/devices-learn-more-bottom-sheet
[Device Management] Learn more bottom sheets (PSG-715)
2022-10-03 17:39:41 +02:00
Nikita Fedrunov
9f8c7688bf added analytics for app layout (#7242) 2022-10-03 11:47:58 +02:00
Benoit Marty
8fd0107d84 Merge pull request #7256 from vector-im/feature/bma/fix_manifest_warning
Fix compilation warning when manifest are merged.
2022-10-03 11:16:25 +02:00
Valere
005e712396 Merge pull request #6703 from vector-im/feature/bca/crosssigning_reset_warning
warn on cross signing reset
2022-10-03 09:25:52 +02:00
Florian Renaud
2812b16cad Add changelog file 2022-10-03 09:25:03 +02:00
Florian Renaud
2bc08069cc Add Voice Broadcast action in the composer 2022-10-03 09:25:03 +02:00
Florian Renaud
0b0ea64a4b Add Voice Broadcast feature flag 2022-10-03 09:25:02 +02:00
Szimszon
d8b3c66c62 Translated using Weblate (Hungarian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/
2022-10-02 19:32:54 +00:00
Priit Jõerüüt
28af6bb208 Translated using Weblate (Estonian)
Currently translated at 99.6% (2411 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/et/
2022-10-02 19:32:53 +00:00
Priit Jõerüüt
73997d4569 Translated using Weblate (Estonian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/et/
2022-10-01 14:33:42 +00:00
phardyle
5566901b71 Translated using Weblate (Chinese (Simplified))
Currently translated at 96.0% (73 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hans/
2022-10-01 14:33:39 +00:00
Nui Harime
feff368f85 Translated using Weblate (Russian)
Currently translated at 98.3% (2380 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2022-10-01 14:33:37 +00:00
Przemysław Romanik
fa66ce1833 Translated using Weblate (Polish)
Currently translated at 97.8% (2367 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
2022-10-01 14:33:36 +00:00
Anonimas
a2ad855ce2 Translated using Weblate (Lithuanian)
Currently translated at 80.1% (1940 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/lt/
2022-10-01 14:33:35 +00:00
Linerly
366d273fc0 Translated using Weblate (Indonesian)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/id/
2022-10-01 14:32:51 +00:00
Lamdarer
f9d9a0c178 Translated using Weblate (German)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
2022-10-01 14:32:50 +00:00
Vri
fef2c8519a Translated using Weblate (German)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
2022-10-01 14:32:50 +00:00
dependabot[bot]
9cb7051694 Bump glide from 4.13.2 to 4.14.1
Bumps `glide` from 4.13.2 to 4.14.1.

Updates `glide` from 4.13.2 to 4.14.1
- [Release notes](https://github.com/bumptech/glide/releases)
- [Commits](https://github.com/bumptech/glide/compare/v4.13.2...v4.14.1)

Updates `compiler` from 4.13.2 to 4.14.1
- [Release notes](https://github.com/bumptech/glide/releases)
- [Commits](https://github.com/bumptech/glide/compare/v4.13.2...v4.14.1)

---
updated-dependencies:
- dependency-name: com.github.bumptech.glide:glide
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.github.bumptech.glide:compiler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-30 23:09:33 +00:00
Onuray Sahin
d0dd446af8 Merge pull request #7247 from vector-im/feature/ons/parse_user_agent
[Device Manager] Parse user agents (PSG-762)
2022-09-30 18:36:33 +03:00
Valere
384e829d42 Update changelog.d/6702.bugfix
Co-authored-by: Benoit Marty <benoitm@matrix.org>
2022-09-30 17:16:49 +02:00
Onuray Sahin
ea8dc45796 Parse browser version. 2022-09-30 17:08:35 +03:00
Valere
b4f7e1381d fix test post rebase 2022-09-30 16:00:34 +02:00
Valere
59afe434f8 more tests 2022-09-30 16:00:34 +02:00
Valere
ac0e5e9dec fix broken test, userId confustion
cleaning


cleaning


add tests


cleaning
2022-09-30 16:00:34 +02:00
Valere
c8f0792997 warn on cross signing reset 2022-09-30 16:00:34 +02:00
Onuray Sahin
bf4576d155 Code review fixes. 2022-09-30 13:21:44 +03:00
Valere
dc9451aeba Merge pull request #7246 from vector-im/feature/adm/autocomplete-crash
[Crash] Autocomplete crashes on open
2022-09-30 10:43:23 +02:00
dependabot[bot]
1db669d1c2 Bump kotlin-reflect from 1.7.10 to 1.7.20
Bumps [kotlin-reflect](https://github.com/JetBrains/kotlin) from 1.7.10 to 1.7.20.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.7.20/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.10...v1.7.20)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin:kotlin-reflect
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-29 23:21:58 +00:00
dependabot[bot]
169170d398 Bump kotlin-gradle-plugin from 1.7.10 to 1.7.20
Bumps [kotlin-gradle-plugin](https://github.com/JetBrains/kotlin) from 1.7.10 to 1.7.20.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.7.20/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.10...v1.7.20)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-29 23:15:14 +00:00
Onuray Sahin
0f8637bc7a Lint fix. 2022-09-29 17:57:22 +03:00
Onuray Sahin
81e8ddf832 Code review fixes. 2022-09-29 17:40:26 +03:00
Onuray Sahin
6d459a0bc9 Code review fixes. 2022-09-29 17:35:47 +03:00
Benoit Marty
aca5d3f148 Merge branch 'release/TODO_RELEASE_NAME' into main 2022-09-29 16:31:21 +02:00
Maxime NATUREL
48439f9071 Reverting remove of end of line from translations 2022-09-29 14:06:45 +02:00
Maxime NATUREL
28dee84aee Rename sessions screen learn more 2022-09-29 14:06:45 +02:00
Maxime NATUREL
20a24162f4 Updating texts + other sessions list screen learn more 2022-09-29 14:06:45 +02:00
Maxime NATUREL
c356c8090b Removing other sessions section learn more 2022-09-29 14:06:45 +02:00
Maxime NATUREL
acba3f2aa4 Updating learn more strings 2022-09-29 14:06:45 +02:00
Maxime NATUREL
5704dd4f43 Fix wrong import order 2022-09-29 14:06:44 +02:00
Maxime NATUREL
28b30e4e4f Fix after rebase issue 2022-09-29 14:06:44 +02:00
Maxime NATUREL
e986d7805e Fixing after rebase issues 2022-09-29 14:06:44 +02:00
Maxime NATUREL
d1bc7d591f Revert changes to translations 2022-09-29 14:06:44 +02:00
Maxime NATUREL
87e1b53c6e Fix coding style 2022-09-29 14:06:44 +02:00
Maxime NATUREL
51532687b9 Learn more in session overview screen 2022-09-29 14:06:44 +02:00
Maxime NATUREL
400b1b0697 Adding handle at top 2022-09-29 14:06:44 +02:00
Maxime NATUREL
97cdda45d6 Adding close button 2022-09-29 14:06:44 +02:00
Maxime NATUREL
648311e2b1 Show basic bottom sheet when pressing learn more link from other sessions section 2022-09-29 14:06:44 +02:00
Maxime NATUREL
1d11eae0cc Removing learn more link from security header 2022-09-29 14:06:44 +02:00
Maxime NATUREL
70a5093e3d Adding string resources 2022-09-29 14:06:44 +02:00
Maxime NATUREL
6eb5d98180 Add changelog entry 2022-09-29 14:06:43 +02:00
Onuray Sahin
38cd2be332 Fix broken tests. 2022-09-29 13:28:46 +03:00
Onuray Sahin
1238f31cdf Merge pull request #7209 from vector-im/feature/ons/extend_user_agent
[Device Manager] Extend user agent to include device information (PSG-755)
2022-09-29 13:11:20 +03:00
Benoit Marty
214867ad0e Merge pull request #7248 from vector-im/feature/bca/hotfix_1.5.1_merge
Feature/bca/hotfix 1.5.1 merge back from main
2022-09-29 11:58:36 +02:00
Maxime NATUREL
75a381ea0d Merge pull request #7243 from vector-im/feature/mna/device-manager-signout-session
[Device management] Sign out a session (PSG-742)
2022-09-29 11:43:56 +02:00
Benoit Marty
11cdf8ea9c Merge pull request #7223 from vector-im/feature/bca/fix_new_layout_list_flickering
Fix new layout flicker/leaks
2022-09-29 11:39:34 +02:00
Onuray Sahin
8663fe8c74 Add tests for unknown user agents. 2022-09-29 12:35:15 +03:00
Onuray Sahin
0f0ec54ed1 Code review fixes. 2022-09-29 12:20:01 +03:00
Onuray Sahin
4c173a79ae Lint fixes. 2022-09-29 11:40:15 +03:00
Onuray Sahin
c16b5d674c Add more user agent support. 2022-09-29 11:36:38 +03:00
Maxime NATUREL
082fa1e69e Adding confirmation dialog for all type of sessions 2022-09-29 10:27:13 +02:00
Valere
803eff9ad1 Fix not exhaustive when 2022-09-29 09:45:18 +02:00
Benoit Marty
f4674b17d6 Fix compilation warning. The Jitsi library does not include these permissions anymore. 2022-09-29 09:44:46 +02:00
Valere
8132a7902b post merge code quality 2022-09-29 09:21:06 +02:00
Valere
ce86e29122 Merge branch 'main' into develop 2022-09-28 18:16:39 +02:00
Onuray Sahin
7a36b10d40 Add changelog. 2022-09-28 18:22:24 +03:00
Onuray Sahin
5666383134 Add unit test for desktop and web user agents. 2022-09-28 18:19:25 +03:00
Maxime NATUREL
e47bf2b200 Adding unit tests for reAuth needed case 2022-09-28 16:45:06 +02:00
Onuray Sahin
41643ffb53 Add unit test for iOS user agents. 2022-09-28 15:00:16 +03:00
Onuray Sahin
2bcf0c307d Add unit test for Android user agents. 2022-09-28 14:59:56 +03:00
Onuray Sahin
04a305b403 Refactor user agent parsing. 2022-09-28 14:32:20 +03:00
Adam Brown
5f778fff01 re-enabling the jetifier, it's required by the autocomplete library
- the upstream library source doesn't require the jetifier however it hasn't been released
2022-09-28 10:09:13 +01:00
Benoit Marty
0c4510250b Merge pull request #7241 from vector-im/feature/bma/gradle_doctor
Set up Gradle doctor
2022-09-27 18:48:05 +02:00
dependabot[bot]
0d6cbbdb5d Bump dependency-check-gradle from 7.2.0 to 7.2.1
Bumps dependency-check-gradle from 7.2.0 to 7.2.1.

---
updated-dependencies:
- dependency-name: org.owasp:dependency-check-gradle
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-27 16:41:13 +00:00
dependabot[bot]
8ca390a2a8 Bump google-services from 4.3.13 to 4.3.14 (#7150)
Bumps google-services from 4.3.13 to 4.3.14.

---
updated-dependencies:
- dependency-name: com.google.gms:google-services
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-27 17:40:13 +01:00
Benoit Marty
a381f9fc52 Merge pull request #7216 from vector-im/dependabot/gradle/com.googlecode.libphonenumber-libphonenumber-8.12.56
Bump libphonenumber from 8.12.55 to 8.12.56
2022-09-27 18:10:14 +02:00
Nikita Fedrunov
337dce7d9e tests workflow will now update gradle cache when run against develop (#7238) 2022-09-27 17:45:50 +02:00
dependabot[bot]
d44ad6c351 Bump libphonenumber from 8.12.55 to 8.12.56
Bumps [libphonenumber](https://github.com/google/libphonenumber) from 8.12.55 to 8.12.56.
- [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.55...v8.12.56)

---
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-09-27 14:25:35 +00:00
Maxime NATUREL
68d9f672c5 Unit tests for after reAuth 2022-09-27 15:04:34 +02:00
Maxime NATUREL
dafa98eb77 Unit tests for signout error cases 2022-09-27 15:04:34 +02:00
Maxime NATUREL
89cf8ee8ec Unit test for signout success 2022-09-27 15:04:34 +02:00
Maxime NATUREL
da3d3308b4 Fix unit tests in ViewModel 2022-09-27 15:04:34 +02:00
Maxime NATUREL
68bee65e97 Confirm signout when it is current session 2022-09-27 15:04:34 +02:00
Maxime NATUREL
0fe5ee68f2 Unit tests for interception of signout process result 2022-09-27 15:04:34 +02:00
Maxime NATUREL
8d870b8220 Replace IsCurrentSessionUseCase by using DeviceFullInfo field 2022-09-27 15:04:34 +02:00
Maxime NATUREL
04ad2daa80 Unit tests for signout use case 2022-09-27 15:04:34 +02:00
Maxime NATUREL
bf42220422 Unit tests for view navigator 2022-09-27 15:04:34 +02:00
Maxime NATUREL
0c708c0ad4 Fix after rebase property qualifier 2022-09-27 15:04:34 +02:00
Maxime NATUREL
d6bb6efb1d Loading dialog during signout process 2022-09-27 15:04:34 +02:00
Maxime NATUREL
b2b3ee1fe5 Adding button to trigger sign out 2022-09-27 15:04:33 +02:00
Maxime NATUREL
7e81aa6193 ReAuth process 2022-09-27 15:04:33 +02:00
Maxime NATUREL
5380c30780 Adding signout action and corresponding use cases 2022-09-27 15:04:33 +02:00
Maxime NATUREL
320e9eac39 Adding changelog entry 2022-09-27 15:04:33 +02:00
Onuray Sahin
3e66a6538e Implement use case to parse user agent. 2022-09-27 15:45:34 +03:00
Adam Brown
fad02062d8 Instrumentation test coroutines (#7207)
Converting SDK instrumentation tests from CountdownLatch to suspending functions
2022-09-27 13:37:23 +01:00
Benoit Marty
67d899dce4 Deactivate some gradle doctor checks on the CI. 2022-09-27 14:34:51 +02:00
Adam Brown
a422361872 Merge pull request #7073 from vector-im/dependabot/gradle/moshi-1.14.0
Bump moshi from 1.13.0 to 1.14.0
2022-09-27 13:07:08 +01:00
dependabot[bot]
5666786635 Bump moshi from 1.13.0 to 1.14.0
Bumps `moshi` from 1.13.0 to 1.14.0.

Updates `moshi` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/square/moshi/releases)
- [Changelog](https://github.com/square/moshi/blob/master/CHANGELOG.md)
- [Commits](https://github.com/square/moshi/compare/moshi-parent-1.13.0...1.14.0)

Updates `moshi-kotlin` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/square/moshi/releases)
- [Changelog](https://github.com/square/moshi/blob/master/CHANGELOG.md)
- [Commits](https://github.com/square/moshi/compare/moshi-parent-1.13.0...1.14.0)

Updates `moshi-kotlin-codegen` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/square/moshi/releases)
- [Changelog](https://github.com/square/moshi/blob/master/CHANGELOG.md)
- [Commits](https://github.com/square/moshi/compare/moshi-parent-1.13.0...1.14.0)

Updates `moshi-adapters` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/square/moshi/releases)
- [Changelog](https://github.com/square/moshi/blob/master/CHANGELOG.md)
- [Commits](https://github.com/square/moshi/compare/moshi-parent-1.13.0...1.14.0)

---
updated-dependencies:
- dependency-name: com.squareup.moshi:moshi
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.squareup.moshi:moshi-kotlin
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.squareup.moshi:moshi-kotlin-codegen
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.squareup.moshi:moshi-adapters
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-27 11:04:30 +00:00
Adam Brown
d308b72868 Merge pull request #7129 from vector-im/feature/adm/screenshot-testing-example-test
Example screenshot test
2022-09-27 12:02:38 +01:00
Adam Brown
2d2b2e9218 using latest upload-artifact action (should fix missing glob) 2022-09-27 11:03:44 +01:00
Adam Brown
28f4e79b43 attempting to use 0% difference for screenshot verification
- this may cause false errors with the navigation/status bar https://github.com/cashapp/paparazzi/issues/453#issuecomment-1254001714
2022-09-27 10:16:45 +01:00
Benoit Marty
4d09f0888d Merge pull request #7231 from pt2121/pt/12-flip-table
Add support for `/tableflip` command (#12)
2022-09-27 11:11:08 +02:00
Benoit Marty
df0ce31f8f Merge pull request #7240 from vector-im/dependabot/gradle/org.json-json-20220924
Bump json from 20220320 to 20220924
2022-09-27 10:52:10 +02:00
Adam Brown
189369da71 Merge pull request #6249 from vector-im/dependabot/bundler/jmespath-1.6.1
Update Fastlane dependencies
2022-09-27 09:29:38 +01:00
Benoit Marty
974ac49594 Add default configuration of Gradle Doctor to the project.
Will allow to tweak the configuration if necessary.
2022-09-27 10:20:02 +02:00
Benoit Marty
c6e1154744 Set up gradle doctor plugin 2022-09-27 10:20:02 +02:00
Nikita Fedrunov
e9d1a9e04e app layout labs flag is enabled by default (#7237) 2022-09-27 09:54:24 +02:00
dependabot[bot]
5246035163 Bump json from 20220320 to 20220924
Bumps [json](https://github.com/douglascrockford/JSON-java) from 20220320 to 20220924.
- [Release notes](https://github.com/douglascrockford/JSON-java/releases)
- [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md)
- [Commits](https://github.com/douglascrockford/JSON-java/commits)

---
updated-dependencies:
- dependency-name: org.json:json
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 23:10:18 +00:00
yostyle
8dc71e07ed Add activities from Android API 33. 2022-09-27 00:24:33 +02:00
yostyle
bd64749b48 Add changelog 2022-09-27 00:24:33 +02:00
yostyle
dc1abb7978 Add Activities of android permission controller in the whitelist 2022-09-27 00:24:33 +02:00
ganfra
bf405394d8 Home room list: make some clean up 2022-09-26 19:36:50 +02:00
Adam Brown
08c79a798e Merge pull request #7115 from vector-im/docs/unit-testing
[docs] Unit testing documentation
2022-09-26 16:51:42 +01:00
Prat T
3f9b9827bd Add support for /tableflip command (#12)
Signed-off-by: Prat T <pt2121@users.noreply.github.com>
2022-09-26 07:25:34 -07:00
Adam Brown
4a81ee25ac manually including the paparazzi jar as the plugin is only applied when executing the screenshot tasks (which automatically included the jar previously) 2022-09-26 15:13:37 +01:00
Adam Brown
be1e8a8ef8 adding and recording example paparazzi test 2022-09-26 14:14:03 +01:00
Adam Brown
df752b9e58 Merge pull request #7210 from vector-im/feature/adm/emulator-network-access
Missing buildjet Emulator network
2022-09-26 13:39:12 +01:00
Onuray Sahin
c70b6206d0 Add user agent into device info. 2022-09-26 14:39:23 +03:00
Adam Brown
2e4ca1d6d9 ensuring build flags are applied to all test steps 2022-09-26 12:29:28 +01:00
Adam Brown
ac9333312a switching emulator image to the playstore variant to fix no network on the buildjet runner
- updates max workers to match available resources
- re-enables previously failing test
2022-09-26 12:28:50 +01:00
Adam Brown
59e7b70b03 Merge pull request #7128 from vector-im/feature/adm/screenshot-testing-setup
Paparazzi screenshot testing setup
2022-09-26 12:01:01 +01:00
Jorge Martín
90e4760ee7 Fix VoiceRecorderLTests by faking OggOpusEncoder 2022-09-26 11:32:29 +02:00
Adam Brown
c0baa2e8fd making use of the lazy task registration to allow only applying the paparazzi plugin when needed 2022-09-26 10:26:39 +01:00
Adam Brown
dc0599f966 removing jetifier screenshot config as the jetifier is no longer needed 2022-09-26 10:26:39 +01:00
Adam Brown
7d18d89a61 adding missing colon to yml run param 2022-09-26 10:26:39 +01:00
Adam Brown
7740404b14 using ## heading for the examples block 2022-09-26 10:26:39 +01:00
Adam Brown
469dd46a45 adding changelog entry 2022-09-26 10:26:39 +01:00
Adam Brown
1fab6e69c5 adding origin of bash script url 2022-09-26 10:26:39 +01:00
Adam Brown
c19b359f43 adding docs for creating, recording and verifying screenshot tests 2022-09-26 10:26:39 +01:00
Adam Brown
243ca01924 including lfs files when checking out during tests workflow 2022-09-26 10:26:39 +01:00
Adam Brown
b0e2596b58 including screenshot verification and error result uploads as part of the test step 2022-09-26 10:26:38 +01:00
Adam Brown
7f8cb4b1a1 ignoring the screenshot failure results from git 2022-09-26 10:26:38 +01:00
Adam Brown
0f19726fe2 creating custom tasks to record and verify screenshot
- introduces a 'screenshot' flag to include/exclude the screenshot tests from the default test runs
2022-09-26 10:26:38 +01:00
Adam Brown
9ef4975025 adding github action to validate screenshot files are commited with git lfs 2022-09-26 10:26:38 +01:00
Adam Brown
9fd77044a9 including git lfs config for picking up screenshot test recordings 2022-09-26 10:26:38 +01:00
Adam Brown
c66a38057e adding paparazzi screenshot testing lib setup 2022-09-26 10:26:38 +01:00
Adam Brown
2c1eef7a59 Merge pull request #7142 from vector-im/feature/adm/dialpad-lib
Manually including `im.dlg:android-dialer:1.2.5`
2022-09-26 10:14:56 +01:00
Maxime NATUREL
223149805b Merge pull request #7189 from vector-im/feature/mna/device-manager-rename-session
[Device management] Rename a session (PSG-747)
2022-09-26 10:35:15 +02:00
Maxime NATUREL
7a4bf83da0 Fix lint issue 2022-09-26 09:46:58 +02:00
Maxime NATUREL
fd85ad0f1b Add Init action + corresponding initialized event 2022-09-26 09:46:58 +02:00
Maxime NATUREL
e437c9e131 Updating info icon tint color 2022-09-26 09:46:58 +02:00
Maxime NATUREL
f0fe636654 Fix file name for styles of session warning info view 2022-09-26 09:46:58 +02:00
Maxime NATUREL
5de097e251 Adding warning info view 2022-09-26 09:46:58 +02:00
Maxime NATUREL
bd9b843df7 Focus on edit text + open keyboard when landing on screen 2022-09-26 09:46:58 +02:00
Maxime NATUREL
5498a7e96e Adding unit tests for view model 2022-09-26 09:46:58 +02:00
Maxime NATUREL
c96d671e6b Adding unit tests for navigator 2022-09-26 09:46:58 +02:00
Maxime NATUREL
4a3966d4f5 Improve rename session use case and add tests 2022-09-26 09:46:58 +02:00
Maxime NATUREL
d7afea7b3a Rename session use case 2022-09-26 09:46:58 +02:00
Maxime NATUREL
b134d35dd6 Adding save button and view actions 2022-09-26 09:46:58 +02:00
Maxime NATUREL
33cf3d3032 Setup a custom toolbar 2022-09-26 09:46:58 +02:00
Maxime NATUREL
7eab37e9d1 Small renaming of navigator method 2022-09-26 09:46:58 +02:00
Maxime NATUREL
c3d359e58f Adding edit text into the screen 2022-09-26 09:46:58 +02:00
Maxime NATUREL
54aec63f6c Small improvement in code readability 2022-09-26 09:46:58 +02:00
Maxime NATUREL
82fabf4a85 Adding menu with rename action in session overview screen 2022-09-26 09:46:58 +02:00
Maxime NATUREL
3de96a3a0c Adding new method into navigator 2022-09-26 09:46:58 +02:00
Maxime NATUREL
1091ae41ad Default structure for the new code 2022-09-26 09:46:58 +02:00
Maxime NATUREL
45b72483fe Adding changelog entry 2022-09-26 09:46:58 +02:00
Maxime NATUREL
a83be29dbe Merge pull request #7206 from vector-im/feature/mna/mutualize-pending-auth
Mutualize the pending auth handling (PSG-742)
2022-09-26 09:45:52 +02:00
Artjom König
2dda8af776 Merge branch 'vector-im:develop' into develop 2022-09-26 08:52:08 +02:00
Tomáš Beňo
079a2f5351 Hide Incognito Keyboard setting on unsupported devices 2022-09-25 14:56:20 +02:00
Tomáš Beňo
e5cf431cc7 Apply imeOptions to ComposerEditText without overriding previously set options 2022-09-25 14:42:07 +02:00
Tomáš Beňo
d2f9ca4cbc Improve summary text of Incognito Keyboard setting 2022-09-25 13:56:59 +02:00
Tomáš Beňo
79e4a435da Add privacy setting to disable personalized learning by the keyboard 2022-09-25 13:23:32 +02:00
Ihor Hordiichuk
30628217ae Translated using Weblate (Ukrainian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/
2022-09-25 00:33:03 +00:00
lvre
ef344236cd Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/pt_BR/
2022-09-25 00:33:01 +00:00
Vri
94b2026056 Translated using Weblate (German)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/de/
2022-09-25 00:33:00 +00:00
phardyle
d7ce983ef4 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.8% (2392 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/
2022-09-25 00:32:58 +00:00
Ihor Hordiichuk
e315db3c8e Translated using Weblate (Ukrainian)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/
2022-09-25 00:32:57 +00:00
Nui Harime
d86594099c Translated using Weblate (Russian)
Currently translated at 97.9% (2370 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2022-09-25 00:32:56 +00:00
lvre
312111c35a Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/
2022-09-25 00:32:55 +00:00
Szimszon
2a5a85af1f Translated using Weblate (Hungarian)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/
2022-09-25 00:32:53 +00:00
Vri
b356ac799a Translated using Weblate (German)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
2022-09-25 00:32:51 +00:00
Adam Brown
d0bff7495d Merge pull request #7205 from vector-im/dependabot/gradle/fragment-1.5.3
Bump fragment from 1.5.2 to 1.5.3
2022-09-23 15:56:51 +01:00
Maxime NATUREL
c9eaf30057 Updating the log in ssoAuthDone method to improve privacy 2022-09-23 16:39:41 +02:00
Maxime NATUREL
854a604fbe Fix missing loading ViewEvent 2022-09-23 16:39:41 +02:00
Maxime NATUREL
99c2088d0e Using UiaCancelledException on reAuth cancellation 2022-09-23 16:39:41 +02:00
Maxime NATUREL
0d7d841d73 Adding unit tests 2022-09-23 16:39:41 +02:00
Maxime NATUREL
0cd352ccba Adding changelog entry 2022-09-23 16:39:41 +02:00
Maxime NATUREL
892fd4445c Mutualize pending auth handling 2022-09-23 16:39:41 +02:00
Onuray Sahin
6c79aae3aa Merge pull request #7171 from vector-im/feature/ons/device_manager_security_sessions
[Device Manager] Unverified and inactive sessions list (PSG-698, PSG-696)
2022-09-23 17:22:44 +03:00
Onuray Sahin
33eeb721bf Merge branch 'develop' into feature/ons/extend_user_agent 2022-09-23 16:17:06 +03:00
Onuray Sahin
7cd30a1ed4 Merge branch 'develop' into feature/ons/device_manager_security_sessions 2022-09-23 16:16:49 +03:00
Benoit Marty
4fb7154f2b Merge pull request #7187 from vector-im/dependabot/gradle/com.github.UnifiedPush-android-connector-2.1.0
Bump android-connector from 2.0.1 to 2.1.0
2022-09-23 15:13:59 +02:00
Benoit Marty
46311356b7 Merge pull request #7222 from vector-im/feature/bma/ignore_flaky_test
Ignore flaky test "CantVerifyTest" and "fix" VoiceRecorderLTests
2022-09-23 15:10:30 +02:00
ganfra
6cba51eff3 Update changelog 1.5.0 for fastlane 2022-09-23 15:09:17 +02:00
Onuray Sahin
42983f5ce4 Write unit test for computing user agent user case. 2022-09-23 15:55:02 +03:00
Linerly
13bca69ae4 Translated using Weblate (Indonesian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/id/
2022-09-23 12:44:43 +00:00
waclaw66
a71cc768f5 Translated using Weblate (Czech)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/
2022-09-23 12:44:40 +00:00
Jeff Huang
dc9c0ce573 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/
2022-09-23 12:44:38 +00:00
Danial Behzadi
f45209d197 Translated using Weblate (Persian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/
2022-09-23 12:44:36 +00:00
random
e749831ad1 Translated using Weblate (Italian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/it/
2022-09-23 12:44:34 +00:00
Ihor Hordiichuk
4a752f7f43 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/
2022-09-23 12:44:31 +00:00
Jozef Gaal
9a438204c4 Translated using Weblate (Slovak)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/sk/
2022-09-23 12:44:29 +00:00
Glandos
15a027d7fd Translated using Weblate (French)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/fr/
2022-09-23 12:44:27 +00:00
Vri
ab7dc527fa Translated using Weblate (German)
Currently translated at 100.0% (76 of 76 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/de/
2022-09-23 12:44:25 +00:00
Jeff Huang
c0504a2002 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/
2022-09-23 12:44:23 +00:00
phardyle
f415a7f5db Translated using Weblate (Chinese (Simplified))
Currently translated at 98.1% (2375 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/
2022-09-23 12:44:19 +00:00
Ihor Hordiichuk
2a8dfc2a59 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/
2022-09-23 12:44:19 +00:00
Jozef Gaal
c0b854f54f Translated using Weblate (Slovak)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/sk/
2022-09-23 12:44:16 +00:00
Nui Harime
2228ece79a Translated using Weblate (Russian)
Currently translated at 97.3% (2356 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2022-09-23 12:44:13 +00:00
Didek
06286e6a7a Translated using Weblate (Polish)
Currently translated at 97.8% (2367 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/pl/
2022-09-23 12:44:11 +00:00
random
063b080d2c Translated using Weblate (Italian)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/it/
2022-09-23 12:44:10 +00:00
Linerly
0366205926 Translated using Weblate (Indonesian)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/id/
2022-09-23 12:44:07 +00:00
Glandos
ffa3e4b842 Translated using Weblate (French)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fr/
2022-09-23 12:44:05 +00:00
Danial Behzadi
589ccc142e Translated using Weblate (Persian)
Currently translated at 99.9% (2417 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/
2022-09-23 12:44:02 +00:00
waclaw66
204f36dc3d Translated using Weblate (Czech)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/
2022-09-23 12:44:01 +00:00
Auri B. P
b60bb295ad Translated using Weblate (Catalan)
Currently translated at 100.0% (2419 of 2419 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ca/
2022-09-23 12:43:58 +00:00
Benoit Marty
97b3b2363b Disable not passing VoiceRecorderLTests, for the time we are investigating the issue. 2022-09-23 14:09:44 +02:00
ganfra
92be6d1b49 Merge branch 'main' into develop 2022-09-23 12:20:00 +02:00
Valere
2ea357ddc0 Fix new layout flicker/leaks 2022-09-23 12:12:14 +02:00
Onuray Sahin
c7108f3ac3 Create use case to compute user agent. 2022-09-23 13:05:16 +03:00
Benoit Marty
56f3ecc4af Disable flaky CantVerifyTest, for the time we are investigating the issue. 2022-09-23 11:46:40 +02:00
Benoit Marty
56189a2d5d Merge pull request #7211 from vector-im/feature/bma/prevent_modification_of_translations
Prevent modification of translations
2022-09-23 10:46:38 +02:00
ganfra
40e304a4ff Merge branch 'main' into develop 2022-09-22 18:18:26 +02:00
Benoit Marty
a5ab942097 Add TOC to CONTRIBUTING.md 2022-09-22 17:52:52 +02:00
Benoit Marty
a07761dedb Fix issue with knit. 2022-09-22 17:48:38 +02:00
Benoit Marty
c56f33a939 Add changelog 2022-09-22 17:36:08 +02:00
Benoit Marty
60bfd0dd42 Merge pull request #7159 from vector-im/feature/bma/fix_new_lint_warning
Fix lint warning
2022-09-22 17:35:10 +02:00
Benoit Marty
6e2ce10f65 Add a note for string reordering 2022-09-22 17:22:58 +02:00
Benoit Marty
97c3623f89 Add a note for plurals 2022-09-22 17:22:58 +02:00
Benoit Marty
729eba750b Add link to the file values/strings.xml, and fix typo in the path. 2022-09-22 17:22:58 +02:00
Benoit Marty
a7856db218 Add a section about renaming id of String resource 2022-09-22 17:10:46 +02:00
Benoit Marty
cefe2e9ef4 Add a rule to Danger to check that translation files are not modified by developers. 2022-09-22 17:03:45 +02:00
Benoit Marty
f4c5cba020 Merge pull request #7126 from vector-im/feature/bma/arch_doc
Architecture doc
2022-09-22 16:41:17 +02:00
Adam Brown
65156a8ece Merge pull request #7198 from vector-im/feature/adm/configurable-sync-timeout
Allow configurable sync timeout
2022-09-22 15:40:58 +01:00
Benoit Marty
828413c2c5 Fix some typo 2022-09-22 16:40:34 +02:00
Benoit Marty
086a6ee9a1 Update after Ganfra's review 2022-09-22 16:39:35 +02:00
Benoit Marty
3600e374f2 Avoid code duplication 2022-09-22 16:34:07 +02:00
Benoit Marty
0559911f39 Fix non passing tests 2022-09-22 16:34:07 +02:00
Benoit Marty
7f5c712e88 No need to use @SuppressLint("NewApi") when @ChecksSdkIntAtLeast is used - more cleanup 2022-09-22 16:34:07 +02:00
Benoit Marty
658a09ea6a No need to use @SuppressLint("NewApi") when @ChecksSdkIntAtLeast is used. 2022-09-22 16:32:14 +02:00
Benoit Marty
5886245bbf Reverse condition for code clarity with ChecksSdkIntAtLeast 2022-09-22 16:32:14 +02:00
Benoit Marty
0910b118ff Changelog 2022-09-22 16:32:14 +02:00
Benoit Marty
2bda97224c Cleanup 2022-09-22 16:32:14 +02:00
Benoit Marty
2266723789 Remove DefaultSharedPreferences since we now have @DefaultPreferences which provide a singleton. 2022-09-22 16:32:14 +02:00
Benoit Marty
c735ea5e3d Remove duplication between KeysBackupBanner.State and ServerBackupStatusViewModel.BannerState and move the some logic to the ViewModel 2022-09-22 16:32:14 +02:00
Benoit Marty
b4494ee8ea Remove DefaultSharedPreferences since we now have @DefaultPreferences which provide a singleton.
Some fun has been moved to injectable classes due to this change. Not compiling, still work to do, but I prefer to split into 2 separate commits.
2022-09-22 16:32:14 +02:00
Benoit Marty
5736c8f648 Remove DefaultSharedPreferences since we now have @DefaultPreferences which provide a singleton.
Some fun has been moved to injectable classes due to this change. Not compiling, still work to do, but I prefer to split into 2 separate commits.
2022-09-22 16:32:14 +02:00
Benoit Marty
0324927b04 Create VectorLocaleProvider, to just read the current Locale from the SharedPreference 2022-09-22 16:32:14 +02:00
Benoit Marty
d8436874e2 Fix StaticFieldLeak issue (context).
Make VectorLocal an injectable class.
2022-09-22 16:32:14 +02:00
Benoit Marty
7e8a39e6de Suppress LaunchActivityFromNotification. This is fine here, this is the notification for the diagnostic, we do not want to start an Activity. 2022-09-22 16:32:14 +02:00
Benoit Marty
832a472b57 Add @ChecksSdkIntAtLeast annotation, to be able to remove AndroidVersionTestOverrider 2022-09-22 16:32:14 +02:00
Benoit Marty
bb2eb56ee6 Add @ChecksSdkIntAtLeast annotation. 2022-09-22 16:32:14 +02:00
Benoit Marty
1ff4a5f212 Ignore AlwaysShowAction lint issue. Also make it an error, so that developer has to explicitly disable the warning. 2022-09-22 16:32:14 +02:00
dependabot[bot]
33e613fe96 Bump dagger from 2.42 to 2.44
Bumps `dagger` from 2.42 to 2.44.

Updates `hilt-android-gradle-plugin` from 2.42 to 2.44
- [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.44)

Updates `dagger` from 2.42 to 2.44
- [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.44)

Updates `dagger-compiler` from 2.42 to 2.44
- [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.44)

Updates `hilt-android` from 2.42 to 2.44
- [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.44)

Updates `hilt-android-testing` from 2.42 to 2.44
- [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.44)

Updates `hilt-compiler` from 2.42 to 2.44
- [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.44)

---
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-09-22 14:31:31 +00:00
dependabot[bot]
2aa9382fba Bump android-connector from 2.0.1 to 2.1.0
Bumps [android-connector](https://github.com/UnifiedPush/android-connector) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/UnifiedPush/android-connector/releases)
- [Commits](https://github.com/UnifiedPush/android-connector/compare/2.0.1...2.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-22 14:31:16 +00:00
Benoit Marty
151f6245db Merge pull request #6929 from vector-im/feature/bma/android12
Target API 32 (Android 12)
2022-09-22 16:30:04 +02:00
Onuray Sahin
c37a6842fe Update format to be consistent with Element iOS. 2022-09-22 15:53:29 +03:00
Onuray Sahin
ea78f504d7 Small refactoring. 2022-09-22 15:28:26 +03:00
Onuray Sahin
8b3eaf10e1 Add changelog. 2022-09-22 15:25:31 +03:00
Onuray Sahin
b2e7cc2208 Extend user agent by adding device manufacturer and model to the beginning. 2022-09-22 15:18:20 +03:00
Benoit Marty
e98bfe5c9b Merge pull request #7156 from vector-im/feature/mna/device-manager-verify-other-session
[Device management] Verify another session (PSG-722)
2022-09-22 11:46:28 +02:00
Benoit Marty
4e30bc86b8 Merge pull request #7139 from vector-im/feature/mna/device-manager-verify-current-session
[Device management] Verify current session (PSG-722)
2022-09-22 11:46:07 +02:00
ganfra
fabfe36ede Update versions to 1.5.2 2022-09-22 10:31:31 +02:00
ganfra
2a9cf32829 Merge branch 'main' into develop 2022-09-22 10:28:04 +02:00
dependabot[bot]
44f6e66efb Bump fragment from 1.5.2 to 1.5.3
Bumps `fragment` from 1.5.2 to 1.5.3.

Updates `fragment-ktx` from 1.5.2 to 1.5.3

Updates `fragment-testing` from 1.5.2 to 1.5.3

---
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-09-21 23:10:46 +00:00
Adam Brown
600588dbbb adding trailing commas 2022-09-21 16:37:31 +01:00
Adam Brown
d75e37966c adding changelog entry 2022-09-21 15:39:13 +01:00
Adam Brown
9ab78c93e2 reducing sync timeout for instrumentation tests to speed them up 2022-09-21 15:39:13 +01:00
Adam Brown
7f31098ba1 lifting the sync timeout to the matrix configuration 2022-09-21 15:39:09 +01:00
Benoit Marty
b9c28ba4ce Merge branch 'develop' into feature/bma/android12 2022-09-21 16:24:30 +02:00
Onuray Sahin
8de9ef8c7d Code review fixes. 2022-09-21 14:30:24 +03:00
Onuray Sahin
4ab798f88d Code review fixes. 2022-09-21 14:16:51 +03:00
Onuray Sahin
45cf7dcd63 Merge branch 'develop' into feature/ons/device_manager_security_sessions 2022-09-20 17:11:51 +03:00
Onuray Sahin
3ea054f8e1 Fix unit test. 2022-09-20 15:06:52 +03:00
Adam Brown
2168362a8b including appcompat (instead of the support library) to fix colorPrimary attribute compiliation issues 2022-09-20 10:06:21 +01:00
Maxime NATUREL
943ec7ee75 Reducing argument number in session info view update method 2022-09-20 10:46:10 +02:00
Maxime NATUREL
72637b465f Using viewState value to check if it is current session 2022-09-20 10:46:10 +02:00
Maxime NATUREL
aa7f7d7111 Fix after rebase 2022-09-20 10:46:10 +02:00
Maxime NATUREL
17bb14c1dc Fixing coding style issues 2022-09-20 10:46:10 +02:00
Maxime NATUREL
921533e4b2 Getting the current session verification status to change verify button visibility 2022-09-20 10:46:10 +02:00
Maxime NATUREL
95d133e0e2 Moving some components inside the verification package 2022-09-20 10:46:10 +02:00
Maxime NATUREL
a6cb25d0c3 Verification of another session 2022-09-20 10:46:10 +02:00
Maxime NATUREL
c16e1ca291 Adding changelog entry 2022-09-20 10:46:10 +02:00
Maxime NATUREL
54a4dc7e9a Inverting some arguments to ease readability 2022-09-20 10:45:47 +02:00
Maxime NATUREL
cf6b8d76a8 Removing non necessary session id arg from ViewAction 2022-09-20 10:45:46 +02:00
Maxime NATUREL
e0c4706cf9 Removing non necessary session arg from ViewEvent 2022-09-20 10:45:46 +02:00
Maxime NATUREL
584c699409 Verify current session in Session overview screen 2022-09-20 10:45:46 +02:00
Maxime NATUREL
fa990351af Editing changelog entry 2022-09-20 10:45:46 +02:00
Maxime NATUREL
32b5606498 Fixing missing event to start verification process 2022-09-20 10:45:46 +02:00
Maxime NATUREL
35db958279 Adding unit tests for new action in DevicesViewModel 2022-09-20 10:45:46 +02:00
Maxime NATUREL
d826327773 Adding unit tests for CheckIfCurrentSessionCanBeVerifiedUseCase 2022-09-20 10:45:46 +02:00
Maxime NATUREL
8cd7b0744a Verification process for the current Session 2022-09-20 10:45:46 +02:00
Maxime NATUREL
5759a0f7da Adding click listeners on verify button 2022-09-20 10:45:46 +02:00
Maxime NATUREL
81beccdd8e Adding changelog entry 2022-09-20 10:45:46 +02:00
Onuray Sahin
72cc0deda2 Add changelog. 2022-09-19 16:45:52 +03:00
Onuray Sahin
2ad0cd46bb Fix unit tests. 2022-09-19 16:18:30 +03:00
Onuray Sahin
ec9843fb53 Fix unverified session detection logic. 2022-09-19 15:38:02 +03:00
Onuray Sahin
7db222af0c Render security recommendation sessions. 2022-09-19 15:37:13 +03:00
Onuray Sahin
740b69d48c Make other sessions view dynamic. 2022-09-19 13:42:30 +03:00
Benoit Marty
e2d131fc4f Move xml resource in the module where they are used to avoid lint false positive UnusedResources issues. 2022-09-19 11:56:40 +02:00
Benoit Marty
c91ba06285 Fix lint warnings, some code has vanished dur to the rebasing of the branch... 2022-09-19 10:50:15 +02:00
Benoit Marty
d4eb619d40 Changelog 2022-09-16 23:30:20 +02:00
Benoit Marty
a1f4ffbf17 Use vanniktechEmoji "0.16.0-SNAPSHOT" 2022-09-16 23:12:48 +02:00
Benoit Marty
84afa4714a App compat 1.5.1 2022-09-16 23:01:56 +02:00
Benoit Marty
892484a1b3 Upgrade kotlin from 1.6.21 to 1.7.10 and dagger (+hilt) from 2.42 to 2.43.2 2022-09-16 23:01:56 +02:00
Benoit Marty
57db43c80a Fix gradle warning:
WARNING:API 'ApkVariantOutput.getVersionCodeOverride()' is obsolete and has been replaced with 'VariantOutput.versionCode()'.
2022-09-16 23:01:29 +02:00
Benoit Marty
c5571c06ed Upgrade gradle plugin from 7.1.3 to 7.2.2 2022-09-16 23:01:29 +02:00
Benoit Marty
842a9bbd55 Add dataExtractionRules, applicable to Android 12. Exclude everything from being backed up. Also properly support Android 11. 2022-09-16 23:01:29 +02:00
Benoit Marty
88482c9b2e Reduce level API check, this seems not necessary. 2022-09-16 23:00:39 +02:00
Benoit Marty
cde7096928 Restore this annotation 2022-09-16 23:00:39 +02:00
Benoit Marty
518ec738f3 Reduce level API check, this seems not necessary. 2022-09-16 23:00:39 +02:00
Benoit Marty
e17f009566 Reduce level API check, this seems not necessary. 2022-09-16 23:00:39 +02:00
Benoit Marty
536b9cf926 Move @Suppress("DEPRECATION") closer to the deprecated usage. Will help to detect other deprecated API usage. 2022-09-16 23:00:39 +02:00
Benoit Marty
24e4f94e61 Stop using deprecated method. 2022-09-16 23:00:39 +02:00
Benoit Marty
3f3c83a43d Remove deprecated internal class. 2022-09-16 23:00:39 +02:00
Benoit Marty
8b64bd38b7 'compileSdk': 32, 'targetSdk': 32 2022-09-16 23:00:39 +02:00
dependabot[bot]
d9ee51a212 Bump emoji2 from 1.1.0 to 1.2.0
Bumps emoji2 from 1.1.0 to 1.2.0.

---
updated-dependencies:
- dependency-name: androidx.emoji2:emoji2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-16 23:00:39 +02:00
dependabot[bot]
ea274c4df6 Bump appcompat from 1.4.2 to 1.5.0
Bumps appcompat from 1.4.2 to 1.5.0.

---
updated-dependencies:
- dependency-name: androidx.appcompat:appcompat
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-16 23:00:39 +02:00
Adam Brown
0385f387d9 using value notion instead of key for the elements in the circular cache 2022-09-16 16:34:42 +01:00
Adam Brown
4a0cda3268 formatting tweaks 2022-09-16 16:34:38 +01:00
Adam Brown
739a513f89 moving external library modules to an external directory 2022-09-16 15:15:32 +01:00
Adam Brown
e83fa9c81f removing dialpad reliance on the legacy support library 2022-09-16 15:15:32 +01:00
Adam Brown
abd70d953b disabling lint for the pulled in module 2022-09-16 15:15:32 +01:00
Adam Brown
5058f942af manually including the im.dlg:android-dialer:1.2.5
- avoids using appcompat
- avoids using an artifact without a source repository
2022-09-16 15:15:32 +01:00
Benoit Marty
bdda8dbc48 Changelogs 2022-09-14 18:19:57 +02:00
Benoit Marty
7341a65410 Run knit. 2022-09-14 18:17:15 +02:00
Benoit Marty
b9294381b8 Add a paragraph about test. 2022-09-14 17:52:11 +02:00
Benoit Marty
8623b85ac8 Add support to /devtools command 2022-09-14 17:49:55 +02:00
Benoit Marty
f67cf0d591 Reduce link size. 2022-09-14 17:38:50 +02:00
Benoit Marty
c72ab3d187 Add link to the new doc to the README file. 2022-09-14 17:38:28 +02:00
Benoit Marty
64fb985d3b First draft of documentation to onboard new developers. 2022-09-14 17:36:59 +02:00
Benoit Marty
970abb4dde Rename file. 2022-09-14 16:53:38 +02:00
Adam Brown
1b3e099d7c adding first pass at unit testing documentation 2022-09-14 10:21:34 +01:00
Artjom König
098fac635d Merge branch 'vector-im:develop' into develop 2022-09-05 12:06:19 +02:00
Artjom König
7991684fc8 Merge branch 'vector-im:develop' into develop 2022-09-02 16:05:45 +02:00
Artjom König
6452a95e0a clean up pin code and biometrics on logout 2022-08-22 14:08:29 +02:00
networkException
2bca94d92b Changelog: Add .bugfix entry for pull request #6215
Signed-off-by: networkException <git@nwex.de>
2022-08-21 12:07:55 +02:00
networkException
5fede491ee ImageContentRenderer: Only animate images using ANIMATED_THUMBNAIL mode
This patch removes the dependency on `VectorSettings` as well as only
enable animated rendering if the image is actually playable.

Signed-off-by: networkException <git@nwex.de>
2022-08-21 12:07:55 +02:00
networkException
dccc64384c Implement Mode.ANIMATED_THUMBNAIL used for autoplaying animated images
This patch introduces a new `ImageContentRenderer` mode used for
autoplaying animated images. The mode shares url resolving semantics
with `FULL_SIZE` and `STICKER`, as such not just fetching thumbnail data
but shares sizing semantics with `THUMBNAIL` (scaling by image height).

This change fixes animated images not playing in cases in which only a
static thumbnail would be loaded.

This new mode will only be chosen if the message content is actually a
playable image, as such limiting bandwith usage to the required amount
by avoiding to load normal images fully (still fetching animated images
will increase bandwith usage as a whole of course).

Signed-off-by: networkException <git@nwex.de>
2022-08-21 12:07:54 +02:00
Benoit Marty
b52171c1dc Run bundle update again. 2022-08-17 16:55:33 +02:00
Benoit Marty
84aed0a5d5 Merge branch 'develop' into dependabot/bundler/jmespath-1.6.1 2022-08-17 16:51:58 +02:00
eidonia
cd71abeb9f [Bugfix #5029] disable emoji keyboard not applies to reply
Signed-off-by: eidonia <bastien_rambeaud@hotmail.com>
2022-08-16 19:29:14 +02:00
rudmannn
a97addfa3b replace android:gravity for backward compatibility 2022-08-07 11:14:10 +08:00
Adam Brown
4d8f24b73c updating fastlane dependencies 2022-06-23 11:11:33 +01:00
dependabot[bot]
31c962567f Bump jmespath from 1.4.0 to 1.6.1
Bumps [jmespath](https://github.com/trevorrowe/jmespath.rb) from 1.4.0 to 1.6.1.
- [Release notes](https://github.com/trevorrowe/jmespath.rb/releases)
- [Changelog](https://github.com/jmespath/jmespath.rb/blob/main/CHANGELOG.md)
- [Commits](https://github.com/trevorrowe/jmespath.rb/compare/v1.4.0...v1.6.1)

---
updated-dependencies:
- dependency-name: jmespath
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-07 22:00:23 +00:00
Danny Seymour
3267a0410a fix: tweak styling of message bubbles
* Decreases the size of rounded corners
* Increases the maximum width of message bubbles to help avoid unnecessary unused space on screen

Signed-off-by: Danny Seymour <danny@seymour.family>
2022-04-07 02:36:07 -07:00
861 changed files with 13664 additions and 3942 deletions

1
.gitattributes vendored Normal file
View File

@@ -0,0 +1 @@
**/snapshots/**/*.png filter=lfs diff=lfs merge=lfs -text

View File

@@ -11,7 +11,7 @@ jobs:
- run: |
npm install --save-dev @babel/plugin-transform-flow-strip-types
- name: Danger
uses: danger/danger-js@11.1.2
uses: danger/danger-js@11.1.3
with:
args: "--dangerfile tools/danger/dangerfile.js"
env:

View File

@@ -66,7 +66,7 @@ jobs:
yarn add danger-plugin-lint-report --dev
- name: Danger lint
if: always()
uses: danger/danger-js@11.1.2
uses: danger/danger-js@11.1.3
with:
args: "--dangerfile tools/danger/dangerfile-lint.js"
env:

View File

@@ -8,7 +8,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
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
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 4 --no-daemon
jobs:
tests:
@@ -24,12 +24,29 @@ jobs:
steps:
- uses: actions/checkout@v3
with:
lfs: true
fetch-depth: 0
- uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: '11'
- uses: gradle/gradle-build-action@v2
with:
cache-read-only: ${{ github.ref != 'refs/heads/develop' }}
gradle-home-cache-cleanup: ${{ github.ref == 'refs/heads/develop' }}
- name: Run screenshot tests
run: ./gradlew verifyScreenshots $CI_GRADLE_ARG_PROPERTIES
- name: Archive Screenshot Results on Error
if: failure()
uses: actions/upload-artifact@v3
with:
name: screenshot-results
path: |
**/out/failures/
**/build/reports/tests/*UnitTest/
- uses: actions/setup-python@v4
with:
python-version: 3.8
@@ -40,27 +57,6 @@ jobs:
disableRateLimiting: true
public_baseurl: "http://10.0.2.2:8080/"
- name: AVD cache
uses: actions/cache@v3
id: avd-cache
with:
path: |
~/.android/avd/*
~/.android/adb*
key: avd-${{ matrix.api-level }}
- name: create AVD and generate snapshot for caching
if: steps.avd-cache.outputs.cache-hit != 'true'
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: ${{ matrix.api-level }}
arch: x86
profile: Nexus 5X
force-avd-creation: true # Is set to false in the doc https://github.com/ReactiveCircus/android-emulator-runner
emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
script: echo "Generated AVD snapshot for caching."
- name: Run all the codecoverage tests at once
uses: reactivecircus/android-emulator-runner@v2
# continue-on-error: true
@@ -68,6 +64,7 @@ jobs:
api-level: ${{ matrix.api-level }}
arch: x86
profile: Nexus 5X
target: playstore
force-avd-creation: false
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true

15
.github/workflows/validate-lfs.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
name: Validate Git LFS
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
name: Validate
steps:
- uses: actions/checkout@v3
with:
lfs: 'true'
- run: |
./tools/validate_lfs.sh

1
.gitignore vendored
View File

@@ -22,3 +22,4 @@
/package.json
/yarn.lock
/node_modules
**/out/failures

View File

@@ -1,3 +1,59 @@
Changes in Element v1.5.2 (2022-10-05)
======================================
Features ✨
----------
- New App Layout is now enabled by default! Go to the Settings > Labs to toggle this ([#7166](https://github.com/vector-im/element-android/issues/7166))
- Render inline images in the timeline ([#351](https://github.com/vector-im/element-android/issues/351))
- Add privacy setting to disable personalized learning by the keyboard ([#6633](https://github.com/vector-im/element-android/issues/6633))
Bugfixes 🐛
----------
- Disable emoji keyboard not applies in reply ([#5029](https://github.com/vector-im/element-android/issues/5029))
- Fix animated images not autoplaying sometimes if only a thumbnail was fetched from the server ([#6215](https://github.com/vector-im/element-android/issues/6215))
- Add Warning shield when a user previously verified rotated their cross signing keys ([#6702](https://github.com/vector-im/element-android/issues/6702))
- Can't verify user when option to send keys to verified devices only is selected ([#6723](https://github.com/vector-im/element-android/issues/6723))
- Add option to only send to verified devices per room (web parity) ([#6725](https://github.com/vector-im/element-android/issues/6725))
- Delete pin code key and the key used for biometrics authentication on logout ([#6906](https://github.com/vector-im/element-android/issues/6906))
- Fix crash on previewing images to upload on Android Pie. ([#7184](https://github.com/vector-im/element-android/issues/7184))
- Fix app restarts in loop on Android 13 on the first run of the app. ([#7224](https://github.com/vector-im/element-android/issues/7224))
In development 🚧
----------------
- [Device Management] Learn more bottom sheets ([#7100](https://github.com/vector-im/element-android/issues/7100))
- [Device management] Verify current session ([#7114](https://github.com/vector-im/element-android/issues/7114))
- [Device management] Verify another session ([#7143](https://github.com/vector-im/element-android/issues/7143))
- [Device management] Rename a session ([#7158](https://github.com/vector-im/element-android/issues/7158))
- [Device Manager] Unverified and inactive sessions list ([#7170](https://github.com/vector-im/element-android/issues/7170))
- [Device management] Sign out a session ([#7190](https://github.com/vector-im/element-android/issues/7190))
- [Device Manager] Parse user agents ([#7247](https://github.com/vector-im/element-android/issues/7247))
- [Voice Broadcast] Add a feature flag with the composer action ([#7258](https://github.com/vector-im/element-android/issues/7258))
Improved Documentation 📚
------------------------
- Draft onboarding documentation of the project at `./docs/_developer_onboarding.md` ([#7126](https://github.com/vector-im/element-android/issues/7126))
SDK API changes ⚠️
------------------
- Allow the sync timeout to be configured (mainly useful for testing) ([#7198](https://github.com/vector-im/element-android/issues/7198))
- Ports SDK instrumentation tests to use suspending functions instead of countdown latches ([#7207](https://github.com/vector-im/element-android/issues/7207))
- [Device Manager] Extend user agent to include device information ([#7209](https://github.com/vector-im/element-android/issues/7209))
Other changes
-------------
- Add support for `/tableflip` command ([#12](https://github.com/vector-im/element-android/issues/12))
- Decreases the size of rounded corners and increases the maximum width of message bubbles to help avoid unnecessary unused space on screen ([#5712](https://github.com/vector-im/element-android/issues/5712))
- Adds screenshot testing tooling ([#5798](https://github.com/vector-im/element-android/issues/5798))
- [AppLayout]: added tracking of new analytics events ([#6508](https://github.com/vector-im/element-android/issues/6508))
- Target API 12 and compile with Android SDK 32. ([#6929](https://github.com/vector-im/element-android/issues/6929))
- Add basic integration of Sentry to capture errors and crashes if user has given consent. ([#7076](https://github.com/vector-im/element-android/issues/7076))
- Add support to `/devtools` command. ([#7126](https://github.com/vector-im/element-android/issues/7126))
- Fix lint warning, and cleanup the code ([#7159](https://github.com/vector-im/element-android/issues/7159))
- Mutualize the pending auth handling ([#7193](https://github.com/vector-im/element-android/issues/7193))
- CI: Prevent modification of translations by developer. ([#7211](https://github.com/vector-im/element-android/issues/7211))
- Fix typo in strings.xml and make sure this is American English. ([#7287](https://github.com/vector-im/element-android/issues/7287))
Changes in Element v1.5.1 (2022-09-28)
======================================

View File

@@ -1,10 +1,42 @@
# Contributing code to Matrix
# Contributing to Element Android
<!--- TOC -->
* [Contributing code to Matrix](#contributing-code-to-matrix)
* [Android Studio settings](#android-studio-settings)
* [Template](#template)
* [Compilation](#compilation)
* [I want to help translating Element](#i-want-to-help-translating-element)
* [I want to submit a PR to fix an issue](#i-want-to-submit-a-pr-to-fix-an-issue)
* [Kotlin](#kotlin)
* [Changelog](#changelog)
* [Code quality](#code-quality)
* [Internal tool](#internal-tool)
* [ktlint](#ktlint)
* [lint](#lint)
* [Unit tests](#unit-tests)
* [Tests](#tests)
* [Internationalisation](#internationalisation)
* [Adding new string](#adding-new-string)
* [Plurals](#plurals)
* [Editing existing strings](#editing-existing-strings)
* [Removing existing strings](#removing-existing-strings)
* [Renaming string ids](#renaming-string-ids)
* [Reordering strings](#reordering-strings)
* [Accessibility](#accessibility)
* [Layout](#layout)
* [Authors](#authors)
* [Thanks](#thanks)
<!--- END -->
## Contributing code to Matrix
Please read https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.md
Element Android support can be found in this room: [![Element Android Matrix room #element-android:matrix.org](https://img.shields.io/matrix/element-android:matrix.org.svg?label=%23element-android:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#element-android:matrix.org).
# Specific rules for Matrix Android projects
The rest of the document contains specific rules for Matrix Android projects
## Android Studio settings
@@ -120,17 +152,21 @@ You should consider adding Unit tests with your PR, and also integration tests (
Translations are handled using an external tool: [Weblate](https://translate.element.io/projects/element-android/)
As a general rule, please never edit or add or remove translations to the project in a Pull Request. It can lead to merge conflict if the translations are also modified in Weblate side.
**As a general rule, please never edit or add or remove translations to the project in a Pull Request**. It can lead to merge conflict if the translations are also modified in Weblate side. Pull Request containing change(s) on the translation files cannot be merged.
#### Adding new string
When adding new string resources, please only add new entries in the file `value/strings.xml`. Translations will be added later by the community of translators using Weblate.
When adding new string resources, please only add new entries in the file `values/strings.xml` ([this file](./library/ui-strings/src/main/res/values/strings.xml)). Translations will be added later by the community of translators using Weblate.
The file `value/strings.xml` must only contain American English (U. S. English) values, as this is the default language of the Android operating system. So for instance, please use "color" instead of "colour". Element Android will still use the language set on the system by the user, like any other Android applications which provide translations. The system language can be any other English language variants, or any other languages. Note that this is also possible to override the system language using the Element Android in-app language settings.
The file `values/strings.xml` must only contain American English (U. S. English) values, as this is the default language of the Android operating system. So for instance, please use "color" instead of "colour". Element Android will still use the language set on the system by the user, like any other Android applications which provide translations. The system language can be any other English language variants, or any other languages. Note that this is also possible to override the system language using the Element Android in-app language settings.
New strings can be added anywhere in the file `value/strings.xml`, not necessarily at the end of the file. Generally, it's even better to add the new strings in some dedicated section per feature, and not at the end of the file, to avoid merge conflict between 2 PR adding strings at the end of the same file.
New strings can be added anywhere in the file `values/strings.xml`, not necessarily at the end of the file. Generally, it's even better to add the new strings in some dedicated section per feature, and not at the end of the file, to avoid merge conflict between 2 PR adding strings at the end of the same file.
Do not hesitate to use plurals when appropriate.
##### Plurals
Please use `plurals` resources when appropriate, and note that some languages have specific rules for `plurals`, so even if the string will always be at the plural form for English, please always create a `plurals` resource.
Specific plural forms can be found [here](https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_plural_rules.html).
#### Editing existing strings
@@ -150,6 +186,23 @@ And add `tools:ignore="UnusedResources"` to the string, to let lint ignore that
The string will be removed during the next sync with Weblate.
#### Renaming string ids
This is possible to rename ids of the String resources, but since translation files cannot be edited, add TODO in the main strings.xml file above the strings you want to rename.
```xml
<!-- TODO Rename id to put_new_id_here -->
<string name="current_id">Hello Matrix world!</string>
```
The string id(s) will be renamed during the next Weblate sync.
#### Reordering strings
To group strings per feature, or for any other reasons, it is possible to reorder string resources, but only in the [main strings.xml file](./library/ui-strings/src/main/res/values/strings.xml). ). We do not mind about ordering in the translation files, and anyway this is forbidden to edit manually the translation files.
It is also possible to add empty lines between string resources, and to add XML comments. Please note that the XML comment just above a String resource will also appear on Weblate and be visible to the translators.
### Accessibility
Please consider accessibility as an important point. As a minimum requirement, in layout XML files please use attributes such as `android:contentDescription` and `android:importantForAccessibility`, and test with a screen reader if it's working well. You can add new string resources, dedicated to accessibility, in this case, please prefix theirs id with `a11y_`.

View File

@@ -1,29 +1,30 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.3)
CFPropertyList (3.0.5)
rexml
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
artifactory (3.0.15)
atomos (0.1.3)
aws-eventstream (1.1.1)
aws-partitions (1.479.0)
aws-sdk-core (3.117.0)
aws-eventstream (1.2.0)
aws-partitions (1.619.0)
aws-sdk-core (3.132.0)
aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.239.0)
aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
aws-sdk-kms (1.44.0)
aws-sdk-core (~> 3, >= 3.112.0)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.58.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.96.1)
aws-sdk-core (~> 3, >= 3.112.0)
aws-sdk-s3 (1.114.0)
aws-sdk-core (~> 3, >= 3.127.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.1)
aws-sigv4 (1.2.4)
aws-sigv4 (~> 1.4)
aws-sigv4 (1.5.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
claide (1.0.3)
claide (1.1.0)
claide-plugins (0.9.2)
cork
nap
@@ -48,22 +49,24 @@ GEM
octokit (~> 4.7)
terminal-table (>= 1, < 4)
declarative (0.0.20)
digest-crc (0.6.3)
digest-crc (0.6.4)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.7.6)
emoji_regex (3.2.2)
excon (0.85.0)
faraday (1.5.1)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.92.4)
faraday (1.10.1)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0.1)
faraday-httpclient (~> 1.0)
faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.1)
faraday-net_http_persistent (~> 1.0)
faraday-patron (~> 1.0)
multipart-post (>= 1.2, < 3)
faraday-rack (~> 1.0)
faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.7)
faraday (>= 0.8.0)
@@ -71,18 +74,22 @@ GEM
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.0)
faraday-excon (1.1.0)
faraday-http-cache (2.4.0)
faraday-http-cache (2.4.1)
faraday (>= 0.8)
faraday-httpclient (1.0.1)
faraday-multipart (1.0.4)
multipart-post (~> 2)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday_middleware (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.4)
fastlane (2.187.0)
fastimage (2.2.6)
fastlane (2.209.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.3, < 3.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
@@ -97,7 +104,7 @@ GEM
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.1)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
@@ -106,6 +113,7 @@ GEM
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (~> 2.0.0)
naturally (~> 2.2)
optparse (~> 0.1.1)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.3)
@@ -121,9 +129,9 @@ GEM
gh_inspector (1.1.3)
git (1.11.0)
rchardet (~> 1.8)
google-apis-androidpublisher_v3 (0.8.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-core (0.4.0)
google-apis-androidpublisher_v3 (0.25.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-core (0.7.0)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
@@ -132,47 +140,47 @@ GEM
retriable (>= 2.0, < 4.a)
rexml
webrick
google-apis-iamcredentials_v1 (0.6.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-playcustomapp_v1 (0.5.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-storage_v1 (0.6.0)
google-apis-core (>= 0.4, < 2.a)
google-apis-iamcredentials_v1 (0.13.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-playcustomapp_v1 (0.10.0)
google-apis-core (>= 0.7, < 2.a)
google-apis-storage_v1 (0.17.0)
google-apis-core (>= 0.7, < 2.a)
google-cloud-core (1.6.0)
google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0)
google-cloud-env (1.5.0)
faraday (>= 0.17.3, < 2.0)
google-cloud-errors (1.1.0)
google-cloud-storage (1.34.1)
addressable (~> 2.5)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.2.0)
google-cloud-storage (1.38.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.17.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (0.16.2)
faraday (>= 0.17.3, < 2.0)
googleauth (1.2.0)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
memoist (~> 0.16)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (~> 0.14)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.4)
http-cookie (1.0.5)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.4.0)
json (2.5.1)
jwt (2.2.3)
jmespath (1.6.1)
json (2.6.2)
jwt (2.4.1)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
memoist (0.16.2)
mini_magick (4.11.0)
mini_mime (1.1.0)
mini_mime (1.1.2)
multi_json (1.15.0)
multipart-post (2.0.0)
nanaimo (0.3.0)
@@ -183,12 +191,13 @@ GEM
faraday (>= 1, < 3)
sawyer (~> 0.9)
open4 (1.3.4)
os (1.1.1)
optparse (0.1.1)
os (1.1.4)
plist (3.6.0)
public_suffix (4.0.6)
public_suffix (4.0.7)
rake (13.0.6)
rchardet (1.8.0)
representable (3.1.1)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
@@ -201,9 +210,9 @@ GEM
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
security (0.1.3)
signet (0.15.0)
addressable (~> 2.3)
faraday (>= 0.17.3, < 2.0)
signet (0.17.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.8)
@@ -212,7 +221,7 @@ GEM
terminal-notifier (2.0.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
trailblazer-option (0.1.1)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.1)
tty-spinner (0.9.3)
@@ -220,11 +229,11 @@ GEM
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.7)
unicode-display_width (1.7.0)
unf_ext (0.0.8.2)
unicode-display_width (1.8.0)
webrick (1.7.0)
word_wrap (1.0.0)
xcodeproj (1.20.0)
xcodeproj (1.22.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
@@ -239,6 +248,7 @@ GEM
PLATFORMS
universal-darwin-21
x86_64-darwin-20
x86_64-linux
DEPENDENCIES
danger

View File

@@ -44,10 +44,12 @@ If you would like to receive releases more quickly (bearing in mind that they ma
## Contributing
Please refer to [CONTRIBUTING.md](https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md) if you want to contribute on Matrix Android projects!
Please refer to [CONTRIBUTING.md](./CONTRIBUTING.md) if you want to contribute on Matrix Android projects!
Come chat with the community in the dedicated Matrix [room](https://matrix.to/#/#element-android:matrix.org).
Also [this documentation](./docs/_developer_onboarding.md) can hopefully help developers to start working on the project.
## Triaging issues
Issues are triaged by community members and the Android App Team, following the [triage process](https://github.com/vector-im/element-meta/wiki/Triage-process).

View File

@@ -25,14 +25,15 @@ buildscript {
classpath libs.gradle.kotlinPlugin
classpath libs.gradle.hiltPlugin
classpath 'com.google.firebase:firebase-appdistribution-gradle:3.0.3'
classpath 'com.google.gms:google-services:4.3.13'
classpath 'com.google.gms:google-services:4.3.14'
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5'
classpath "com.likethesalad.android:stem-plugin:2.2.2"
classpath 'org.owasp:dependency-check-gradle:7.2.0'
classpath 'org.owasp:dependency-check-gradle:7.2.1'
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.10"
classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0"
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
classpath 'app.cash.paparazzi:paparazzi-gradle-plugin:1.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
@@ -46,6 +47,8 @@ plugins {
// Dependency Analysis
id 'com.autonomousapps.dependency-analysis' version "1.13.1"
// Gradle doctor
id "com.osacky.doctor" version "0.8.1"
}
// https://github.com/jeremylong/DependencyCheck
@@ -58,6 +61,9 @@ dependencyCheck {
]
}
// Gradle doctor configuration
apply from: './tools/gradle/doctor.gradle'
allprojects {
apply plugin: "org.jlleitschuh.gradle.ktlint"
apply plugin: "io.gitlab.arturbosch.detekt"
@@ -71,6 +77,14 @@ allprojects {
groups.mavenCentral.group.each { includeGroup it }
}
}
// snapshots repository
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
content {
groups.snapshot.regex.each { includeGroupByRegex it }
groups.snapshot.group.each { includeGroup it }
}
}
maven {
url 'https://jitpack.io'
content {
@@ -216,7 +230,7 @@ project(":vector") {
}
}
project(":library:diff-match-patch") {
project(":library:external:diff-match-patch") {
sonarqube {
skipProject = true
}
@@ -287,3 +301,29 @@ dependencyAnalysis {
}
}
}
tasks.register("recordScreenshots", GradleBuild) {
startParameter.projectProperties.screenshot = ""
tasks = [':vector:recordPaparazziDebug']
}
tasks.register("verifyScreenshots", GradleBuild) {
startParameter.projectProperties.screenshot = ""
tasks = [':vector:verifyPaparazziDebug']
}
ext.initScreenshotTests = { project ->
def hasScreenshots = project.hasProperty("screenshot")
if (hasScreenshots) {
project.apply plugin: 'app.cash.paparazzi'
}
project.dependencies { testCompileOnly "app.cash.paparazzi:paparazzi:1.0.0" }
project.android.testOptions.unitTests.all {
def screenshotTestCapture = "**/*ScreenshotTest*"
if (hasScreenshots) {
include screenshotTestCapture
} else {
exclude screenshotTestCapture
}
}
}

View File

@@ -1,36 +1,37 @@
ext.versions = [
'minSdk' : 21,
'compileSdk' : 31,
'targetSdk' : 31,
'compileSdk' : 32,
'targetSdk' : 32,
'sourceCompat' : JavaVersion.VERSION_11,
'targetCompat' : JavaVersion.VERSION_11,
]
// Pinned to 7.1.3 because of https://github.com/vector-im/element-android/issues/6142
// Please test carefully before upgrading again.
def gradle = "7.1.3"
def gradle = "7.2.2"
// Ref: https://kotlinlang.org/releases.html
def kotlin = "1.6.21"
def kotlin = "1.7.20"
def kotlinCoroutines = "1.6.4"
def dagger = "2.42"
def dagger = "2.44"
def appDistribution = "16.0.0-beta04"
def retrofit = "2.9.0"
def arrow = "0.8.2"
def markwon = "4.6.2"
def moshi = "1.13.0"
def moshi = "1.14.0"
def lifecycle = "2.5.1"
def flowBinding = "1.2.0"
def flipper = "0.164.0"
def epoxy = "4.6.2"
def mavericks = "2.7.0"
def glide = "4.13.2"
def glide = "4.14.1"
def bigImageViewer = "1.8.1"
def jjwt = "0.11.5"
def vanniktechEmoji = "0.15.0"
// Temporary version to unblock #6929. Once 0.16.0 is released we should use it, and revert
// the whole commit which set version 0.16.0-SNAPSHOT
def vanniktechEmoji = "0.16.0-SNAPSHOT"
def fragment = "1.5.2"
def sentry = "6.4.1"
def fragment = "1.5.3"
// 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
@@ -51,7 +52,7 @@ ext.libs = [
],
androidx : [
'activity' : "androidx.activity:activity:1.5.1",
'appCompat' : "androidx.appcompat:appcompat:1.4.2",
'appCompat' : "androidx.appcompat:appcompat:1.5.1",
'biometric' : "androidx.biometric:biometric:1.1.0",
'core' : "androidx.core:core-ktx:1.8.0",
'recyclerview' : "androidx.recyclerview:recyclerview:1.2.1",
@@ -86,7 +87,7 @@ ext.libs = [
'appdistributionApi' : "com.google.firebase:firebase-appdistribution-api-ktx:$appDistribution",
'appdistribution' : "com.google.firebase:firebase-appdistribution:$appDistribution",
// Phone number https://github.com/google/libphonenumber
'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.12.55"
'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.12.56"
],
dagger : [
'dagger' : "com.google.dagger:dagger:$dagger",
@@ -100,7 +101,7 @@ ext.libs = [
'flipperNetworkPlugin' : "com.facebook.flipper:flipper-network-plugin:$flipper",
],
element : [
'opusencoder' : "io.element.android:opusencoder:1.0.4",
'opusencoder' : "io.element.android:opusencoder:1.1.0",
],
squareup : [
'moshi' : "com.squareup.moshi:moshi:$moshi",
@@ -120,6 +121,7 @@ ext.libs = [
markwon : [
'core' : "io.noties.markwon:core:$markwon",
'extLatex' : "io.noties.markwon:ext-latex:$markwon",
'imageGlide' : "io.noties.markwon:image-glide:$markwon",
'inlineParser' : "io.noties.markwon:inline-parser:$markwon",
'html' : "io.noties.markwon:html:$markwon"
],
@@ -165,10 +167,13 @@ ext.libs = [
apache : [
'commonsImaging' : "org.apache.sanselan:sanselan:0.97-incubator"
],
sentry: [
'sentryAndroid' : "io.sentry:sentry-android:$sentry"
],
tests : [
'kluent' : "org.amshove.kluent:kluent-android:1.68",
'timberJunitRule' : "net.lachlanmckee:timber-junit-rule:1.0.1",
'junit' : "junit:junit:4.13.2"
'junit' : "junit:junit:4.13.2",
]
]

View File

@@ -38,10 +38,18 @@ ext.groups = [
'com.google.testing.platform',
]
],
snapshot: [
regex: [
],
group: [
'com.vanniktech',
]
],
mavenCentral: [
regex: [
],
group: [
'app.cash.paparazzi',
'ch.qos.logback',
'com.adevinta.android',
'com.airbnb.android',
@@ -118,7 +126,7 @@ ext.groups = [
'com.sun.xml.bind.mvn',
'com.sun.xml.fastinfoset',
'com.thoughtworks.qdox',
'com.vanniktech',
// 'com.vanniktech',
'commons-cli',
'commons-codec',
'commons-io',
@@ -140,14 +148,18 @@ ext.groups = [
'io.opencensus',
'io.reactivex.rxjava2',
'io.realm',
'io.sentry',
'it.unimi.dsi',
'jakarta.activation',
'jakarta.xml.bind',
'javax.activation',
'javax.annotation',
'javax.inject',
'javax.xml.bind',
'jline',
'jp.wasabeef',
'junit',
'kxml2',
'me.saket',
'net.bytebuddy',
'net.java',
@@ -176,11 +188,13 @@ ext.groups = [
'org.hamcrest',
'org.jacoco',
'org.java-websocket',
'org.jcodec',
'org.jetbrains',
'org.jetbrains.dokka',
'org.jetbrains.intellij.deps',
'org.jetbrains.kotlin',
'org.jetbrains.kotlinx',
'org.jetbrains.trove4j',
'org.json',
'org.jsoup',
'org.junit',
@@ -197,7 +211,6 @@ ext.groups = [
'org.ow2.asm',
'org.ow2.asm',
'org.reactivestreams',
'org.robolectric',
'org.slf4j',
'org.sonatype.oss',
'org.testng',

View File

@@ -0,0 +1,259 @@
# Developer on boarding
<!--- TOC -->
* [Introduction](#introduction)
* [Quick introduction to Matrix](#quick-introduction-to-matrix)
* [Matrix data](#matrix-data)
* [Room](#room)
* [Event](#event)
* [Sync](#sync)
* [Glossary about syncs](#glossary-about-syncs)
* [The Android project](#the-android-project)
* [Matrix SDK](#matrix-sdk)
* [Application](#application)
* [MvRx](#mvrx)
* [Behavior](#behavior)
* [Epoxy](#epoxy)
* [Other frameworks](#other-frameworks)
* [Push](#push)
* [Dependencies management](#dependencies-management)
* [Test](#test)
* [Other points](#other-points)
* [Logging](#logging)
* [Rageshake](#rageshake)
* [Tips](#tips)
* [Happy coding!](#happy-coding)
<!--- END -->
## Introduction
This doc is a quick introduction about the project and its architecture.
It's aim is to help new developers to understand the overall project and where to start developing.
Other useful documentation:
- all the docs in this folder!
- the [contributing doc](../CONTRIBUTING.md), that you should also read carefully.
### Quick introduction to Matrix
Matrix website: [matrix.org](https://matrix.org), [discover page](https://matrix.org/discover).
*Note*: Matrix.org is also hosting a homeserver ([.well-known file](https://matrix.org/.well-known/matrix/client)).
The reference homeserver (this is how Matrix servers are called) implementation is [Synapse](https://github.com/matrix-org/synapse/). But other implementations exist. The Matrix specification is here to ensure that any Matrix client, such as Element Android and its SDK can talk to any Matrix server.
Have a quick look to the client-server API documentation: [Client-server documentation](https://spec.matrix.org/v1.3/client-server-api/). Other network API exist, the list is here: (https://spec.matrix.org/latest/)
Matrix is an open source protocol. Change are possible and are tracked using [this GitHub repository](https://github.com/matrix-org/matrix-doc/). Changes to the protocol are called MSC: Matrix Spec Change. These are PullRequest to this project.
Matrix object are Json data. Unstable prefixes must be used for Json keys when the MSC is not merged (i.e. accepted).
#### Matrix data
There are many object and data in the Matrix worlds. Let's focus on the most important and used, `Room` and `Event`
##### Room
`Room` is a place which contains ordered `Event`s. They are identified with their `room_id`. Nearly all the data are stored in rooms, and shared using homeserver to all the Room Member.
*Note*: Spaces are also Rooms with a different `type`.
##### Event
`Events` are items of a Room, where data is embedded.
There are 2 types of Room Event:
- Regular Events: contain useful content for the user (message, image, etc.), but are not necessarily displayed as this in the timeline (reaction, message edition, call signaling).
- State Events: contain the state of the Room (name, topic, etc.). They have a non null value for the key `state_key`.
Also all the Room Member details are in State Events: one State Event per member. In this case, the `state_key` is the matrixId (= userId).
Important Fields of an Event:
- `event_id`: unique across the Matrix universe;
- `room_id`: the room the Event belongs to;
- `type`: describe what the Event contain, especially in the `content` section, and how the SDK should handle this Event;
- `content`: dynamic Event data; depends on the `type`.
So we have a triple `event_id`, `type`, `state_key` which uniquely defines an Event.
#### Sync
The `Sync` is a way for the Matrix client to be up to date regarding the user data hosted by the server. All the Events are coming through the sync response. More details can be found here: [spec.matrix.org/v1.3/client-server-api/#syncing](https://spec.matrix.org/v1.3/client-server-api/#syncing)
When the application is in foreground, this is a looping request. We are using Https requests, which offer the advantage to be compatible with any homeserver. A sync token is used as request parameter, to let the server know what the client knows.
The `SyncThread` is responsible to manage the sync request loop.
When the application is in background, a Push will trigger a sync request.
##### Glossary about syncs
- **initial sync**: a sync request without a token. This is the first request a client perform after login or after a clear cache. The server will include in the response all your rooms with the full state (all the room membership Event will not be present), with the latest messages for each room. We are in the process to replace this by version 3: sliding sync. All data are inserted to the Database (currently [Realm](https://www.mongodb.com/docs/realm/sdk/java/)).
- **incremental sync**: sync request with a token.
- **gappy sync**: sync request where all the new Events are not returned for one or several Rooms. Also called `limited sync`. It can be limited per Room. To get all the missing Events, a Room pagination API has to be called.
- **sync token**: `next_batch` value in the previous sync response. Will be provided as the `since` parameter for the next sync request.
### The Android project
The project should compile out of the box.
The project is split into several modules. The main ones are:
For the app
- `vector-app`: application entry point;
- `vector`: legacy application, but now a library. In the process of being split into several modules;
- `vector-config`: this is where all the configuration of the application should occurs. Should because we are in the process of migrating all the configuration here;
- `library/ui-strings`: this is where all the string resources are stored. Please refer to [contributing doc](../CONTRIBUTING.md) to know how to make change on this module;
- `library/ui-styles`: this is where the Android styles are defined.
For the SDK
- `matrix-sdk-android`: the main SDK module. The sources are in this project, but are also exported to [its own project](https://github.com/matrix-org/matrix-android-sdk2). All the PRs and issues related to the SDK take place in the Element Android project;
- `matrix-sdk-android-flow`: contains some wrapper to expose `Flow` to the application.
### Matrix SDK
SDK exposes `Services` to the client application. `Services` are public interface, and are defined in this parent package: `org.matrix.android.sdk.api`. Default implementation are internal to the SDK, in this parent package: `org.matrix.android.sdk.internal`. Note that you also have to declare the classes as `internal` when adding classes to the `org.matrix.android.sdk.internal` package.
Interface allows us to replace the implementation for testing purpose.
A generated documentation of the SDK is available [here](https://matrix-org.github.io/matrix-android-sdk2/). Updated after each release. Please ensure that the documentation (KDoc) of all the SDK Services is up to date, and is clear for a SDK user.
The SDK generated documentation also contains information about the entry points of the SDK.
[Dagger](https://dagger.dev/) is used to inject all the dependencies to the SDK classes.
SDK is exposing data as `LiveData`, but we are progressively migrating to `Flow`. Database is the source of truth.
Example:
- Client send an Event using the `SendService`;
- At the end a `SendEvent` task is used;
- Retrofit API is used to send data to the server;
- Goes to the server, which returns only the `event_id`;
- The `Event` is coming back from the `sync` response with eventually extra added data.
### Application
This is the UI part of the project.
There are two variants of the application: `Gplay` and `Fdroid`.
The main difference is about using Firebase on `Gplay` variant, to have Push from Google Services. `FDroid` variant cannot contain closed source dependency.
`Fdroid` is using background polling to lack the missing of Pushed. Now a solution using UnifiedPush has ben added to the project. See refer to [the dedicated documentation](./unifiedpush.md) for more details.
#### MvRx
[Maverick](https://airbnb.io/mavericks/#/README) (or MvRx) is an Android MVI framework that helps to develop Reactive application on Android.
- Activity: holder for Fragment. See the parent [VectorBaseActivity](../vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt);
- Fragment: manage screen of the application. See the parent [VectorBaseFragment](../vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt);
- BottomSheet: see the parent [VectorBaseBottomSheetDialogFragment](../vector/src/main/java/im/vector/app/core/platform/VectorBaseBottomSheetDialogFragment.kt);
- ViewModel: this is where the logic is placed. All our ViewModel has a `handle()` which takes action as parameter. See the parent [VectorViewModel](../vector/src/main/java/im/vector/app/core/platform/VectorViewModel.kt);
- VectorSharedActionViewModel: Specific ViewModel that can be used to communicate between Fragment(s) and the host Activity. See the parent [VectorSharedActionViewModel](../vector/src/main/java/im/vector/app/core/platform/VectorSharedActionViewModel.kt);
- ViewState: this are `data class`, and this represent the state of the View. Has to be copied and set to be updated. Fragment will update the UI regarding the current state (`invalidate()` method). `Async` class from MvRx can be used in the ViewState, especially for asynchronous data loading. Nullability can also be used for optional data. ViewStates have to implement `MavericksState`;
- ViewEvents: useful when the ViewModel asks the View to trigger a specific action: navigation, show dialog, etc. See the parent [VectorViewEvents](../vector/src/main/java/im/vector/app/core/platform/VectorViewEvents.kt);
- ViewAction (`VectorViewModelAction`): useful when the UI (generally the Fragment) asks the ViewModel to do something. See the parent [VectorViewModelAction](../vector/src/main/java/im/vector/app/core/platform/VectorViewModelAction.kt);
- Controller: see the `Epoxy` section just below.
##### Behavior
Fragment asks the ViewModel to perform an action (coming from the user, but not necessarily. ViewModel can then talk to the SDK, updates the state once or several times. Fragment update the UI regarding the new state.
When ViewModel is instantiated, it can subscribe using the SDK Services to get live state of the data.
`invalidate()` has to be used by default, but it's possible to listen to specific member(s) of the `ViewState` using `onEach`. TODO Add an example.
`awaitState()` method
#### Epoxy
[Epoxy](https://github.com/airbnb/epoxy) is an Android library for building complex screens in a RecyclerView. Please read [the introduction](https://github.com/airbnb/epoxy#epoxy).
- Controller declares items of the RecyclerView. Controller is injected in the Fragment. Controller extends `EpoxyController`, or one of its subclass, especially `TypedEpoxyController`;
- Fragment gives the state to the controller using `setData`;
- `buildModels` will be called by the framework;
- Controller will create ordered Items.
Epoxy does the diffing, and handle many other thing for us, like handling item type, etc.
See for instance the controller [AccountDataEpoxyController](../vector/src/main/java/im/vector/app/features/settings/devtools/AccountDataEpoxyController.kt)) for a simple example.
Warning: do not use twice the same item `id` or it will crash.
#### Other frameworks
- Dependency injection is managed by [Dagger](https://dagger.dev/) (SDK) and [Hilt](https://developer.android.com/training/dependency-injection/hilt-android) (App);
- [Retrofit](https://square.github.io/retrofit/) and [OkHttp3](https://square.github.io/okhttp/): network requests;
- [Moshi](https://github.com/square/moshi) is used to parse and serialize Json object;
### Push
Please see the dedicated documentation for more details.
This is the classical scenario:
- App receives a Push. Note: Push is ignored if app is in foreground;
- App asks the SDK to load Event data (fastlane mode). We have a change to get the data faster and display the notification faster;
- App asks the SDK to perform a sync request.
### Dependencies management
All the dependencies are declared in `build.gradle` files. But some versions are declared in [this dedicated file](../dependencies.gradle).
When adding a new dependency, you will have to update the file [dependencies_groups.gradle](../dependencies_groups.gradle) to allow the dependency to be downloaded from the artifact repository. Sometimes sub-dependencies need to be added too, until the project can compile.
[Dependabot](https://github.com/dependabot) is set up on the project. This tool will automatically create Pull Request to upgrade our dependencies one by one.
dependencies_group, gradle files, Dependabot, etc.
### Test
Please refer to [this dedicated document](./ui-tests.md).
TODO add link to the dedicated screenshot test documentation
### Other points
#### Logging
**Important warning: ** NEVER log private user data, or use the flag `LOG_PRIVATE_DATA`. Be very careful when logging `data class`, all the content will be output!
[Timber](https://github.com/JakeWharton/timber) is used to log data to logcat. We do not use directly the `Log` class. If possible please use a tag, as per
````kotlin
Timber.tag(loggerTag.value).d("my log")
````
because automatic tag (= class name) will not be available on the release version.
Also generally it is recommended to provide the `Throwable` to the Timber log functions.
Last point, not that `Timber.v` function may have no effect on some devices. Prefer using `Timber.d` and up.
#### Rageshake
Rageshake is a feature to send bug report directly from the application. Just shake your phone and you will be prompted to send a bug report.
Bug report can contain:
- a screenshot of the current application state
- the application logs from up to 15 application starts
- the logcat logs
- the key share history (crypto data)
The data will be sent to an internal server, which is not publicly accessible. A GitHub issue will also be created to a private GitHub repository.
Rageshake can be very useful to get logs from a release version of the application.
### Tips
- Element Android has a `developer mode` in the `Settings/Advanced settings`. Other useful options are available here;
- Show hidden Events can also help to debug feature. When developer mode is enabled, it is possible to view the source (= the Json content) of any Events;
- Type `/devtools` in a Room composer to access a developer menu. There are some other entry points. Developer mode has to be enabled;
- Hidden debug menu: when developer mode is enabled and on debug build, there are some extra screens that can be accessible using the green wheel. In those screens, it will be possible to toggle some feature flags;
- Using logcat, filtering with `onResume` can help you to understand what screen are currently displayed on your device. Searching for string displayed on the screen can also help to find the running code in the codebase.
- When this is possible, prefer using `sealed interface` instead of `sealed class`;
- When writing temporary code, using the string "DO NOT COMMIT" in a comment can help to avoid committing things by mistake. If committed and pushed, the CI will detect this String and will warn the user about it.
## Happy coding!
The team is here to support you, feel free to ask anything to other developers.
Also please feel to update this documentation, if incomplete/wrong/obsolete/etc.
**Thanks!**

View File

@@ -28,6 +28,7 @@ Here are the checks that Danger does so far:
- PR with change on layout should include screenshot in the description
- PR which adds png file warn about the usage of vector drawables
- non draft PR should have a reviewer
- files containing translations are not modified by developers
### Quality check

View File

@@ -0,0 +1,72 @@
# Screenshot testing
<!--- TOC -->
* [Overview](#overview)
* [Setup](#setup)
* [Recording](#recording)
* [Verifying](#verifying)
* [Contributing](#contributing)
* [Example](#example)
<!--- END -->
## Overview
- Screenshot tests are tests which record the content of a rendered screen and verify subsequent runs to check if the screen renders differently.
- Element uses [Paparazzi](https://github.com/cashapp/paparazzi) to render, record and verify android layouts.
- The screenshot verification occurs on every pull request as part of the `tests.yml` workflow.
## Setup
- Install Git LFS through your package manager of choice (`brew install git-lfs` | `yay -S git-lfs`).
- Install the Git LFS hooks into the project.
```bash
# with element-android as the current working directory
git lfs install --local
```
- If installed correctly, `git push` and `git pull` will now include LFS content.
## Recording
- `./gradlew recordScreenshots`
- Paparazzi will generate images in `${module}/src/test/snapshots`, which will need to be committed to the repository using Git LFS.
## Verifying
- `./gradlew verifyScreenshots`
- In the case of failure, Paparazzi will generate images in `${module}/out/failure`. The images will show the expected and actual screenshots along with a delta of the two images.
## Contributing
- When creating a test, the file (and class) name names must include `ScreenshotTest`, eg `ItemScreenshotTest`.
- After creating the new test, record and commit the newly rendered screens.
- `./tools/validate_lfs` can be ran to ensure everything is working correctly with Git LFS, the CI also runs this check.
## Example
```kotlin
class PaparazziExampleScreenshotTest {
@get:Rule
val paparazzi = Paparazzi(
deviceConfig = PIXEL_3,
theme = "Theme.Vector.Light",
)
@Test
fun `example paparazzi test`() {
// Inflate the layout
val view = paparazzi.inflate<ConstraintLayout>(R.layout.item_radio)
// Bind data to the view
view.findViewById<TextView>(R.id.actionTitle).text = paparazzi.resources.getString(R.string.room_settings_all_messages)
view.findViewById<ImageView>(R.id.radioIcon).setImageResource(R.drawable.ic_radio_on)
// Record the bound view
paparazzi.snapshot(view)
}
}
```

351
docs/unit_testing.md Normal file
View File

@@ -0,0 +1,351 @@
# Table of Contents
<!--- TOC -->
* [Overview](#overview)
* [Best Practices](#best-practices)
* [Project Conventions](#project-conventions)
* [Setup](#setup)
* [Naming](#naming)
* [Format](#format)
* [Assertions](#assertions)
* [Constants](#constants)
* [Mocking](#mocking)
* [Fakes](#fakes)
* [Fixtures](#fixtures)
* [Examples](#examples)
* [Extensions used to streamline the test setup](#extensions-used-to-streamline-the-test-setup)
* [Fakes and Fixtures](#fakes-and-fixtures)
<!--- END -->
## Overview
Unit tests are a mechanism to validate our code executes the way we expect. They help to inform the design of our systems by requiring testability and
understanding, they describe the inner workings without relying on inline comments and protect from unexpected regressions.
However, unit tests are not a magical solution to solve all our problems and come at a cost. Unreliable and hard to maintain tests often end up ignored, deleted
or worse, provide a false sense of security.
### Best Practices
Tests can be written in many ways, the main rule is to keep them simple and maintainable. Some ways to help achieve this are...
- Break out logic into single units (following the Single Responsibility Principle) to reduce test complexity.
- Favour pure functions, avoiding mutable state.
- Prefer dependency injection to static calls to allow for simpler test setup.
- Write concise tests with a single function under test, clearly showing the inputs and expected output.
- Create separate test cases instead of changing parameters and grouping multiple assertions within a single test to help trace back failure causes (with the
exception of parameterised tests).
- Assert against entire models instead of subsets of properties to capture any possible changes within the test scope.
- Avoid invoking logic from production instances other than the class under test to guard from unrelated changes.
- Always inject `Dispatchers` and `Clock` instances and provide fake implementations for tests to avoid non deterministic results.
## Project Conventions
#### Setup
- Test file and class name should be the class under test with the Test suffix, created in a `test` sourceset, with the same package name as the class under
test.
- Dependencies of the class are instantiated inline, junit will recreate the test class for each test run.
- A line break between the dependencies and class under test helps clarify the instance being tested.
```kotlin
class MyClassTest {
private val fakeUppercaser = FakeUppercaser()
// line break between the class under test and its dependencies
private val myClass = MyClass(fakeUppercaser.instance)
}
```
#### Naming
- Test names use the `Gherkin` format, `given, when, then` mapping to the input, logic under test and expected result.
- `given` - Uniqueness about the environment or dependencies in which the test case is running. _"given device is android 12 and supports dark mode"_
- `when` - The action/function under test. _"when reading dark mode status"_
- `then` - The expected result from the combination of _given_ and _when_. _"then returns dark mode enabled"_
- Test names are written using kotlin back ticks to enable sentences _ish_.
```kotlin
@Test
fun `given a lowercase label, when uppercasing, then returns label uppercased`
```
When the input is given directly to the _when_, this can also be represented as...
```kotlin
@Test
fun `when uppercasing a lowercase label, then returns label uppercased`
```
Multiple given or returns statements can be used in the name although it could be a sign that the logic being tested does too much.
---
#### Format
- Test bodies are broken into sections through the use of blank lines where the sections correspond to the test name.
- Sections can span multiple lines.
```kotlin
// comments are for illustrative purposes
/* given */ val lowercaseLabel = "hello world"
/* when */ val result = textUppercaser.uppercase(lowercaseLabel)
/* then */ result shouldBeEqualTo "HELLO WORLD"
```
- Functions extracted from test bodies are placed beneath all the unit tests.
---
#### Assertions
- Assertions against test results are made using [Kluent's](https://github.com/MarkusAmshove/Kluent) _fluent_ api.
- Typically `shouldBeEqualTo`is the main assertion to use for asserting function return values as by project convention we assert against entire objects or
lists.
```kotlin
val result = listOf("hello", "world")
// Fail
result shouldBeEqualTo listOf("hello")
```
```kotlin
data class Person(val age: Int, val name: String)
val result = Person(age = 100, name = "Gandalf")
// Avoid
result.age shouldBeEqualTo 100
// Prefer
result shouldBeEqualTo Person(age = 100, "Gandalf")
```
- Exception throwing can be asserted against using `assertFailsWith<T : Throwable>`.
- When asserting reusable exceptions, include the message to distinguish between them.
```kotlin
assertFailsWith<ConcreteException>(message = "Details about error") {
// when section of the test
codeUnderTest()
}
```
---
#### Constants
- Reusable values are extracted to file level immutable properties or constants.
- These can be parameters or expected results.
- The naming convention is to prefix with `A` or `AN` for better matching with the test name.
```kotlin
private const val A_LOWERCASE_LABEL = "hello"
class MyTest {
@Test
fun `when uppercasing a lowercase label, then returns label uppercased`() {
val result = TextUppercaser().uppercase(A_LOWERCASE_LABEL)
...
}
}
```
---
#### Mocking
- In order to provide different behaviour for dependencies within tests our main method is through mocking, using [Mockk](https://mockk.io/).
- We avoid using relaxed mocks in favour of explicitly declaring mock behaviour through the _Fake_ convention. There are exceptions when mocking framework
classes which would require a lot of boilerplate.
- Using `Spy` is discouraged as it inherently requires real instances, which we are avoiding in our tests. There are exceptions such as `VectorFeatures` which
acts like a `Fixture` in release builds.
---
#### Fakes
- Fakes are reusable instances of classes purely for testing purposes. They provide functions to replace the functions of the interface/class they're faking
with test specific values.
- When faking an interface, the _Fake_ can be written using delegation or by stubbing
- All Fakes currently reside in the same package `${package}.test.fakes`
```kotlin
// Delegating to a mock
class FakeClock : Clock by mockk() {
fun givenEpoch(epoch: Long) {
every { epochMillis() } returns epoch
}
}
// Stubbing the interface
class FakeClock(private val epoch: Long) : Clock {
override fun epochMillis() = epoch
}
```
It's currently more common for fakes to fake class behaviour, we achieve this by wrapping and exposing a mock instance.
```kotlin
class FakeCursor {
val instance = mockk<Cursor>()
fun givenEmpty() {
every { instance.count } returns 0
every { instance.moveToFirst() } returns false
}
}
val fakeCursor = FakeCursor().apply { givenEmpty() }
```
#### Fixtures
- Fixtures are a reusable wrappers around data models. They provide default values to make creating instances as easy as possible, with the option to override
specific parameters when needed.
- Are namespaced within an `object`.
- Reduces the _find usages_ noise when searching for usages of the origin class construction.
- All Fixtures currently reside in the same package `${package}.test.fixtures`.
```kotlin
object ContentAttachmentDataFixture {
fun aContentAttachmentData(
type: ContentAttachmentData.Type.TEXT,
mimeType: String? = null
) = ContentAttachmentData(type, mimeType)
}
```
- Fixtures can also be used to manage specific combinations of parameters
```kotlin
fun aContentAttachmentAudioData() = aContentAttachmentData(
type = ContentAttachmentData.Type.AUDIO,
mimeType = "audio/mp3",
)
```
---
### Examples
##### Extensions used to streamline the test setup
```kotlin
class CircularCacheTest {
@Test
fun `when putting more than cache size then cache is limited to cache size`() {
val (cache, internalData) = createIntCache(cacheSize = 3)
cache.putInOrder(1, 1, 1, 1, 1, 1)
internalData shouldBeEqualTo arrayOf(1, 1, 1)
}
}
private fun createIntCache(cacheSize: Int): Pair<CircularCache<Int>, Array<Int?>> {
var internalData: Array<Int?>? = null
val factory: (Int) -> Array<Int?> = {
Array<Int?>(it) { null }.also { array -> internalData = array }
}
return CircularCache(cacheSize, factory) to internalData!!
}
private fun CircularCache<Int>.putInOrder(vararg values: Int) {
values.forEach { put(it) }
}
```
##### Fakes and Fixtures
```kotlin
class LateInitUserPropertiesFactoryTest {
private val fakeActiveSessionDataSource = FakeActiveSessionDataSource()
private val fakeVectorStore = FakeVectorStore()
private val fakeContext = FakeContext()
private val fakeSession = FakeSession().also {
it.givenVectorStore(fakeVectorStore.instance)
}
private val lateInitUserProperties = LateInitUserPropertiesFactory(
fakeActiveSessionDataSource.instance,
fakeContext.instance
)
@Test
fun `given no active session, when creating properties, then returns null`() {
val result = lateInitUserProperties.createUserProperties()
result shouldBeEqualTo null
}
@Test
fun `given a teams use case set on an active session, when creating properties, then includes the remapped WorkMessaging selection`() {
fakeVectorStore.givenUseCase(FtueUseCase.TEAMS)
fakeActiveSessionDataSource.setActiveSession(fakeSession)
val result = lateInitUserProperties.createUserProperties()
result shouldBeEqualTo UserProperties(
ftueUseCaseSelection = UserProperties.FtueUseCaseSelection.WorkMessaging
)
}
}
```
##### ViewModel
- `ViewModels` tend to be one of the most complex areas to unit test due to their position as a coordinator of data flows and bridge between domains.
- As the project uses a slightly tweaked`MvRx`, our API for the `ViewModel` is simplified down to `input - ViewModel.handle(Action)`
and `output Flows - ViewModel.viewEvents & ViewModel.stateFlow`. A `ViewModel` test asserter has been created to further simplify the process.
```kotlin
class ViewModelTest {
private var initialState = ViewState.Empty
@get:Rule
val mvrxTestRule = MvRxTestRule(testDispatcher = UnconfinedTestDispatcher())
@Test
fun `when handling MyAction, then emits Loading and Content states`() {
val viewModel = ViewModel<State>(initialState)
val test = viewModel.test() // must be invoked before interacting with the VM
viewModel.handle(MyAction)
test
.assertViewStates(initialState, State.Loading, State.Content())
.assertNoEvents()
.finish()
}
}
```
- `ViewModels` often emit multiple states which are copies of the previous state, the `test` extension `assertStatesChanges` allows only the difference to be
supplied.
```kotlin
data class ViewState(val name: String? = null, val age: Int? = null)
val initialState = ViewState()
val viewModel = ViewModel<State>(initialState)
val test = viewModel.test()
viewModel.handle(ChangeNameAction("Gandalf"))
test
.assertStatesChanges(
initialState,
{ copy(name = "Gandalf") },
)
.finish()
```

View File

@@ -0,0 +1,3 @@
Nový vzhled aplikace lze povolit v Experimentálních funkcích. Prosíme, vyzkoušejte ho!
Oprava problémů s chybějícími oznámeními a dlouhou přírůstkovou synchronizací.
Úplný seznam změn: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
Das neue App-Layout kann in den experimentellen Einstellungen aktiviert werden. Probier es gerne aus!
Fehler bzgl. ausbleibender Benachrichtigungen und langwierigem inkrementellem Synchronisieren behoben.
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases

View File

@@ -1 +1 @@
Gruppen-Messenger - verschlüsselte Kommunikation, Gruppenchat und Videoanrufe
Gruppen-Messenger verschlüsselte Kommunikation, Gruppen und Videoanrufe

View File

@@ -1 +1 @@
Element - Sicherer Messenger
Element Sicher kommunizieren

View File

@@ -1,2 +1,2 @@
Main changes in this version: New App Layout and Deferred DM enabled by default.
Full changelog: https://github.com/vector-im/element-android/releases
Main changes in this version: Deferred DM enabled by default.
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,2 @@
Main changes in this version: New app layout enabled by default!
Full changelog: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
Testide alt saad sisse lülitada uue kujunduse - palun proovi seda!
Parandasime teavitustega seotud vigu ning andmete sünkroniseerimist pika viitega.
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
چینش کارهٔ جدید می‌تواند در تنظیمات آزمایشگاه‌ها به کار بیفتند. لطفاً بیازماییدش!
رفع مشکلات مربوط به آگاهی غایب و همگام‌سازی تجمعّی طولانی.
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
La nouvelle présentation de lapplication est disponibles dans les paramètres expérimentaux. Essayez-là !
Correction de problèmes sur les notifications manquantes, et la synchronisation incrémentale lente.
Intégralité des changements : https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
Az új alkalmazás megjelenés a Laborokban bekapcsolható. Próbáld ki!
Hiányzó értesítések és hosszú inkrementális szinkronizáció javítása.
Teljes változásnapló: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
Tata Letak Aplikasi Baru dapat diaktifkan di pengaturan Uji Coba. Cobalah!
Perbariki masalah tentang notifikasi hilang, dan penyinkronan inkremental panjang.
Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
Nuova disposizione dell'app attivabile nelle impostazioni Laboratori. Provala!
Corretti problemi su notifiche mancanti e sincronizzazioni incrementali lunghe.
Cronologia completa: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
Novo Layout de App poder ser habilitado nas configurações de Labs. Por favor dê uma chance!
Consertar problemas sobre notificação faltando, e sinc incremental longo.
Changelog completo: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
Nové usporiadanie aplikácie môžete povoliť v nastaveniach laboratórií. Vyskúšajte to!
Oprava problémov týkajúcich sa chýbajúcich oznámení a dlhej inkrementálnej synchronizácie.
Úplný zoznam zmien: https://github.com/vector-im/element-android/releases

View File

@@ -0,0 +1,3 @@
Новий макет програми можна увімкнути в налаштуваннях лабораторії. Спробуйте!
Виправлено проблеми з відсутністю сповіщень та тривалою інкрементною синхронізацією.
Список усіх змін: https://github.com/vector-im/element-android/releases

View File

@@ -5,7 +5,7 @@ Element — це і безпечний месенджер, і застосуно
- Повністю зашифровані повідомлення для надання можливості безпечнішого корпоративного спілкування, навіть для віддалених працівників
- Децентралізований чат на основі відкритого коду Matrix
- Безпечний обмін файлами із зашифрованими даними для керування проєктами
- Відеочати з передачею голосу через IP та показом екрану іншим
- Відеочати з передачею голосу через IP та показом екрана іншим
- Проста інтеграція з вашими улюбленими інструментами для онлайн-співпраці, інструментами керування проєктами, послугами VoIP та іншими застосунками обміну повідомленнями для команд
Element цілковито відрізняється від інших застосунків обміну повідомленнями та спільної роботи. Він працює на Matrix, відкритій мережі для безпечного обміну повідомленнями та децентралізованого зв'язку. Це дозволяє самостійне розгортання, щоб надати користувачам якнайбільше володіння та контролю над їх даними та повідомленнями.

View File

@@ -30,7 +30,7 @@ Element 透过不同的方式让你掌控一切:
你可以与 Matrix 网络上的任何人聊天,不论他们是使用 Element、其他 Matrix 应用或其他通讯应用。
<b>超级安全</b>
真正的端到端加密(仅有那些在对话中的可以解密讯息)以及交叉签章装置验证。
真正的端到端加密(仅有那些在对话中的可以解密讯息)以及交叉签章装置验证。
<b>完整的通讯与整合</b>
信息传递、语音与视频通话、文件分享、画面分享与超多的整合、机器人与挂件。建构房间、社群、保持联络并完成工作。

View File

@@ -1 +1 @@
群组消息应用-加密的消息传递、群组聊天和视频通话
群组消息应用——加密的消息传递、群组聊天和视频通话

View File

@@ -0,0 +1,3 @@
新的應用程式佈局可在「實驗室」設定中啟用。請試試看!
修復關於遺失通知的問題,以及增量同步需要長時間的問題。
完整的變更紀錄https://github.com/vector-im/element-android/releases

View File

@@ -16,6 +16,7 @@ org.gradle.caching=true
# Android Settings
android.enableJetifier=true
android.jetifier.ignorelist=android-base-common,common
android.useAndroidX=true
#Project Settings

View File

@@ -17,7 +17,6 @@
package im.vector.lib.attachmentviewer
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Build
import android.os.Bundle
@@ -136,7 +135,6 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi
}
}
@Suppress("DEPRECATION")
private fun setDecorViewFullScreen() {
// This is important for the dispatchTouchEvent, if not we must correct
// the touch coordinates
@@ -144,22 +142,20 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi
// New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
window.setDecorFitsSystemWindows(false)
// New API instead of SYSTEM_UI_FLAG_IMMERSIVE
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
} else {
@SuppressLint("WrongConstant")
window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE
}
window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// New API instead of FLAG_TRANSLUCENT_STATUS
window.statusBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar)
// new API instead of FLAG_TRANSLUCENT_NAVIGATION
window.navigationBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar)
} else {
@Suppress("DEPRECATION")
window.decorView.systemUiVisibility = (
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE)
@Suppress("DEPRECATION")
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
@Suppress("DEPRECATION")
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
}
}
@@ -344,7 +340,6 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi
?.handleCommand(commands)
}
@Suppress("DEPRECATION")
private fun hideSystemUI() {
systemUiVisibility = false
// Enables regular immersive mode.
@@ -356,17 +351,13 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi
// new API instead of SYSTEM_UI_FLAG_HIDE_NAVIGATION
window.decorView.windowInsetsController?.hide(WindowInsets.Type.navigationBars())
// New API instead of SYSTEM_UI_FLAG_IMMERSIVE
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
} else {
@SuppressLint("WrongConstant")
window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE
}
window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// New API instead of FLAG_TRANSLUCENT_STATUS
window.statusBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar)
// New API instead of FLAG_TRANSLUCENT_NAVIGATION
window.navigationBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar)
} else {
@Suppress("DEPRECATION")
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
// Set the content to appear under the system bars so that the
// content doesn't resize when the system bars hide and show.
@@ -381,13 +372,13 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi
// Shows the system bars by removing all the flags
// except for the ones that make the content appear under the system bars.
@Suppress("DEPRECATION")
private fun showSystemUI() {
systemUiVisibility = true
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
window.setDecorFitsSystemWindows(false)
} else {
@Suppress("DEPRECATION")
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)

30
library/external/dialpad/build.gradle vendored Normal file
View File

@@ -0,0 +1,30 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
android {
compileSdk versions.compileSdk
defaultConfig {
minSdk versions.minSdk
targetSdk versions.targetSdk
}
compileOptions {
sourceCompatibility versions.sourceCompat
targetCompatibility versions.targetCompat
}
kotlinOptions {
jvmTarget = "11"
}
}
dependencies {
implementation libs.androidx.appCompat
}
afterEvaluate {
tasks.findAll { it.name.startsWith("lint") }.each {
it.enabled = false
}
}

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.android.dialer.dialpadview" />

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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 com.android.dialer.animation;
import android.view.animation.Interpolator;
import com.android.dialer.compat.PathInterpolatorCompat;
public class AnimUtils {
public static final Interpolator EASE_OUT_EASE_IN =
PathInterpolatorCompat.create(0.4f, 0, 0.2f, 1);
}

View File

@@ -0,0 +1,120 @@
/*
* Copyright (C) 2015 The Android Open Source Project
*
* 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 com.android.dialer.compat;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.os.Build;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
public class PathInterpolatorCompat {
public static Interpolator create(
float controlX1, float controlY1, float controlX2, float controlY2) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return new PathInterpolator(controlX1, controlY1, controlX2, controlY2);
}
return new PathInterpolatorBase(controlX1, controlY1, controlX2, controlY2);
}
private static class PathInterpolatorBase implements Interpolator {
/** Governs the accuracy of the approximation of the {@link Path}. */
private static final float PRECISION = 0.002f;
private final float[] mX;
private final float[] mY;
public PathInterpolatorBase(Path path) {
final PathMeasure pathMeasure = new PathMeasure(path, false /* forceClosed */);
final float pathLength = pathMeasure.getLength();
final int numPoints = (int) (pathLength / PRECISION) + 1;
mX = new float[numPoints];
mY = new float[numPoints];
final float[] position = new float[2];
for (int i = 0; i < numPoints; ++i) {
final float distance = (i * pathLength) / (numPoints - 1);
pathMeasure.getPosTan(distance, position, null /* tangent */);
mX[i] = position[0];
mY[i] = position[1];
}
}
public PathInterpolatorBase(float controlX, float controlY) {
this(createQuad(controlX, controlY));
}
public PathInterpolatorBase(
float controlX1, float controlY1, float controlX2, float controlY2) {
this(createCubic(controlX1, controlY1, controlX2, controlY2));
}
private static Path createQuad(float controlX, float controlY) {
final Path path = new Path();
path.moveTo(0.0f, 0.0f);
path.quadTo(controlX, controlY, 1.0f, 1.0f);
return path;
}
private static Path createCubic(
float controlX1, float controlY1, float controlX2, float controlY2) {
final Path path = new Path();
path.moveTo(0.0f, 0.0f);
path.cubicTo(controlX1, controlY1, controlX2, controlY2, 1.0f, 1.0f);
return path;
}
@Override
public float getInterpolation(float t) {
if (t <= 0.0f) {
return 0.0f;
} else if (t >= 1.0f) {
return 1.0f;
}
// Do a binary search for the correct x to interpolate between.
int startIndex = 0;
int endIndex = mX.length - 1;
while (endIndex - startIndex > 1) {
int midIndex = (startIndex + endIndex) / 2;
if (t < mX[midIndex]) {
endIndex = midIndex;
} else {
startIndex = midIndex;
}
}
final float xRange = mX[endIndex] - mX[startIndex];
if (xRange == 0) {
return mY[startIndex];
}
final float tInRange = t - mX[startIndex];
final float fraction = tInRange / xRange;
final float startY = mY[startIndex];
final float endY = mY[endIndex];
return startY + (fraction * (endY - startY));
}
}
}

View File

@@ -0,0 +1,231 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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 com.android.dialer.dialpadview;
import android.content.Context;
import android.graphics.RectF;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.FrameLayout;
/**
* Custom class for dialpad buttons.
*
* <p>When touch exploration mode is enabled for accessibility, this class implements the
* lift-to-type interaction model:
*
* <ul>
* <li>Hovering over the button will cause it to gain accessibility focus
* <li>Removing the hover pointer while inside the bounds of the button will perform a click action
* <li>If long-click is supported, hovering over the button for a longer period of time will switch
* to the long-click action
* <li>Moving the hover pointer outside of the bounds of the button will restore to the normal click
* action
* </ul>
*/
public class DialpadKeyButton extends FrameLayout {
/** Timeout before switching to long-click accessibility mode. */
private static final int LONG_HOVER_TIMEOUT = ViewConfiguration.getLongPressTimeout() * 2;
/** Accessibility manager instance used to check touch exploration state. */
private AccessibilityManager mAccessibilityManager;
/** Bounds used to filter HOVER_EXIT events. */
private RectF mHoverBounds = new RectF();
/** Whether this view is currently in the long-hover state. */
private boolean mLongHovered;
/** Alternate content description for long-hover state. */
private CharSequence mLongHoverContentDesc;
/** Backup of standard content description. Used for accessibility. */
private CharSequence mBackupContentDesc;
/** Backup of clickable property. Used for accessibility. */
private boolean mWasClickable;
/** Backup of long-clickable property. Used for accessibility. */
private boolean mWasLongClickable;
/** Runnable used to trigger long-click mode for accessibility. */
private Runnable mLongHoverRunnable;
private OnPressedListener mOnPressedListener;
public DialpadKeyButton(Context context, AttributeSet attrs) {
super(context, attrs);
initForAccessibility(context);
}
public DialpadKeyButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initForAccessibility(context);
}
public void setOnPressedListener(OnPressedListener onPressedListener) {
mOnPressedListener = onPressedListener;
}
private void initForAccessibility(Context context) {
mAccessibilityManager =
(AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
}
public void setLongHoverContentDescription(CharSequence contentDescription) {
mLongHoverContentDesc = contentDescription;
if (mLongHovered) {
super.setContentDescription(mLongHoverContentDesc);
}
}
@Override
public void setContentDescription(CharSequence contentDescription) {
if (mLongHovered) {
mBackupContentDesc = contentDescription;
} else {
super.setContentDescription(contentDescription);
}
}
@Override
public void setPressed(boolean pressed) {
super.setPressed(pressed);
if (mOnPressedListener != null) {
mOnPressedListener.onPressed(this, pressed);
}
}
@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mHoverBounds.left = getPaddingLeft();
mHoverBounds.right = w - getPaddingRight();
mHoverBounds.top = getPaddingTop();
mHoverBounds.bottom = h - getPaddingBottom();
}
@Override
public boolean performAccessibilityAction(int action, Bundle arguments) {
if (action == AccessibilityNodeInfo.ACTION_CLICK) {
simulateClickForAccessibility();
return true;
}
return super.performAccessibilityAction(action, arguments);
}
@Override
public boolean onHoverEvent(MotionEvent event) {
// When touch exploration is turned on, lifting a finger while inside
// the button's hover target bounds should perform a click action.
if (mAccessibilityManager.isEnabled() && mAccessibilityManager.isTouchExplorationEnabled()) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_HOVER_ENTER:
// Lift-to-type temporarily disables double-tap activation.
mWasClickable = isClickable();
mWasLongClickable = isLongClickable();
if (mWasLongClickable && mLongHoverContentDesc != null) {
if (mLongHoverRunnable == null) {
mLongHoverRunnable =
new Runnable() {
@Override
public void run() {
setLongHovered(true);
announceForAccessibility(mLongHoverContentDesc);
}
};
}
postDelayed(mLongHoverRunnable, LONG_HOVER_TIMEOUT);
}
setClickable(false);
setLongClickable(false);
break;
case MotionEvent.ACTION_HOVER_EXIT:
if (mHoverBounds.contains(event.getX(), event.getY())) {
if (mLongHovered) {
performLongClick();
} else {
simulateClickForAccessibility();
}
}
cancelLongHover();
setClickable(mWasClickable);
setLongClickable(mWasLongClickable);
break;
}
}
return super.onHoverEvent(event);
}
/**
* When accessibility is on, simulate press and release to preserve the semantic meaning of
* performClick(). Required for Braille support.
*/
private void simulateClickForAccessibility() {
// Checking the press state prevents double activation.
if (isPressed()) {
return;
}
setPressed(true);
// Stay consistent with performClick() by sending the event after
// setting the pressed state but before performing the action.
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
setPressed(false);
}
private void setLongHovered(boolean enabled) {
if (mLongHovered != enabled) {
mLongHovered = enabled;
// Switch between normal and alternate description, if available.
if (enabled) {
mBackupContentDesc = getContentDescription();
super.setContentDescription(mLongHoverContentDesc);
} else {
super.setContentDescription(mBackupContentDesc);
}
}
}
private void cancelLongHover() {
if (mLongHoverRunnable != null) {
removeCallbacks(mLongHoverRunnable);
}
setLongHovered(false);
}
public interface OnPressedListener {
void onPressed(View view, boolean pressed);
}
}

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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 com.android.dialer.dialpadview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* This is a custom text view intended only for rendering the numerals (and star and pound) on the
* dialpad. TextView has built in top/bottom padding to help account for ascenders/descenders.
*
* <p>Since vertical space is at a premium on the dialpad, particularly if the font size is scaled
* to a larger default, for the dialpad we use this class to more precisely render characters
* according to the precise amount of space they need.
*/
public class DialpadTextView extends TextView {
private Rect mTextBounds = new Rect();
private String mTextStr;
public DialpadTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
/** Draw the text to fit within the height/width which have been specified during measurement. */
@Override
public void draw(Canvas canvas) {
Paint paint = getPaint();
// Without this, the draw does not respect the style's specified text color.
paint.setColor(getCurrentTextColor());
// The text bounds values are relative and can be negative,, so rather than specifying a
// standard origin such as 0, 0, we need to use negative of the left/top bounds.
// For example, the bounds may be: Left: 11, Right: 37, Top: -77, Bottom: 0
canvas.drawText(mTextStr, -mTextBounds.left, -mTextBounds.top, paint);
}
/**
* Calculate the pixel-accurate bounds of the text when rendered, and use that to specify the
* height and width.
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mTextStr = getText().toString();
getPaint().getTextBounds(mTextStr, 0, mTextStr.length(), mTextBounds);
int width = resolveSize(mTextBounds.width(), widthMeasureSpec);
int height = resolveSize(mTextBounds.height(), heightMeasureSpec);
setMeasuredDimension(width, height);
}
}

View File

@@ -0,0 +1,455 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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 com.android.dialer.dialpadview;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.Spannable;
import android.text.TextUtils;
import android.text.style.TtsSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import android.view.accessibility.AccessibilityManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.dialer.animation.AnimUtils;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
/** View that displays a twelve-key phone dialpad. */
public class DialpadView extends LinearLayout {
private static final String TAG = DialpadView.class.getSimpleName();
private static final double DELAY_MULTIPLIER = 0.66;
private static final double DURATION_MULTIPLIER = 0.8;
// For animation.
private static final int KEY_FRAME_DURATION = 33;
/** {@code True} if the dialpad is in landscape orientation. */
private final boolean mIsLandscape;
/** {@code True} if the dialpad is showing in a right-to-left locale. */
private final boolean mIsRtl;
private final int[] mButtonIds =
new int[] {
R.id.zero,
R.id.one,
R.id.two,
R.id.three,
R.id.four,
R.id.five,
R.id.six,
R.id.seven,
R.id.eight,
R.id.nine,
R.id.star,
R.id.pound
};
private EditText mDigits;
private ImageButton mDelete;
private View mOverflowMenuButton;
private ViewGroup mRateContainer;
private TextView mIldCountry;
private TextView mIldRate;
private boolean mCanDigitsBeEdited;
private int mTranslateDistance;
public DialpadView(Context context) {
this(context, null);
}
public DialpadView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DialpadView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mTranslateDistance =
getResources().getDimensionPixelSize(R.dimen.dialpad_key_button_translate_y);
mIsLandscape =
getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
mIsRtl = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 &&
TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL;
}
@Override
protected void onFinishInflate() {
setupKeypad();
mDigits = (EditText) findViewById(R.id.digits);
mDelete = (ImageButton) findViewById(R.id.deleteButton);
mOverflowMenuButton = findViewById(R.id.dialpad_overflow);
mRateContainer = (ViewGroup) findViewById(R.id.rate_container);
mIldCountry = (TextView) mRateContainer.findViewById(R.id.ild_country);
mIldRate = (TextView) mRateContainer.findViewById(R.id.ild_rate);
AccessibilityManager accessibilityManager =
(AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
if (accessibilityManager.isEnabled()) {
// The text view must be selected to send accessibility events.
mDigits.setSelected(true);
}
}
private void setupKeypad() {
final int[] letterIds =
new int[] {
R.string.dialpad_0_letters,
R.string.dialpad_1_letters,
R.string.dialpad_2_letters,
R.string.dialpad_3_letters,
R.string.dialpad_4_letters,
R.string.dialpad_5_letters,
R.string.dialpad_6_letters,
R.string.dialpad_7_letters,
R.string.dialpad_8_letters,
R.string.dialpad_9_letters,
R.string.dialpad_star_letters,
R.string.dialpad_pound_letters
};
final Resources resources = getContext().getResources();
DialpadKeyButton dialpadKey;
TextView numberView;
TextView lettersView;
final Locale currentLocale = resources.getConfiguration().locale;
final NumberFormat nf;
// We translate dialpad numbers only for "fa" and not any other locale
// ("ar" anybody ?).
if ("fa".equals(currentLocale.getLanguage())) {
nf = DecimalFormat.getInstance(resources.getConfiguration().locale);
} else {
nf = DecimalFormat.getInstance(Locale.ENGLISH);
}
for (int i = 0; i < mButtonIds.length; i++) {
dialpadKey = (DialpadKeyButton) findViewById(mButtonIds[i]);
numberView = (TextView) dialpadKey.findViewById(R.id.dialpad_key_number);
lettersView = (TextView) dialpadKey.findViewById(R.id.dialpad_key_letters);
final String numberString;
final CharSequence numberContentDescription;
if (mButtonIds[i] == R.id.pound) {
numberString = resources.getString(R.string.dialpad_pound_number);
numberContentDescription = numberString;
} else if (mButtonIds[i] == R.id.star) {
numberString = resources.getString(R.string.dialpad_star_number);
numberContentDescription = numberString;
} else {
numberString = nf.format(i);
// The content description is used for Talkback key presses. The number is
// separated by a "," to introduce a slight delay. Convert letters into a verbatim
// span so that they are read as letters instead of as one word.
String letters = resources.getString(letterIds[i]);
Spannable spannable =
Spannable.Factory.getInstance().newSpannable(numberString + "," + letters);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
spannable.setSpan(
(new TtsSpan.VerbatimBuilder(letters)).build(),
numberString.length() + 1,
numberString.length() + 1 + letters.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
numberContentDescription = spannable;
}
numberView.setText(numberString);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
numberView.setElegantTextHeight(false);
}
dialpadKey.setContentDescription(numberContentDescription);
if (lettersView != null) {
lettersView.setText(resources.getString(letterIds[i]));
}
}
final DialpadKeyButton one = (DialpadKeyButton) findViewById(R.id.one);
one.setLongHoverContentDescription(resources.getText(R.string.description_voicemail_button));
final DialpadKeyButton zero = (DialpadKeyButton) findViewById(R.id.zero);
zero.setLongHoverContentDescription(resources.getText(R.string.description_image_button_plus));
}
private Drawable getDrawableCompat(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return context.getDrawable(id);
} else {
return context.getResources().getDrawable(id);
}
}
public void setShowVoicemailButton(boolean show) {
View view = findViewById(R.id.dialpad_key_voicemail);
if (view != null) {
view.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
}
}
/**
* Whether or not the digits above the dialer can be edited.
*
* @param canBeEdited If true, the backspace button will be shown and the digits EditText will be
* configured to allow text manipulation.
*/
public void setCanDigitsBeEdited(boolean canBeEdited) {
// View deleteButton = findViewById(R.id.deleteButton);
// deleteButton.setVisibility(canBeEdited ? View.VISIBLE : View.INVISIBLE);
// View overflowMenuButton = findViewById(R.id.dialpad_overflow);
// overflowMenuButton.setVisibility(canBeEdited ? View.VISIBLE : View.GONE);
// EditText digits = (EditText) findViewById(R.id.digits);
// digits.setClickable(canBeEdited);
// digits.setLongClickable(canBeEdited);
// digits.setFocusableInTouchMode(canBeEdited);
// digits.setCursorVisible(false);
mCanDigitsBeEdited = canBeEdited;
}
public void setCallRateInformation(String countryName, String displayRate) {
if (TextUtils.isEmpty(countryName) && TextUtils.isEmpty(displayRate)) {
mRateContainer.setVisibility(View.GONE);
return;
}
mRateContainer.setVisibility(View.VISIBLE);
mIldCountry.setText(countryName);
mIldRate.setText(displayRate);
}
public boolean canDigitsBeEdited() {
return mCanDigitsBeEdited;
}
/**
* Always returns true for onHoverEvent callbacks, to fix problems with accessibility due to the
* dialpad overlaying other fragments.
*/
@Override
public boolean onHoverEvent(MotionEvent event) {
return true;
}
public void animateShow() {
// This is a hack; without this, the setTranslationY is delayed in being applied, and the
// numbers appear at their original position (0) momentarily before animating.
final AnimatorListenerAdapter showListener = new AnimatorListenerAdapter() {};
for (int i = 0; i < mButtonIds.length; i++) {
int delay = (int) (getKeyButtonAnimationDelay(mButtonIds[i]) * DELAY_MULTIPLIER);
int duration = (int) (getKeyButtonAnimationDuration(mButtonIds[i]) * DURATION_MULTIPLIER);
final DialpadKeyButton dialpadKey = (DialpadKeyButton) findViewById(mButtonIds[i]);
ViewPropertyAnimator animator = dialpadKey.animate();
if (mIsLandscape) {
// Landscape orientation requires translation along the X axis.
// For RTL locales, ensure we translate negative on the X axis.
dialpadKey.setTranslationX((mIsRtl ? -1 : 1) * mTranslateDistance);
animator.translationX(0);
} else {
// Portrait orientation requires translation along the Y axis.
dialpadKey.setTranslationY(mTranslateDistance);
animator.translationY(0);
}
animator
.setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
.setStartDelay(delay)
.setDuration(duration)
.setListener(showListener)
.start();
}
}
public EditText getDigits() {
return mDigits;
}
public ImageButton getDeleteButton() {
return mDelete;
}
public View getOverflowMenuButton() {
return mOverflowMenuButton;
}
/**
* Get the animation delay for the buttons, taking into account whether the dialpad is in
* landscape left-to-right, landscape right-to-left, or portrait.
*
* @param buttonId The button ID.
* @return The animation delay.
*/
private int getKeyButtonAnimationDelay(int buttonId) {
if (mIsLandscape) {
if (mIsRtl) {
if (buttonId == R.id.three) {
return KEY_FRAME_DURATION * 1;
} else if (buttonId == R.id.six) {
return KEY_FRAME_DURATION * 2;
} else if (buttonId == R.id.nine) {
return KEY_FRAME_DURATION * 3;
} else if (buttonId == R.id.pound) {
return KEY_FRAME_DURATION * 4;
} else if (buttonId == R.id.two) {
return KEY_FRAME_DURATION * 5;
} else if (buttonId == R.id.five) {
return KEY_FRAME_DURATION * 6;
} else if (buttonId == R.id.eight) {
return KEY_FRAME_DURATION * 7;
} else if (buttonId == R.id.zero) {
return KEY_FRAME_DURATION * 8;
} else if (buttonId == R.id.one) {
return KEY_FRAME_DURATION * 9;
} else if (buttonId == R.id.four) {
return KEY_FRAME_DURATION * 10;
} else if (buttonId == R.id.seven || buttonId == R.id.star) {
return KEY_FRAME_DURATION * 11;
}
} else {
if (buttonId == R.id.one) {
return KEY_FRAME_DURATION * 1;
} else if (buttonId == R.id.four) {
return KEY_FRAME_DURATION * 2;
} else if (buttonId == R.id.seven) {
return KEY_FRAME_DURATION * 3;
} else if (buttonId == R.id.star) {
return KEY_FRAME_DURATION * 4;
} else if (buttonId == R.id.two) {
return KEY_FRAME_DURATION * 5;
} else if (buttonId == R.id.five) {
return KEY_FRAME_DURATION * 6;
} else if (buttonId == R.id.eight) {
return KEY_FRAME_DURATION * 7;
} else if (buttonId == R.id.zero) {
return KEY_FRAME_DURATION * 8;
} else if (buttonId == R.id.three) {
return KEY_FRAME_DURATION * 9;
} else if (buttonId == R.id.six) {
return KEY_FRAME_DURATION * 10;
} else if (buttonId == R.id.nine || buttonId == R.id.pound) {
return KEY_FRAME_DURATION * 11;
}
}
} else {
if (buttonId == R.id.one) {
return KEY_FRAME_DURATION * 1;
} else if (buttonId == R.id.two) {
return KEY_FRAME_DURATION * 2;
} else if (buttonId == R.id.three) {
return KEY_FRAME_DURATION * 3;
} else if (buttonId == R.id.four) {
return KEY_FRAME_DURATION * 4;
} else if (buttonId == R.id.five) {
return KEY_FRAME_DURATION * 5;
} else if (buttonId == R.id.six) {
return KEY_FRAME_DURATION * 6;
} else if (buttonId == R.id.seven) {
return KEY_FRAME_DURATION * 7;
} else if (buttonId == R.id.eight) {
return KEY_FRAME_DURATION * 8;
} else if (buttonId == R.id.nine) {
return KEY_FRAME_DURATION * 9;
} else if (buttonId == R.id.star) {
return KEY_FRAME_DURATION * 10;
} else if (buttonId == R.id.zero || buttonId == R.id.pound) {
return KEY_FRAME_DURATION * 11;
}
}
Log.wtf(TAG, "Attempted to get animation delay for invalid key button id.");
return 0;
}
/**
* Get the button animation duration, taking into account whether the dialpad is in landscape
* left-to-right, landscape right-to-left, or portrait.
*
* @param buttonId The button ID.
* @return The animation duration.
*/
private int getKeyButtonAnimationDuration(int buttonId) {
if (mIsLandscape) {
if (mIsRtl) {
if (buttonId == R.id.one
|| buttonId == R.id.four
|| buttonId == R.id.seven
|| buttonId == R.id.star) {
return KEY_FRAME_DURATION * 8;
} else if (buttonId == R.id.two
|| buttonId == R.id.five
|| buttonId == R.id.eight
|| buttonId == R.id.zero) {
return KEY_FRAME_DURATION * 9;
} else if (buttonId == R.id.three
|| buttonId == R.id.six
|| buttonId == R.id.nine
|| buttonId == R.id.pound) {
return KEY_FRAME_DURATION * 10;
}
} else {
if (buttonId == R.id.one
|| buttonId == R.id.four
|| buttonId == R.id.seven
|| buttonId == R.id.star) {
return KEY_FRAME_DURATION * 10;
} else if (buttonId == R.id.two
|| buttonId == R.id.five
|| buttonId == R.id.eight
|| buttonId == R.id.zero) {
return KEY_FRAME_DURATION * 9;
} else if (buttonId == R.id.three
|| buttonId == R.id.six
|| buttonId == R.id.nine
|| buttonId == R.id.pound) {
return KEY_FRAME_DURATION * 8;
}
}
} else {
if (buttonId == R.id.one
|| buttonId == R.id.two
|| buttonId == R.id.three
|| buttonId == R.id.four
|| buttonId == R.id.five
|| buttonId == R.id.six) {
return KEY_FRAME_DURATION * 10;
} else if (buttonId == R.id.seven || buttonId == R.id.eight || buttonId == R.id.nine) {
return KEY_FRAME_DURATION * 9;
} else if (buttonId == R.id.star || buttonId == R.id.zero || buttonId == R.id.pound) {
return KEY_FRAME_DURATION * 8;
}
}
Log.wtf(TAG, "Attempted to get animation duration for invalid key button id.");
return 0;
}
}

View File

@@ -0,0 +1,84 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* 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 com.android.dialer.dialpadview;
import android.content.Context;
import android.graphics.Rect;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.inputmethod.InputMethodManager;
import com.android.dialer.widget.ResizingTextEditText;
/** EditText which suppresses IME show up. */
public class DigitsEditText extends ResizingTextEditText {
private OnTextContextMenuClickListener mOnTextContextMenuClickListener;
public DigitsEditText(Context context, AttributeSet attrs) {
super(context, attrs);
setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
setShowSoftInputOnFocus(false);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
final InputMethodManager imm =
((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE));
if (imm != null && imm.isActive(this)) {
imm.hideSoftInputFromWindow(getApplicationWindowToken(), 0);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
final boolean ret = super.onTouchEvent(event);
// Must be done after super.onTouchEvent()
final InputMethodManager imm =
((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE));
if (imm != null && imm.isActive(this)) {
imm.hideSoftInputFromWindow(getApplicationWindowToken(), 0);
}
return ret;
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
if (isCursorVisible()) {
setSelection(getText().length());
}
}
@Override
public boolean onTextContextMenuItem(int id) {
boolean value = super.onTextContextMenuItem(id);
if (mOnTextContextMenuClickListener != null) {
mOnTextContextMenuClickListener.onTextContextMenuClickListener(id);
}
return value;
}
public interface OnTextContextMenuClickListener {
void onTextContextMenuClickListener(int id);
}
public void setOnTextContextMenuClickListener(OnTextContextMenuClickListener listener) {
this.mOnTextContextMenuClickListener = listener;
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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 com.android.dialer.util;
import android.graphics.Paint;
import android.util.TypedValue;
import android.widget.TextView;
/** Provides static functions to work with views */
public class ViewUtil {
private ViewUtil() {}
public static void resizeText(TextView textView, int originalTextSize, int minTextSize) {
final Paint paint = textView.getPaint();
final int width = textView.getWidth();
if (width == 0) {
return;
}
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalTextSize);
float ratio = width / paint.measureText(textView.getText().toString());
if (ratio <= 1.0f) {
textView.setTextSize(
TypedValue.COMPLEX_UNIT_PX, Math.max(minTextSize, originalTextSize * ratio));
}
}
}

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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 com.android.dialer.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.EditText;
import com.android.dialer.dialpadview.R;
import com.android.dialer.util.ViewUtil;
/** EditText which resizes dynamically with respect to text length. */
public class ResizingTextEditText extends EditText {
private final int mOriginalTextSize;
private final int mMinTextSize;
public ResizingTextEditText(Context context, AttributeSet attrs) {
super(context, attrs);
mOriginalTextSize = (int) getTextSize();
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ResizingText);
mMinTextSize =
(int) a.getDimension(R.styleable.ResizingText_resizing_text_min_size, mOriginalTextSize);
a.recycle();
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
super.onTextChanged(text, start, lengthBefore, lengthAfter);
ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 511 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

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