Compare commits

...

93 Commits

Author SHA1 Message Date
Honza Rychnovský 00db536674
[#1417] Add in-app authentication
* [#1417] Add authentication

- Closes #1417
- Closes #326
- Partially addresses [Electric-Coin-Company/zashi#7] too
- Creates reusable AuthenticationVM component with all necessary logic that reports authentication status to its callers
- Addresses authentication requirements for the Send funds, Delete wallet, Export private data, and Recovery phrase. The App access authentication use case is prepared and can be turned on anytime.
- The new logic also counts with possible future user customization via the app UI of the default on/off states for all implemented authentication use cases
- Send.Confirmation logic simplification
- This also adds the welcome screen (splash) animation to all the app entry points (the app recreation caused by system included)

* Allow unauthenticated access

- In case no authentication method is available on the device

* Build supported authenticators for the device

- Based on the device Android SDK version

* Disable broken screenshot testing

- This is a temporary change until #1448 is addressed

* Changelog update

* Add temporary placeholder screenshot test

To suppress no test error
2024-05-22 15:59:38 +02:00
dependabot[bot] 02e67ae778
Bump actions/checkout from 4.1.5 to 4.1.6 (#1446)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.5 to 4.1.6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](44c2b7a8a4...a5ac7e51b4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-20 17:45:21 +02:00
dependabot[bot] 9fdfcf39dd
Bump google-github-actions/auth from 2.1.2 to 2.1.3 (#1445)
Bumps [google-github-actions/auth](https://github.com/google-github-actions/auth) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/google-github-actions/auth/releases)
- [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md)
- [Commits](55bd3a7c6e...71fee32a0b)

---
updated-dependencies:
- dependency-name: google-github-actions/auth
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-16 06:44:23 +02:00
Honza Rychnovský 6ee0deeb5c
[#1442] Release Zashi Android version 1.0 (650)
* [#1442] Release Zashi Android version 1.0 (650)

- Closes #1442
- Changelog
2024-05-07 17:02:17 +02:00
Honza Rychnovský a97b71d922
[#1338] Redesign Update-Available screen
- Closes  #1338
- Changelog update
2024-05-07 16:57:45 +02:00
dependabot[bot] b235e0cc82
Bump actions/checkout from 4.1.4 to 4.1.5 (#1439)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.4 to 4.1.5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](0ad4b8fada...44c2b7a8a4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-05-07 07:00:09 +02:00
Honza Rychnovský 6c3307748a
Improve delete wallet app state reset (#1438) 2024-05-06 19:29:50 +02:00
Honza Rychnovský c3cf711ee6
[#1382] Improve Onboarding screen dynamic height calculation
- Closes #1382
- Changelog update
2024-05-06 18:54:52 +02:00
Honza Rychnovský 5c21a776d5
[#1434] Improve Shielding UX
* [#1434] Improve Shielding UX

- Closes #1434
- Changelog update

* Trigger balances refresh after sending too
2024-05-06 16:33:31 +02:00
Honza Rychnovský 6160554d64
[#1431] Minor UI improvements
* [#1431] Minor UI improvements

- Account - syncing bar vertical paddings too big

* Add missing bottom padding on About

* Changelog update

* Improve OS info in the support email template

* [#1348] Update restore wallet text field copy

Closes #1348
2024-05-03 13:53:10 +02:00
Honza Rychnovský 2828c25c21
[#1350] No message included in transaction
- Closes #1350
2024-05-03 10:15:59 +02:00
Honza Rychnovský e2ddebe47c
[#1429] Deduplicate messages on transaction
- Closes #1429
- Changelog update
2024-05-02 12:53:21 +02:00
Honza Rychnovský 448177c2d1
[#1427] Do not concatenate memos
- Closes #1427
- Changelog update
2024-05-02 12:37:50 +02:00
Honza Rychnovský 09febc6ff1
[#1425] Improve Balances widget loader logic
- Closes #1425
- Changelog update
2024-05-02 12:04:49 +02:00
Honza Rychnovský a1cf59f9b2
[#1407] Add Delete wallet feature
- Closes #1407
- Changelog update
- Link a new snapshot version of the Zcash SDK
2024-05-02 10:07:28 +02:00
Honza Rychnovský eae133f650
[#1405] Release version 1.0 (638)
* Fix server selection in Restore wallet flow

* [#1405] Release version 1.0 (638)

- Closes #1405
- Changleog update
2024-04-26 16:43:27 +02:00
Honza Rychnovský b0ccdef6e3
Fix server selection in Restore wallet flow (#1404) 2024-04-26 16:42:54 +02:00
Honza Rychnovský a95172ad76
[#1402] Release version 1.0 (636) 2024-04-26 13:11:44 +02:00
Honza Rychnovský 9b2bad6f10
Add zec.rocks lightwalletd server options (#1401)
- Default wallet option changed to zec.rocks:443
- Changleog update
2024-04-26 13:02:07 +02:00
dependabot[bot] 9ca5548ca3
Bump gradle/gradle-build-action from 3.3.1 to 3.3.2 (#1400)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](e2097ccd7e...4c39dd82cd)

---
updated-dependencies:
- dependency-name: gradle/gradle-build-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-26 12:45:38 +02:00
dependabot[bot] 841e0e76d1
Bump gradle/wrapper-validation-action from 3.3.1 to 3.3.2 (#1399)
Bumps [gradle/wrapper-validation-action](https://github.com/gradle/wrapper-validation-action) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/gradle/wrapper-validation-action/releases)
- [Commits](5188e9b552...216d1ad2b3)

---
updated-dependencies:
- dependency-name: gradle/wrapper-validation-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-26 12:45:15 +02:00
dependabot[bot] e1a805fc0a
Bump actions/checkout from 4.1.3 to 4.1.4 (#1398)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.3 to 4.1.4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](1d96c772d1...0ad4b8fada)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-26 12:44:47 +02:00
dependabot[bot] 9ae38c92bc
Bump actions/download-artifact from 4.1.6 to 4.1.7 (#1397)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.6 to 4.1.7.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](9c19ed7fe5...65a9edc588)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-26 12:44:17 +02:00
Honza Rychnovský b9249d6ebf
[#1395] Release Zashi Android version 1.0 (630)
Closes #1395
2024-04-24 19:05:28 +02:00
Honza Rychnovský 2ac9f5ebd4
Add more servers to the list (#1394)
- 8 more servers added to the list
- Order of servers changed to show default as 1st, custom as 2nd
2024-04-24 18:47:23 +02:00
Honza Rychnovský e0439f0ca9
[#1150] Release Zashi Android v1.0 (628)
- Closes #1150
- Changelog updated
2024-04-23 21:14:19 +02:00
Honza Rychnovský abafc0387f
[#1391] Adopt SDK production v2.1.1
Closes #1391
2024-04-23 20:22:40 +02:00
Honza Rychnovský d9565e68e0
Remove unused resources (#1390) 2024-04-23 18:08:58 +02:00
Honza Rychnovský 45ca274f98
Display only 3 decimals within fee amount (#1387)
- The proper solution will be added with #1047
2024-04-23 13:30:11 +02:00
Honza Rychnovský 66ba050719
Scroll to Send button (#1386) 2024-04-23 13:29:12 +02:00
Honza Rychnovský 1ffbaf986f
[#1284] Rework Scan screen
- Closes #1284
- Closes #423
- Closes #437
- Changelog update
2024-04-23 10:05:15 +02:00
dependabot[bot] 992c1dd197
Bump actions/download-artifact from 4.1.5 to 4.1.6 (#1383)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.5 to 4.1.6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](8caf195ad4...9c19ed7fe5)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-23 08:56:57 +02:00
dependabot[bot] 32e68c3d91
Bump actions/upload-artifact from 4.3.2 to 4.3.3 (#1384)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.3.2 to 4.3.3.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](1746f4ab65...65462800fd)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-23 08:46:09 +02:00
Honza Rychnovský dd371348eb
[#372] Improve scrolling on Onboarding
* [#372] Improve scrolling on Onboarding

- Closes #372
- All screens were checked
- The Onboarding screen behavior on very small screens improved
- Tested with Split screen OS feature to emulate a very small screen

* Fixed status and navigation bars height
2024-04-23 08:45:27 +02:00
dependabot[bot] 6ef9d9f02e
Bump actions/checkout from 4.1.2 to 4.1.3 (#1379)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](9bb56186c3...1d96c772d1)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-23 08:44:23 +02:00
Honza Rychnovský 551055e65c
[#1291] Balances hint box copy update
Closes #1291
2024-04-23 08:43:48 +02:00
Honza Rychnovský ff2ce3a379
[#1372] Throw if parsing configuration failed
- Closes #1372
- Follow up #1373
2024-04-23 08:43:14 +02:00
Honza Rychnovský 786c8c2cab
[#1371] Improve Balances widget loader logic
- Closes #1371
- This also covers the security audit recommendation: 4.2.14 (App) This comment in WalletSnapshot.kt should be ticketed
2024-04-23 08:42:34 +02:00
Honza Rychnovský fb5d446bab
[#1367] Send 0 funds only within shielded transaction
- Closes #1367
- Plus slightly refactored SendForm composable to two functions
- Changelog update
2024-04-23 08:39:40 +02:00
Honza Rychnovský b00c807df1
[#1190] Add native debug symbols to builds
- Although this build flag is not transitive, and thus it does not cover SDK, it’s still a good approach to have it turned on
- Using the middle path with symbol_table value - this could be changed once needed
2024-04-23 08:38:36 +02:00
dependabot[bot] 533f335038
Bump actions/upload-artifact from 4.3.1 to 4.3.2 (#1366)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.3.1 to 4.3.2.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](5d5d22a312...1746f4ab65)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 09:01:24 +02:00
dependabot[bot] e3fb6083c9
Bump actions/download-artifact from 4.1.4 to 4.1.5 (#1365)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.4 to 4.1.5.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](c850b930e6...8caf195ad4)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 09:00:56 +02:00
dependabot[bot] 681fb6ae85
Bump gradle/wrapper-validation-action from 3.3.0 to 3.3.1 (#1364)
Bumps [gradle/wrapper-validation-action](https://github.com/gradle/wrapper-validation-action) from 3.3.0 to 3.3.1.
- [Release notes](https://github.com/gradle/wrapper-validation-action/releases)
- [Commits](460a3ca55f...5188e9b552)

---
updated-dependencies:
- dependency-name: gradle/wrapper-validation-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 09:00:17 +02:00
dependabot[bot] 7cc067af49
Bump gradle/gradle-build-action from 3.3.0 to 3.3.1 (#1363)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 3.3.0 to 3.3.1.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](8baac4c8ef...e2097ccd7e)

---
updated-dependencies:
- dependency-name: gradle/gradle-build-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-19 08:59:51 +02:00
Honza Rychnovský 9c9388a695
[#1361] Release 0.2.0 (609) 2024-04-18 14:23:30 +02:00
Honza Rychnovský e92c0b613c
[#1359] Remove fixed US locale
* [#1359]: Use default Locale in PercentDecimal

* Intended use of Local.US

* Use default Locale in Transaction history dates

* Use default Locale in Balance widget

* Use default Locale in Send tests

* Use default Locale in WalletDisplayValues.kt
2024-04-18 13:05:32 +02:00
dependabot[bot] cada044991
Bump clamav/clamav from 1.3.0 to 1.3.1 in /.github/actions/antivirus (#1358)
Bumps clamav/clamav from 1.3.0 to 1.3.1.

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-18 08:11:13 +02:00
Honza Rychnovský 895d692588
[#1356] Do not report caught exceptions
- Although GlobalCrashReporter is built primarily as an interface for the locale exceptions reporting using LocalCrashReporter, the FirebaseCrashReporter inherits its reportCaughtException API and provides the ability to report a caught exception to remote crashyltics service. This commit disables this API for FirebaseCrashReporter.
- Closes #1356
2024-04-18 08:10:46 +02:00
Honza Rychnovský 81508f6466
[#1354] Repository restriction regex
- Closes #1354
- The repository regex changed to align with audit findings and still be able to cover both
com.android:signflinger:[version] and com.android.tools:common:[version]
2024-04-18 08:10:28 +02:00
Honza Rychnovský afd47e513e
[#1352] Remove test fixture values ZIP321
- Addresses issue J from the security audit: Payment URI parser uses a test fixture address
- This also removes unused Request screen with its logic and tests
- Closes #1352
2024-04-18 08:10:08 +02:00
Honza Rychnovský 0e6b8f83a0
[#1347] Adopt Zcash SDK 2.1.1-SNAPSHOT
* [#1347] Adopt Zcash SDK 2.1.1-SNAPSHOT

- Closes #1347

* Add missing Progurad rules
2024-04-17 18:30:33 +02:00
dependabot[bot] fc1ce4087d
Bump gradle/gradle-build-action from 3.2.1 to 3.3.0 (#1345)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 3.2.1 to 3.3.0.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](bdf99f9dad...8baac4c8ef)

---
updated-dependencies:
- dependency-name: gradle/gradle-build-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-15 18:00:05 +02:00
dependabot[bot] 316bc8702a
Bump gradle/wrapper-validation-action from 2.1.3 to 3.3.0 (#1344)
Bumps [gradle/wrapper-validation-action](https://github.com/gradle/wrapper-validation-action) from 2.1.3 to 3.3.0.
- [Release notes](https://github.com/gradle/wrapper-validation-action/releases)
- [Commits](b5418f5a58...460a3ca55f)

---
updated-dependencies:
- dependency-name: gradle/wrapper-validation-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-15 17:59:34 +02:00
Honza Rychnovský dc955d6ee3
[#1342] Dependency update
* [#1342] Bip-39 1.0.8-SNAPSHOT

* Gradle versions 0.51.0

* Ktlint 1.2.1

* Kotlin 1.9.23 + Compose Compiler 1.5.11

* Gradle 8.7

* compose Activity 1.8.2

* AndroidX Annotation 1.7.1

* Test Macrobenchmark 1.2.3

* Compose 1.6.5

* AndroidX Core 1.12.0

* AndroidX Lifecycle 2.7.0

* Uiautomator 2.3.0

* Accompanist Permission 0.34.0

* Firebase Bom 32.8.1

* Google Play Service Plugin 4.4.1 + Firebase CL Tools 4.4.1

* UiAutomater version fix

* Zxing 3.5.3

* Detekt 1.23.6 + Detekt Compose 0.3.15

* Kotlin Immutable Collections 0.3.7

* Emulator Wtf Gradle Plugin 0.16.2

* Changelog update

[skip ci]

* Bip-39 1.0.8

* AGP 8.3.0

* Jacoco 0.8.12
2024-04-15 17:46:49 +02:00
Honza Rychnovský bd8cbcab10
Document encoding of the upload key for Github secrets in deploy action (#1339)
Co-authored-by: Kris Nuttycombe <kris@nutty.land>
2024-04-14 14:27:29 +02:00
Honza Rychnovský 47937ffabc
Show initial restoring dialog (#1335) 2024-04-12 15:02:44 +02:00
Honza Rychnovský cad8e48bf8
[#1319] Restoring state UI in Account and Balances (#1334)
* [#1319] Restoring state UI in Account and Balances

- Closes #1319

* [#1319] Restoring state widget in Account

- Closes #1319

* Add syncing widget to Account while restoring

* Update changelog

Plus reset the previously unreleased app record
2024-04-12 11:55:44 +02:00
Honza Rychnovský bcdf328cb4
Fix shielding state interpretation (#1333) 2024-04-10 14:41:41 +02:00
dependabot[bot] ed34fb1b3a
Bump gradle/wrapper-validation-action from 2.1.2 to 2.1.3 (#1332)
Bumps [gradle/wrapper-validation-action](https://github.com/gradle/wrapper-validation-action) from 2.1.2 to 2.1.3.
- [Release notes](https://github.com/gradle/wrapper-validation-action/releases)
- [Commits](b231772637...b5418f5a58)

---
updated-dependencies:
- dependency-name: gradle/wrapper-validation-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-10 14:38:01 +02:00
Honza Rychnovský c9308546ab
Release 0.2.0 (594) (#1330) 2024-04-09 16:20:17 +02:00
Honza Rychnovský c6aac62070
[#1328] Release 0.2.0 (593)
- Closes #1328
2024-04-09 15:44:15 +02:00
Honza Rychnovský 0d3d0c4d19
[#1263] Statuses of the sync process
- Closes #1263
- Changelog update
2024-04-09 12:19:13 +02:00
dependabot[bot] af92f1b52f
Bump gradle/gradle-build-action from 3.2.0 to 3.2.1 (#1325)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 3.2.0 to 3.2.1.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](fe59895742...bdf99f9dad)

---
updated-dependencies:
- dependency-name: gradle/gradle-build-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-09 11:42:51 +02:00
Honza Rychnovský bca1c32b8c
[#1264] Handle unavailable AccountBalance
- Closes #1264
- Changelog update
2024-04-08 12:59:03 +02:00
Honza Rychnovský b34d086cc0
Extend shielding state (#1322)
- This adds `ShieldState.Shielded` that helps us keep the correct UI state of the Transparent funds widget after the user starts shielding action
- This also brings little UI improvement in PrimaryButton sizing
2024-04-08 07:49:53 +02:00
Honza Rychnovský 8c027003cc
[#1164] Restoring UI state in TopAppBar
- Closes #1164
- This incorporates the new wallet restoring label into the custom TopAppBar UI component, so it’s accessible from all screens
- This also fixes the adjust brightness feature that previously stayed turned on when the user left to a surrounding tab screen (Send or Balances)
- Changelog update

Move DisableScreenTimeout into the parent HomeView

Persist restoring state

Fix infinite loading trx history UI state

Add New wallet syncing state

This also adds the wallet restoring state into the transaction history state calculation
2024-04-05 13:09:08 +02:00
dependabot[bot] 84c7618037
Bump gradle/gradle-build-action from 3.1.0 to 3.2.0 (#1320)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](29c0906b64...fe59895742)

---
updated-dependencies:
- dependency-name: gradle/gradle-build-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-05 08:41:15 +02:00
Honza Rychnovský e398af5690
[#1317] Improve balances logic calculation
- Closes #1317
2024-04-03 14:16:51 +02:00
Honza Rychnovský 2c45ab642b
[#1162] Finish expandable trx item UI state
- Closes #1162
- Closes #1237
- Closes #1078
- This removes unused DangerousButton component and its related resources
- It fixes the Collapse button vector icon
- It brings send_failed and receive_failed states into the trx item UI
- It adds the fee part of the expandable item
- Its follow-up is #1047
- Changelog updated
2024-04-03 09:18:46 +02:00
Honza Rychnovský c8a14f0375
[#1312] Display SDK error cause in dialog
* [#1312] Display SDK error cause in dialog

- Closes #1312
- Changelog reverter as the previous release hasn’t been deployed yet due to a new bug

* Too long dialog text scrollable
2024-04-02 08:29:08 +02:00
Honza Rychnovský a8ad649ef8
[#1310] Release 0.2.0 (583)
* [#1310] Release 0.2.0 (583)

Closes #1310

* Fix valid message check
2024-03-29 21:23:39 +01:00
Honza Rychnovský 4ae3fde690
[#1162] Expandable transaction history item
Although this brings many changes to the transaction history item UI, it only partly solves Expandable transaction history item #1162
Follow-up PR will close it
2024-03-29 20:27:30 +01:00
Honza Rychnovský c99c2907b1
[#1307] Keep transaction history UI state
- Closes #1307
- Changelog update
- #1162 is the direct follow-up of this PR
2024-03-28 12:57:04 +01:00
Honza Rychnovský 809820c1f2
[#1305] Connect shielding Multi-Trx-Submit-Error
- Closes #1305
2024-03-28 10:54:51 +01:00
Honza Rychnovský 8b58233648
[#1303] Refresh transactions immediately
Closes #1303
2024-03-26 10:56:29 +01:00
Honza Rychnovský e2eb043afb
[#1294] Send Multi-Trx-Submission failure screen
- Closes #1294
- Changelog update
2024-03-25 20:50:31 +01:00
dependabot[bot] 73de78caf9
Bump gradle/wrapper-validation-action from 2.1.1 to 2.1.2 (#1300)
Bumps [gradle/wrapper-validation-action](https://github.com/gradle/wrapper-validation-action) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/gradle/wrapper-validation-action/releases)
- [Commits](699bb18358...b231772637)

---
updated-dependencies:
- dependency-name: gradle/wrapper-validation-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-25 13:30:23 +01:00
Honza Rychnovský 7f3e55cc82
[#1161] Remove Send.Success + rework Send.Failure
- Closes #1161
2024-03-21 13:02:31 +01:00
Honza Rychnovský 3845772071
[#1159] Send.Confirmation according to new design
- Closes #1159
- Closes #1269
- Closes #1073
- Its direct follow-ups are #1294 and #1161
- Other follow up is #1260
- These changes also enable having two Primary buttons side-by-side
- This adds sorting history of transactions by a new calculated height after send done
- This also changes how we treat empty transaction dates from `-` to `` in UI
- Changelog update
2024-03-21 09:57:36 +01:00
dependabot[bot] 24cd22186f
Bump actions/setup-java from 4.2.0 to 4.2.1 (#1296)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](5896cecc08...99b8673ff6)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-15 10:20:21 +01:00
Honza Rychnovský fe5236fdae
[#1285] Adopt proposal API
* Adopt Zcash SDK v2.0.8-SNAPSHOT

* [#1285] Adopt proposal API

- Closes #1285
- Manually tested and the updated send and shield features work as expected
2024-03-15 10:05:40 +01:00
dependabot[bot] 8e495a542f
Bump actions/setup-java from 4.1.0 to 4.2.0 (#1293)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](9704b39bf2...5896cecc08)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-14 17:33:09 +01:00
Honza Rychnovský d309da9287
[#1286] Remove Seed Copy Button
* [#1286] New wallet screen: Copy seed only in debug

* [#1286] Seed screen: Copy seed only in debug

* Changelog update
2024-03-13 15:49:10 +01:00
dependabot[bot] fd7703e005
Bump actions/checkout from 4.1.1 to 4.1.2 (#1290)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.1 to 4.1.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](b4ffde65f4...9bb56186c3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-13 10:20:23 +01:00
Honza Rychnovský d076605444
[#1162] Partial transaction history item rework
- Zcash Android SDK v2.0.7 partially adopted. Proper implementaiton will be part of the Send screens rework.
- Partially addresses #1162. More related UI changes on the transaciton history item come in a follow-up PR
- `HistoryItem` composable will be reworked to several more composables as well
- Also note that the history item amount still lacks proper formatting as filed in #1047
- Closes #1236
- Closes #1288
- Closes #1253
2024-03-13 09:56:49 +01:00
Honza Rychnovský 9a929c1109
[#1160] Trx History UI incorporated into Account
- Closes #1160
- Changelog update
2024-03-05 08:52:47 +01:00
Honza Rychnovský e000745885
[#1280] Improve button sizing
- Applied to both Primary and secondary buttons
- Changelog update
- Closes #1280
2024-03-04 18:06:44 +01:00
Honza Rychnovský 5bf7a635ff
[#1262][#1083][#1241] Privacy policy link
- Closes #1262
- Closes #1083
- Closes #1241
2024-03-04 18:01:24 +01:00
Honza Rychnovský 45ab8ce8c9
[#1242] Unified error popup UI
- Closes #1242
- This creates a reusable alert dialog UI and uses it in the server switching, shielding transparent funds, and contacting support use cases.
- This also updates the Transparent funds shielding help text according to the latest design guideline
2024-03-04 17:45:51 +01:00
Honza Rychnovský cc5f3504fe
[#1235] Server switching
- Closes #1235
- Note that failures and server saving success are reported to the UI with the Android system Snackbar or via the existing Textfield’s error bottom text until we define popup design as filed in #1242
- Changelog update
2024-03-04 16:53:30 +01:00
dependabot[bot] 8f44794f9e
Bump actions/download-artifact from 4.1.3 to 4.1.4 (#1278)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.3 to 4.1.4.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](87c55149d9...c850b930e6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-04 08:55:14 +01:00
Honza Rychnovský c8e3a05eb9
[#1234] Advanced settings screen (#1272)
- Changelog update
- Closes #1234
2024-03-02 18:57:49 +01:00
dependabot[bot] 77c9f3198a
Bump actions/setup-java from 4.0.0 to 4.1.0 (#1270)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](387ac29b30...9704b39bf2)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-29 16:19:47 +01:00
261 changed files with 10596 additions and 4546 deletions

View File

@ -1,3 +1,3 @@
FROM clamav/clamav:1.3.0
FROM clamav/clamav:1.3.1
RUN freshclam
ENTRYPOINT ["clamscan", "--recursive"]

View File

@ -38,12 +38,12 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
# Gradle Wrapper validation can be flaky
# https://github.com/gradle/wrapper-validation-action/issues/40
- name: Gradle Wrapper Validation
timeout-minutes: 1
uses: gradle/wrapper-validation-action@699bb18358f12c5b78b37bb0111d3a0e2276e0e2
uses: gradle/wrapper-validation-action@216d1ad2b3710bf005dc39237337b9673fd8fcd5
check_secrets:
environment: deployment
@ -80,18 +80,18 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
with:
ref: main
fetch-depth: 0 # To fetch all commits
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 10
with:
gradle-home-cache-cleanup: true
@ -112,7 +112,7 @@ jobs:
# Note that this step is not currently used due to #1033
if: false
id: auth_google_play
uses: google-github-actions/auth@55bd3a7c6e2ae7cf1877fd1ccb9d54c0503c457c
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
with:
create_credentials_file: true
project_id: ${{ secrets.GOOGLE_PLAY_CLOUD_PROJECT }}
@ -125,6 +125,13 @@ jobs:
echo "home=${HOME}" >> "$GITHUB_ENV"
- name: Export Signing Key
env:
# The upload key must be exported using `base64 -w 0 <filename.jks>` for use
# as a Github Secrets value; if the key is exported with standard wrapping,
# it will fail to import correctly.
# NOTE: This is the upload signing key, which may be replaced at will, not
# the application signing key which is escrowed by Google and may only be
# replaced once a year (and has a bunch of additional hassles associated with
# replacing it.)
SIGNING_KEYSTORE_BASE_64: ${{ secrets.UPLOAD_KEYSTORE_BASE_64 }}
SIGNING_KEY_PATH: ${{ format('{0}/release.jks', env.home) }}
shell: bash
@ -160,7 +167,7 @@ jobs:
zip -r ${BINARIES_ZIP_PATH} . -i app/build/outputs/apk/\*/\*.apk app/build/outputs/apk_from_bundle/\*/\*.apk app/build/outputs/bundle/\*/\*.aab
zip -r ${MAPPINGS_ZIP_PATH} . -i app/build/outputs/mapping/\*/mapping.txt
- name: Upload Artifacts
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 5
with:
name: Binaries
@ -177,9 +184,9 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Download release artifact
uses: actions/download-artifact@87c55149d96e628cc2ef7e6fc2aab372015aec85
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
with:
name: Binaries
- name: Unzip artifacts

View File

@ -32,12 +32,12 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
# Gradle Wrapper validation can be flaky
# https://github.com/gradle/wrapper-validation-action/issues/40
- name: Gradle Wrapper Validation
timeout-minutes: 1
uses: gradle/wrapper-validation-action@699bb18358f12c5b78b37bb0111d3a0e2276e0e2
uses: gradle/wrapper-validation-action@216d1ad2b3710bf005dc39237337b9673fd8fcd5
check_firebase_secrets:
runs-on: ubuntu-latest
@ -71,15 +71,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Check properties
timeout-minutes: 4
@ -94,15 +94,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Detekt
timeout-minutes: 10
@ -120,7 +120,7 @@ jobs:
zip -r ${REPORTS_ZIP_PATH} . -i build/reports/detekt/*
- name: Upload Artifacts
if: ${{ always() }}
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 1
with:
name: Detekt static analysis results
@ -134,15 +134,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Ktlint
timeout-minutes: 4
@ -160,7 +160,7 @@ jobs:
zip -r ${REPORTS_ZIP_PATH} . -i build/reports/ktlint/\*
- name: Upload Artifacts
if: ${{ always() }}
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 1
with:
name: Ktlint static analysis results
@ -174,15 +174,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Android Lint
timeout-minutes: 15
@ -203,7 +203,7 @@ jobs:
zip -r ${LINT_ZIP_PATH} . -i \*build/reports/\*
- name: Upload Artifacts
if: ${{ always() }}
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 1
with:
name: Android Lint static analysis results
@ -217,15 +217,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Test
timeout-minutes: 10
@ -244,7 +244,7 @@ jobs:
zip -r ${RESULTS_ZIP_PATH} . -i \*build/reports/\* \*/build/kover/html/\* \*/build/kover/xml/report.xml
- name: Upload Artifacts
if: ${{ always() }}
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 1
with:
name: Test Kotlin modules results
@ -261,15 +261,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Build
timeout-minutes: 20
@ -277,7 +277,7 @@ jobs:
./gradlew assembleDebug assembleAndroidTest assembleZcashmainnetDebug assembleZcashtestnetDebug
- name: Authenticate to Google Cloud for Firebase Test Lab
id: auth_test_lab
uses: google-github-actions/auth@55bd3a7c6e2ae7cf1877fd1ccb9d54c0503c457c
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
with:
create_credentials_file: true
project_id: ${{ vars.FIREBASE_TEST_LAB_PROJECT }}
@ -309,7 +309,7 @@ jobs:
zip -r ${TEST_RESULTS_ZIP_PATH} . -i build/fladle/\* \*/build/outputs/androidTest-results/\*
- name: Upload Artifacts
if: ${{ always() }}
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 1
with:
name: Test Android modules with FTL results
@ -324,15 +324,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Build and test
timeout-minutes: 30
@ -356,7 +356,7 @@ jobs:
zip -r ${TEST_RESULTS_ZIP_PATH} . -i \*/build/test-results/\*
- name: Upload Artifacts
if: ${{ always() }}
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 1
with:
name: Test Android libs with WTF results
@ -371,15 +371,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Build and test
timeout-minutes: 30
@ -403,7 +403,7 @@ jobs:
zip -r ${TEST_RESULTS_ZIP_PATH} . -i \*/build/test-results/\*
- name: Upload Artifacts
if: ${{ always() }}
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 1
with:
name: Test Android app with WTF results
@ -421,15 +421,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Export Google Services JSON
env:
@ -451,7 +451,7 @@ jobs:
./gradlew :app:assembleDebug
- name: Authenticate to Google Cloud for Firebase Test Lab
id: auth_test_lab
uses: google-github-actions/auth@55bd3a7c6e2ae7cf1877fd1ccb9d54c0503c457c
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
with:
create_credentials_file: true
project_id: ${{ vars.FIREBASE_TEST_LAB_PROJECT }}
@ -475,15 +475,15 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Export Google Services JSON
env:
@ -530,7 +530,7 @@ jobs:
zip -r ${MAPPINGS_ZIP_PATH} . -i *app/build/outputs/mapping/*/mapping.txt
zip -r ${COMPOSE_METRICS_ZIP_PATH} . -i \*/build/compose-metrics/\* \*/build/compose-reports/\*
- name: Upload Artifacts
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 2
with:
name: Binaries
@ -548,19 +548,19 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@29c0906b64b8fc82467890bfb7a0a7ef34bda89e
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Authenticate to Google Cloud for Firebase Test Lab
id: auth_test_lab
uses: google-github-actions/auth@55bd3a7c6e2ae7cf1877fd1ccb9d54c0503c457c
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
with:
create_credentials_file: true
project_id: ${{ vars.FIREBASE_TEST_LAB_PROJECT }}
@ -568,7 +568,7 @@ jobs:
workload_identity_provider: ${{ secrets.FIREBASE_TEST_LAB_WORKLOAD_IDENTITY_PROVIDER }}
access_token_lifetime: '900s'
- name: Download a single artifact
uses: actions/download-artifact@87c55149d96e628cc2ef7e6fc2aab372015aec85
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
with:
name: Binaries
- name: Robo test

3
.gitignore vendored
View File

@ -9,6 +9,9 @@ syntax: glob
.idea/modules.xml
.idea/tasks.xml
.idea/workspace.xml
.idea/deploymentTargetSelector.xml
.idea/migrations.xml
.idea/studiobot.xml
.settings
*.iml
bin/

View File

@ -9,6 +9,93 @@ directly impact users rather than highlighting other key architectural updates.*
## [Unreleased]
### Added
- Zashi now provides system biometric or device credential (pattern, pin, or password) authentication for these use
cases: Send funds, Recovery Phrase, Export Private Data, and Delete Wallet.
- The app entry animation has been reworked to apply on every app access point, i.e. it will be displayed when
users return to an already set up app as well.
## [1.0 (650)] - 2024-05-07
### Added
- Delete Zashi feature has been added. It's accessible from the Advanced settings screen. It removes the wallet
secrets from Zashi and resets its state.
- Transaction messages are now checked and removed in case of duplicity
### Changed
- We've improved the visibility logic of the little loader that is part of the Balances widget
- The App-Update screen UI has been reworked to align with the latest design guidelines
### Removed
- Concatenation of the messages on a multi-messages transaction has been removed and will be addressed using a new
design
### Fixed
- Transparent funds shielding action has been improved to address the latest user feedback
- Onboarding screen dynamic height calculation has been improved
- A few more minor UI improvements
## [1.0 (638)] - 2024-04-26
### Fixed
- Default server selection option
## [1.0 (636)] - 2024-04-26
### Changed
- We have added one more group of server options (zec.rocks) for increased coverage and reliability
- zec.rocks:443 is now default wallet option
## [1.0 (630)] - 2024-04-24
### Changed
- We have added more server options for increased coverage and reliability
- If you experience issues with the Zcash Lightwalletd Mainnet server selected by default, please switch to one of
the Ywallet servers: https://status.zcash-infra.com/
## [1.0 (628)] - 2024-04-23
### Changed
- The Scan QR code screen has been reworked to align with the rest of the screens
- The Send Form screen scrolls to the Send button on very small devices after the memo is typed
### Fixed
- Sending zero funds is allowed only for shielded recipient address type
- The Balances widget loader has been improved to better handle cases, like a wallet with only transparent funds
## [0.2.0 (609)] - 2024-04-18
### Added
- Advanced Settings screen that provides more technical options like Export private data, Recovery phrase, or
Choose server has been added
- A new Server switching screen has been added. Its purpose is to enable switching between predefined and custom
lightwalletd servers in runtime.
- The About screen now contains a link to the new Zashi Privacy Policy website
- The Send Confirmation screen has been reworked according to the new design
- Transitions between screens are now animated with a simple slide animation
- Proposal API from the Zcash SDK has been integrated together with handling error states for multi-transaction
submission
- New Restoring Your Wallet label and Synchronization widget have been added to all post-onboarding screens to notify
users about the current state of the wallet-restoring process
### Changed
- The Transaction History UI has been incorporated into the Account screen and completely reworked according to the
design guidelines
- Reworked Send screens flow and their look (e.g., Send Failure screen is now a modal dialog instead of a separate
screen)
- The sending and shielding funds logic has been connected to the new Proposal API from the Zcash SDK
- The error dialog contains an error description now. It's useful for tracking down the failure cause.
- A small circular progress indicator is displayed when the app runs block synchronization, and the available balance
is zero instead of reflecting a result value.
- Block synchronization statuses have been simplified to Syncing, Synced, and Error states only
- All internal dependencies have been updated
### Fixed
- Button sizing has been updated to align with the design guidelines and preserve stretching if necessary
### Removed
- The seed copy feature from the New wallet recovery and Seed recovery screens has been removed for security reasons
## [0.2.0 (560)] - 2024-02-27
### Added

View File

@ -93,7 +93,7 @@ android {
releaseKeystorePassword,
releaseKeyAlias,
releaseKeyAliasPassword
).all { !it.isNullOrBlank() }
).all { it.isNotBlank() }
signingConfigs {
if (isReleaseSigningConfigured) {
@ -120,6 +120,8 @@ android {
getByName("release").apply {
isMinifyEnabled = project.property("IS_MINIFY_ENABLED").toString().toBoolean()
isShrinkResources = project.property("IS_MINIFY_ENABLED").toString().toBoolean()
ndk.debugSymbolLevel = project.property("NDK_DEBUG_SYMBOL_LEVEL").toString()
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-project.txt"
@ -251,6 +253,7 @@ androidComponents {
".readme",
))
// The fixed Locale.US is intended
if (variant.name.lowercase(Locale.US).contains("release")) {
variant.packaging.resources.excludes.addAll(listOf(
"**/*.kotlin_metadata",

View File

@ -9,6 +9,9 @@
# Generate the combined proguard configuration for debugging.
-printconfiguration build/outputs/proguard-config.txt
# This is generated automatically by the Android Gradle plugin.
-dontwarn com.google.j2objc.annotations.ReflectionSupport
-dontwarn com.google.j2objc.annotations.RetainedWith
-dontwarn androidx.compose.ui.util.MathHelpersKt
-dontwarn com.google.common.util.concurrent.ListenableFuture
-dontwarn com.google.errorprone.annotations.InlineMe

View File

@ -1,35 +1,35 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:4.2.1=classpath
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.2.1=classpath
org.gradle.kotlin.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:4.3.0=classpath
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.3.0=classpath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
org.jetbrains.kotlin:kotlin-android-extensions:1.9.20=classpath
org.jetbrains.kotlin:kotlin-assignment:1.9.20=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.20=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.20=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.20=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.20=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.20=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.20=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.20=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.20=classpath
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.20=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.20=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.20=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.20=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.20=classpath
org.jetbrains.kotlin:kotlin-android-extensions:1.9.22=classpath
org.jetbrains.kotlin:kotlin-assignment:1.9.22=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.22=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.22=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.22=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.22=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.22=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.22=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.22=classpath
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.22=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.22=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.22=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.22=classpath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=classpath
org.jetbrains:annotations:13.0=classpath
empty=

View File

@ -1,74 +1,78 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
androidx.databinding:databinding-common:8.1.1=runtimeClasspath
androidx.databinding:databinding-compiler-common:8.1.1=runtimeClasspath
com.android.databinding:baseLibrary:8.1.1=runtimeClasspath
com.android.tools.analytics-library:crash:31.1.1=runtimeClasspath
com.android.tools.analytics-library:protos:31.1.1=runtimeClasspath
com.android.tools.analytics-library:shared:31.1.1=runtimeClasspath
com.android.tools.analytics-library:tracker:31.1.1=runtimeClasspath
androidx.databinding:databinding-common:8.3.0=runtimeClasspath
androidx.databinding:databinding-compiler-common:8.3.0=runtimeClasspath
com.android.databinding:baseLibrary:8.3.0=runtimeClasspath
com.android.tools.analytics-library:crash:31.3.0=runtimeClasspath
com.android.tools.analytics-library:protos:31.3.0=runtimeClasspath
com.android.tools.analytics-library:shared:31.3.0=runtimeClasspath
com.android.tools.analytics-library:tracker:31.3.0=runtimeClasspath
com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10=runtimeClasspath
com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10=runtimeClasspath
com.android.tools.build:aapt2-proto:8.1.1-10154469=runtimeClasspath
com.android.tools.build:aaptcompiler:8.1.1=runtimeClasspath
com.android.tools.build:apksig:8.1.1=compileClasspath,runtimeClasspath
com.android.tools.build:apkzlib:8.1.1=compileClasspath,runtimeClasspath
com.android.tools.build:builder-model:8.1.1=compileClasspath,runtimeClasspath
com.android.tools.build:builder-test-api:8.1.1=runtimeClasspath
com.android.tools.build:builder:8.1.1=compileClasspath,runtimeClasspath
com.android.tools.build:bundletool:1.14.0=runtimeClasspath
com.android.tools.build:gradle-api:8.1.1=compileClasspath,runtimeClasspath
com.android.tools.build:gradle-settings-api:8.1.1=runtimeClasspath
com.android.tools.build:gradle:8.1.1=compileClasspath,runtimeClasspath
com.android.tools.build:manifest-merger:31.1.1=compileClasspath,runtimeClasspath
com.android.tools.build:aapt2-proto:8.3.0-10880808=runtimeClasspath
com.android.tools.build:aaptcompiler:8.3.0=runtimeClasspath
com.android.tools.build:apksig:8.3.0=compileClasspath,runtimeClasspath
com.android.tools.build:apkzlib:8.3.0=compileClasspath,runtimeClasspath
com.android.tools.build:builder-model:8.3.0=compileClasspath,runtimeClasspath
com.android.tools.build:builder-test-api:8.3.0=runtimeClasspath
com.android.tools.build:builder:8.3.0=compileClasspath,runtimeClasspath
com.android.tools.build:bundletool:1.15.6=runtimeClasspath
com.android.tools.build:gradle-api:8.3.0=compileClasspath,runtimeClasspath
com.android.tools.build:gradle-settings-api:8.3.0=runtimeClasspath
com.android.tools.build:gradle:8.3.0=compileClasspath,runtimeClasspath
com.android.tools.build:manifest-merger:31.3.0=compileClasspath,runtimeClasspath
com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api=runtimeClasspath
com.android.tools.ddms:ddmlib:31.1.1=runtimeClasspath
com.android.tools.layoutlib:layoutlib-api:31.1.1=runtimeClasspath
com.android.tools.lint:lint-model:31.1.1=runtimeClasspath
com.android.tools.lint:lint-typedef-remover:31.1.1=runtimeClasspath
com.android.tools.utp:android-device-provider-ddmlib-proto:31.1.1=runtimeClasspath
com.android.tools.utp:android-device-provider-gradle-proto:31.1.1=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.1.1=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.1.1=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-coverage-proto:31.1.1=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.1.1=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-logcat-proto:31.1.1=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-retention-proto:31.1.1=runtimeClasspath
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.1.1=runtimeClasspath
com.android.tools:annotations:31.1.1=runtimeClasspath
com.android.tools:common:31.1.1=runtimeClasspath
com.android.tools:dvlib:31.1.1=runtimeClasspath
com.android.tools:repository:31.1.1=runtimeClasspath
com.android.tools:sdk-common:31.1.1=runtimeClasspath
com.android.tools:sdklib:31.1.1=runtimeClasspath
com.android:signflinger:8.1.1=runtimeClasspath
com.android:zipflinger:8.1.1=compileClasspath,runtimeClasspath
com.android.tools.ddms:ddmlib:31.3.0=runtimeClasspath
com.android.tools.layoutlib:layoutlib-api:31.3.0=runtimeClasspath
com.android.tools.lint:lint-model:31.3.0=runtimeClasspath
com.android.tools.lint:lint-typedef-remover:31.3.0=runtimeClasspath
com.android.tools.utp:android-device-provider-ddmlib-proto:31.3.0=runtimeClasspath
com.android.tools.utp:android-device-provider-gradle-proto:31.3.0=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.3.0=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.3.0=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-coverage-proto:31.3.0=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.3.0=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-logcat-proto:31.3.0=runtimeClasspath
com.android.tools.utp:android-test-plugin-host-retention-proto:31.3.0=runtimeClasspath
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.3.0=runtimeClasspath
com.android.tools:annotations:31.3.0=runtimeClasspath
com.android.tools:common:31.3.0=runtimeClasspath
com.android.tools:dvlib:31.3.0=runtimeClasspath
com.android.tools:repository:31.3.0=runtimeClasspath
com.android.tools:sdk-common:31.3.0=runtimeClasspath
com.android.tools:sdklib:31.3.0=runtimeClasspath
com.android:signflinger:8.3.0=runtimeClasspath
com.android:zipflinger:8.3.0=compileClasspath,runtimeClasspath
com.google.android:annotations:4.1.1.4=runtimeClasspath
com.google.api-client:google-api-client:2.2.0=compileClasspath,runtimeClasspath
com.google.api.grpc:proto-google-common-protos:2.0.1=runtimeClasspath
com.google.api.grpc:proto-google-common-protos:2.17.0=runtimeClasspath
com.google.apis:google-api-services-androidpublisher:v3-rev20231030-2.0.0=compileClasspath,runtimeClasspath
com.google.auth:google-auth-library-credentials:1.18.0=compileClasspath,runtimeClasspath
com.google.auth:google-auth-library-oauth2-http:1.18.0=compileClasspath,runtimeClasspath
com.google.auto.value:auto-value-annotations:1.10.1=compileClasspath,runtimeClasspath
com.google.code.findbugs:jsr305:3.0.2=compileClasspath,runtimeClasspath
com.google.code.gson:gson:2.10=compileClasspath,runtimeClasspath
com.google.code.gson:gson:2.10=compileClasspath
com.google.code.gson:gson:2.10.1=runtimeClasspath
com.google.crypto.tink:tink:1.7.0=runtimeClasspath
com.google.dagger:dagger:2.28.3=runtimeClasspath
com.google.errorprone:error_prone_annotations:2.16=compileClasspath,runtimeClasspath
com.google.errorprone:error_prone_annotations:2.16=compileClasspath
com.google.errorprone:error_prone_annotations:2.18.0=runtimeClasspath
com.google.flatbuffers:flatbuffers-java:1.12.0=runtimeClasspath
com.google.guava:failureaccess:1.0.1=compileClasspath,runtimeClasspath
com.google.guava:guava:31.1-jre=compileClasspath,runtimeClasspath
com.google.guava:guava:31.1-jre=compileClasspath
com.google.guava:guava:32.0.1-jre=runtimeClasspath
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=compileClasspath,runtimeClasspath
com.google.http-client:google-http-client-apache-v2:1.42.3=compileClasspath,runtimeClasspath
com.google.http-client:google-http-client-gson:1.42.3=compileClasspath,runtimeClasspath
com.google.http-client:google-http-client:1.42.3=compileClasspath,runtimeClasspath
com.google.j2objc:j2objc-annotations:1.3=compileClasspath,runtimeClasspath
com.google.j2objc:j2objc-annotations:1.3=compileClasspath
com.google.j2objc:j2objc-annotations:2.8=runtimeClasspath
com.google.jimfs:jimfs:1.1=runtimeClasspath
com.google.oauth-client:google-oauth-client:1.34.1=compileClasspath,runtimeClasspath
com.google.protobuf:protobuf-java-util:3.19.3=runtimeClasspath
com.google.protobuf:protobuf-java:3.19.3=runtimeClasspath
com.google.testing.platform:core-proto:0.0.8-alpha08=runtimeClasspath
com.google.protobuf:protobuf-java-util:3.22.3=runtimeClasspath
com.google.protobuf:protobuf-java:3.22.3=runtimeClasspath
com.google.testing.platform:core-proto:0.0.9-alpha02=runtimeClasspath
com.googlecode.juniversalchardet:juniversalchardet:1.0.3=runtimeClasspath
com.squareup:javapoet:1.10.0=runtimeClasspath
com.squareup:javawriter:2.5.0=compileClasspath,runtimeClasspath
@ -77,31 +81,31 @@ com.sun.istack:istack-commons-runtime:3.0.8=runtimeClasspath
com.sun.xml.fastinfoset:FastInfoset:1.2.16=runtimeClasspath
com.vdurmont:semver4j:3.1.0=runtimeClasspath
commons-codec:commons-codec:1.15=compileClasspath,runtimeClasspath
commons-io:commons-io:2.12.0=runtimeClasspath
commons-io:commons-io:2.15.1=runtimeClasspath
commons-logging:commons-logging:1.2=compileClasspath,runtimeClasspath
io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.0=compileClasspath,runtimeClasspath
io.grpc:grpc-api:1.45.1=runtimeClasspath
io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.6=compileClasspath,runtimeClasspath
io.grpc:grpc-api:1.57.0=runtimeClasspath
io.grpc:grpc-context:1.27.2=compileClasspath
io.grpc:grpc-context:1.45.1=runtimeClasspath
io.grpc:grpc-core:1.45.1=runtimeClasspath
io.grpc:grpc-netty:1.45.1=runtimeClasspath
io.grpc:grpc-protobuf-lite:1.45.1=runtimeClasspath
io.grpc:grpc-protobuf:1.45.1=runtimeClasspath
io.grpc:grpc-stub:1.45.1=runtimeClasspath
io.netty:netty-buffer:4.1.72.Final=runtimeClasspath
io.netty:netty-codec-http2:4.1.72.Final=runtimeClasspath
io.netty:netty-codec-http:4.1.72.Final=runtimeClasspath
io.netty:netty-codec-socks:4.1.72.Final=runtimeClasspath
io.netty:netty-codec:4.1.72.Final=runtimeClasspath
io.netty:netty-common:4.1.72.Final=runtimeClasspath
io.netty:netty-handler-proxy:4.1.72.Final=runtimeClasspath
io.netty:netty-handler:4.1.72.Final=runtimeClasspath
io.netty:netty-resolver:4.1.72.Final=runtimeClasspath
io.netty:netty-tcnative-classes:2.0.46.Final=runtimeClasspath
io.netty:netty-transport:4.1.72.Final=runtimeClasspath
io.grpc:grpc-context:1.57.0=runtimeClasspath
io.grpc:grpc-core:1.57.0=runtimeClasspath
io.grpc:grpc-netty:1.57.0=runtimeClasspath
io.grpc:grpc-protobuf-lite:1.57.0=runtimeClasspath
io.grpc:grpc-protobuf:1.57.0=runtimeClasspath
io.grpc:grpc-stub:1.57.0=runtimeClasspath
io.netty:netty-buffer:4.1.93.Final=runtimeClasspath
io.netty:netty-codec-http2:4.1.93.Final=runtimeClasspath
io.netty:netty-codec-http:4.1.93.Final=runtimeClasspath
io.netty:netty-codec-socks:4.1.93.Final=runtimeClasspath
io.netty:netty-codec:4.1.93.Final=runtimeClasspath
io.netty:netty-common:4.1.93.Final=runtimeClasspath
io.netty:netty-handler-proxy:4.1.93.Final=runtimeClasspath
io.netty:netty-handler:4.1.93.Final=runtimeClasspath
io.netty:netty-resolver:4.1.93.Final=runtimeClasspath
io.netty:netty-transport-native-unix-common:4.1.93.Final=runtimeClasspath
io.netty:netty-transport:4.1.93.Final=runtimeClasspath
io.opencensus:opencensus-api:0.31.1=compileClasspath,runtimeClasspath
io.opencensus:opencensus-contrib-http-util:0.31.1=compileClasspath,runtimeClasspath
io.perfmark:perfmark-api:0.23.0=runtimeClasspath
io.perfmark:perfmark-api:0.26.0=runtimeClasspath
jakarta.activation:jakarta.activation-api:1.2.1=runtimeClasspath
jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=runtimeClasspath
javax.annotation:javax.annotation-api:1.3.2=runtimeClasspath
@ -117,71 +121,70 @@ org.apache.httpcomponents:httpmime:4.5.6=runtimeClasspath
org.bitbucket.b_c:jose4j:0.7.0=runtimeClasspath
org.bouncycastle:bcpkix-jdk15on:1.67=runtimeClasspath
org.bouncycastle:bcprov-jdk15on:1.67=runtimeClasspath
org.checkerframework:checker-qual:3.12.0=compileClasspath,runtimeClasspath
org.codehaus.mojo:animal-sniffer-annotations:1.19=runtimeClasspath
org.checkerframework:checker-qual:3.12.0=compileClasspath
org.checkerframework:checker-qual:3.33.0=runtimeClasspath
org.codehaus.mojo:animal-sniffer-annotations:1.23=runtimeClasspath
org.glassfish.jaxb:jaxb-runtime:2.3.2=runtimeClasspath
org.glassfish.jaxb:txw2:2.3.2=runtimeClasspath
org.jdom:jdom2:2.0.6=runtimeClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-android-extensions:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.20=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.20=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-native-utils:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-project-model:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-android-extensions:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.22=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-native-utils:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-project-model:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-reflect:1.9.20=compileClasspath
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.20=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.21=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.9.20=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-tooling-core:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-util-io:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-util-klib:1.9.21=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-reflect:1.9.20=runtimeClasspath
org.jetbrains.kotlin:kotlin-reflect:1.9.22=compileClasspath
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.22=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.9.20=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-tooling-core:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-util-io:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-util-klib:1.9.23=compileClasspath,runtimeClasspath
org.jetbrains.kotlinx.kover:org.jetbrains.kotlinx.kover.gradle.plugin:0.7.3=compileClasspath,runtimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=runtimeClasspath
org.jetbrains.kotlinx:kover-gradle-plugin:0.7.3=compileClasspath,runtimeClasspath
org.jetbrains:annotations:13.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,runtimeClasspath
org.json:json:20230227=runtimeClasspath
org.jetbrains:annotations:13.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains:annotations:23.0.0=runtimeClasspath
org.json:json:20240205=runtimeClasspath
org.jvnet.staxex:stax-ex:1.8.1=runtimeClasspath
org.ow2.asm:asm-analysis:9.2=runtimeClasspath
org.ow2.asm:asm-commons:9.2=runtimeClasspath
org.ow2.asm:asm-tree:9.2=runtimeClasspath
org.ow2.asm:asm-util:9.2=runtimeClasspath
org.ow2.asm:asm:9.2=compileClasspath,runtimeClasspath
org.ow2.asm:asm-analysis:9.6=runtimeClasspath
org.ow2.asm:asm-commons:9.6=runtimeClasspath
org.ow2.asm:asm-tree:9.6=runtimeClasspath
org.ow2.asm:asm-util:9.6=runtimeClasspath
org.ow2.asm:asm:9.6=compileClasspath,runtimeClasspath
org.slf4j:slf4j-api:1.7.30=runtimeClasspath
org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2=runtimeClasspath
wtf.emulator:gradle-compat-6-1:0.15.1=runtimeClasspath
wtf.emulator:gradle-compat-6-6:0.15.1=runtimeClasspath
wtf.emulator:gradle-compat-7-6:0.15.1=runtimeClasspath
wtf.emulator:gradle-compat-api:0.15.1=runtimeClasspath
wtf.emulator:gradle-compat:0.15.1=runtimeClasspath
wtf.emulator:gradle-plugin:0.15.1=compileClasspath,runtimeClasspath
xerces:xercesImpl:2.12.0=runtimeClasspath
xml-apis:xml-apis:1.4.01=runtimeClasspath
wtf.emulator:gradle-compat-6-1:0.16.2=runtimeClasspath
wtf.emulator:gradle-compat-6-6:0.16.2=runtimeClasspath
wtf.emulator:gradle-compat-7-6:0.16.2=runtimeClasspath
wtf.emulator:gradle-compat-api:0.16.2=runtimeClasspath
wtf.emulator:gradle-compat:0.16.2=runtimeClasspath
wtf.emulator:gradle-plugin:0.16.2=compileClasspath,runtimeClasspath
empty=annotationProcessor,kotlinScriptDefExtensions

View File

@ -175,7 +175,7 @@ fun com.android.build.gradle.BaseExtension.configureBaseExtension() {
)
}
if (this is CommonExtension<*, *, *, *, *>) {
if (this is CommonExtension<*, *, *, *, *, *>) {
kotlinOptions {
jvmTarget = project.property("ANDROID_JVM_TARGET").toString()
allWarningsAsErrors = project.property("ZCASH_IS_TREAT_WARNINGS_AS_ERRORS").toString().toBoolean()
@ -191,7 +191,7 @@ fun com.android.build.gradle.BaseExtension.configureBaseExtension() {
}
}
fun CommonExtension<*, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) {
fun CommonExtension<*, *, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) {
(this as ExtensionAware).extensions.configure("kotlinOptions", block)
}

View File

@ -245,6 +245,8 @@ abstract class PublishToGooglePlay @Inject constructor(
track,
Track().setReleases(
listOf(TrackRelease()
// TODO [#1440]: Provide a way to inject in-app-update information
// TODO [#1440]: https://github.com/Electric-Coin-Company/zashi-android/issues/1440
.setName(versionName)
.setVersionCodes(bundleVersionCodes)
.setStatus(status)

View File

@ -4,29 +4,29 @@
junit:junit:4.13.2=commonTestImplementationCopy,jvmTestCompileClasspath,jvmTestImplementationCopy,jvmTestRuntimeClasspath
org.hamcrest:hamcrest-core:1.3=commonTestImplementationCopy,jvmTestCompileClasspath,jvmTestImplementationCopy,jvmTestRuntimeClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.6.20=kotlinCompilerClasspathCopy
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.6.20=kotlinKlibCommonizerClasspathCopy
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.21=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.23=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-scripting-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.20=kotlinCompilerPluginClasspathJvmMainCopy,kotlinCompilerPluginClasspathJvmTestCopy,kotlinCompilerPluginClasspathMetadataCommonMainCopy,kotlinCompilerPluginClasspathMetadataMainCopy
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.21=kotlinCompilerPluginClasspathJvmMainCopy2,kotlinCompilerPluginClasspathJvmTestCopy2,kotlinCompilerPluginClasspathMetadataCommonMainCopy2,kotlinCompilerPluginClasspathMetadataMainCopy2
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain,metadataCommonMainCompileClasspath
@ -35,14 +35,14 @@ org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20=commonMainApiCopy,commonMainCompi
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21=jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlin:kotlin-stdlib:1.6.20=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-stdlib:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.6.20=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-test-junit:1.9.21=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test-junit:1.9.23=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.6.20=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestCompileClasspathCopy2,jvmTestImplementationCopy,jvmTestImplementationDependenciesMetadataCopy,jvmTestRuntimeClasspathCopy,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlin:kotlin-test:1.6.21=commonTestImplementationCopy2,jvmTestImplementationCopy2
org.jetbrains.kotlin:kotlin-test:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=kotlinBuildToolsApiClasspath
org.jetbrains:annotations:13.0=commonTestImplementationCopy,jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestImplementationCopy,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataCommonMain,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
empty=allSourceSetsCompileDependenciesMetadataCopy,allSourceSetsRuntimeDependenciesMetadataCopy,archives,archivesCopy,commonMainApiDependenciesMetadataCopy,commonMainCompileOnlyCopy,commonMainImplementationCopy,commonMainIntransitiveDependenciesMetadata,commonMainIntransitiveDependenciesMetadataCopy,commonMainRuntimeOnlyCopy,commonMainRuntimeOnlyDependenciesMetadata,commonTestCompileOnlyCopy,commonTestIntransitiveDependenciesMetadata,commonTestIntransitiveDependenciesMetadataCopy,commonTestRuntimeOnlyCopy,commonTestRuntimeOnlyDependenciesMetadata,default,defaultCopy,jvmCompileOnlyCopy,jvmMainApiCopy,jvmMainCompileOnlyCopy,jvmMainImplementationCopy,jvmMainIntransitiveDependenciesMetadata,jvmMainIntransitiveDependenciesMetadataCopy,jvmMainRuntimeOnlyCopy,jvmMainRuntimeOnlyDependenciesMetadata,jvmRuntimeOnlyCopy,jvmSourceArtifactsCopy,jvmTestCompileOnlyCopy,jvmTestIntransitiveDependenciesMetadata,jvmTestIntransitiveDependenciesMetadataCopy,jvmTestRuntimeOnlyCopy,jvmTestRuntimeOnlyDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinCompilerPluginClasspathCopy,kotlinNativeCompilerPluginClasspath,kotlinNativeCompilerPluginClasspathCopy,kotlinScriptDef,kotlinScriptDefCopy,kotlinScriptDefExtensions,kotlinScriptDefExtensionsCopy,metadataCommonMainCompileOnlyCopy,metadataCompileOnlyCopy,testKotlinScriptDef,testKotlinScriptDefCopy,testKotlinScriptDefExtensions,testKotlinScriptDefExtensionsCopy

View File

@ -97,6 +97,7 @@ tasks {
"ZCASH_EMULATOR_WTF_API_KEY" to "",
"IS_MINIFY_ENABLED" to "true",
"NDK_DEBUG_SYMBOL_LEVEL" to "symbol_table",
"ZCASH_RELEASE_APP_NAME" to "Zashi",
"ZCASH_RELEASE_PACKAGE_NAME" to "co.electriccoin.zcash",

View File

@ -1,35 +1,35 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
org.gradle.kotlin.kotlin-dsl.base:org.gradle.kotlin.kotlin-dsl.base.gradle.plugin:4.2.1=classpath
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.2.1=classpath
org.gradle.kotlin.kotlin-dsl.base:org.gradle.kotlin.kotlin-dsl.base.gradle.plugin:4.3.0=classpath
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.3.0=classpath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
org.jetbrains.kotlin:kotlin-android-extensions:1.9.20=classpath
org.jetbrains.kotlin:kotlin-assignment:1.9.20=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.20=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.20=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.20=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.20=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.20=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.20=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.20=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.20=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.20=classpath
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.20=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.20=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.20=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.20=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.20=classpath
org.jetbrains.kotlin:kotlin-android-extensions:1.9.22=classpath
org.jetbrains.kotlin:kotlin-assignment:1.9.22=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.22=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.22=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.22=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.22=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.22=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.22=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.22=classpath
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.22=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.22=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.22=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.22=classpath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=classpath
org.jetbrains:annotations:13.0=classpath
empty=

View File

@ -4,33 +4,28 @@
com.googlecode.javaewah:JavaEWAH:1.1.13=buildScriptClasspath,compileClasspath,testCompileClasspath,testRuntimeClasspath
org.eclipse.jgit:org.eclipse.jgit:6.4.0.202211300538-r=buildScriptClasspath,compileClasspath,testCompileClasspath,testRuntimeClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.20=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.20=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.22=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-native-utils:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-project-model:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.7.10=testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-reflect:1.9.20=compileClasspath
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-reflect:1.9.22=compileClasspath
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-script-runtime:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-script-runtime:1.9.20=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.22=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-common:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-scripting-common:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.20=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.9.20=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.22=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-tooling-core:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains.kotlin:kotlin-util-io:1.7.10=kotlinCompilerPluginClasspathTest
org.jetbrains:annotations:13.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath

View File

@ -1,81 +1,80 @@
# This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised.
# This file is expected to be part of source control.
androidx.databinding:databinding-common:8.1.1=classpath
androidx.databinding:databinding-compiler-common:8.1.1=classpath
com.android.databinding:baseLibrary:8.1.1=classpath
com.android.tools.analytics-library:crash:31.1.1=classpath
com.android.tools.analytics-library:protos:31.1.1=classpath
com.android.tools.analytics-library:shared:31.1.1=classpath
com.android.tools.analytics-library:tracker:31.1.1=classpath
androidx.databinding:databinding-common:8.3.0=classpath
androidx.databinding:databinding-compiler-common:8.3.0=classpath
com.android.databinding:baseLibrary:8.3.0=classpath
com.android.tools.analytics-library:crash:31.3.0=classpath
com.android.tools.analytics-library:protos:31.3.0=classpath
com.android.tools.analytics-library:shared:31.3.0=classpath
com.android.tools.analytics-library:tracker:31.3.0=classpath
com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10=classpath
com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10=classpath
com.android.tools.build:aapt2-proto:8.1.1-10154469=classpath
com.android.tools.build:aaptcompiler:8.1.1=classpath
com.android.tools.build:apksig:8.1.1=classpath
com.android.tools.build:apkzlib:8.1.1=classpath
com.android.tools.build:builder-model:8.1.1=classpath
com.android.tools.build:builder-test-api:8.1.1=classpath
com.android.tools.build:builder:8.1.1=classpath
com.android.tools.build:bundletool:1.14.0=classpath
com.android.tools.build:gradle-api:8.1.1=classpath
com.android.tools.build:gradle-settings-api:8.1.1=classpath
com.android.tools.build:gradle:8.1.1=classpath
com.android.tools.build:manifest-merger:31.1.1=classpath
com.android.tools.build:aapt2-proto:8.3.0-10880808=classpath
com.android.tools.build:aaptcompiler:8.3.0=classpath
com.android.tools.build:apksig:8.3.0=classpath
com.android.tools.build:apkzlib:8.3.0=classpath
com.android.tools.build:builder-model:8.3.0=classpath
com.android.tools.build:builder-test-api:8.3.0=classpath
com.android.tools.build:builder:8.3.0=classpath
com.android.tools.build:bundletool:1.15.6=classpath
com.android.tools.build:gradle-api:8.3.0=classpath
com.android.tools.build:gradle-settings-api:8.3.0=classpath
com.android.tools.build:gradle:8.3.0=classpath
com.android.tools.build:manifest-merger:31.3.0=classpath
com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api=classpath
com.android.tools.ddms:ddmlib:31.1.1=classpath
com.android.tools.layoutlib:layoutlib-api:31.1.1=classpath
com.android.tools.lint:lint-model:31.1.1=classpath
com.android.tools.lint:lint-typedef-remover:31.1.1=classpath
com.android.tools.utp:android-device-provider-ddmlib-proto:31.1.1=classpath
com.android.tools.utp:android-device-provider-gradle-proto:31.1.1=classpath
com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.1.1=classpath
com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.1.1=classpath
com.android.tools.utp:android-test-plugin-host-coverage-proto:31.1.1=classpath
com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.1.1=classpath
com.android.tools.utp:android-test-plugin-host-logcat-proto:31.1.1=classpath
com.android.tools.utp:android-test-plugin-host-retention-proto:31.1.1=classpath
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.1.1=classpath
com.android.tools:annotations:31.1.1=classpath
com.android.tools:common:31.1.1=classpath
com.android.tools:dvlib:31.1.1=classpath
com.android.tools:repository:31.1.1=classpath
com.android.tools:sdk-common:31.1.1=classpath
com.android.tools:sdklib:31.1.1=classpath
com.android:signflinger:8.1.1=classpath
com.android:zipflinger:8.1.1=classpath
com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin:0.42.0=classpathCopy,classpathCopy2
com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin:0.47.0=classpath
com.github.ben-manes:gradle-versions-plugin:0.47.0=classpath
com.android.tools.ddms:ddmlib:31.3.0=classpath
com.android.tools.layoutlib:layoutlib-api:31.3.0=classpath
com.android.tools.lint:lint-model:31.3.0=classpath
com.android.tools.lint:lint-typedef-remover:31.3.0=classpath
com.android.tools.utp:android-device-provider-ddmlib-proto:31.3.0=classpath
com.android.tools.utp:android-device-provider-gradle-proto:31.3.0=classpath
com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.3.0=classpath
com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.3.0=classpath
com.android.tools.utp:android-test-plugin-host-coverage-proto:31.3.0=classpath
com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.3.0=classpath
com.android.tools.utp:android-test-plugin-host-logcat-proto:31.3.0=classpath
com.android.tools.utp:android-test-plugin-host-retention-proto:31.3.0=classpath
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.3.0=classpath
com.android.tools:annotations:31.3.0=classpath
com.android.tools:common:31.3.0=classpath
com.android.tools:dvlib:31.3.0=classpath
com.android.tools:repository:31.3.0=classpath
com.android.tools:sdk-common:31.3.0=classpath
com.android.tools:sdklib:31.3.0=classpath
com.android:signflinger:8.3.0=classpath
com.android:zipflinger:8.3.0=classpath
com.github.ben-manes.versions:com.github.ben-manes.versions.gradle.plugin:0.51.0=classpath,classpathCopy,classpathCopy2
com.github.ben-manes:gradle-versions-plugin:0.51.0=classpath
com.google.android.gms:strict-version-matcher-plugin:1.2.4=classpath
com.google.android:annotations:4.1.1.4=classpath
com.google.api-client:google-api-client:2.2.0=classpath
com.google.api.grpc:proto-google-common-protos:2.0.1=classpath
com.google.api.grpc:proto-google-common-protos:2.17.0=classpath
com.google.apis:google-api-services-androidpublisher:v3-rev20231030-2.0.0=classpath
com.google.auth:google-auth-library-credentials:1.18.0=classpath
com.google.auth:google-auth-library-oauth2-http:1.18.0=classpath
com.google.auto.value:auto-value-annotations:1.10.1=classpath
com.google.code.findbugs:jsr305:3.0.2=classpath
com.google.code.gson:gson:2.10=classpath
com.google.code.gson:gson:2.10.1=classpath
com.google.crypto.tink:tink:1.7.0=classpath
com.google.dagger:dagger:2.28.3=classpath
com.google.errorprone:error_prone_annotations:2.16=classpath
com.google.firebase:firebase-crashlytics-buildtools:2.9.4=classpath
com.google.firebase:firebase-crashlytics-gradle:2.9.4=classpath
com.google.errorprone:error_prone_annotations:2.18.0=classpath
com.google.firebase:firebase-crashlytics-buildtools:2.9.9=classpath
com.google.firebase:firebase-crashlytics-gradle:2.9.9=classpath
com.google.flatbuffers:flatbuffers-java:1.12.0=classpath
com.google.gms:google-services:4.3.15=classpath
com.google.gms:google-services:4.4.1=classpath
com.google.guava:failureaccess:1.0.1=classpath
com.google.guava:guava:31.1-jre=classpath
com.google.guava:guava:32.0.1-jre=classpath
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=classpath
com.google.http-client:google-http-client-apache-v2:1.42.3=classpath
com.google.http-client:google-http-client-gson:1.42.3=classpath
com.google.http-client:google-http-client:1.42.3=classpath
com.google.j2objc:j2objc-annotations:1.3=classpath
com.google.j2objc:j2objc-annotations:2.8=classpath
com.google.jimfs:jimfs:1.1=classpath
com.google.oauth-client:google-oauth-client:1.34.1=classpath
com.google.protobuf:protobuf-java-util:3.19.3=classpath
com.google.protobuf:protobuf-java:3.19.3=classpath
com.google.testing.platform:core-proto:0.0.8-alpha08=classpath
com.google.protobuf:protobuf-java-util:3.22.3=classpath
com.google.protobuf:protobuf-java:3.22.3=classpath
com.google.testing.platform:core-proto:0.0.9-alpha02=classpath
com.googlecode.juniversalchardet:juniversalchardet:1.0.3=classpath
com.osacky.flank.gradle:fladle:0.17.4=classpath
com.osacky.fulladle:com.osacky.fulladle.gradle.plugin:0.17.3=classpathCopy
@ -90,36 +89,34 @@ com.squareup:javawriter:2.5.0=classpath
com.sun.activation:javax.activation:1.2.0=classpath
com.sun.istack:istack-commons-runtime:3.0.8=classpath
com.sun.xml.fastinfoset:FastInfoset:1.2.16=classpath
com.thoughtworks.xstream:xstream:1.4.20=classpath
com.vdurmont:semver4j:3.1.0=classpath
commons-codec:commons-codec:1.15=classpath
commons-io:commons-io:2.12.0=classpath
commons-io:commons-io:2.15.1=classpath
commons-logging:commons-logging:1.2=classpath
io.github.x-stream:mxparser:1.2.2=classpath
io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.0=classpath
io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.6=classpath
io.gitlab.arturbosch.detekt:io.gitlab.arturbosch.detekt.gradle.plugin:1.19.0=classpathCopy
io.gitlab.arturbosch.detekt:io.gitlab.arturbosch.detekt.gradle.plugin:1.20.0=classpathCopy2
io.grpc:grpc-api:1.45.1=classpath
io.grpc:grpc-context:1.45.1=classpath
io.grpc:grpc-core:1.45.1=classpath
io.grpc:grpc-netty:1.45.1=classpath
io.grpc:grpc-protobuf-lite:1.45.1=classpath
io.grpc:grpc-protobuf:1.45.1=classpath
io.grpc:grpc-stub:1.45.1=classpath
io.netty:netty-buffer:4.1.72.Final=classpath
io.netty:netty-codec-http2:4.1.72.Final=classpath
io.netty:netty-codec-http:4.1.72.Final=classpath
io.netty:netty-codec-socks:4.1.72.Final=classpath
io.netty:netty-codec:4.1.72.Final=classpath
io.netty:netty-common:4.1.72.Final=classpath
io.netty:netty-handler-proxy:4.1.72.Final=classpath
io.netty:netty-handler:4.1.72.Final=classpath
io.netty:netty-resolver:4.1.72.Final=classpath
io.netty:netty-tcnative-classes:2.0.46.Final=classpath
io.netty:netty-transport:4.1.72.Final=classpath
io.grpc:grpc-api:1.57.0=classpath
io.grpc:grpc-context:1.57.0=classpath
io.grpc:grpc-core:1.57.0=classpath
io.grpc:grpc-netty:1.57.0=classpath
io.grpc:grpc-protobuf-lite:1.57.0=classpath
io.grpc:grpc-protobuf:1.57.0=classpath
io.grpc:grpc-stub:1.57.0=classpath
io.netty:netty-buffer:4.1.93.Final=classpath
io.netty:netty-codec-http2:4.1.93.Final=classpath
io.netty:netty-codec-http:4.1.93.Final=classpath
io.netty:netty-codec-socks:4.1.93.Final=classpath
io.netty:netty-codec:4.1.93.Final=classpath
io.netty:netty-common:4.1.93.Final=classpath
io.netty:netty-handler-proxy:4.1.93.Final=classpath
io.netty:netty-handler:4.1.93.Final=classpath
io.netty:netty-resolver:4.1.93.Final=classpath
io.netty:netty-transport-native-unix-common:4.1.93.Final=classpath
io.netty:netty-transport:4.1.93.Final=classpath
io.opencensus:opencensus-api:0.31.1=classpath
io.opencensus:opencensus-contrib-http-util:0.31.1=classpath
io.perfmark:perfmark-api:0.23.0=classpath
io.perfmark:perfmark-api:0.26.0=classpath
jakarta.activation:jakarta.activation-api:1.2.1=classpath
jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=classpath
javax.annotation:javax.annotation-api:1.3.2=classpath
@ -135,60 +132,57 @@ org.apache.httpcomponents:httpmime:4.5.6=classpath
org.bitbucket.b_c:jose4j:0.7.0=classpath
org.bouncycastle:bcpkix-jdk15on:1.67=classpath
org.bouncycastle:bcprov-jdk15on:1.67=classpath
org.checkerframework:checker-qual:3.12.0=classpath
org.codehaus.mojo:animal-sniffer-annotations:1.19=classpath
org.checkerframework:checker-qual:3.33.0=classpath
org.codehaus.mojo:animal-sniffer-annotations:1.23=classpath
org.glassfish.jaxb:jaxb-runtime:2.3.2=classpath
org.glassfish.jaxb:txw2:2.3.2=classpath
org.jdom:jdom2:2.0.6=classpath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
org.jetbrains.kotlin:kotlin-android-extensions:1.9.21=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.21=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.21=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.21=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.21=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.21=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.21=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.21=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.21=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.21=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.21=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.21=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.21=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.21=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.21=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.21=classpath
org.jetbrains.kotlin:kotlin-reflect:1.9.20=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.21=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.21=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.21=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.21=classpath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.20=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.20=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.21=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.21=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.21=classpath
org.jetbrains.kotlin:kotlin-android-extensions:1.9.23=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.23=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.23=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.23=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.23=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.23=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.23=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.23=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.23=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.23=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.23=classpath
org.jetbrains.kotlin:kotlin-reflect:1.9.22=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=classpath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.23=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.23=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.23=classpath
org.jetbrains.kotlinx.kover:org.jetbrains.kotlinx.kover.gradle.plugin:0.7.3=classpath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=classpath
org.jetbrains.kotlinx:kover-gradle-plugin:0.7.3=classpath
org.jetbrains:annotations:13.0=classpath
org.json:json:20230227=classpath
org.json:json:20240205=classpath
org.jvnet.staxex:stax-ex:1.8.1=classpath
org.ow2.asm:asm-analysis:9.2=classpath
org.ow2.asm:asm-commons:9.2=classpath
org.ow2.asm:asm-tree:9.2=classpath
org.ow2.asm:asm-util:9.2=classpath
org.ow2.asm:asm:9.2=classpath
org.ow2.asm:asm-analysis:9.6=classpath
org.ow2.asm:asm-commons:9.6=classpath
org.ow2.asm:asm-tree:9.6=classpath
org.ow2.asm:asm-util:9.6=classpath
org.ow2.asm:asm:9.6=classpath
org.slf4j:slf4j-api:1.7.30=classpath
org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2=classpath
wtf.emulator:gradle-compat-6-1:0.15.1=classpath
wtf.emulator:gradle-compat-6-6:0.15.1=classpath
wtf.emulator:gradle-compat-7-6:0.15.1=classpath
wtf.emulator:gradle-compat-api:0.15.1=classpath
wtf.emulator:gradle-compat:0.15.1=classpath
wtf.emulator:gradle-plugin:0.15.1=classpath
xerces:xercesImpl:2.12.0=classpath
xml-apis:xml-apis:1.4.01=classpath
xmlpull:xmlpull:1.1.3.1=classpath
wtf.emulator:gradle-compat-6-1:0.16.2=classpath
wtf.emulator:gradle-compat-6-6:0.16.2=classpath
wtf.emulator:gradle-compat-7-6:0.16.2=classpath
wtf.emulator:gradle-compat-api:0.16.2=classpath
wtf.emulator:gradle-compat:0.16.2=classpath
wtf.emulator:gradle-plugin:0.16.2=classpath
empty=

View File

@ -8,53 +8,51 @@ org.jetbrains.intellij.deps:coverage-report:1.0.21=koverJvmReporter
org.jetbrains.intellij.deps:intellij-coverage-agent:1.0.724=koverJvmAgent,koverJvmReporter
org.jetbrains.intellij.deps:intellij-coverage-reporter:1.0.724=koverJvmReporter
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.21=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.23=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-scripting-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain,metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-stdlib:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.9.21=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.9.23=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:atomicfu:0.17.3=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlinx:atomicfu:0.20.2=metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:atomicfu:0.21.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.6=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:atomicfu:0.23.1=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.7=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5=allSourceSetsRuntimeDependenciesMetadata,metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.6=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=kotlinBuildToolsApiClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1=metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.7.3=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.5.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime:0.4.0=allSourceSetsRuntimeDependenciesMetadata,metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:kotlinx-datetime:0.5.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath

View File

@ -40,6 +40,8 @@ private data class MergingConfiguration(private val configurations: PersistentLi
return null != configurations.firstWithKey(key)
}
// TODO [#1373]: Catch and log Configuration Key Coercion Failures
// TODO [#1373]: https://github.com/Electric-Coin-Company/zashi-android/issues/1373
override fun getBoolean(
key: ConfigKey,
defaultValue: Boolean
@ -49,6 +51,8 @@ private data class MergingConfiguration(private val configurations: PersistentLi
} ?: defaultValue
}
// TODO [#1373]: Catch and log Configuration Key Coercion Failures
// TODO [#1373]: https://github.com/Electric-Coin-Company/zashi-android/issues/1373
override fun getInt(
key: ConfigKey,
defaultValue: Int

View File

@ -6,5 +6,7 @@ data class BooleanConfigurationEntry(
override val key: ConfigKey,
private val defaultValue: Boolean
) : DefaultEntry<Boolean> {
// TODO [#1373]: Catch and log Configuration Key Coercion Failures
// TODO [#1373]: https://github.com/Electric-Coin-Company/zashi-android/issues/1373
override fun getValue(configuration: Configuration) = configuration.getBoolean(key, defaultValue)
}

View File

@ -6,5 +6,7 @@ data class IntegerConfigurationEntry(
override val key: ConfigKey,
private val defaultValue: Int
) : DefaultEntry<Int> {
// TODO [#1373]: Catch and log Configuration Key Coercion Failures
// TODO [#1373]: https://github.com/Electric-Coin-Company/zashi-android/issues/1373
override fun getValue(configuration: Configuration) = configuration.getInt(key, defaultValue)
}

View File

@ -0,0 +1,7 @@
package co.electriccoin.zcash.configuration.model.exception
/**
* Exception that may occur when parsing a value from the remote configuration. This could mean that someone made an
* error in the remote config console.
*/
class ConfigurationParseException(message: String, cause: Throwable?) : IllegalArgumentException(message, cause)

View File

@ -1,6 +1,7 @@
package co.electriccoin.zcash.configuration.model.map
import co.electriccoin.zcash.configuration.model.entry.ConfigKey
import co.electriccoin.zcash.configuration.model.exception.ConfigurationParseException
import kotlinx.collections.immutable.PersistentMap
import kotlinx.datetime.Instant
@ -10,31 +11,35 @@ data class StringConfiguration(
val configurationMapping: PersistentMap<String, String>,
override val updatedAt: Instant?
) : Configuration {
@Throws(ConfigurationParseException::class)
override fun getBoolean(
key: ConfigKey,
defaultValue: Boolean
) = configurationMapping[key.key]?.let {
try {
it.toBooleanStrict()
} catch (
@Suppress("SwallowedException") e: IllegalArgumentException
) {
// In the future, log coercion failure as this could mean someone made an error in the remote config console
defaultValue
} catch (e: IllegalArgumentException) {
throw ConfigurationParseException(
"Failed while parsing String value to Boolean. This could mean " +
"someone made an error in the remote config console",
e
)
}
} ?: defaultValue
@Throws(ConfigurationParseException::class)
override fun getInt(
key: ConfigKey,
defaultValue: Int
) = configurationMapping[key.key]?.let {
try {
it.toInt()
} catch (
@Suppress("SwallowedException") e: NumberFormatException
) {
// In the future, log coercion failure as this could mean someone made an error in the remote config console
defaultValue
} catch (e: IllegalArgumentException) {
throw ConfigurationParseException(
"Failed while parsing String value to Int. This could mean " +
"someone made an error in the remote config console",
e
)
}
} ?: defaultValue

View File

@ -1,6 +1,7 @@
package co.electriccoin.zcash.configuration.test
import co.electriccoin.zcash.configuration.model.entry.ConfigKey
import co.electriccoin.zcash.configuration.model.exception.ConfigurationParseException
import co.electriccoin.zcash.configuration.model.map.Configuration
import kotlinx.datetime.Instant
@ -13,31 +14,35 @@ import kotlinx.datetime.Instant
class MockConfiguration(private val configurationMapping: Map<String, String> = emptyMap()) : Configuration {
override val updatedAt: Instant? = null
@Throws(ConfigurationParseException::class)
override fun getBoolean(
key: ConfigKey,
defaultValue: Boolean
) = configurationMapping[key.key]?.let {
try {
it.toBooleanStrict()
} catch (
@Suppress("SwallowedException") e: IllegalArgumentException
) {
// In the future, log coercion failure as this could mean someone made an error in the remote config console
defaultValue
} catch (e: IllegalArgumentException) {
throw ConfigurationParseException(
"Failed while parsing String value to Boolean. This could mean " +
"someone made an error in the remote config console",
e
)
}
} ?: defaultValue
@Throws(ConfigurationParseException::class)
override fun getInt(
key: ConfigKey,
defaultValue: Int
) = configurationMapping[key.key]?.let {
try {
it.toInt()
} catch (
@Suppress("SwallowedException") e: NumberFormatException
) {
// In the future, log coercion failure as this could mean someone made an error in the remote config console
defaultValue
} catch (e: IllegalArgumentException) {
throw ConfigurationParseException(
"Failed while parsing String value to Int. This could mean " +
"someone made an error in the remote config console",
e
)
}
} ?: defaultValue

View File

@ -69,7 +69,12 @@ private class FirebaseCrashReporterImpl(
) : CrashReporter {
@AnyThread
override fun reportCaughtException(exception: Throwable) {
firebaseCrashlytics.recordException(exception)
error(
"Although most of the sensitive model objects implement custom [toString] methods to redact information" +
" if they were to be logged (which includes exceptions), we're encouraged to disable caught exception" +
" reporting to the remote Crashlytics service due to its security risk. Use the the local variant of" +
" the reporter to report caught exception - [LocalCrashReporter]."
)
}
override fun enable() {

View File

@ -8,70 +8,70 @@ org.jetbrains.intellij.deps:coverage-report:1.0.21=koverJvmReporter
org.jetbrains.intellij.deps:intellij-coverage-agent:1.0.724=koverJvmAgent,koverJvmReporter
org.jetbrains.intellij.deps:intellij-coverage-reporter:1.0.724=koverJvmReporter
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.6.20=kotlinCompilerClasspathCopy
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.6.20=kotlinKlibCommonizerClasspathCopy
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.21=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.23=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-scripting-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.20=kotlinCompilerPluginClasspathJvmMainCopy,kotlinCompilerPluginClasspathJvmTestCopy,kotlinCompilerPluginClasspathMetadataCommonMainCopy,kotlinCompilerPluginClasspathMetadataMainCopy
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.21=kotlinCompilerPluginClasspathJvmMainCopy2,kotlinCompilerPluginClasspathJvmTestCopy2,kotlinCompilerPluginClasspathMetadataCommonMainCopy2,kotlinCompilerPluginClasspathMetadataMainCopy2
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20=commonTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain,metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0=commonTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0=commonTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20=allSourceSetsCompileDependenciesMetadataCopy,allSourceSetsRuntimeDependenciesMetadataCopy,commonMainApiCopy,commonTestApiCopy,compileClasspathCopy,jvmApiCopy,jvmApiElementsCopy,jvmCompileClasspathCopy,jvmImplementationCopy,jvmRuntimeClasspathCopy,jvmRuntimeElementsCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy,metadataApiCopy,metadataApiElementsCopy,metadataCommonMainApiCopy,metadataCommonMainCompileClasspathCopy,metadataCommonMainImplementationCopy,metadataCompileClasspathCopy,metadataImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.6.20=commonTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-stdlib:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.6.20=commonTestImplementationCopy
org.jetbrains.kotlin:kotlin-test-junit:1.9.21=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test-junit:1.9.23=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.6.20=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlin:kotlin-test:1.6.21=commonTestImplementationCopy2
org.jetbrains.kotlin:kotlin-test:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:atomicfu:0.17.3=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlinx:atomicfu:0.20.2=metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:atomicfu:0.21.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlinx:atomicfu:0.23.1=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1=commonTestImplementationCopy
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=kotlinBuildToolsApiClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1=commonMainApiCopy,commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.2=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1=commonMainApiCopy,commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1=metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.2=commonTestImplementationCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.7.3=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.2=commonTestImplementationCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.3.2=commonMainApiCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.3.3=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.5.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath

View File

@ -1,4 +1,5 @@
Note: Contact Support will fail on some devices without an app to handle email, such as an Android TV device. See issue #386
Note: Contact Support will fail and display an error message on some devices without an app to handle email, such as an
Android TV device.
# Check Support Email Contents
1. If using a test device or emulator, be sure to configure a default email app. For example, try opening the Gmail app and confirm that it shows your inbox.

View File

@ -50,11 +50,19 @@ ZCASH_FIREBASE_TEST_LAB_PROJECT=
# Optionally disable minification
IS_MINIFY_ENABLED=true
# Optionally change the NDK debug symbols generation level
# Supported values are:
# - none (default, no native debug metadata will be packaged)
# - symbol_table (only the symbol tables will be packaged)
# - full (the debug info and symbol tables will be packaged)
# The result will be placed in app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip
NDK_DEBUG_SYMBOL_LEVEL=symbol_table
# If ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH is set and the deployment task is triggered, then
# VERSION_CODE is effectively ignored. VERSION_NAME is suffixed with the version code.
# If not using automated Google Play deployment, then these serve as the actual version numbers.
ZCASH_VERSION_CODE=1
ZCASH_VERSION_NAME=0.2.0
ZCASH_VERSION_NAME=1.0
# Set these fields, as you need them (e.g. with values "Zcash X" and "co.electriccoin.zcash.x")
# to distinguish a different release build that can be installed alongside the official version
@ -133,63 +141,65 @@ ANDROID_COMPILE_SDK_VERSION=34
ANDROID_NDK_VERSION=23.0.7599858
ANDROID_GRADLE_PLUGIN_VERSION=8.1.1
DETEKT_VERSION=1.23.0
DETEKT_COMPOSE_RULES_VERSION=0.3.5
EMULATOR_WTF_GRADLE_PLUGIN_VERSION=0.15.1
FIREBASE_CRASHLYTICS_BUILD_TOOLS_VERSION=2.9.4
ANDROID_GRADLE_PLUGIN_VERSION=8.3.0
DETEKT_VERSION=1.23.6
DETEKT_COMPOSE_RULES_VERSION=0.3.15
EMULATOR_WTF_GRADLE_PLUGIN_VERSION=0.16.2
FIREBASE_CRASHLYTICS_BUILD_TOOLS_VERSION=2.9.9
FLANK_VERSION=23.10.1
FULLADLE_VERSION=0.17.4
GOOGLE_PLAY_SERVICES_GRADLE_PLUGIN_VERSION=4.3.15
GRADLE_VERSIONS_PLUGIN_VERSION=0.47.0
GOOGLE_PLAY_SERVICES_GRADLE_PLUGIN_VERSION=4.4.1
GRADLE_VERSIONS_PLUGIN_VERSION=0.51.0
JGIT_VERSION=6.4.0.202211300538-r
KTLINT_VERSION=1.0.1
KTLINT_VERSION=1.2.1
ACCOMPANIST_PERMISSIONS_VERSION=0.32.0
ANDROIDX_ACTIVITY_VERSION=1.8.1
ANDROIDX_ANNOTATION_VERSION=1.7.0
ACCOMPANIST_PERMISSIONS_VERSION=0.34.0
ANDROIDX_ACTIVITY_VERSION=1.8.2
ANDROIDX_ANNOTATION_VERSION=1.7.1
ANDROIDX_APPCOMPAT_VERSION=1.6.1
ANDROIDX_CAMERA_VERSION=1.3.0
ANDROIDX_COMPOSE_COMPILER_VERSION=1.5.6
ANDROIDX_COMPOSE_MATERIAL3_VERSION=1.1.2
ANDROIDX_COMPOSE_MATERIAL_ICONS_VERSION=1.5.4
ANDROIDX_COMPOSE_VERSION=1.5.4
ANDROIDX_BIOMETRIC_VERSION=1.2.0-alpha05
ANDROIDX_CAMERA_VERSION=1.3.2
ANDROIDX_COMPOSE_COMPILER_VERSION=1.5.11
ANDROIDX_COMPOSE_MATERIAL3_VERSION=1.2.1
ANDROIDX_COMPOSE_MATERIAL_ICONS_VERSION=1.6.5
ANDROIDX_COMPOSE_VERSION=1.6.6
ANDROIDX_CONSTRAINTLAYOUT_VERSION=1.0.1
ANDROIDX_CORE_VERSION=1.9.0
ANDROIDX_CORE_VERSION=1.12.0
ANDROIDX_ESPRESSO_VERSION=3.5.1
ANDROIDX_LIFECYCLE_VERSION=2.6.2
ANDROIDX_NAVIGATION_COMPOSE_VERSION=2.7.5
ANDROIDX_LIFECYCLE_VERSION=2.7.0
ANDROIDX_NAVIGATION_COMPOSE_VERSION=2.7.7
ANDROIDX_PROFILE_INSTALLER_VERSION=1.3.1
ANDROIDX_SECURITY_CRYPTO_VERSION=1.1.0-alpha06
ANDROIDX_SPLASH_SCREEN_VERSION=1.0.1
ANDROIDX_TEST_JUNIT_VERSION=1.1.5
ANDROIDX_TEST_ORCHESTRATOR_VERSION=1.4.2
ANDROIDX_TEST_CORE_VERSION=1.5.0
ANDROIDX_TEST_MACROBENCHMARK_VERSION=1.2.2
ANDROIDX_TEST_MACROBENCHMARK_VERSION=1.2.3
ANDROIDX_TEST_RUNNER_VERSION=1.5.2
ANDROIDX_STARTUP_VERSION=1.1.1
ANDROIDX_TEST_SERVICE_VERSION=1.4.2
ANDROIDX_UI_AUTOMATOR_VERSION=2.2.0-alpha1
ANDROIDX_UI_AUTOMATOR_VERSION=2.3.0
ANDROIDX_WORK_MANAGER_VERSION=2.9.0
CORE_LIBRARY_DESUGARING_VERSION=2.0.4
FIREBASE_BOM_VERSION_MATCHER=32.6.0
FIREBASE_BOM_VERSION_MATCHER=32.8.1
GOOGLE_AUTH_LIB_JAVA_VERSION=1.18.0
JACOCO_VERSION=0.8.9
KOTLIN_VERSION=1.9.21
KOTLINX_COROUTINES_VERSION=1.7.3
JACOCO_VERSION=0.8.12
KOTLIN_VERSION=1.9.23
KOTLINX_COROUTINES_VERSION=1.8.0
KOTLINX_DATETIME_VERSION=0.5.0
KOTLINX_IMMUTABLE_COLLECTIONS_VERSION=0.3.6
KOTLINX_IMMUTABLE_COLLECTIONS_VERSION=0.3.7
KOTLINX_SERIALIZABLE_JSON_VERSION=1.6.3
KOVER_VERSION=0.7.3
PLAY_APP_UPDATE_VERSION=2.1.0
PLAY_APP_UPDATE_KTX_VERSION=2.1.0
PLAY_PUBLISHER_API_VERSION=v3-rev20231030-2.0.0
ZCASH_ANDROID_WALLET_PLUGINS_VERSION=1.0.0
ZCASH_BIP39_VERSION=1.0.7
ZXING_VERSION=3.5.2
ZXING_VERSION=3.5.3
# WARNING: Ensure a non-snapshot version is used before releasing to production.
ZCASH_SDK_VERSION=2.0.6-SNAPSHOT
ZCASH_BIP39_VERSION=1.0.8
# WARNING: Ensure a non-snapshot version is used before releasing to production
ZCASH_SDK_VERSION=2.1.1-SNAPSHOT
# Toolchain is the Java version used to build the application, which is separate from the
# Java version used to run the application.

Binary file not shown.

View File

@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

20
gradlew.bat vendored
View File

@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail

View File

@ -8,64 +8,64 @@ org.jetbrains.intellij.deps:coverage-report:1.0.21=koverJvmReporter
org.jetbrains.intellij.deps:intellij-coverage-agent:1.0.724=koverJvmAgent,koverJvmReporter
org.jetbrains.intellij.deps:intellij-coverage-reporter:1.0.724=koverJvmReporter
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.6.20=kotlinCompilerClasspathCopy
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.6.20=kotlinKlibCommonizerClasspathCopy
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.21=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.23=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-scripting-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.20=kotlinCompilerPluginClasspathJvmMainCopy,kotlinCompilerPluginClasspathJvmTestCopy,kotlinCompilerPluginClasspathMetadataCommonMainCopy,kotlinCompilerPluginClasspathMetadataMainCopy
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.21=kotlinCompilerPluginClasspathJvmMainCopy2,kotlinCompilerPluginClasspathJvmTestCopy2,kotlinCompilerPluginClasspathMetadataCommonMainCopy2,kotlinCompilerPluginClasspathMetadataMainCopy2
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain,metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20=commonMainApiCopy,commonMainApiCopy2,commonMainCompileOnlyDependenciesMetadataCopy,commonMainImplementationDependenciesMetadataCopy,commonMainRuntimeOnlyDependenciesMetadataCopy,commonTestApiCopy,commonTestApiDependenciesMetadataCopy,commonTestCompileOnlyDependenciesMetadataCopy,commonTestImplementationDependenciesMetadataCopy,commonTestRuntimeOnlyDependenciesMetadataCopy,compileClasspathCopy,jvmApiCopy,jvmApiElementsCopy,jvmCompileClasspathCopy,jvmImplementationCopy,jvmMainApiDependenciesMetadataCopy,jvmMainCompileOnlyDependenciesMetadataCopy,jvmMainImplementationDependenciesMetadataCopy,jvmMainRuntimeOnlyDependenciesMetadataCopy,jvmRuntimeClasspathCopy,jvmRuntimeElementsCopy,jvmTestApiCopy,jvmTestApiDependenciesMetadataCopy,jvmTestCompileClasspathCopy,jvmTestCompileOnlyDependenciesMetadataCopy,jvmTestImplementationCopy,jvmTestImplementationCopy2,jvmTestImplementationDependenciesMetadataCopy,jvmTestRuntimeClasspathCopy,jvmTestRuntimeOnlyDependenciesMetadataCopy,metadataApiCopy,metadataApiElementsCopy,metadataCommonMainApiCopy,metadataCommonMainCompileClasspathCopy,metadataCommonMainImplementationCopy,metadataCompileClasspathCopy,metadataImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21=jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-stdlib:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.9.21=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.9.23=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.6.20=commonTestImplementationCopy,commonTestImplementationDependenciesMetadataCopy,jvmTestCompileClasspathCopy,jvmTestCompileClasspathCopy2,jvmTestImplementationCopy,jvmTestImplementationDependenciesMetadataCopy,jvmTestRuntimeClasspathCopy,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlin:kotlin-test:1.6.21=commonTestImplementationCopy2,jvmTestImplementationCopy2
org.jetbrains.kotlin:kotlin-test:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:atomicfu:0.17.3=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlinx:atomicfu:0.20.2=metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:atomicfu:0.21.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:atomicfu:0.23.1=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=kotlinBuildToolsApiClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1=commonMainApiCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.2=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1=commonMainApiCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1=metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.2=commonTestImplementationCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.7.3=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.2=commonTestImplementationCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataCommonMain,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCommonMainCompileClasspath
org.jetbrains:annotations:16.0.2=koverJvmReporter
org.jetbrains:annotations:23.0.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath

View File

@ -14,4 +14,6 @@ interface PreferenceProvider {
suspend fun getString(key: PreferenceKey): String?
fun observe(key: PreferenceKey): Flow<String?>
suspend fun clearPreferences(): Boolean
}

View File

@ -18,6 +18,11 @@ class MockPreferenceProvider(
// For the mock implementation, does not support observability of changes
override fun observe(key: PreferenceKey): Flow<String?> = flow { emit(getString(key)) }
override suspend fun clearPreferences(): Boolean {
map.clear()
return true
}
override suspend fun hasKey(key: PreferenceKey) = map.containsKey(key.key)
override suspend fun putString(

View File

@ -59,6 +59,16 @@ class AndroidPreferenceProvider(
sharedPreferences.getString(key.key, null)
}
@SuppressLint("ApplySharedPref")
override suspend fun clearPreferences() =
withContext(dispatcher) {
val editor = sharedPreferences.edit()
editor.clear()
return@withContext editor.commit()
}
override fun observe(key: PreferenceKey): Flow<String?> =
callbackFlow<Unit> {
val listener =
@ -108,7 +118,6 @@ class AndroidPreferenceProvider(
val mainKey =
withContext(singleThreadedDispatcher) {
@Suppress("BlockingMethodInNonBlockingContext")
MasterKey.Builder(context).apply {
setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
}.build()
@ -116,7 +125,6 @@ class AndroidPreferenceProvider(
val sharedPreferences =
withContext(singleThreadedDispatcher) {
@Suppress("BlockingMethodInNonBlockingContext")
EncryptedSharedPreferences.create(
context,
filename,

View File

@ -33,7 +33,7 @@ class PercentDecimalExtTest {
runTest {
val parsed = PercentDecimal(1f).toPercentageWithDecimal()
assertEquals("100${MonetarySeparators.current(Locale.US).decimal}00", parsed)
assertEquals("100${MonetarySeparators.current(Locale.getDefault()).decimal}00", parsed)
}
@Test

View File

@ -7,13 +7,14 @@ import cash.z.ecc.sdk.fixture.Zip321UriBuildFixture
import cash.z.ecc.sdk.fixture.Zip321UriParseFixture
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import org.junit.Ignore
import org.junit.Test
import kotlin.test.Ignore
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
@Ignore("Disabled until the issue #397 is addressed")
class ZecRequestTest {
companion object {
private const val URI: String = "zcash:tmXuTnE11JojToagTqxXUn6KvdxDE3iLKbp?amount=1&message=Hello%20world!"

View File

@ -1,36 +0,0 @@
@file:Suppress("ktlint:standard:filename")
package cash.z.ecc.sdk.extension
import cash.z.ecc.android.sdk.model.ZcashNetwork
import co.electriccoin.lightwallet.client.model.LightWalletEndpoint
/*
* This set of extension functions suit for default values for the SDK initialization.
*/
fun LightWalletEndpoint.Companion.defaultForNetwork(zcashNetwork: ZcashNetwork): LightWalletEndpoint {
return when (zcashNetwork.id) {
ZcashNetwork.Mainnet.id -> LightWalletEndpoint.Mainnet
ZcashNetwork.Testnet.id -> LightWalletEndpoint.Testnet
else -> error("Unknown network id: ${zcashNetwork.id}")
}
}
private const val DEFAULT_PORT = 9067
val LightWalletEndpoint.Companion.Mainnet
get() =
LightWalletEndpoint(
"mainnet.lightwalletd.com",
DEFAULT_PORT,
isSecure = true
)
val LightWalletEndpoint.Companion.Testnet
get() =
LightWalletEndpoint(
"lightwalletd.testnet.electriccoin.co",
DEFAULT_PORT,
isSecure = true
)

View File

@ -0,0 +1,30 @@
@file:Suppress("ktlint:standard:filename", "MagicNumber")
package cash.z.ecc.sdk.extension
import co.electriccoin.lightwallet.client.model.LightWalletEndpoint
/*
* Used for testing purposes only
*/
val LightWalletEndpoint.Companion.Mainnet
get() =
LightWalletEndpoint(
"zec.rocks",
443,
isSecure = true
)
val LightWalletEndpoint.Companion.Testnet
get() =
LightWalletEndpoint(
"lightwalletd.testnet.electriccoin.co",
9067,
isSecure = true
)
const val MIN_PORT_NUMBER = 1
const val MAX_PORT_NUMBER = 65535
fun LightWalletEndpoint.isValid() = host.isNotBlank() && port in MIN_PORT_NUMBER..MAX_PORT_NUMBER

View File

@ -16,9 +16,7 @@ fun PercentDecimal.toPercentageWithDecimal(decimalFormat: DecimalFormat = prepar
private fun preparePercentDecimalFormat(): DecimalFormat =
DecimalFormat().apply {
// TODO [#1171]: Remove default MonetarySeparators locale
// TODO [#1171]: https://github.com/Electric-Coin-Company/zashi-android/issues/1171
val monetarySeparators = MonetarySeparators.current(Locale.US)
val monetarySeparators = MonetarySeparators.current(Locale.getDefault())
val localizedPattern = "##0${monetarySeparators.decimal}00"
runCatching {
applyLocalizedPattern(localizedPattern)

View File

@ -1,17 +0,0 @@
@file:Suppress("ktlint:standard:filename")
package cash.z.ecc.sdk.extension
import cash.z.ecc.android.sdk.Synchronizer
import cash.z.ecc.android.sdk.model.UnifiedSpendingKey
import cash.z.ecc.android.sdk.model.ZecSend
suspend fun Synchronizer.send(
spendingKey: UnifiedSpendingKey,
send: ZecSend
) = sendToAddress(
spendingKey,
send.amount,
send.destination.address,
send.memo.value
)

View File

@ -2,6 +2,7 @@ package cash.z.ecc.sdk.fixture
import cash.z.ecc.android.sdk.fixture.WalletAddressFixture
import cash.z.ecc.android.sdk.model.Memo
import cash.z.ecc.android.sdk.model.Proposal
import cash.z.ecc.android.sdk.model.WalletAddress
import cash.z.ecc.android.sdk.model.Zatoshi
import cash.z.ecc.android.sdk.model.ZecSend
@ -13,9 +14,13 @@ object ZecSendFixture {
val AMOUNT = Zatoshi(123)
val MEMO = MemoFixture.new()
// Null until we figure out how to proper test this
val PROPOSAL = null
suspend fun new(
address: String = ADDRESS,
amount: Zatoshi = AMOUNT,
memo: Memo = MEMO
) = ZecSend(WalletAddress.Unified.new(address), amount, memo)
memo: Memo = MEMO,
proposal: Proposal? = PROPOSAL
) = ZecSend(WalletAddress.Unified.new(address), amount, memo, proposal)
}

View File

@ -2,21 +2,20 @@ package cash.z.ecc.sdk.model
import cash.z.ecc.android.sdk.model.WalletAddress
import cash.z.ecc.android.sdk.model.Zatoshi
import cash.z.ecc.sdk.fixture.Zip321UriBuildFixture
import cash.z.ecc.sdk.fixture.Zip321UriParseFixture
data class ZecRequest(val address: WalletAddress.Unified, val amount: Zatoshi, val message: ZecRequestMessage) {
// TODO [#397]: Waiting for an implementation of Uri parser in SDK project
// TODO [#397]: https://github.com/Electric-Coin-Company/zcash-android-wallet-sdk/issues/397
suspend fun toUri(): String {
return Zip321UriBuildFixture.new(this)
TODO("Not implemented yet: Issue #397")
}
companion object {
// TODO [#397]: Waiting for an implementation of Uri parser in SDK project
// TODO [#397]: https://github.com/Electric-Coin-Company/zcash-android-wallet-sdk/issues/397
@Suppress("UNUSED_PARAMETER")
suspend fun fromUri(uriString: String): ZecRequest {
return Zip321UriParseFixture.new(uriString)
TODO("Not implemented yet: Issue #397")
}
}
}

View File

@ -6,13 +6,12 @@ pluginManagement {
val googleGroups = listOf(
"androidx.navigation",
"com.android.tools",
"com.android",
"com.google.testing.platform"
)
val googleRegexes = listOf(
"androidx.*",
"com\\.android.*",
"com\\.android\\.tools.*"
"androidx\\..*",
"com\\.android(\\.|\\:).*"
)
val wtfGroups = listOf("wtf.emulator")
@ -80,7 +79,7 @@ dependencyResolutionManagement {
val googleGroups = listOf(
"androidx.benchmark",
"androidx.navigation",
"com.android.tools",
"com.android",
"com.google.android.datatransport",
"com.google.android.gms",
"com.google.android.material",
@ -90,9 +89,8 @@ dependencyResolutionManagement {
"com.google.android.apps.common.testing.accessibility.framework"
)
val googleRegexes = listOf(
"androidx.*",
"com\\.android.*",
"com\\.android\\.tools.*"
"androidx\\..*",
"com\\.android(\\.|\\:).*",
)
val wtfGroups = listOf("wtf.emulator")
@ -146,6 +144,7 @@ dependencyResolutionManagement {
val androidxActivityVersion = extra["ANDROIDX_ACTIVITY_VERSION"].toString()
val androidxAnnotationVersion = extra["ANDROIDX_ANNOTATION_VERSION"].toString()
val androidxAppcompatVersion = extra["ANDROIDX_APPCOMPAT_VERSION"].toString()
val androidxBiometricVersion = extra["ANDROIDX_BIOMETRIC_VERSION"].toString()
val androidxCameraVersion = extra["ANDROIDX_CAMERA_VERSION"].toString()
val androidxComposeCompilerVersion = extra["ANDROIDX_COMPOSE_COMPILER_VERSION"].toString()
val androidxComposeMaterial3Version = extra["ANDROIDX_COMPOSE_MATERIAL3_VERSION"].toString()
@ -194,6 +193,8 @@ dependencyResolutionManagement {
library("androidx-activity-compose", "androidx.activity:activity-compose:$androidxActivityVersion")
library("androidx-annotation", "androidx.annotation:annotation:$androidxAnnotationVersion")
library("androidx-appcompat", "androidx.appcompat:appcompat:$androidxAppcompatVersion")
library("androidx-biometric", "androidx.biometric:biometric:$androidxBiometricVersion")
library("androidx-biometric-ktx", "androidx.biometric:biometric-ktx:$androidxBiometricVersion")
library("androidx-camera", "androidx.camera:camera-camera2:$androidxCameraVersion")
library("androidx-camera-lifecycle", "androidx.camera:camera-lifecycle:$androidxCameraVersion")
library("androidx-camera-view", "androidx.camera:camera-view:$androidxCameraVersion")
@ -250,9 +251,16 @@ dependencyResolutionManagement {
library("androidx-test-orchestrator", "androidx.test:orchestrator:$androidxTestOrchestratorVersion")
library("androidx-test-runner", "androidx.test:runner:$androidxTestRunnerVersion")
library("androidx-test-services","androidx.test.services:test-services:$androidxTestServices")
library("androidx-uiAutomator", "androidx.test.uiautomator:uiautomator-v18:$androidxUiAutomatorVersion")
library("androidx-uiAutomator", "androidx.test.uiautomator:uiautomator:$androidxUiAutomatorVersion")
library("kotlinx-coroutines-test", "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinxCoroutinesVersion")
// Bundles
bundle(
"androidx-biometric",
listOf(
"androidx-biometric",
"androidx-biometric-ktx",
)
)
bundle(
"androidx-camera",
listOf(

View File

@ -11,12 +11,28 @@ object AndroidApiVersion {
* [sdk].
*/
@ChecksSdkIntAtLeast(parameter = 0)
fun isAtLeast(
private fun isAtLeast(
@IntRange(from = Build.VERSION_CODES.BASE.toLong()) sdk: Int
): Boolean {
return Build.VERSION.SDK_INT >= sdk
}
/**
* @param sdk SDK version number to test against the current environment.
* @return `true` if [android.os.Build.VERSION.SDK_INT] is equal to [sdk].
*/
private fun isExactly(
@IntRange(from = Build.VERSION_CODES.BASE.toLong()) sdk: Int
): Boolean {
return Build.VERSION.SDK_INT == sdk
}
val isExactlyO = isExactly(Build.VERSION_CODES.O_MR1)
val isExactlyP = isExactly(Build.VERSION_CODES.P)
val isExactlyQ = isExactly(Build.VERSION_CODES.Q)
@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.P)
val isAtLeastP = isAtLeast(Build.VERSION_CODES.P)

View File

@ -8,69 +8,69 @@ org.jetbrains.intellij.deps:coverage-report:1.0.21=koverJvmReporter
org.jetbrains.intellij.deps:intellij-coverage-agent:1.0.724=koverJvmAgent,koverJvmReporter
org.jetbrains.intellij.deps:intellij-coverage-reporter:1.0.724=koverJvmReporter
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.6.20=kotlinCompilerClasspathCopy
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.21=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.6.20=kotlinKlibCommonizerClasspathCopy
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.21=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.23=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.21=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-script-runtime:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-scripting-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.20=kotlinCompilerPluginClasspathJvmMainCopy,kotlinCompilerPluginClasspathJvmTestCopy,kotlinCompilerPluginClasspathMetadataCommonMainCopy,kotlinCompilerPluginClasspathMetadataMainCopy
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.6.21=kotlinCompilerPluginClasspathJvmMainCopy2,kotlinCompilerPluginClasspathJvmTestCopy2,kotlinCompilerPluginClasspathMetadataCommonMainCopy2,kotlinCompilerPluginClasspathMetadataMainCopy2
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.21=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain
org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain,metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.0=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20=commonMainApiCopy,commonMainApiCopy2,commonTestApiCopy,jvmMainApiCopy,jvmTestApiCopy
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.6.20=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib:1.8.20=metadataCommonMainCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
org.jetbrains.kotlin:kotlin-stdlib:1.9.21=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-stdlib:1.9.23=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.6.20=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-test-junit:1.9.21=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test-junit:1.9.23=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.6.20=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlin:kotlin-test:1.6.21=commonTestImplementationCopy2,jvmTestImplementationCopy2
org.jetbrains.kotlin:kotlin-test:1.9.21=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:atomicfu:0.17.3=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlinx:atomicfu:0.20.2=metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:atomicfu:0.21.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlinx:atomicfu:0.23.1=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1=commonTestImplementationCopy,jvmTestImplementationCopy
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=kotlinBuildToolsApiClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1=commonMainApiCopy,commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.2=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1=commonMainApiCopy,commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=allSourceSetsRuntimeDependenciesMetadata
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1=metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.2=commonTestImplementationCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.7.3=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.2=commonTestImplementationCopy2
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains:annotations:13.0=commonTestImplementationCopy,jvmTestImplementationCopy,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataCommonMain,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCommonMainCompileClasspath
org.jetbrains:annotations:16.0.2=koverJvmReporter
org.jetbrains:annotations:23.0.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath

View File

@ -50,6 +50,7 @@ dependencies {
implementation(libs.androidx.core)
implementation(libs.androidx.splash)
implementation(libs.bundles.androidx.compose.core)
implementation(libs.bundles.androidx.compose.extended)
implementation(libs.kotlin.stdlib)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.coroutines.core)

View File

@ -0,0 +1,47 @@
package co.electriccoin.zcash.ui.design.animation
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.core.TweenSpec
import androidx.compose.animation.core.tween
import androidx.compose.ui.unit.IntOffset
import androidx.navigation.NavBackStackEntry
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.DurationUnit
object ScreenAnimation {
private const val DURATION = 400
fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() =
slideIntoContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Start,
initialOffset = { it },
animationSpec = tween(duration = DURATION.milliseconds)
)
fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() =
slideOutOfContainer(
towards = AnimatedContentTransitionScope.SlideDirection.Start,
targetOffset = { it },
animationSpec = tween(duration = DURATION.milliseconds)
)
fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() =
slideIntoContainer(
towards = AnimatedContentTransitionScope.SlideDirection.End,
initialOffset = { it },
animationSpec = tween(duration = DURATION.milliseconds)
)
fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() =
slideOutOfContainer(
towards = AnimatedContentTransitionScope.SlideDirection.End,
targetOffset = { it },
animationSpec = tween(duration = DURATION.milliseconds)
)
}
private fun tween(duration: Duration): TweenSpec<IntOffset> =
tween(
durationMillis = duration.toInt(DurationUnit.MILLISECONDS)
)

View File

@ -7,12 +7,17 @@ import androidx.compose.foundation.gestures.awaitFirstDown
import androidx.compose.foundation.gestures.waitForUpOrCancellation
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ButtonDefaults.buttonColors
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@ -36,6 +41,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.compose.ConstraintLayout
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
@Preview
@ -45,53 +51,67 @@ private fun ButtonComposablePreview() {
GradientSurface {
Column(Modifier.padding(ZcashTheme.dimens.spacingDefault)) {
PrimaryButton(onClick = { }, text = "Primary")
PrimaryButton(onClick = { }, text = "Primary...", showProgressBar = true)
PrimaryButton(onClick = { }, text = "Primary Small", minHeight = ZcashTheme.dimens.buttonHeightSmall)
SecondaryButton(onClick = { }, text = "Secondary")
TertiaryButton(onClick = { }, text = "Tertiary")
TertiaryButton(onClick = { }, text = "Tertiary", enabled = false)
NavigationButton(onClick = { }, text = "Navigation")
DangerousButton(onClick = { }, text = "Dangerous")
@Suppress("MagicNumber")
Row {
PrimaryButton(onClick = { }, text = "Button 1", modifier = Modifier.weight(0.5f))
Spacer(modifier = Modifier.width(24.dp))
PrimaryButton(onClick = { }, text = "Button 2", modifier = Modifier.weight(0.5f))
}
}
}
}
}
@Composable
@Suppress("LongParameterList")
@Suppress("LongParameterList", "LongMethod")
fun PrimaryButton(
onClick: () -> Unit,
text: String,
modifier: Modifier = Modifier,
buttonColor: Color = MaterialTheme.colorScheme.primary,
minWidth: Dp = ZcashTheme.dimens.buttonWidth,
minHeight: Dp = ZcashTheme.dimens.buttonHeight,
enabled: Boolean = true,
showProgressBar: Boolean = false,
buttonColor: Color = MaterialTheme.colorScheme.primary,
textColor: Color = MaterialTheme.colorScheme.onPrimary,
textStyle: TextStyle = ZcashTheme.extendedTypography.buttonText,
outerPaddingValues: PaddingValues =
PaddingValues(
horizontal = ZcashTheme.dimens.spacingNone,
vertical = ZcashTheme.dimens.spacingSmall
)
),
contentPaddingValues: PaddingValues = PaddingValues(all = 16.5.dp)
) {
Button(
shape = RectangleShape,
enabled = enabled,
contentPadding = contentPaddingValues,
modifier =
modifier.then(Modifier.fillMaxWidth())
.padding(outerPaddingValues)
.shadow(
contentColor = textColor,
strokeColor = buttonColor,
strokeWidth = 1.dp,
offsetX = ZcashTheme.dimens.buttonShadowOffsetX,
offsetY = ZcashTheme.dimens.buttonShadowOffsetY,
spread = ZcashTheme.dimens.buttonShadowSpread,
)
.translationClick(
// + 6dp to exactly cover the bottom shadow
translationX = ZcashTheme.dimens.buttonShadowOffsetX + 6.dp,
translationY = ZcashTheme.dimens.buttonShadowOffsetX + 6.dp
)
.defaultMinSize(ZcashTheme.dimens.buttonWidth, ZcashTheme.dimens.buttonHeight)
.border(1.dp, Color.Black),
modifier.then(
Modifier
.padding(outerPaddingValues)
.shadow(
contentColor = textColor,
strokeColor = buttonColor,
strokeWidth = 1.dp,
offsetX = ZcashTheme.dimens.buttonShadowOffsetX,
offsetY = ZcashTheme.dimens.buttonShadowOffsetY,
spread = ZcashTheme.dimens.buttonShadowSpread,
)
.translationClick(
// + 6dp to exactly cover the bottom shadow
translationX = ZcashTheme.dimens.buttonShadowOffsetX + 6.dp,
translationY = ZcashTheme.dimens.buttonShadowOffsetX + 6.dp
)
.defaultMinSize(minWidth, minHeight)
.border(1.dp, Color.Black)
),
colors =
buttonColors(
containerColor = buttonColor,
@ -100,12 +120,50 @@ fun PrimaryButton(
),
onClick = onClick,
) {
Text(
style = textStyle,
textAlign = TextAlign.Center,
text = text.uppercase(),
color = textColor
)
ConstraintLayout {
val (title, spacer, progress) = createRefs()
Text(
style = textStyle,
textAlign = TextAlign.Center,
text = text.uppercase(),
color = textColor,
modifier =
Modifier.constrainAs(title) {
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
start.linkTo(parent.start)
end.linkTo(parent.end)
}
)
if (showProgressBar) {
Spacer(
modifier =
Modifier
.width(12.dp)
.constrainAs(spacer) {
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
start.linkTo(title.end)
end.linkTo(progress.start)
}
)
CircularProgressIndicator(
color = Color.White,
strokeWidth = 2.dp,
modifier =
Modifier
.size(18.dp)
.constrainAs(progress) {
top.linkTo(parent.top)
bottom.linkTo(parent.bottom)
start.linkTo(spacer.end)
}
)
}
}
}
}
@ -115,35 +173,43 @@ fun SecondaryButton(
onClick: () -> Unit,
text: String,
modifier: Modifier = Modifier,
minWidth: Dp = ZcashTheme.dimens.buttonWidth,
minHeight: Dp = ZcashTheme.dimens.buttonHeight,
enabled: Boolean = true,
buttonColor: Color = MaterialTheme.colorScheme.secondary,
textColor: Color = MaterialTheme.colorScheme.onSecondary,
outerPaddingValues: PaddingValues =
PaddingValues(
horizontal = ZcashTheme.dimens.spacingNone,
vertical = ZcashTheme.dimens.spacingSmall
),
enabled: Boolean = true,
buttonColor: Color = MaterialTheme.colorScheme.secondary,
textColor: Color = MaterialTheme.colorScheme.onSecondary,
contentPaddingValues: PaddingValues = PaddingValues(all = 16.5.dp)
) {
Button(
shape = RectangleShape,
enabled = enabled,
contentPadding = contentPaddingValues,
modifier =
modifier.then(Modifier.fillMaxWidth())
.padding(outerPaddingValues)
.shadow(
contentColor = textColor,
strokeColor = textColor,
offsetX = ZcashTheme.dimens.buttonShadowOffsetX,
offsetY = ZcashTheme.dimens.buttonShadowOffsetY,
spread = ZcashTheme.dimens.buttonShadowSpread,
)
.translationClick(
// + 6dp to exactly cover the bottom shadow
translationX = ZcashTheme.dimens.buttonShadowOffsetX + 6.dp,
translationY = ZcashTheme.dimens.buttonShadowOffsetX + 6.dp
)
.defaultMinSize(ZcashTheme.dimens.buttonWidth, ZcashTheme.dimens.buttonHeight)
.border(1.dp, Color.Black),
modifier.then(
Modifier
.padding(outerPaddingValues)
.shadow(
contentColor = textColor,
strokeColor = buttonColor,
strokeWidth = 1.dp,
offsetX = ZcashTheme.dimens.buttonShadowOffsetX,
offsetY = ZcashTheme.dimens.buttonShadowOffsetY,
spread = ZcashTheme.dimens.buttonShadowSpread,
)
.translationClick(
// + 6dp to exactly cover the bottom shadow
translationX = ZcashTheme.dimens.buttonShadowOffsetX + 6.dp,
translationY = ZcashTheme.dimens.buttonShadowOffsetX + 6.dp
)
.defaultMinSize(minWidth, minHeight)
.fillMaxWidth()
.border(1.dp, Color.Black)
),
colors =
buttonColors(
containerColor = buttonColor,
@ -226,38 +292,6 @@ fun TertiaryButton(
}
}
@Composable
fun DangerousButton(
onClick: () -> Unit,
text: String,
modifier: Modifier = Modifier,
outerPaddingValues: PaddingValues =
PaddingValues(
horizontal = ZcashTheme.dimens.spacingNone,
vertical = ZcashTheme.dimens.spacingSmall
),
) {
Button(
shape = RectangleShape,
onClick = onClick,
modifier =
modifier.then(
Modifier
.fillMaxWidth()
.padding(outerPaddingValues)
.defaultMinSize(ZcashTheme.dimens.buttonWidth, ZcashTheme.dimens.buttonHeight)
),
colors = buttonColors(containerColor = ZcashTheme.colors.dangerous)
) {
Text(
style = MaterialTheme.typography.labelLarge,
textAlign = TextAlign.Center,
text = text,
color = ZcashTheme.colors.onDangerous
)
}
}
@Suppress("LongParameterList")
fun Modifier.shadow(
contentColor: Color = Color.Black,
@ -311,6 +345,9 @@ fun Modifier.shadow(
private enum class ButtonState { Pressed, Idle }
// TODO [#1346]: Rework not-recommended composed{}
// TODO [#1346]: https://github.com/Electric-Coin-Company/zashi-android/issues/1346
@Suppress("ModifierComposed")
fun Modifier.translationClick(
translationX: Dp = 0.dp,
translationY: Dp = 0.dp

View File

@ -38,8 +38,9 @@ private fun ComposablePreview() {
@Composable
fun ChipGrid(
wordList: ImmutableList<String>,
onGridClick: () -> Unit,
modifier: Modifier = Modifier,
onGridClick: () -> Unit
allowCopy: Boolean = false,
) {
val interactionSource = remember { MutableInteractionSource() }
@ -51,13 +52,20 @@ fun ChipGrid(
modifier =
Modifier
.wrapContentWidth()
.clickable(
interactionSource = interactionSource,
// Disable ripple
indication = null,
onClick = onGridClick
)
.testTag(CommonTag.CHIP_LAYOUT)
.then(
if (allowCopy) {
Modifier
.clickable(
interactionSource = interactionSource,
// Disable ripple
indication = null,
onClick = onGridClick
)
} else {
Modifier
}
)
) {
wordList.chunked(CHIP_GRID_COLUMN_SIZE).forEachIndexed { chunkIndex, chunk ->
// TODO [#1043]: Correctly align numbers and words on Recovery screen

View File

@ -0,0 +1,118 @@
package co.electriccoin.zcash.ui.design.component
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.DialogProperties
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
@Preview
@Composable
private fun LightAlertDialogComposablePreview() {
ZcashTheme(forceDarkMode = false) {
AppAlertDialog(
title = "Light popup",
text =
"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Temporibus autem quibusdam et aut " +
"officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et " +
"molestiae non recusandae. Duis condimentum augue id magna semper rutrum.",
confirmButtonText = "OK",
dismissButtonText = "Cancel"
)
}
}
@Preview
@Composable
private fun DarkAlertDialogComposablePreview() {
ZcashTheme(forceDarkMode = true) {
AppAlertDialog(
title = "Dark no button popup",
text =
"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Temporibus autem quibusdam et aut " +
"officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et " +
"molestiae non recusandae. Duis condimentum augue id magna semper rutrum.",
)
}
}
// TODO [#1276]: Consider adding support for a specific exception in AppAlertDialog
// TODO [#1276]: https://github.com/Electric-Coin-Company/zashi-android/issues/1276
@Composable
@Suppress("LongParameterList")
fun AppAlertDialog(
modifier: Modifier = Modifier,
onDismissRequest: (() -> Unit)? = null,
confirmButtonText: String? = null,
onConfirmButtonClick: (() -> Unit)? = null,
dismissButtonText: String? = null,
onDismissButtonClick: (() -> Unit)? = null,
icon: ImageVector? = null,
title: String? = null,
text: @Composable (() -> Unit)? = null,
properties: DialogProperties = DialogProperties()
) {
AlertDialog(
shape = RectangleShape,
onDismissRequest = onDismissRequest?.let { onDismissRequest } ?: {},
confirmButton = {
confirmButtonText?.let {
NavigationButton(
text = confirmButtonText,
onClick = onConfirmButtonClick ?: {},
outerPaddingValues = PaddingValues(all = 0.dp)
)
}
},
dismissButton = {
dismissButtonText?.let {
NavigationButton(
text = dismissButtonText,
onClick = onDismissButtonClick ?: {},
outerPaddingValues = PaddingValues(all = 0.dp)
)
}
},
title = title?.let { { Text(text = title) } },
text = text,
icon = icon?.let { { Icon(imageVector = icon, null) } },
properties = properties,
modifier = modifier,
)
}
@Composable
@Suppress("LongParameterList")
fun AppAlertDialog(
modifier: Modifier = Modifier,
onDismissRequest: (() -> Unit)? = null,
confirmButtonText: String? = null,
onConfirmButtonClick: (() -> Unit)? = null,
dismissButtonText: String? = null,
onDismissButtonClick: (() -> Unit)? = null,
icon: ImageVector? = null,
title: String? = null,
text: String? = null,
properties: DialogProperties = DialogProperties()
) {
AppAlertDialog(
onDismissRequest = onDismissRequest?.let { onDismissRequest } ?: {},
modifier = modifier,
confirmButtonText = confirmButtonText,
title = title,
text = { text?.let { Text(text = text) } },
icon = icon,
properties = properties,
onConfirmButtonClick = onConfirmButtonClick,
dismissButtonText = dismissButtonText,
onDismissButtonClick = onDismissButtonClick
)
}

View File

@ -11,6 +11,7 @@ import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@ -23,7 +24,7 @@ private fun CircularScreenProgressIndicatorComposablePreview() {
GradientSurface {
Column {
CircularScreenProgressIndicator()
CircularSmallProgressIndicator()
CircularMidProgressIndicator()
}
}
}
@ -48,9 +49,24 @@ fun CircularScreenProgressIndicator(modifier: Modifier = Modifier) {
}
@Composable
fun CircularSmallProgressIndicator(modifier: Modifier = Modifier) {
fun CircularMidProgressIndicator(modifier: Modifier = Modifier) {
CircularProgressIndicator(
color = ZcashTheme.colors.circularProgressBarSmall,
color = ZcashTheme.colors.circularProgressBarScreen,
strokeWidth = 3.dp,
modifier =
Modifier
.size(ZcashTheme.dimens.circularMidProgressWidth)
.then(modifier)
)
}
@Composable
fun CircularSmallProgressIndicator(
modifier: Modifier = Modifier,
color: Color = ZcashTheme.colors.circularProgressBarSmall,
) {
CircularProgressIndicator(
color = color,
strokeWidth = 2.dp,
modifier =
Modifier
@ -65,18 +81,18 @@ private fun LinearProgressIndicatorComposablePreview() {
ZcashTheme(forceDarkMode = false) {
GradientSurface {
@Suppress("MagicNumber")
LinearProgressIndicator(0.75f)
SmallLinearProgressIndicator(0.75f)
}
}
}
@Composable
fun LinearProgressIndicator(
fun SmallLinearProgressIndicator(
progress: Float,
modifier: Modifier = Modifier
) {
LinearProgressIndicator(
progress = progress,
progress = { progress },
color = ZcashTheme.colors.linearProgressBarBackground,
trackColor = ZcashTheme.colors.linearProgressBarTrack,
strokeCap = StrokeCap.Butt,

View File

@ -0,0 +1,79 @@
package co.electriccoin.zcash.ui.design.component
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.RadioButton
import androidx.compose.material3.RadioButtonDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
@Preview
@Composable
private fun ComposablePreview() {
ZcashTheme(forceDarkMode = false) {
RadioButton(
text = "test",
selected = true,
onClick = {},
modifier = Modifier
)
}
}
@Composable
fun RadioButton(
text: String,
selected: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier,
testTag: String? = null,
) {
Row(
modifier =
Modifier
.wrapContentSize()
.clip(RoundedCornerShape(ZcashTheme.dimens.regularRippleEffectCorner))
.clickable { onClick() }
.then(
if (testTag != null) {
Modifier.testTag(testTag)
} else {
Modifier
}
)
.then(modifier),
verticalAlignment = Alignment.CenterVertically
) {
RadioButton(
selected = selected,
onClick = onClick,
colors =
RadioButtonDefaults.colors(
selectedColor = ZcashTheme.colors.radioButtonColor,
unselectedColor = ZcashTheme.colors.radioButtonColor,
)
)
Text(
text = text,
style = ZcashTheme.extendedTypography.radioButton,
color = ZcashTheme.colors.radioButtonTextColor,
modifier =
Modifier.padding(
top = 16.dp,
bottom = 16.dp,
start = 0.dp,
end = ZcashTheme.dimens.spacingDefault
)
)
}
}

View File

@ -3,6 +3,7 @@
package co.electriccoin.zcash.ui.design.component
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.basicMarquee
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
@ -14,6 +15,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.AccountBox
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@ -30,6 +32,7 @@ import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import cash.z.ecc.android.sdk.model.MonetarySeparators
import co.electriccoin.zcash.spackle.Twig
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
@ -189,6 +192,7 @@ fun TitleLarge(
fun Small(
text: String,
modifier: Modifier = Modifier,
textFontWeight: FontWeight = FontWeight.Normal,
maxLines: Int = Int.MAX_VALUE,
overflow: TextOverflow = TextOverflow.Clip,
textAlign: TextAlign = TextAlign.Start,
@ -197,6 +201,7 @@ fun Small(
Text(
text = text,
color = color,
fontWeight = textFontWeight,
maxLines = maxLines,
overflow = overflow,
textAlign = textAlign,
@ -222,21 +227,46 @@ fun Tiny(
overflow = overflow,
textAlign = textAlign,
modifier = modifier,
style = MaterialTheme.typography.labelSmall,
style = MaterialTheme.typography.bodySmall,
)
}
@Composable
fun ListHeader(
@Suppress("LongParameterList")
fun TextWithIcon(
text: String,
modifier: Modifier = Modifier
iconVector: ImageVector,
modifier: Modifier = Modifier,
iconContentDescription: String? = null,
maxLines: Int = Int.MAX_VALUE,
overflow: TextOverflow = TextOverflow.Clip,
textAlign: TextAlign = TextAlign.Start,
style: TextStyle = LocalTextStyle.current,
color: Color = MaterialTheme.colorScheme.onBackground,
) {
Text(
text = text,
style = ZcashTheme.extendedTypography.listItem,
color = ZcashTheme.colors.onBackgroundHeader,
modifier = modifier
)
Row(
modifier =
Modifier
.wrapContentSize()
.then(modifier),
verticalAlignment = Alignment.CenterVertically
) {
Image(
imageVector = iconVector,
contentDescription = iconContentDescription
)
Spacer(modifier = Modifier.padding(3.dp))
Text(
text = text,
color = color,
maxLines = maxLines,
overflow = overflow,
textAlign = textAlign,
style = style,
)
}
}
@Suppress("LongParameterList")
@ -248,6 +278,7 @@ fun Reference(
fontWeight: FontWeight = FontWeight.SemiBold,
textAlign: TextAlign = TextAlign.Center,
textStyle: TextStyle = ZcashTheme.typography.primary.bodyLarge,
color: Color = ZcashTheme.colors.reference,
imageVector: ImageVector? = null,
imageContentDescription: String? = null
) {
@ -273,7 +304,7 @@ fun Reference(
style =
textStyle.merge(
TextStyle(
color = ZcashTheme.colors.reference,
color = color,
textAlign = textAlign,
textDecoration = TextDecoration.Underline,
fontWeight = fontWeight
@ -298,9 +329,10 @@ fun StyledBalance(
balanceString: String,
textStyles: Pair<TextStyle, TextStyle>,
modifier: Modifier = Modifier,
textColor: Color? = null
textColor: Color? = null,
prefix: String? = null
) {
val balanceSplit = splitBalance(balanceString)
val balanceSplit = splitBalance(balanceString, prefix)
val content =
buildAnnotatedString {
@ -338,16 +370,20 @@ fun StyledBalance(
}
}
private fun splitBalance(balance: String): Pair<String, String> {
Twig.debug { "Balance before split: $balance" }
private fun splitBalance(
balance: String,
prefix: String?
): Pair<String, String> {
Twig.debug { "Balance before split: $balance, prefix: $prefix" }
@Suppress("MAGIC_CONSTANT", "MagicNumber")
val cutPosition = balance.indexOf(MonetarySeparators.current(Locale.US).decimal) + 4
@Suppress("MagicNumber")
val cutPosition = balance.indexOf(MonetarySeparators.current(Locale.getDefault()).decimal) + 4
val firstPart =
balance.substring(
startIndex = 0,
endIndex = cutPosition
)
(prefix ?: "") +
balance.substring(
startIndex = 0,
endIndex = cutPosition
)
val secondPart =
balance.substring(
startIndex = cutPosition

View File

@ -2,8 +2,10 @@ package co.electriccoin.zcash.ui.design.component
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.relocation.BringIntoViewRequester
import androidx.compose.foundation.text.KeyboardActions
@ -17,6 +19,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.onFocusEvent
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextOverflow
@ -61,57 +64,66 @@ fun FormTextField(
withBorder: Boolean = true,
bringIntoViewRequester: BringIntoViewRequester? = null,
minHeight: Dp = ZcashTheme.dimens.textFieldDefaultHeight,
testTag: String? = null
) {
val coroutineScope = rememberCoroutineScope()
val composedTextFieldModifier =
modifier
.defaultMinSize(minHeight = minHeight)
.onFocusEvent { focusState ->
bringIntoViewRequester?.run {
if (focusState.isFocused) {
coroutineScope.launch {
bringIntoView()
Column(modifier = Modifier.then(modifier)) {
TextField(
value = value,
onValueChange = onValueChange,
placeholder =
if (enabled) {
placeholder
} else {
null
},
textStyle = textStyle,
keyboardOptions = keyboardOptions,
colors = colors,
modifier =
Modifier
.fillMaxWidth()
.defaultMinSize(minHeight = minHeight)
.onFocusEvent { focusState ->
bringIntoViewRequester?.run {
if (focusState.isFocused) {
coroutineScope.launch {
bringIntoView()
}
}
}
}
}
}
.then(
if (withBorder) {
modifier.border(width = 1.dp, color = ZcashTheme.colors.textFieldFrame)
} else {
Modifier
}
)
TextField(
value = value,
onValueChange = onValueChange,
placeholder =
if (enabled) {
placeholder
} else {
null
},
textStyle = textStyle,
keyboardOptions = keyboardOptions,
colors = colors,
modifier = composedTextFieldModifier,
leadingIcon = leadingIcon,
trailingIcon = trailingIcon,
keyboardActions = keyboardActions,
shape = shape,
enabled = enabled
)
if (!error.isNullOrEmpty()) {
Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingSmall))
BodySmall(
text = error,
color = ZcashTheme.colors.textFieldError,
maxLines = 1,
overflow = TextOverflow.Ellipsis
.then(
if (withBorder) {
Modifier.border(width = 1.dp, color = ZcashTheme.colors.textFieldFrame)
} else {
Modifier
}
)
.then(
if (testTag.isNullOrEmpty()) {
Modifier
} else {
Modifier.testTag(testTag)
}
),
leadingIcon = leadingIcon,
trailingIcon = trailingIcon,
keyboardActions = keyboardActions,
shape = shape,
enabled = enabled
)
if (!error.isNullOrEmpty()) {
Spacer(modifier = Modifier.height(ZcashTheme.dimens.spacingSmall))
BodySmall(
text = error,
color = ZcashTheme.colors.textFieldError,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
}

View File

@ -1,20 +1,22 @@
@file:Suppress("TooManyFunctions")
package co.electriccoin.zcash.ui.design.component
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.AccountCircle
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.DropdownMenu
@ -34,10 +36,14 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import co.electriccoin.zcash.ui.design.R
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.design.theme.internal.SecondaryTypography
import co.electriccoin.zcash.ui.design.theme.internal.TopAppBarColors
@Preview
@Composable
@ -49,6 +55,34 @@ private fun TopAppBarTextComposablePreview() {
}
}
@Preview
@Composable
private fun TopAppBarTextRestoringComposablePreview() {
ZcashTheme(forceDarkMode = false) {
GradientSurface {
SmallTopAppBar(
titleText = "Screen A",
backText = "Back",
restoringLabel = "[RESTORING YOUR WALLET…]"
)
}
}
}
@Preview
@Composable
private fun TopAppBarTextRestoringLongComposablePreview() {
ZcashTheme(forceDarkMode = false) {
GradientSurface {
SmallTopAppBar(
titleText = "Screen A",
backText = "Back",
restoringLabel = "[RESTORING YOUR WALLET LONG TEXT…]"
)
}
}
}
@Preview
@Composable
private fun TopAppBarLogoComposablePreview() {
@ -59,6 +93,20 @@ private fun TopAppBarLogoComposablePreview() {
}
}
@Preview
@Composable
private fun TopAppBarLogoRestoringComposablePreview() {
ZcashTheme(forceDarkMode = false) {
GradientSurface {
SmallTopAppBar(
showTitleLogo = true,
backText = "Back",
restoringLabel = "[RESTORING YOUR WALLET…]"
)
}
}
}
@Preview
@Composable
private fun TopAppBarRegularMenuComposablePreview() {
@ -213,31 +261,58 @@ private fun TopBarOneVisibleActionMenuExample(
}
@Composable
@Suppress("LongParameterList")
@Suppress("LongParameterList", "LongMethod")
@OptIn(ExperimentalMaterial3Api::class)
fun SmallTopAppBar(
modifier: Modifier = Modifier,
titleText: String? = null,
showTitleLogo: Boolean = false,
backText: String? = null,
backContentDescriptionText: String? = null,
onBack: (() -> Unit)? = null,
backText: String? = null,
colors: TopAppBarColors = ZcashTheme.colors.topAppBarColors,
hamburgerMenuActions: (@Composable RowScope.() -> Unit)? = null,
onBack: (() -> Unit)? = null,
regularActions: (@Composable RowScope.() -> Unit)? = null,
restoringLabel: String? = null,
showTitleLogo: Boolean = false,
titleText: String? = null,
) {
CenterAlignedTopAppBar(
title = {
if (titleText != null) {
Text(
text = titleText.uppercase(),
style = SecondaryTypography.headlineSmall
)
} else if (showTitleLogo) {
Icon(
painter = painterResource(id = R.drawable.zashi_text_logo),
contentDescription = null,
modifier = Modifier.height(ZcashTheme.dimens.topAppBarZcashLogoHeight)
)
Column(
horizontalAlignment = Alignment.CenterHorizontally
) {
var restoringSpacerHeight: Dp = 0.dp
if (titleText != null) {
Text(
text = titleText.uppercase(),
style = SecondaryTypography.headlineSmall,
color = colors.titleColor,
)
restoringSpacerHeight = ZcashTheme.dimens.spacingTiny
} else if (showTitleLogo) {
Icon(
painter = painterResource(id = R.drawable.zashi_text_logo),
contentDescription = null,
tint = colors.titleColor,
modifier = Modifier.height(ZcashTheme.dimens.topAppBarZcashLogoHeight)
)
restoringSpacerHeight = ZcashTheme.dimens.spacingSmall
}
if (restoringLabel != null) {
Spacer(modifier = Modifier.height(restoringSpacerHeight))
@Suppress("MagicNumber")
Text(
text = restoringLabel.uppercase(),
style = ZcashTheme.extendedTypography.restoringTopAppBarStyle,
color = colors.subTitleColor,
modifier = Modifier.fillMaxWidth(0.75f),
textAlign = TextAlign.Center,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
},
navigationIcon = {
@ -253,9 +328,10 @@ fun SmallTopAppBar(
modifier = Modifier.padding(all = ZcashTheme.dimens.spacingDefault),
verticalAlignment = Alignment.CenterVertically
) {
Image(
imageVector = Icons.Filled.ArrowBack,
contentDescription = backContentDescriptionText
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = backContentDescriptionText,
tint = colors.navigationColor,
)
Spacer(modifier = Modifier.size(size = ZcashTheme.dimens.spacingSmall))
Text(text = backText.uppercase())
@ -267,6 +343,7 @@ fun SmallTopAppBar(
regularActions?.invoke(this)
hamburgerMenuActions?.invoke(this)
},
colors = colors.toMaterialTopAppBarColors(),
modifier =
Modifier
.testTag(CommonTag.TOP_APP_BAR)

View File

@ -0,0 +1,135 @@
@file:Suppress("MatchingDeclarationName")
package co.electriccoin.zcash.ui.design.component
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.FastOutLinearInEasing
import androidx.compose.animation.core.tween
import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.ColorPainter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import co.electriccoin.zcash.ui.design.R
import co.electriccoin.zcash.ui.design.component.AnimationConstants.ANIMATION_DURATION
import co.electriccoin.zcash.ui.design.component.AnimationConstants.INITIAL_DELAY
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.design.util.screenHeight
import kotlinx.coroutines.delay
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
object AnimationConstants {
const val ANIMATION_DURATION = 700
const val INITIAL_DELAY = 1000
fun together() = (ANIMATION_DURATION + INITIAL_DELAY).toLong()
}
// TODO [#1002]: Welcome screen animation masking
// TODO [#1002]: https://github.com/Electric-Coin-Company/zashi-android/issues/1002
@Composable
fun WelcomeAnimationAutostart(
modifier: Modifier = Modifier,
delay: Duration = INITIAL_DELAY.milliseconds,
) {
var currentAnimationState by remember { mutableStateOf(true) }
WelcomeAnimation(
animationState = currentAnimationState,
modifier = modifier
)
// Let's start the animation automatically in case e.g. authentication is not involved
LaunchedEffect(key1 = currentAnimationState) {
delay(delay)
currentAnimationState = false
}
}
private const val LOGO_RELATIVE_LOCATION = 0.2f
@Composable
fun WelcomeAnimation(
animationState: Boolean,
modifier: Modifier = Modifier,
) {
val screenHeight = screenHeight()
Column(
modifier =
modifier.then(
Modifier
.verticalScroll(
state = rememberScrollState(),
enabled = false
)
.wrapContentSize()
)
) {
AnimatedVisibility(
visible = animationState,
exit =
slideOutVertically(
targetOffsetY = { -it },
animationSpec =
tween(
durationMillis = ANIMATION_DURATION,
easing = FastOutLinearInEasing
)
),
) {
Box(modifier = Modifier.wrapContentSize()) {
Column(modifier = Modifier.wrapContentSize()) {
Image(
painter = ColorPainter(ZcashTheme.colors.welcomeAnimationColor),
contentScale = ContentScale.FillBounds,
modifier =
Modifier
.fillMaxHeight()
.height(screenHeight.overallScreenHeight()),
contentDescription = null
)
Image(
painter = painterResource(id = R.drawable.chart_line),
contentScale = ContentScale.FillBounds,
contentDescription = null,
)
}
Column(
modifier =
Modifier
.fillMaxSize()
.height(screenHeight.overallScreenHeight()),
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.fillMaxHeight(LOGO_RELATIVE_LOCATION))
Image(
painter = painterResource(id = R.drawable.logo_with_hi),
contentDescription = null,
)
}
}
}
}
}

View File

@ -12,11 +12,14 @@ data class Dimens(
// Default spacings:
val spacingNone: Dp,
val spacingXtiny: Dp,
val spacingMin: Dp,
val spacingTiny: Dp,
val spacingSmall: Dp,
val spacingMid: Dp,
val spacingDefault: Dp,
val spacingLarge: Dp,
val spacingXlarge: Dp,
val spacingUpLarge: Dp,
val spacingBig: Dp,
val spacingHuge: Dp,
// List of custom spacings:
// Button:
@ -25,11 +28,13 @@ data class Dimens(
val buttonShadowSpread: Dp,
val buttonWidth: Dp,
val buttonHeight: Dp,
val buttonHeightSmall: Dp,
// Chip
val chipShadowElevation: Dp,
val chipStroke: Dp,
// Progress
val circularScreenProgressWidth: Dp,
val circularMidProgressWidth: Dp,
val circularSmallProgressWidth: Dp,
val linearProgressHeight: Dp,
// TopAppBar:
@ -43,12 +48,14 @@ data class Dimens(
val layoutStroke: Dp,
val regularRippleEffectCorner: Dp,
val smallRippleEffectCorner: Dp,
val tinyRippleEffectCorner: Dp,
// Screen custom spacings:
val inScreenZcashLogoHeight: Dp,
val inScreenZcashLogoWidth: Dp,
val inScreenZcashTextLogoHeight: Dp,
val screenHorizontalSpacingBig: Dp,
val screenHorizontalSpacingRegular: Dp,
val cameraTorchButton: Dp,
)
private val defaultDimens =
@ -56,19 +63,24 @@ private val defaultDimens =
spacingNone = 0.dp,
spacingXtiny = 2.dp,
spacingTiny = 4.dp,
spacingMin = 6.dp,
spacingSmall = 8.dp,
spacingMid = 12.dp,
spacingDefault = 16.dp,
spacingLarge = 24.dp,
spacingXlarge = 32.dp,
spacingUpLarge = 32.dp,
spacingBig = 48.dp,
spacingHuge = 64.dp,
buttonShadowOffsetX = 20.dp,
buttonShadowOffsetY = 20.dp,
buttonShadowSpread = 10.dp,
buttonWidth = 244.dp,
buttonHeight = 70.dp,
buttonHeight = 56.dp,
buttonHeightSmall = 38.dp,
chipShadowElevation = 4.dp,
chipStroke = 0.5.dp,
circularScreenProgressWidth = 48.dp,
circularMidProgressWidth = 22.dp,
circularSmallProgressWidth = 14.dp,
linearProgressHeight = 14.dp,
topAppBarZcashLogoHeight = 24.dp,
@ -79,11 +91,13 @@ private val defaultDimens =
divider = 1.dp,
regularRippleEffectCorner = 28.dp,
smallRippleEffectCorner = 10.dp,
tinyRippleEffectCorner = 8.dp,
inScreenZcashLogoHeight = 100.dp,
inScreenZcashLogoWidth = 60.dp,
inScreenZcashTextLogoHeight = 30.dp,
screenHorizontalSpacingBig = 64.dp,
screenHorizontalSpacingRegular = 32.dp,
cameraTorchButton = 20.dp,
)
private val normalDimens = defaultDimens

View File

@ -5,6 +5,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import co.electriccoin.zcash.ui.design.theme.internal.TopAppBarColors
@Immutable
data class ExtendedColors(
@ -15,22 +16,24 @@ data class ExtendedColors(
val callout: Color,
val onCallout: Color,
val circularProgressBarSmall: Color,
val circularProgressBarSmallDark: Color,
val circularProgressBarScreen: Color,
val linearProgressBarTrack: Color,
val linearProgressBarBackground: Color,
val chipIndex: Color,
val textCommon: Color,
val textMedium: Color,
val textDisabled: Color,
val textFieldHint: Color,
val textFieldError: Color,
val textFieldWarning: Color,
val textFieldFrame: Color,
val textDescription: Color,
val textDescriptionDark: Color,
val textPending: Color,
val layoutStroke: Color,
val overlay: Color,
val highlight: Color,
val dangerous: Color,
val onDangerous: Color,
val reference: Color,
val disabledButtonColor: Color,
val disabledButtonTextColor: Color,
@ -43,6 +46,15 @@ data class ExtendedColors(
val darkDividerColor: Color,
val tabTextColor: Color,
val panelBackgroundColor: Color,
val cameraDisabledBackgroundColor: Color,
val cameraDisabledFrameColor: Color,
val radioButtonColor: Color,
val radioButtonTextColor: Color,
val historyBackgroundColor: Color,
val historyRedColor: Color,
val historySyncingColor: Color,
val topAppBarColors: TopAppBarColors,
val transparentTopAppBarColors: TopAppBarColors
) {
@Composable
fun surfaceGradient() =

View File

@ -24,15 +24,18 @@ internal object Dark {
val textSecondaryButton = Color(0xFF000000)
val textTertiaryButton = Color.White
val textCommon = Color(0xFFFFFFFF)
val textMedium = Color(0xFF353535)
val textDisabled = Color(0xFFB7B7B7)
val textChipIndex = Color(0xFFFFB900)
val textFieldFrame = Color(0xFF231F20)
val textFieldError = Color(0xFFFF0000)
val textFieldWarning = Color(0xFFF40202)
val textFieldHint = Color(0xFFB7B7B7)
val textDescription = Color(0xFF777777)
val textDescriptionDark = Color(0xFF4D4D4D)
val textProgress = Color(0xFF8B8A8A)
val aboutTextColor = Color.Unspecified
val aboutTextColor = Color(0xFF4E4E4E)
val screenTitleColor = Color(0xFF040404)
val welcomeAnimationColor = Color(0xFF231F20)
val complementaryColor = Color(0xFFF4B728)
@ -41,25 +44,21 @@ internal object Dark {
val tabTextColor = Color(0xFF040404)
val layoutStroke = Color(0xFFFFFFFF)
val panelBackgroundColor = Color(0xFFEAEAEA)
val cameraDisabledBackgroundColor = Color(0xFF5E5C5C)
val cameraDisabledFrameColor = Color(0xFFFFFFFF)
val primaryButton = Color(0xFFFFFFFF)
val primaryButtonPressed = Color(0xFFFFFFFF)
val primaryButtonDisabled = Color(0xFFFFFFFF)
val secondaryButton = Color(0xFFFFFFFF)
val secondaryButtonPressed = Color(0xFFFFFFFF)
val secondaryButtonDisabled = Color(0xFFFFFFFF)
val tertiaryButton = Color.Transparent
val tertiaryButtonPressed = Color(0xFFFFFFFF)
val navigationButton = Color(0xFFFFFFFF)
val navigationButtonPressed = Color(0xFFFFFFFF)
val radioButtonColor = Color(0xFF070707)
val radioButtonTextColor = Color(0xFF4E4E4E)
val circularProgressBarSmall = Color(0xFF8B8A8A)
val circularProgressBarSmallDark = textBodyOnBackground
val circularProgressBarScreen = Color(0xFFFFFFFF)
val linearProgressBarTrack = Color(0xFFD9D9D9)
val linearProgressBarBackground = Light.complementaryColor
val linearProgressBarBackground = complementaryColor
val callout = Color(0xFFFFFFFF)
val onCallout = Color(0xFFFFFFFF)
@ -67,15 +66,19 @@ internal object Dark {
val overlay = Color(0x22000000)
val highlight = Color(0xFFFFD800)
val dangerous = Color(0xFFEC0008)
val onDangerous = Color(0xFFFFFFFF)
val reference = Color(0xFFFFFFFF)
val disabledButtonColor = Color(0xFFB7B7B7)
val disabledButtonTextColor = Color(0xFFDDDDDD)
val buttonShadowColor = Color(0xFFFFFFFF)
val historyBackgroundColor = Color(0xFFF6F6F6)
val historyRedColor = textFieldWarning
val historySyncingColor = panelBackgroundColor
val topAppBarColors = DarkTopAppBarColors()
val transparentTopAppBarColors = TransparentTopAppBarColors()
}
internal object Light {
@ -88,12 +91,15 @@ internal object Light {
val textSecondaryButton = Color(0xFF000000)
val textTertiaryButton = Color(0xFF000000)
val textCommon = Color(0xFF000000)
val textMedium = Color(0xFF353535)
val textDisabled = Color(0xFFB7B7B7)
val textFieldFrame = Color(0xFF231F20)
val textFieldError = Color(0xFFCD0002)
val textFieldWarning = Color(0xFFF40202)
val textFieldHint = Color(0xFFB7B7B7)
val textChipIndex = Color(0xFFEE8592)
val textDescription = Color(0xFF777777)
val textDescriptionDark = Color(0xFF4D4D4D)
val textProgress = Color(0xFF8B8A8A)
val screenTitleColor = Color(0xFF040404)
@ -105,23 +111,19 @@ internal object Light {
val tabTextColor = Color(0xFF040404)
val layoutStroke = Color(0xFF000000)
val panelBackgroundColor = Color(0xFFEAEAEA)
val cameraDisabledBackgroundColor = Color(0xFF5E5C5C)
val cameraDisabledFrameColor = Color(0xFFFFFFFF)
val primaryButton = Color(0xFF000000)
val primaryButtonPressed = Color(0xFF000000)
val primaryButtonDisabled = Color(0xFF000000)
val secondaryButton = Color(0xFFFFFFFF)
val secondaryButtonPressed = Color(0xFFFFFFFF)
val secondaryButtonDisabled = Color(0xFFFFFFFF)
val tertiaryButton = Color.Transparent
val tertiaryButtonPressed = Color(0xFFFFFFFF)
val navigationButton = Color(0xFFFFFFFF)
val navigationButtonPressed = Color(0xFFFFFFFF)
val radioButtonColor = Color(0xFF070707)
val radioButtonTextColor = Color(0xFF4E4E4E)
val circularProgressBarSmall = Color(0xFF8B8A8A)
val circularProgressBarScreen = Color(0xFF000000)
val circularProgressBarSmallDark = textBodyOnBackground
val linearProgressBarTrack = Color(0xFFD9D9D9)
val linearProgressBarBackground = complementaryColor
@ -131,14 +133,18 @@ internal object Light {
val overlay = Color(0x22000000)
val highlight = Color(0xFFFFD800)
val dangerous = Color(0xFFEC0008)
val onDangerous = Color(0xFFFFFFFF)
val reference = Color(0xFF000000)
val disabledButtonColor = Color(0xFFB7B7B7)
val disabledButtonTextColor = Color(0xFFDDDDDD)
val buttonShadowColor = Color(0xFF000000)
val historyBackgroundColor = Color(0xFFF6F6F6)
val historyRedColor = textFieldWarning
val historySyncingColor = Dark.panelBackgroundColor
val topAppBarColors = LightTopAppBarColors()
val transparentTopAppBarColors = TransparentTopAppBarColors()
}
internal val DarkColorPalette =
@ -174,22 +180,24 @@ internal val DarkExtendedColorPalette =
callout = Dark.callout,
onCallout = Dark.onCallout,
circularProgressBarSmall = Dark.circularProgressBarSmall,
circularProgressBarSmallDark = Dark.circularProgressBarSmallDark,
circularProgressBarScreen = Dark.circularProgressBarScreen,
linearProgressBarTrack = Dark.linearProgressBarTrack,
linearProgressBarBackground = Dark.linearProgressBarBackground,
chipIndex = Dark.textChipIndex,
textCommon = Dark.textCommon,
textMedium = Dark.textMedium,
textDisabled = Dark.textDisabled,
textFieldFrame = Dark.textFieldFrame,
textFieldError = Dark.textFieldError,
textFieldWarning = Dark.textFieldWarning,
textFieldHint = Dark.textFieldHint,
textDescription = Dark.textDescription,
textDescriptionDark = Dark.textDescriptionDark,
textPending = Dark.textProgress,
layoutStroke = Dark.layoutStroke,
overlay = Dark.overlay,
highlight = Dark.highlight,
dangerous = Dark.dangerous,
onDangerous = Dark.onDangerous,
disabledButtonTextColor = Dark.disabledButtonTextColor,
disabledButtonColor = Dark.disabledButtonColor,
reference = Dark.reference,
@ -202,6 +210,15 @@ internal val DarkExtendedColorPalette =
darkDividerColor = Dark.darkDividerColor,
tabTextColor = Dark.tabTextColor,
panelBackgroundColor = Dark.panelBackgroundColor,
cameraDisabledBackgroundColor = Dark.cameraDisabledBackgroundColor,
cameraDisabledFrameColor = Dark.cameraDisabledFrameColor,
radioButtonColor = Dark.radioButtonColor,
radioButtonTextColor = Dark.radioButtonTextColor,
historyBackgroundColor = Dark.historyBackgroundColor,
historyRedColor = Dark.historyRedColor,
historySyncingColor = Dark.historySyncingColor,
topAppBarColors = Dark.topAppBarColors,
transparentTopAppBarColors = Dark.transparentTopAppBarColors
)
internal val LightExtendedColorPalette =
@ -214,21 +231,23 @@ internal val LightExtendedColorPalette =
onCallout = Light.onCallout,
circularProgressBarScreen = Light.circularProgressBarScreen,
circularProgressBarSmall = Light.circularProgressBarSmall,
circularProgressBarSmallDark = Light.circularProgressBarSmallDark,
linearProgressBarTrack = Light.linearProgressBarTrack,
linearProgressBarBackground = Light.linearProgressBarBackground,
chipIndex = Light.textChipIndex,
textCommon = Light.textCommon,
textMedium = Light.textMedium,
textDisabled = Light.textDisabled,
textFieldFrame = Light.textFieldFrame,
textFieldError = Light.textFieldError,
textFieldWarning = Light.textFieldWarning,
textFieldHint = Light.textFieldHint,
textDescription = Light.textDescription,
textDescriptionDark = Light.textDescriptionDark,
textPending = Light.textProgress,
layoutStroke = Light.layoutStroke,
overlay = Light.overlay,
highlight = Light.highlight,
dangerous = Light.dangerous,
onDangerous = Light.onDangerous,
disabledButtonTextColor = Light.disabledButtonTextColor,
disabledButtonColor = Light.disabledButtonColor,
reference = Light.reference,
@ -241,6 +260,15 @@ internal val LightExtendedColorPalette =
darkDividerColor = Light.darkDividerColor,
tabTextColor = Light.tabTextColor,
panelBackgroundColor = Light.panelBackgroundColor,
cameraDisabledBackgroundColor = Light.cameraDisabledBackgroundColor,
cameraDisabledFrameColor = Light.cameraDisabledFrameColor,
radioButtonColor = Light.radioButtonColor,
radioButtonTextColor = Light.radioButtonTextColor,
historyBackgroundColor = Light.historyBackgroundColor,
historyRedColor = Light.historyRedColor,
historySyncingColor = Light.historySyncingColor,
topAppBarColors = Light.topAppBarColors,
transparentTopAppBarColors = Light.transparentTopAppBarColors
)
@Suppress("CompositionLocalAllowlist")
@ -255,21 +283,23 @@ internal val LocalExtendedColors =
onCallout = Color.Unspecified,
circularProgressBarScreen = Color.Unspecified,
circularProgressBarSmall = Color.Unspecified,
circularProgressBarSmallDark = Color.Unspecified,
linearProgressBarTrack = Color.Unspecified,
linearProgressBarBackground = Color.Unspecified,
chipIndex = Color.Unspecified,
textCommon = Color.Unspecified,
textMedium = Color.Unspecified,
textDisabled = Color.Unspecified,
textFieldHint = Color.Unspecified,
textFieldError = Color.Unspecified,
textFieldWarning = Color.Unspecified,
textFieldFrame = Color.Unspecified,
textDescription = Color.Unspecified,
textDescriptionDark = Color.Unspecified,
textPending = Color.Unspecified,
layoutStroke = Color.Unspecified,
overlay = Color.Unspecified,
highlight = Color.Unspecified,
dangerous = Color.Unspecified,
onDangerous = Color.Unspecified,
disabledButtonTextColor = Color.Unspecified,
disabledButtonColor = Color.Unspecified,
reference = Color.Unspecified,
@ -282,5 +312,14 @@ internal val LocalExtendedColors =
darkDividerColor = Color.Unspecified,
tabTextColor = Color.Unspecified,
panelBackgroundColor = Color.Unspecified,
cameraDisabledBackgroundColor = Color.Unspecified,
cameraDisabledFrameColor = Color.Unspecified,
radioButtonColor = Color.Unspecified,
radioButtonTextColor = Color.Unspecified,
historyBackgroundColor = Color.Unspecified,
historyRedColor = Color.Unspecified,
historySyncingColor = Color.Unspecified,
topAppBarColors = DefaultTopAppBarColors(),
transparentTopAppBarColors = DefaultTopAppBarColors(),
)
}

View File

@ -0,0 +1,62 @@
@file:Suppress("MagicNumber")
package co.electriccoin.zcash.ui.design.theme.internal
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Immutable
import androidx.compose.ui.graphics.Color
@Immutable
interface TopAppBarColors {
val containerColor: Color
val navigationColor: Color
val titleColor: Color
val subTitleColor: Color
val actionColor: Color
@OptIn(ExperimentalMaterial3Api::class)
fun toMaterialTopAppBarColors() =
androidx.compose.material3.TopAppBarColors(
containerColor = containerColor,
scrolledContainerColor = containerColor,
navigationIconContentColor = navigationColor,
titleContentColor = titleColor,
actionIconContentColor = actionColor
)
}
@Immutable
internal data class DefaultTopAppBarColors(
override val containerColor: Color = Color.Unspecified,
override val navigationColor: Color = Color.Unspecified,
override val titleColor: Color = Color.Unspecified,
override val subTitleColor: Color = Color.Unspecified,
override val actionColor: Color = Color.Unspecified,
) : TopAppBarColors
@Immutable
internal data class LightTopAppBarColors(
override val containerColor: Color = Color(0xFFFFFFFF),
override val navigationColor: Color = Color(0xFF000000),
override val titleColor: Color = Color(0xFF000000),
override val subTitleColor: Color = Color(0xFF8A8888),
override val actionColor: Color = Color(0xFF000000),
) : TopAppBarColors
@Immutable
internal data class DarkTopAppBarColors(
override val containerColor: Color = Color(0xFF000000),
override val navigationColor: Color = Color(0xFFFFFFFF),
override val titleColor: Color = Color(0xFFFFFFFF),
override val subTitleColor: Color = Color(0xFF8A8888),
override val actionColor: Color = Color(0xFFFFFFFF),
) : TopAppBarColors
@Immutable
internal data class TransparentTopAppBarColors(
override val containerColor: Color = Color(0x00000000),
override val navigationColor: Color = Color(0xFFFFFFFF),
override val titleColor: Color = Color(0xFFFFFFFF),
override val subTitleColor: Color = Color(0xFFFFFFFF),
override val actionColor: Color = Color(0xFFFFFFFF),
) : TopAppBarColors

View File

@ -6,10 +6,12 @@ import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.text.PlatformTextStyle
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.googlefonts.Font
import androidx.compose.ui.text.googlefonts.GoogleFont
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.sp
import co.electriccoin.zcash.ui.design.R
@ -102,8 +104,8 @@ internal val SecondaryTypography =
headlineSmall =
TextStyle(
fontFamily = ArchivoFontFamily,
fontWeight = FontWeight.SemiBold,
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
fontSize = 16.sp,
textAlign = TextAlign.Center
),
bodyLarge =
@ -152,9 +154,25 @@ data class BalanceSingleTextStyles(
val second: TextStyle,
)
@Immutable
data class TransactionItemTextStyles(
val titleRegular: TextStyle,
val titleRunning: TextStyle,
val titleFailed: TextStyle,
val addressCollapsed: TextStyle,
val valueFirstPart: TextStyle,
val valueSecondPart: TextStyle,
val content: TextStyle,
val contentItalic: TextStyle,
val contentMedium: TextStyle,
val contentUnderline: TextStyle,
val contentLineThrough: TextStyle,
val feeFirstPart: TextStyle,
val feeSecondPart: TextStyle,
)
@Immutable
data class ExtendedTypography(
val listItem: TextStyle,
// Grouping balances text styles to a wrapper class for BalanceWidget
val balanceWidgetStyles: BalanceWidgetTextStyles,
// Grouping balances text styles to a wrapper class for single balance use case
@ -165,11 +183,18 @@ data class ExtendedTypography(
val buttonTextSmall: TextStyle,
val checkboxText: TextStyle,
val securityWarningText: TextStyle,
val footnote: TextStyle,
val textFieldHint: TextStyle,
val textFieldValue: TextStyle,
val textFieldBirthday: TextStyle,
val textNavTab: TextStyle,
val referenceSmall: TextStyle,
val radioButton: TextStyle,
// Grouping transaction item text styles to a wrapper class
val transactionItemStyles: TransactionItemTextStyles,
val restoringTopAppBarStyle: TextStyle,
val deleteWalletWarnStyle: TextStyle,
val updateTitleStyle: TextStyle,
)
@Suppress("CompositionLocalAllowlist")
@ -185,10 +210,6 @@ val LocalTypographies =
val LocalExtendedTypography =
staticCompositionLocalOf {
ExtendedTypography(
listItem =
PrimaryTypography.bodyLarge.copy(
fontSize = 24.sp
),
// Note: the order here matters, be careful when reordering
balanceWidgetStyles =
BalanceWidgetTextStyles(
@ -229,19 +250,20 @@ val LocalExtendedTypography =
)
),
addressStyle =
SecondaryTypography.bodyLarge.copy(
// TODO [#1032]: Addresses can be shown with "×" symbols
// TODO [#1032]: https://github.com/Electric-Coin-Company/zashi-android/issues/1032
),
SecondaryTypography.bodyLarge.copy(),
aboutText =
PrimaryTypography.bodyLarge.copy(
fontSize = 14.sp,
lineHeight = 20.sp
),
buttonText = PrimaryTypography.bodySmall,
buttonText =
PrimaryTypography.bodyMedium.copy(
fontWeight = FontWeight.Medium
),
buttonTextSmall =
PrimaryTypography.bodySmall.copy(
fontSize = 11.sp
fontSize = 11.sp,
fontWeight = FontWeight.Medium
),
checkboxText =
PrimaryTypography.bodyMedium.copy(
@ -249,7 +271,13 @@ val LocalExtendedTypography =
),
securityWarningText =
PrimaryTypography.bodySmall.copy(
lineHeight = 22.32.sp
fontSize = 16.sp,
fontWeight = FontWeight.Medium
),
footnote =
PrimaryTypography.bodySmall.copy(
fontSize = 11.sp,
fontWeight = FontWeight.Medium
),
textFieldHint =
PrimaryTypography.bodySmall.copy(
@ -269,6 +297,91 @@ val LocalExtendedTypography =
referenceSmall =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp
),
radioButton =
PrimaryTypography.bodySmall.copy(
fontSize = 14.sp,
fontWeight = FontWeight.SemiBold
),
transactionItemStyles =
TransactionItemTextStyles(
titleRegular =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp,
fontWeight = FontWeight.Bold
),
titleRunning =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp,
fontWeight = FontWeight.ExtraBold,
fontStyle = FontStyle.Italic
),
titleFailed =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp,
fontWeight = FontWeight.ExtraBold,
textDecoration = TextDecoration.LineThrough
),
addressCollapsed =
SecondaryTypography.bodySmall.copy(
fontSize = 13.sp
),
valueFirstPart =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp
),
valueSecondPart =
PrimaryTypography.bodySmall.copy(
fontSize = 8.sp
),
content =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp
),
contentItalic =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp,
fontStyle = FontStyle.Italic
),
contentMedium =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp,
fontWeight = FontWeight.Medium
),
contentUnderline =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp,
fontStyle = FontStyle.Italic,
textDecoration = TextDecoration.Underline
),
contentLineThrough =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp,
textDecoration = TextDecoration.LineThrough
),
feeFirstPart =
PrimaryTypography.bodySmall.copy(
fontSize = 13.sp,
fontWeight = FontWeight.SemiBold
),
feeSecondPart =
PrimaryTypography.bodySmall.copy(
fontSize = 8.sp,
fontWeight = FontWeight.SemiBold
),
),
restoringTopAppBarStyle =
SecondaryTypography.labelMedium.copy(
fontSize = 12.sp,
fontWeight = FontWeight.SemiBold
),
deleteWalletWarnStyle =
PrimaryTypography.bodyLarge.copy(
fontWeight = FontWeight.Bold
),
updateTitleStyle =
PrimaryTypography.titleLarge.copy(
fontWeight = FontWeight.Bold
)
)
}

View File

@ -1,54 +1,60 @@
package co.electriccoin.zcash.ui.design.util
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.navigationBarsIgnoringVisibility
import androidx.compose.foundation.layout.statusBarsIgnoringVisibility
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import co.electriccoin.zcash.spackle.Twig
import kotlin.math.roundToInt
/**
* This operation performs calculation of the screen height together with remembering its result for a further calls.
* This operation performs calculation of the screen height.
*
* @param cacheKey The cache defining key. Use a different one for recalculation.
*
* @return Wrapper object of the calculated heights in density pixels.
* @return [ScreenHeight] a wrapper object of the calculated heights in density pixels.
*/
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun screenHeight(cacheKey: Any = true): ScreenHeight {
val density = LocalDensity.current
fun screenHeight(): ScreenHeight {
val configuration = LocalConfiguration.current
val statusBars = WindowInsets.statusBars
val navigationBars = WindowInsets.navigationBars
val cachedResult =
remember(cacheKey) {
val contentHeightPx = with(density) { configuration.screenHeightDp.dp.roundToPx() }
Twig.debug { "Screen content height in pixels: $contentHeightPx" }
val statusBars = WindowInsets.statusBarsIgnoringVisibility.asPaddingValues().calculateTopPadding()
Twig.debug { "Screen height: Status bar height raw: $statusBars" }
val statusBarHeight = statusBars.getTop(density).dp
Twig.debug { "Status bar height: $statusBarHeight" }
val navigationBars = WindowInsets.navigationBarsIgnoringVisibility.asPaddingValues().calculateBottomPadding()
Twig.debug { "Screen height: Navigation bar height raw: $navigationBars" }
val navigationBarHeight = navigationBars.getBottom(density).dp
Twig.debug { "Navigation bar height: $navigationBarHeight" }
val contentHeight = configuration.screenHeightDp.dp
Twig.debug { "Screen height: Screen content height: $contentHeight" }
val contentHeight = (contentHeightPx / density.density.roundToInt()).dp
Twig.debug { "Screen content height in dps: $contentHeight" }
ScreenHeight(
contentHeight = contentHeight,
systemStatusBarHeight = statusBarHeight,
systemNavigationBarHeight = navigationBarHeight,
)
val statusBarHeight =
statusBars.run {
if (value <= 0f) {
24.dp
} else {
this
}
}
Twig.debug { "Screen total height: $cachedResult" }
Twig.debug { "Screen height: Status bar height: $statusBarHeight" }
return cachedResult
val navigationBarHeight =
navigationBars.run {
if (value <= 0f) {
88.dp
} else {
this
}
}
Twig.debug { "Screen height: Navigation bar height: $navigationBarHeight" }
return ScreenHeight(
contentHeight = contentHeight,
systemStatusBarHeight = statusBarHeight,
systemNavigationBarHeight = navigationBarHeight
)
}
data class ScreenHeight(
@ -56,7 +62,15 @@ data class ScreenHeight(
val systemStatusBarHeight: Dp,
val systemNavigationBarHeight: Dp
) {
fun overallScreenHeight() = contentHeight + systemBarsHeight()
fun overallScreenHeight(): Dp {
return (contentHeight + systemBarsHeight()).also {
Twig.debug { "Screen height: Overall height: $it" }
}
}
fun systemBarsHeight() = systemStatusBarHeight + systemNavigationBarHeight
fun systemBarsHeight(): Dp {
return (systemStatusBarHeight + systemNavigationBarHeight).also {
Twig.debug { "Screen height: System bars height: $it" }
}
}
}

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="48"
android:viewportHeight="48">
<path
android:fillColor="@android:color/black"
android:pathData="M22.55,42V37.8Q19.7,37.3 17.875,35.625Q16.05,33.95 15.25,31.4L18.05,30.25Q18.9,32.65 20.5,33.825Q22.1,35 24.35,35Q26.75,35 28.3,33.8Q29.85,32.6 29.85,30.5Q29.85,28.3 28.475,27.1Q27.1,25.9 23.3,24.65Q19.7,23.5 17.925,21.6Q16.15,19.7 16.15,16.85Q16.15,14.1 17.925,12.25Q19.7,10.4 22.55,10.15V6H25.55V10.15Q27.8,10.4 29.425,11.625Q31.05,12.85 31.9,14.75L29.1,15.95Q28.4,14.35 27.225,13.625Q26.05,12.9 24.15,12.9Q21.85,12.9 20.5,13.95Q19.15,15 19.15,16.8Q19.15,18.7 20.65,19.875Q22.15,21.05 26.2,22.3Q29.6,23.35 31.225,25.325Q32.85,27.3 32.85,30.3Q32.85,33.45 31,35.375Q29.15,37.3 25.55,37.85V42Z"/>
</vector>

View File

@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="3.17dp"
android:height="5.57dp"
android:viewportWidth="3.17"
android:viewportHeight="5.57">
<path
android:pathData="M1.96,5.57l0,-0.75l1.21,0l0,-0.84l-1.96,0l1.62,-2.18l0.34,-0.44l0,0l0,-0.61l-1.21,0l0,-0.75l-0.75,0l0,0.75l-1.21,0l0,0.84l1.96,0l-1.62,2.12l-0.34,0.44l0,0.67l1.21,0l0,0.75l0.75,0z"
android:fillColor="#1d181a"/>
</vector>

View File

@ -57,6 +57,8 @@ android {
}
dependencies {
implementation(libs.zcash.sdk)
implementation(projects.uiLib)
implementation(projects.uiDesignLib)
implementation(projects.testLib)

View File

@ -2,9 +2,7 @@ package co.electriccoin.zcash.ui.integration.test.screen.scan.view
import androidx.compose.ui.test.assertHasClickAction
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertTextEquals
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
@ -14,6 +12,7 @@ import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.integration.test.common.IntegrationTestingActivity
import co.electriccoin.zcash.ui.integration.test.common.getPermissionPositiveButtonUiObject
import co.electriccoin.zcash.ui.integration.test.common.getStringResource
import co.electriccoin.zcash.ui.integration.test.common.getStringResourceWithArgs
import co.electriccoin.zcash.ui.integration.test.common.waitForDeviceIdle
import co.electriccoin.zcash.ui.screen.scan.ScanTag
import co.electriccoin.zcash.ui.screen.scan.model.ScanState
@ -71,21 +70,10 @@ class ScanViewTest : UiTestPrerequisites() {
testSetup.grantPermission()
composeTestRule.onNodeWithContentDescription(
getStringResource(R.string.scan_back_content_description)
).also {
composeTestRule.onNodeWithText(getStringResource(R.string.scan_cancel_button).uppercase()).also {
it.assertIsDisplayed()
}
composeTestRule.onNodeWithText(getStringResource(R.string.scan_hint)).also {
it.assertIsDisplayed()
}
composeTestRule.onNodeWithTag(ScanTag.TEXT_STATE).also {
it.assertIsDisplayed()
it.assertTextEquals(getStringResource(R.string.scan_state_scanning))
}
composeTestRule.onNodeWithTag(ScanTag.QR_FRAME).also {
it.assertIsDisplayed()
}
@ -109,23 +97,19 @@ class ScanViewTest : UiTestPrerequisites() {
assertEquals(ScanState.Permission, testSetup.getScanState())
composeTestRule.onNodeWithTag(ScanTag.QR_FRAME).also {
it.assertDoesNotExist()
}
composeTestRule.onNodeWithTag(ScanTag.CAMERA_VIEW).also {
it.assertDoesNotExist()
}
composeTestRule.onNodeWithText(getStringResource(R.string.scan_hint)).also {
composeTestRule.onNodeWithText(
getStringResourceWithArgs(
resId = R.string.scan_state_permission,
getStringResource(R.string.app_name)
)
).also {
it.assertIsDisplayed()
}
composeTestRule.onNodeWithTag(ScanTag.TEXT_STATE).also {
it.assertIsDisplayed()
it.assertTextEquals(getStringResource(R.string.scan_state_permission))
}
composeTestRule.onNodeWithText(getStringResource(R.string.scan_settings_button), ignoreCase = true).also {
it.assertIsDisplayed()
it.assertHasClickAction()

View File

@ -3,6 +3,8 @@ package co.electriccoin.zcash.ui.integration.test.screen.scan.view
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import cash.z.ecc.android.sdk.type.AddressType
import co.electriccoin.zcash.ui.common.model.WalletRestoringState
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.integration.test.common.getPermissionNegativeButtonUiObject
import co.electriccoin.zcash.ui.integration.test.common.getPermissionPositiveButtonUiObject
@ -56,7 +58,9 @@ class ScanViewTestSetup(
},
onScanStateChanged = {
scanState.set(it)
}
},
walletRestoringState = WalletRestoringState.NONE,
addressValidationResult = AddressType.Unified
)
}

View File

@ -7,6 +7,7 @@ import co.electriccoin.zcash.test.UiTestPrerequisites
import co.electriccoin.zcash.ui.fixture.UpdateInfoFixture
import co.electriccoin.zcash.ui.integration.test.common.IntegrationTestingActivity
import co.electriccoin.zcash.ui.screen.update.AppUpdateChecker
import co.electriccoin.zcash.ui.screen.update.AppUpdateCheckerMock
import co.electriccoin.zcash.ui.screen.update.model.UpdateInfo
import co.electriccoin.zcash.ui.screen.update.model.UpdateState
import co.electriccoin.zcash.ui.screen.update.viewmodel.UpdateViewModel

View File

@ -31,20 +31,23 @@ android {
res.setSrcDirs(
setOf(
"src/main/res/ui/about",
"src/main/res/ui/advanced_settings",
"src/main/res/ui/account",
"src/main/res/ui/authentication",
"src/main/res/ui/balances",
"src/main/res/ui/common",
"src/main/res/ui/delete_wallet",
"src/main/res/ui/export_data",
"src/main/res/ui/history",
"src/main/res/ui/home",
"src/main/res/ui/choose_server",
"src/main/res/ui/new_wallet_recovery",
"src/main/res/ui/onboarding",
"src/main/res/ui/receive",
"src/main/res/ui/request",
"src/main/res/ui/restore",
"src/main/res/ui/scan",
"src/main/res/ui/seed_recovery",
"src/main/res/ui/send",
"src/main/res/ui/send_confirmation",
"src/main/res/ui/settings",
"src/main/res/ui/support",
"src/main/res/ui/update",
@ -90,6 +93,7 @@ dependencies {
implementation(libs.androidx.lifecycle.livedata)
implementation(libs.androidx.splash)
implementation(libs.androidx.workmanager)
implementation(libs.bundles.androidx.biometric)
implementation(libs.bundles.androidx.camera)
implementation(libs.bundles.androidx.compose.core)
implementation(libs.bundles.androidx.compose.extended)

View File

@ -11,12 +11,10 @@ import org.junit.Test
import kotlin.test.assertTrue
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
import kotlin.time.ExperimentalTime
import kotlin.time.TimeMark
import kotlin.time.TimeSource
class FlowExtTest {
@OptIn(ExperimentalTime::class)
@Test
@SmallTest
fun throttle_one_sec() =
@ -40,7 +38,6 @@ class FlowExtTest {
}
}
@OptIn(ExperimentalTime::class)
private fun raceConditionTest(duration: Duration): Boolean =
runBlocking {
val flow = (0..1000).asFlow().throttle(duration)

View File

@ -11,8 +11,8 @@ import co.electriccoin.zcash.test.UiTestPrerequisites
import co.electriccoin.zcash.ui.common.compose.BrightenScreen
import co.electriccoin.zcash.ui.common.compose.LocalScreenBrightness
import co.electriccoin.zcash.ui.common.compose.ScreenBrightness
import co.electriccoin.zcash.ui.common.compose.ScreenBrightnessState
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.test.runTest
@ -20,7 +20,6 @@ import org.junit.Rule
import org.junit.Test
import kotlin.test.assertEquals
@OptIn(ExperimentalCoroutinesApi::class)
class ScreenBrightnessTest : UiTestPrerequisites() {
@get:Rule
val composeTestRule = createComposeRule()
@ -31,19 +30,19 @@ class ScreenBrightnessTest : UiTestPrerequisites() {
runTest {
val testSetup = TestSetup(composeTestRule)
assertEquals(1, testSetup.getSecureBrightnessCount())
assertEquals(ScreenBrightnessState.FULL, testSetup.getSecureBrightnessCount())
testSetup.mutableScreenBrightnessFlag.update { false }
composeTestRule.awaitIdle()
assertEquals(0, testSetup.getSecureBrightnessCount())
assertEquals(ScreenBrightnessState.NORMAL, testSetup.getSecureBrightnessCount())
}
private class TestSetup(composeTestRule: ComposeContentTestRule) {
val mutableScreenBrightnessFlag = MutableStateFlow(true)
private val screenBrightness = ScreenBrightness()
private val screenBrightness = ScreenBrightness
fun getSecureBrightnessCount() = screenBrightness.referenceCount.value
fun getSecureBrightnessCount() = screenBrightness.referenceSwitch.value
init {
runTest {

View File

@ -7,14 +7,18 @@ import cash.z.ecc.android.sdk.block.processor.CompactBlockProcessor
import cash.z.ecc.android.sdk.model.Account
import cash.z.ecc.android.sdk.model.BlockHeight
import cash.z.ecc.android.sdk.model.PercentDecimal
import cash.z.ecc.android.sdk.model.Proposal
import cash.z.ecc.android.sdk.model.TransactionOverview
import cash.z.ecc.android.sdk.model.TransactionRecipient
import cash.z.ecc.android.sdk.model.TransactionSubmitResult
import cash.z.ecc.android.sdk.model.UnifiedSpendingKey
import cash.z.ecc.android.sdk.model.WalletBalance
import cash.z.ecc.android.sdk.model.Zatoshi
import cash.z.ecc.android.sdk.model.ZcashNetwork
import cash.z.ecc.android.sdk.type.AddressType
import cash.z.ecc.android.sdk.type.ConsensusMatchType
import cash.z.ecc.android.sdk.type.ServerValidation
import co.electriccoin.lightwallet.client.model.LightWalletEndpoint
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
@ -78,6 +82,13 @@ internal class MockSynchronizer : CloseableSynchronizer {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} implementation.")
}
override suspend fun createProposedTransactions(
proposal: Proposal,
usk: UnifiedSpendingKey
): Flow<TransactionSubmitResult> {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} yet.")
}
override fun getMemos(transactionOverview: TransactionOverview): Flow<String> {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} implementation.")
}
@ -118,6 +129,24 @@ internal class MockSynchronizer : CloseableSynchronizer {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} implementation.")
}
override suspend fun proposeShielding(
account: Account,
shieldingThreshold: Zatoshi,
memo: String,
transparentReceiver: String?
): Proposal? {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} yet.")
}
override suspend fun proposeTransfer(
account: Account,
recipient: String,
amount: Zatoshi,
memo: String
): Proposal {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} yet.")
}
override suspend fun quickRewind() {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} implementation.")
}
@ -133,6 +162,13 @@ internal class MockSynchronizer : CloseableSynchronizer {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} implementation.")
}
@Deprecated(
"Upcoming SDK 2.1 will create multiple transactions at once for some recipients.",
replaceWith =
ReplaceWith(
"createProposedTransactions(proposeTransfer(usk.account, toAddress, amount, memo), usk)"
)
)
override suspend fun sendToAddress(
usk: UnifiedSpendingKey,
amount: Zatoshi,
@ -142,6 +178,13 @@ internal class MockSynchronizer : CloseableSynchronizer {
return 1
}
@Deprecated(
"Upcoming SDK 2.1 will create multiple transactions at once for some recipients.",
replaceWith =
ReplaceWith(
"proposeShielding(usk.account, shieldingThreshold, memo)?.let { createProposedTransactions(it, usk) }"
)
)
override suspend fun shieldFunds(
usk: UnifiedSpendingKey,
memo: String
@ -155,6 +198,13 @@ internal class MockSynchronizer : CloseableSynchronizer {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} implementation.")
}
override suspend fun validateServerEndpoint(
context: Context,
endpoint: LightWalletEndpoint
): ServerValidation {
error("Intentionally not implemented in ${MockSynchronizer::class.simpleName} implementation.")
}
override suspend fun getExistingDataDbFilePath(
context: Context,
network: ZcashNetwork,

View File

@ -1,33 +1,20 @@
package co.electriccoin.zcash.ui.fixture
import cash.z.ecc.android.sdk.fixture.WalletFixture
import cash.z.ecc.android.sdk.model.Zatoshi
import cash.z.ecc.android.sdk.model.ZcashNetwork
import cash.z.ecc.android.sdk.model.toZecString
import cash.z.ecc.android.sdk.type.AddressType
import cash.z.ecc.sdk.fixture.MemoFixture
import cash.z.ecc.sdk.fixture.ZatoshiFixture
import co.electriccoin.zcash.ui.screen.scan.model.ScanResult
import co.electriccoin.zcash.ui.screen.send.model.SendArgumentsWrapper
import co.electriccoin.zcash.ui.common.model.SerializableAddress
import co.electriccoin.zcash.ui.screen.send.model.SendArguments
internal object SendArgumentsWrapperFixture {
val RECIPIENT_ADDRESS =
ScanResult(
SerializableAddress(
address = WalletFixture.Alice.getAddresses(ZcashNetwork.Testnet).unified,
type = AddressType.Unified
)
val MEMO = MemoFixture.new("Thanks for lunch").value
val AMOUNT = ZatoshiFixture.new(1)
fun amountToFixtureZecString(amount: Zatoshi?) = amount?.toZecString()
fun new(
recipientAddress: ScanResult? = RECIPIENT_ADDRESS,
amount: Zatoshi? = AMOUNT,
memo: String? = MEMO
) = SendArgumentsWrapper(
recipientAddress = recipientAddress?.toRecipient(),
amount = amountToFixtureZecString(amount),
memo = memo
)
fun new(recipientAddress: SerializableAddress? = RECIPIENT_ADDRESS) =
SendArguments(
recipientAddress = recipientAddress?.toRecipient(),
)
}

View File

@ -1,4 +1,4 @@
package co.electriccoin.zcash.ui.screen.securitywarning.util
package co.electriccoin.zcash.ui.screen.about.util
import android.content.Intent
import androidx.test.filters.SmallTest

View File

@ -1,7 +1,9 @@
package co.electriccoin.zcash.ui.screen.about.view
import androidx.compose.material3.SnackbarHostState
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import co.electriccoin.zcash.ui.common.model.VersionInfo
import co.electriccoin.zcash.ui.common.model.WalletRestoringState
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.screen.support.model.ConfigInfo
import java.util.concurrent.atomic.AtomicInteger
@ -23,8 +25,11 @@ class AboutViewTestSetup(
ZcashTheme {
About(
onBack = { onBackCount.incrementAndGet() },
configInfo = configInfo,
onPrivacyPolicy = {},
snackbarHostState = SnackbarHostState(),
versionInfo = versionInfo,
configInfo = configInfo
walletRestoringState = WalletRestoringState.NONE
)
}
}

View File

@ -2,8 +2,13 @@ package co.electriccoin.zcash.ui.screen.account
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import co.electriccoin.zcash.ui.common.model.WalletRestoringState
import co.electriccoin.zcash.ui.common.model.WalletSnapshot
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.fixture.BalanceStateFixture
import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture
import co.electriccoin.zcash.ui.screen.account.history.fixture.TransactionHistoryUiStateFixture
import co.electriccoin.zcash.ui.screen.account.model.TransactionUiState
import co.electriccoin.zcash.ui.screen.account.view.Account
import java.util.concurrent.atomic.AtomicInteger
@ -11,10 +16,26 @@ class AccountTestSetup(
private val composeTestRule: ComposeContentTestRule,
private val walletSnapshot: WalletSnapshot,
) {
// TODO [#1282]: Update AccountView Tests #1282
// TODO [#1282]: https://github.com/Electric-Coin-Company/zashi-android/issues/1282
val initialTransactionState: TransactionUiState = TransactionHistoryUiStateFixture.new()
private val onSettingsCount = AtomicInteger(0)
private val onReceiveCount = AtomicInteger(0)
private val onSendCount = AtomicInteger(0)
private val onHistoryCount = AtomicInteger(0)
private val onItemClickCount = AtomicInteger(0)
private val onItemIdClickCount = AtomicInteger(0)
fun getOnItemClickCount(): Int {
composeTestRule.waitForIdle()
return onItemClickCount.get()
}
fun getOnItemIdClickCount(): Int {
composeTestRule.waitForIdle()
return onItemIdClickCount.get()
}
fun getOnSettingsCount(): Int {
composeTestRule.waitForIdle()
@ -31,11 +52,6 @@ class AccountTestSetup(
return onSendCount.get()
}
fun getOnHistoryCount(): Int {
composeTestRule.waitForIdle()
return onHistoryCount.get()
}
fun getWalletSnapshot(): WalletSnapshot {
composeTestRule.waitForIdle()
return walletSnapshot
@ -45,15 +61,17 @@ class AccountTestSetup(
@Suppress("TestFunctionName")
fun DefaultContent() {
Account(
walletSnapshot = walletSnapshot,
isKeepScreenOnWhileSyncing = false,
balanceState = BalanceStateFixture.new(),
goSettings = {
onSettingsCount.incrementAndGet()
},
goBalances = {},
goHistory = {
onHistoryCount.incrementAndGet()
transactionsUiState = initialTransactionState,
onTransactionItemAction = {
onItemClickCount.incrementAndGet()
},
walletRestoringState = WalletRestoringState.NONE,
walletSnapshot = WalletSnapshotFixture.new()
)
}

View File

@ -1,24 +1,20 @@
package co.electriccoin.zcash.ui.screen.history
package co.electriccoin.zcash.ui.screen.account.history
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import co.electriccoin.zcash.ui.common.model.WalletRestoringState
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.screen.history.state.TransactionHistorySyncState
import co.electriccoin.zcash.ui.screen.history.view.History
import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture
import co.electriccoin.zcash.ui.screen.account.model.TransactionUiState
import co.electriccoin.zcash.ui.screen.account.view.HistoryContainer
import java.util.concurrent.atomic.AtomicInteger
class HistoryTestSetup(
private val composeTestRule: ComposeContentTestRule,
initialHistorySyncState: TransactionHistorySyncState
initialHistoryUiState: TransactionUiState
) {
private val onBackClickCount = AtomicInteger(0)
private val onItemClickCount = AtomicInteger(0)
private val onItemIdClickCount = AtomicInteger(0)
fun getOnBackClickCount(): Int {
composeTestRule.waitForIdle()
return onBackClickCount.get()
}
fun getOnItemClickCount(): Int {
composeTestRule.waitForIdle()
return onItemClickCount.get()
@ -32,17 +28,13 @@ class HistoryTestSetup(
init {
composeTestRule.setContent {
ZcashTheme {
History(
transactionState = initialHistorySyncState,
onBack = {
onBackClickCount.incrementAndGet()
},
onItemClick = {
onItemClickCount.incrementAndGet()
},
onTransactionIdClick = {
HistoryContainer(
transactionState = initialHistoryUiState,
onTransactionItemAction = {
onItemIdClickCount.incrementAndGet()
}
},
walletRestoringState = WalletRestoringState.NONE,
walletSnapshot = WalletSnapshotFixture.new()
)
}
}

View File

@ -0,0 +1,47 @@
package co.electriccoin.zcash.ui.screen.account.history.fixture
import cash.z.ecc.android.sdk.fixture.TransactionOverviewFixture
import cash.z.ecc.android.sdk.model.Account
import cash.z.ecc.android.sdk.model.TransactionRecipient
import cash.z.ecc.android.sdk.type.AddressType
import co.electriccoin.zcash.ui.screen.account.ext.TransactionOverviewExt
import co.electriccoin.zcash.ui.screen.account.state.TransactionHistorySyncState
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
internal object TransactionHistorySyncStateFixture {
val TRANSACTIONS =
persistentListOf(
TransactionOverviewExt(
TransactionOverviewFixture.new(),
TransactionRecipient.Account(Account.DEFAULT),
AddressType.Shielded
),
TransactionOverviewExt(
TransactionOverviewFixture.new(),
TransactionRecipient.Account(Account(1)),
AddressType.Transparent
),
TransactionOverviewExt(
TransactionOverviewFixture.new(),
null,
AddressType.Unified
),
)
val STATE = TransactionHistorySyncState.Syncing(TRANSACTIONS)
fun new(
transactions: ImmutableList<TransactionOverviewExt> = TRANSACTIONS,
state: TransactionHistorySyncState = STATE
) = when (state) {
is TransactionHistorySyncState.Syncing -> {
state.copy(transactions)
}
is TransactionHistorySyncState.Done -> {
state.copy(transactions)
}
TransactionHistorySyncState.Loading -> {
state
}
}
}

View File

@ -0,0 +1,22 @@
package co.electriccoin.zcash.ui.screen.account.history.fixture
import co.electriccoin.zcash.ui.screen.account.fixture.TransactionsFixture
import co.electriccoin.zcash.ui.screen.account.model.TransactionUi
import co.electriccoin.zcash.ui.screen.account.model.TransactionUiState
import kotlinx.collections.immutable.ImmutableList
internal object TransactionHistoryUiStateFixture {
val TRANSACTIONS = TransactionsFixture.new()
val STATE = TransactionUiState.Done(TRANSACTIONS)
fun new(
transactions: ImmutableList<TransactionUi> = TRANSACTIONS,
state: TransactionUiState = STATE
) = when (state) {
is TransactionUiState.Loading -> state
is TransactionUiState.Syncing -> state.copy(transactions)
is TransactionUiState.Done -> state.copy(transactions)
TransactionUiState.DoneEmpty -> state
TransactionUiState.SyncingEmpty -> state
}
}

View File

@ -1,26 +1,25 @@
package co.electriccoin.zcash.ui.screen.history.view
package co.electriccoin.zcash.ui.screen.account.history.view
import androidx.compose.ui.test.assertCountEquals
import androidx.compose.ui.test.assertHeightIsAtLeast
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onAllNodesWithTag
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.unit.dp
import androidx.test.filters.MediumTest
import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.screen.history.HistoryTag
import co.electriccoin.zcash.ui.screen.history.HistoryTestSetup
import co.electriccoin.zcash.ui.screen.history.fixture.TransactionHistorySyncStateFixture
import co.electriccoin.zcash.ui.screen.history.state.TransactionHistorySyncState
import co.electriccoin.zcash.ui.test.getStringResource
import co.electriccoin.zcash.ui.screen.account.HistoryTag
import co.electriccoin.zcash.ui.screen.account.history.HistoryTestSetup
import co.electriccoin.zcash.ui.screen.account.history.fixture.TransactionHistorySyncStateFixture
import co.electriccoin.zcash.ui.screen.account.history.fixture.TransactionHistoryUiStateFixture
import co.electriccoin.zcash.ui.screen.account.model.TransactionUiState
import kotlinx.collections.immutable.persistentListOf
import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
import kotlin.test.Ignore
import kotlin.test.Test
@Ignore("Disabled because of #1160. Will be resolved as part of #1282.")
class HistoryViewTest {
@get:Rule
val composeTestRule = createComposeRule()
@ -28,7 +27,7 @@ class HistoryViewTest {
@Test
@MediumTest
fun check_loading_state() {
newTestSetup(TransactionHistorySyncState.Loading)
newTestSetup(TransactionUiState.Loading)
composeTestRule.onNodeWithTag(HistoryTag.PROGRESS).also {
it.assertExists()
@ -39,15 +38,15 @@ class HistoryViewTest {
@MediumTest
fun check_syncing_state() {
newTestSetup(
TransactionHistorySyncStateFixture.new(
state = TransactionHistorySyncStateFixture.STATE,
transactions = TransactionHistorySyncStateFixture.TRANSACTIONS
TransactionHistoryUiStateFixture.new(
state = TransactionUiState.Syncing(persistentListOf()),
transactions = TransactionHistoryUiStateFixture.TRANSACTIONS
)
)
composeTestRule.onNodeWithText(getStringResource(R.string.history_syncing)).also {
it.assertExists()
}
// composeTestRule.onNodeWithText(getStringResource(R.string.history_syncing)).also {
// it.assertExists()
// }
// No progress bar, as we have some transactions laid out
composeTestRule.onNodeWithTag(HistoryTag.PROGRESS).also {
it.assertDoesNotExist()
@ -62,37 +61,37 @@ class HistoryViewTest {
@MediumTest
fun check_done_state_no_transactions() {
newTestSetup(
TransactionHistorySyncStateFixture.new(
state = TransactionHistorySyncState.Done(persistentListOf()),
transactions = persistentListOf()
TransactionHistoryUiStateFixture.new(
state = TransactionUiState.Syncing(persistentListOf()),
transactions = TransactionHistoryUiStateFixture.TRANSACTIONS
)
)
composeTestRule.onNodeWithText(getStringResource(R.string.history_syncing)).also {
it.assertDoesNotExist()
}
// composeTestRule.onNodeWithText(getStringResource(R.string.history_syncing)).also {
// it.assertDoesNotExist()
// }
composeTestRule.onNodeWithTag(HistoryTag.PROGRESS).also {
it.assertDoesNotExist()
}
composeTestRule.onNodeWithTag(HistoryTag.TRANSACTION_LIST).also {
it.assertDoesNotExist()
}
composeTestRule.onNodeWithText(getStringResource(R.string.history_empty)).also {
it.assertExists()
}
// composeTestRule.onNodeWithText(getStringResource(R.string.history_empty)).also {
// it.assertExists()
// }
}
@Test
@MediumTest
fun check_done_state_with_transactions() {
newTestSetup(
TransactionHistorySyncStateFixture.new(
state = TransactionHistorySyncState.Done(persistentListOf()),
transactions = TransactionHistorySyncStateFixture.TRANSACTIONS
TransactionHistoryUiStateFixture.new(
state = TransactionUiState.Syncing(persistentListOf()),
transactions = TransactionHistoryUiStateFixture.TRANSACTIONS
)
)
composeTestRule.onNodeWithText(getStringResource(R.string.history_syncing)).also {
it.assertDoesNotExist()
}
// composeTestRule.onNodeWithText(getStringResource(R.string.history_syncing)).also {
// it.assertDoesNotExist()
// }
composeTestRule.onNodeWithTag(HistoryTag.PROGRESS).also {
it.assertDoesNotExist()
}
@ -100,35 +99,19 @@ class HistoryViewTest {
it.assertExists()
it.assertHeightIsAtLeast(1.dp)
}
composeTestRule.onNodeWithText(getStringResource(R.string.history_empty)).also {
it.assertDoesNotExist()
}
}
@Test
@MediumTest
fun back_click_test() {
val testSetup = newTestSetup()
assertEquals(0, testSetup.getOnBackClickCount())
composeTestRule.onNodeWithContentDescription(
getStringResource(R.string.history_back_content_description)
).also {
it.performClick()
}
assertEquals(1, testSetup.getOnBackClickCount())
// composeTestRule.onNodeWithText(getStringResource(R.string.history_empty)).also {
// it.assertDoesNotExist()
// }
}
@Test
@MediumTest
fun item_click_test() {
val testSetup = newTestSetup(TransactionHistorySyncStateFixture.STATE)
val testSetup = newTestSetup(TransactionHistoryUiStateFixture.STATE)
assertEquals(0, testSetup.getOnItemClickCount())
composeTestRule.onAllNodesWithTag(HistoryTag.TRANSACTION_ITEM, useUnmergedTree = true).also {
composeTestRule.onAllNodesWithTag(HistoryTag.TRANSACTION_ITEM_TITLE, useUnmergedTree = true).also {
it.assertCountEquals(TransactionHistorySyncStateFixture.TRANSACTIONS.size)
TransactionHistorySyncStateFixture.TRANSACTIONS.forEachIndexed { index, _ ->
@ -142,7 +125,7 @@ class HistoryViewTest {
@Test
@MediumTest
fun transaction_id_click_test() {
val testSetup = newTestSetup(TransactionHistorySyncStateFixture.STATE)
val testSetup = newTestSetup(TransactionHistoryUiStateFixture.STATE)
assertEquals(0, testSetup.getOnItemIdClickCount())
@ -157,12 +140,10 @@ class HistoryViewTest {
assertEquals(TransactionHistorySyncStateFixture.TRANSACTIONS.size, testSetup.getOnItemIdClickCount())
}
private fun newTestSetup(
transactionHistorySyncState: TransactionHistorySyncState = TransactionHistorySyncStateFixture.new()
): HistoryTestSetup {
private fun newTestSetup(state: TransactionUiState = TransactionHistoryUiStateFixture.new()): HistoryTestSetup {
return HistoryTestSetup(
composeTestRule = composeTestRule,
initialHistorySyncState = transactionHistorySyncState
initialHistoryUiState = state
)
}
}

View File

@ -1,22 +1,16 @@
package co.electriccoin.zcash.ui.screen.account.view
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import androidx.test.filters.MediumTest
import co.electriccoin.zcash.test.UiTestPrerequisites
import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.common.model.WalletSnapshot
import co.electriccoin.zcash.ui.design.component.CommonTag
import co.electriccoin.zcash.ui.fixture.WalletSnapshotFixture
import co.electriccoin.zcash.ui.screen.account.AccountTag
import co.electriccoin.zcash.ui.screen.account.AccountTestSetup
import co.electriccoin.zcash.ui.screen.send.clickSettingsTopAppBarMenu
import co.electriccoin.zcash.ui.test.getStringResource
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
@ -41,22 +35,6 @@ class AccountViewTest : UiTestPrerequisites() {
composeTestRule.onNodeWithTag(AccountTag.BALANCE_VIEWS).also {
it.assertIsDisplayed()
}
composeTestRule.onNodeWithText(getStringResource(R.string.account_button_history), ignoreCase = true).also {
it.assertIsDisplayed()
}
}
@Test
@MediumTest
fun click_history_button() {
val testSetup = newTestSetup()
Assert.assertEquals(0, testSetup.getOnHistoryCount())
composeTestRule.clickHistory()
Assert.assertEquals(1, testSetup.getOnHistoryCount())
}
@Test
@ -79,10 +57,3 @@ class AccountViewTest : UiTestPrerequisites() {
setDefaultContent()
}
}
private fun ComposeContentTestRule.clickHistory() {
onNodeWithText(getStringResource(R.string.home_button_history), ignoreCase = true).also {
it.performScrollTo()
it.performClick()
}
}

View File

@ -2,8 +2,10 @@ package co.electriccoin.zcash.ui.screen.balances
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import co.electriccoin.zcash.ui.common.model.WalletRestoringState
import co.electriccoin.zcash.ui.common.model.WalletSnapshot
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.fixture.BalanceStateFixture
import co.electriccoin.zcash.ui.screen.balances.model.ShieldState
import co.electriccoin.zcash.ui.screen.balances.view.Balances
import java.util.concurrent.atomic.AtomicInteger
@ -29,15 +31,19 @@ class BalancesTestSetup(
@Suppress("TestFunctionName")
fun DefaultContent() {
Balances(
balanceState = BalanceStateFixture.new(),
onSettings = {
onSettingsCount.incrementAndGet()
},
isDetailedStatus = false,
isFiatConversionEnabled = isShowFiatConversion,
isKeepScreenOnWhileSyncing = false,
isUpdateAvailable = false,
walletSnapshot = walletSnapshot,
isShowingErrorDialog = false,
setShowErrorDialog = {},
onShielding = {},
shieldState = ShieldState.Available
shieldState = ShieldState.Available,
walletSnapshot = walletSnapshot,
walletRestoringState = WalletRestoringState.NONE,
)
}

View File

@ -29,9 +29,10 @@ class WalletDisplayValuesTest {
)
val values =
WalletDisplayValues.getNextValues(
getAppContext(),
walletSnapshot,
false
context = getAppContext(),
walletSnapshot = walletSnapshot,
isUpdateAvailable = false,
isDetailedStatus = false
)
assertNotNull(values)

View File

@ -3,6 +3,7 @@ package co.electriccoin.zcash.ui.screen.exportdata.view
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import co.electriccoin.zcash.ui.common.model.WalletRestoringState
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
@ -33,7 +34,7 @@ class ExportPrivateDataViewTestSetup(private val composeTestRule: ComposeContent
@Suppress("TestFunctionName")
fun DefaultContent() {
ExportPrivateData(
SnackbarHostState(),
snackbarHostState = SnackbarHostState(),
onBack = {
onBackCount.incrementAndGet()
},
@ -42,7 +43,8 @@ class ExportPrivateDataViewTestSetup(private val composeTestRule: ComposeContent
},
onConfirm = {
onConfirmCount.incrementAndGet()
}
},
walletRestoringState = WalletRestoringState.NONE
)
}

View File

@ -1,32 +0,0 @@
package co.electriccoin.zcash.ui.screen.history.fixture
import cash.z.ecc.android.sdk.fixture.TransactionOverviewFixture
import cash.z.ecc.android.sdk.model.TransactionOverview
import co.electriccoin.zcash.ui.screen.history.state.TransactionHistorySyncState
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
internal object TransactionHistorySyncStateFixture {
val TRANSACTIONS =
persistentListOf(
TransactionOverviewFixture.new(),
TransactionOverviewFixture.new(),
TransactionOverviewFixture.new()
)
val STATE = TransactionHistorySyncState.Syncing(TRANSACTIONS)
fun new(
transactions: ImmutableList<TransactionOverview> = TRANSACTIONS,
state: TransactionHistorySyncState = STATE
) = when (state) {
is TransactionHistorySyncState.Syncing -> {
state.copy(transactions)
}
is TransactionHistorySyncState.Done -> {
state.copy(transactions)
}
TransactionHistorySyncState.Loading -> {
state
}
}
}

View File

@ -3,23 +3,18 @@ package co.electriccoin.zcash.ui.screen.newwalletrecovery.view
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import cash.z.ecc.sdk.fixture.PersistableWalletFixture
import co.electriccoin.zcash.ui.common.model.VersionInfo
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import java.util.concurrent.atomic.AtomicInteger
class NewWalletRecoveryTestSetup(
private val composeTestRule: ComposeContentTestRule,
private val versionInfo: VersionInfo,
) {
private val onSeedCopyCount = AtomicInteger(0)
private val onBirthdayCopyCount = AtomicInteger(0)
private val onCompleteCallbackCount = AtomicInteger(0)
fun getOnSeedCopyCount(): Int {
composeTestRule.waitForIdle()
return onSeedCopyCount.get()
}
fun getOnBirthdayCopyCount(): Int {
composeTestRule.waitForIdle()
return onBirthdayCopyCount.get()
@ -36,9 +31,10 @@ class NewWalletRecoveryTestSetup(
ZcashTheme {
NewWalletRecovery(
PersistableWalletFixture.new(),
onSeedCopy = { onSeedCopyCount.incrementAndGet() },
onSeedCopy = { /* Not tested - debug mode feature only */ },
onBirthdayCopy = { onBirthdayCopyCount.incrementAndGet() },
onComplete = { onCompleteCallbackCount.incrementAndGet() },
versionInfo = versionInfo,
)
}
}

View File

@ -11,6 +11,7 @@ import co.electriccoin.zcash.test.UiTestPrerequisites
import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.common.test.CommonTag.WALLET_BIRTHDAY
import co.electriccoin.zcash.ui.design.component.CommonTag
import co.electriccoin.zcash.ui.fixture.VersionInfoFixture
import co.electriccoin.zcash.ui.test.getStringResource
import org.junit.Rule
import kotlin.test.Test
@ -21,7 +22,10 @@ class NewWalletRecoveryViewTest : UiTestPrerequisites() {
val composeTestRule = createComposeRule()
private fun newTestSetup(): NewWalletRecoveryTestSetup {
return NewWalletRecoveryTestSetup(composeTestRule).apply {
return NewWalletRecoveryTestSetup(
composeTestRule,
VersionInfoFixture.new()
).apply {
setDefaultContent()
}
}
@ -31,14 +35,9 @@ class NewWalletRecoveryViewTest : UiTestPrerequisites() {
fun default_ui_state_test() {
val testSetup = newTestSetup()
assertEquals(0, testSetup.getOnSeedCopyCount())
assertEquals(0, testSetup.getOnBirthdayCopyCount())
assertEquals(0, testSetup.getOnCompleteCount())
composeTestRule.onNodeWithText(getStringResource(R.string.new_wallet_recovery_copy)).also {
it.assertExists()
}
composeTestRule.onNodeWithContentDescription(
label = getStringResource(R.string.zcash_logo_content_description)
).also {
@ -69,40 +68,10 @@ class NewWalletRecoveryViewTest : UiTestPrerequisites() {
it.assertExists()
}
assertEquals(0, testSetup.getOnSeedCopyCount())
assertEquals(0, testSetup.getOnBirthdayCopyCount())
assertEquals(0, testSetup.getOnCompleteCount())
}
@Test
@MediumTest
fun copy_seed_to_clipboard_from_app_bar_test() {
val testSetup = newTestSetup()
assertEquals(0, testSetup.getOnSeedCopyCount())
composeTestRule.onNodeWithText(getStringResource(R.string.new_wallet_recovery_copy)).also { menuButton ->
menuButton.performClick()
}
assertEquals(1, testSetup.getOnSeedCopyCount())
}
@Test
@MediumTest
fun copy_seed_to_clipboard_content_test() {
val testSetup = newTestSetup()
assertEquals(0, testSetup.getOnSeedCopyCount())
composeTestRule.onNodeWithTag(CommonTag.CHIP_LAYOUT).also {
it.performScrollTo()
it.performClick()
}
assertEquals(1, testSetup.getOnSeedCopyCount())
}
@Test
@MediumTest
fun copy_birthday_to_clipboard_content_test() {
@ -123,7 +92,6 @@ class NewWalletRecoveryViewTest : UiTestPrerequisites() {
fun click_finish_test() {
val testSetup = newTestSetup()
assertEquals(0, testSetup.getOnSeedCopyCount())
assertEquals(0, testSetup.getOnBirthdayCopyCount())
assertEquals(0, testSetup.getOnCompleteCount())
@ -135,7 +103,6 @@ class NewWalletRecoveryViewTest : UiTestPrerequisites() {
it.performClick()
}
assertEquals(0, testSetup.getOnSeedCopyCount())
assertEquals(0, testSetup.getOnBirthdayCopyCount())
assertEquals(1, testSetup.getOnCompleteCount())
}

View File

@ -9,6 +9,7 @@ import co.electriccoin.zcash.test.UiTestPrerequisites
import co.electriccoin.zcash.ui.common.compose.LocalScreenSecurity
import co.electriccoin.zcash.ui.common.compose.ScreenSecurity
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.fixture.VersionInfoFixture
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
@ -45,7 +46,8 @@ class NewWalletRecoveryViewsSecuredScreenTest : UiTestPrerequisites() {
PersistableWalletFixture.new(),
onSeedCopy = {},
onBirthdayCopy = {},
onComplete = {}
onComplete = {},
versionInfo = VersionInfoFixture.new()
)
}
}

View File

@ -3,7 +3,7 @@ package co.electriccoin.zcash.ui.screen.onboarding
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.screen.onboarding.view.ShortOnboarding
import co.electriccoin.zcash.ui.screen.onboarding.view.Onboarding
import java.util.concurrent.atomic.AtomicInteger
class OnboardingTestSetup(
@ -26,9 +26,7 @@ class OnboardingTestSetup(
@Suppress("TestFunctionName")
fun DefaultContent() {
ZcashTheme {
ShortOnboarding(
// It's fine to test the screen UI after the welcome animation
showWelcomeAnim = false,
Onboarding(
// Debug only UI state does not need to be tested
isDebugMenuEnabled = false,
onImportWallet = { onImportWalletCallbackCount.incrementAndGet() },

View File

@ -13,6 +13,7 @@ import co.electriccoin.zcash.ui.test.getStringResource
import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test
import kotlin.test.Ignore
class OnboardingViewTest : UiTestPrerequisites() {
@get:Rule
@ -66,6 +67,7 @@ class OnboardingViewTest : UiTestPrerequisites() {
@Test
@MediumTest
@Ignore("Disabling this until [SemanticNodeInteraction.performScrollTo] works as expected")
fun click_import_wallet() {
val testSetup = newTestSetup()

View File

@ -5,6 +5,7 @@ import androidx.test.filters.MediumTest
import cash.z.ecc.android.sdk.fixture.WalletAddressesFixture
import cash.z.ecc.android.sdk.model.WalletAddresses
import co.electriccoin.zcash.test.UiTestPrerequisites
import co.electriccoin.zcash.ui.common.compose.ScreenBrightnessState
import co.electriccoin.zcash.ui.common.model.VersionInfo
import co.electriccoin.zcash.ui.fixture.VersionInfoFixture
import kotlinx.coroutines.test.runTest
@ -27,7 +28,7 @@ class ReceiveViewScreenBrightnessTest : UiTestPrerequisites() {
VersionInfoFixture.new(isDebuggable = true)
)
assertEquals(0, testSetup.getScreenBrightnessCount())
assertEquals(ScreenBrightnessState.NORMAL, testSetup.getScreenBrightness())
}
@Test
@ -41,13 +42,11 @@ class ReceiveViewScreenBrightnessTest : UiTestPrerequisites() {
VersionInfoFixture.new(isDebuggable = true)
)
assertEquals(false, testSetup.getOnAdjustBrightness())
assertEquals(0, testSetup.getScreenBrightnessCount())
assertEquals(ScreenBrightnessState.NORMAL, testSetup.getOnAdjustBrightness())
composeTestRule.clickAdjustBrightness()
assertEquals(true, testSetup.getOnAdjustBrightness())
assertEquals(1, testSetup.getScreenBrightnessCount())
assertEquals(ScreenBrightnessState.FULL, testSetup.getOnAdjustBrightness())
}
private fun newTestSetup(

View File

@ -40,12 +40,10 @@ class ReceiveViewScreenTimeoutTest : UiTestPrerequisites() {
VersionInfoFixture.new(isDebuggable = true)
)
assertEquals(false, testSetup.getOnAdjustBrightness())
assertEquals(0, testSetup.getScreenTimeoutCount())
composeTestRule.clickAdjustBrightness()
assertEquals(true, testSetup.getOnAdjustBrightness())
assertEquals(1, testSetup.getScreenTimeoutCount())
}

View File

@ -10,12 +10,13 @@ import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.common.compose.LocalScreenBrightness
import co.electriccoin.zcash.ui.common.compose.LocalScreenTimeout
import co.electriccoin.zcash.ui.common.compose.ScreenBrightness
import co.electriccoin.zcash.ui.common.compose.ScreenBrightnessState
import co.electriccoin.zcash.ui.common.compose.ScreenTimeout
import co.electriccoin.zcash.ui.common.model.VersionInfo
import co.electriccoin.zcash.ui.common.model.WalletRestoringState
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.fixture.VersionInfoFixture
import co.electriccoin.zcash.ui.test.getStringResource
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
class ReceiveViewTestSetup(
@ -25,17 +26,17 @@ class ReceiveViewTestSetup(
) {
private val onSettingsCount = AtomicInteger(0)
private val onAddressDetailsCount = AtomicInteger(0)
private val screenBrightness = ScreenBrightness()
private val screenBrightness = ScreenBrightness
private val screenTimeout = ScreenTimeout()
private val onAdjustBrightness = AtomicBoolean(false)
private var onAdjustBrightness: ScreenBrightnessState = ScreenBrightnessState.NORMAL
fun getScreenBrightnessCount() = screenBrightness.referenceCount.value
fun getScreenBrightness() = screenBrightness.referenceSwitch.value
fun getScreenTimeoutCount() = screenTimeout.referenceCount.value
fun getOnAdjustBrightness(): Boolean {
fun getOnAdjustBrightness(): ScreenBrightnessState {
composeTestRule.waitForIdle()
return onAdjustBrightness.get()
return onAdjustBrightness
}
fun getOnSettingsCount(): Int {
@ -63,11 +64,14 @@ class ReceiveViewTestSetup(
onSettingsCount.getAndIncrement()
},
onAdjustBrightness = {
onAdjustBrightness.getAndSet(it)
onAdjustBrightness = onAdjustBrightness.getChange()
screenTimeout.disableScreenTimeout()
},
onAddrCopyToClipboard = {},
onQrImageShare = {},
versionInfo = versionInfo
screenBrightnessState = ScreenBrightnessState.NORMAL,
versionInfo = versionInfo,
walletRestoringState = WalletRestoringState.NONE
)
}
}

View File

@ -1,294 +0,0 @@
package co.electriccoin.zcash.ui.screen.request.view
import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performTextClearance
import androidx.compose.ui.test.performTextInput
import androidx.test.filters.MediumTest
import cash.z.ecc.android.sdk.fixture.WalletAddressFixture
import cash.z.ecc.android.sdk.model.MonetarySeparators
import cash.z.ecc.android.sdk.model.Zatoshi
import cash.z.ecc.sdk.fixture.ZecRequestFixture
import cash.z.ecc.sdk.model.ZecRequest
import cash.z.ecc.sdk.model.ZecRequestMessage
import co.electriccoin.zcash.test.UiTestPrerequisites
import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.test.getStringResource
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
import java.util.concurrent.atomic.AtomicInteger
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
class RequestViewTest : UiTestPrerequisites() {
@get:Rule
val composeTestRule = createComposeRule()
@Test
@MediumTest
fun create_button_disabled() {
@Suppress("UNUSED_VARIABLE")
val testSetup = TestSetup(composeTestRule)
composeTestRule.assertSendDisabled()
}
@Test
@MediumTest
@OptIn(ExperimentalCoroutinesApi::class)
fun create_request_no_message() =
runTest {
val testSetup = TestSetup(composeTestRule)
assertEquals(0, testSetup.getOnCreateCount())
assertEquals(null, testSetup.getLastCreateZecRequest())
composeTestRule.setValidAmount()
composeTestRule.clickCreateAndSend()
assertEquals(1, testSetup.getOnCreateCount())
testSetup.getLastCreateZecRequest().also {
assertNotNull(it)
assertEquals(WalletAddressFixture.unified(), it.address)
assertEquals(Zatoshi(12345600000), it.amount)
assertTrue(it.message.value.isEmpty())
}
}
@Test
@MediumTest
@OptIn(ExperimentalCoroutinesApi::class)
fun create_request_with_message() =
runTest {
val testSetup = TestSetup(composeTestRule)
assertEquals(0, testSetup.getOnCreateCount())
assertEquals(null, testSetup.getLastCreateZecRequest())
composeTestRule.setValidAmount()
composeTestRule.setValidMessage()
composeTestRule.clickCreateAndSend()
assertEquals(1, testSetup.getOnCreateCount())
testSetup.getLastCreateZecRequest().also {
assertNotNull(it)
assertEquals(WalletAddressFixture.unified(), it.address)
assertEquals(Zatoshi(12345600000), it.amount)
assertEquals(ZecRequestFixture.MESSAGE.value, it.message.value)
}
}
@Test
@MediumTest
fun check_regex_functionality_valid_inputs() {
val testSetup = TestSetup(composeTestRule)
val separators = MonetarySeparators.current()
assertEquals(0, testSetup.getOnCreateCount())
assertEquals(null, testSetup.getLastCreateZecRequest())
composeTestRule.setAmount("123")
composeTestRule.clickCreateAndSend()
assertEquals(1, testSetup.getOnCreateCount())
// e.g. 123,456
composeTestRule.setAmount("123${separators.grouping}456")
composeTestRule.clickCreateAndSend()
assertEquals(2, testSetup.getOnCreateCount())
// e.g. 123.
composeTestRule.setAmount("123${separators.decimal}")
composeTestRule.clickCreateAndSend()
assertEquals(3, testSetup.getOnCreateCount())
// e.g. 123,456.
composeTestRule.setAmount("123${separators.grouping}456${separators.decimal}")
composeTestRule.clickCreateAndSend()
assertEquals(4, testSetup.getOnCreateCount())
// e.g. 123,456.789
composeTestRule.setAmount("123${separators.grouping}456${separators.decimal}789")
composeTestRule.clickCreateAndSend()
assertEquals(5, testSetup.getOnCreateCount())
}
@Test
@MediumTest
fun check_regex_functionality_invalid_inputs() {
val testSetup = TestSetup(composeTestRule)
val separators = MonetarySeparators.current()
assertEquals(0, testSetup.getOnCreateCount())
assertEquals(null, testSetup.getLastCreateZecRequest())
composeTestRule.setAmount("aaa")
composeTestRule.clickCreateAndSend()
assertEquals(0, testSetup.getOnCreateCount())
composeTestRule.setAmount("123aaa")
composeTestRule.clickCreateAndSend()
assertEquals(0, testSetup.getOnCreateCount())
// e.g. ,.
composeTestRule.setAmount("${separators.grouping}${separators.decimal}")
composeTestRule.clickCreateAndSend()
assertEquals(0, testSetup.getOnCreateCount())
// e.g. 123,.
composeTestRule.setAmount("123${separators.grouping}${separators.decimal}")
composeTestRule.clickCreateAndSend()
assertEquals(0, testSetup.getOnCreateCount())
// e.g. 1,2,3
composeTestRule.setAmount("1${separators.grouping}2${separators.grouping}3")
composeTestRule.clickCreateAndSend()
assertEquals(0, testSetup.getOnCreateCount())
// e.g. 1.2.3
composeTestRule.setAmount("1${separators.decimal}2${separators.decimal}3")
composeTestRule.clickCreateAndSend()
assertEquals(0, testSetup.getOnCreateCount())
}
@Test
@MediumTest
@OptIn(ExperimentalCoroutinesApi::class)
fun max_message_length() =
runTest {
val testSetup = TestSetup(composeTestRule)
composeTestRule.setValidAmount()
composeTestRule.setMessage(
buildString {
repeat(ZecRequestMessage.MAX_MESSAGE_LENGTH + 1) { number ->
append("$number")
}
}
)
composeTestRule.clickCreateAndSend()
assertEquals(1, testSetup.getOnCreateCount())
testSetup.getLastCreateZecRequest().also {
assertNotNull(it)
assertEquals(WalletAddressFixture.unified(), it.address)
assertEquals(Zatoshi(12345600000), it.amount)
assertTrue(it.message.value.isEmpty())
}
}
@Test
@MediumTest
fun back() {
val testSetup = TestSetup(composeTestRule)
assertEquals(0, testSetup.getOnBackCount())
composeTestRule.clickBack()
assertEquals(1, testSetup.getOnBackCount())
}
private class TestSetup(private val composeTestRule: ComposeContentTestRule) {
private val onBackCount = AtomicInteger(0)
private val onCreateCount = AtomicInteger(0)
@Volatile
private var onCreateZecRequest: ZecRequest? = null
fun getOnBackCount(): Int {
composeTestRule.waitForIdle()
return onBackCount.get()
}
fun getOnCreateCount(): Int {
composeTestRule.waitForIdle()
return onCreateCount.get()
}
fun getLastCreateZecRequest(): ZecRequest? {
composeTestRule.waitForIdle()
return onCreateZecRequest
}
init {
composeTestRule.setContent {
ZcashTheme {
Request(
myAddress = runBlocking { WalletAddressFixture.unified() },
goBack = {
onBackCount.incrementAndGet()
},
onCreateAndSend = {
onCreateCount.incrementAndGet()
onCreateZecRequest = it
}
)
}
}
}
}
}
private fun ComposeContentTestRule.clickBack() {
onNodeWithContentDescription(getStringResource(R.string.request_back_content_description)).also {
it.performClick()
}
}
private fun ComposeContentTestRule.setValidAmount() {
onNodeWithText(getStringResource(R.string.request_amount)).also {
val separators = MonetarySeparators.current()
it.performTextClearance()
it.performTextInput("123${separators.decimal}456")
}
}
private fun ComposeContentTestRule.setAmount(amount: String) {
onNodeWithText(getStringResource(R.string.request_amount)).also {
it.performTextClearance()
it.performTextInput(amount)
}
}
private fun ComposeContentTestRule.setValidMessage() {
onNodeWithText(getStringResource(R.string.request_message)).also {
it.performTextClearance()
it.performTextInput(ZecRequestFixture.MESSAGE.value)
}
}
private fun ComposeContentTestRule.setMessage(message: String) {
onNodeWithText(getStringResource(R.string.request_message)).also {
it.performTextClearance()
it.performTextInput(message)
}
}
private fun ComposeContentTestRule.clickCreateAndSend() {
onNodeWithText(getStringResource(R.string.request_create), ignoreCase = true).also {
it.performClick()
}
}
private fun ComposeContentTestRule.assertSendDisabled() {
onNodeWithText(getStringResource(R.string.request_create), ignoreCase = true).also {
it.assertIsNotEnabled()
}
}

View File

@ -2,7 +2,6 @@ package co.electriccoin.zcash.ui.screen.scan.view
import android.Manifest
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.assertTextEquals
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
@ -33,12 +32,12 @@ class ScanViewBasicTest : UiTestPrerequisites() {
@Test
@MediumTest
fun back() {
fun cancel() {
val testSetup = newTestSetup()
assertEquals(0, testSetup.getOnBackCount())
composeTestRule.onNodeWithContentDescription(getStringResource(R.string.scan_back_content_description)).also {
composeTestRule.onNodeWithText(getStringResource(R.string.scan_cancel_button).uppercase()).also {
it.performClick()
}
@ -52,7 +51,7 @@ class ScanViewBasicTest : UiTestPrerequisites() {
// Permission granted ui items (visible):
composeTestRule.onNodeWithText(getStringResource(R.string.scan_header)).also {
composeTestRule.onNodeWithText(getStringResource(R.string.scan_cancel_button).uppercase()).also {
it.assertIsDisplayed()
}
@ -62,12 +61,7 @@ class ScanViewBasicTest : UiTestPrerequisites() {
it.assertIsDisplayed()
}
composeTestRule.onNodeWithTag(ScanTag.TEXT_STATE).also {
it.assertIsDisplayed()
it.assertTextEquals(getStringResource(R.string.scan_state_scanning))
}
composeTestRule.onNodeWithText(getStringResource(R.string.scan_hint)).also {
composeTestRule.onNodeWithContentDescription(getStringResource(R.string.scan_torch_content_description)).also {
it.assertIsDisplayed()
}

View File

@ -3,6 +3,8 @@ package co.electriccoin.zcash.ui.screen.scan.view
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import cash.z.ecc.android.sdk.type.AddressType
import co.electriccoin.zcash.ui.common.model.WalletRestoringState
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
import co.electriccoin.zcash.ui.screen.scan.model.ScanState
import java.util.concurrent.atomic.AtomicInteger
@ -36,7 +38,9 @@ class ScanViewBasicTestSetup(
onOpenSettings = {},
onScanStateChanged = {
scanState.set(it)
}
},
walletRestoringState = WalletRestoringState.NONE,
addressValidationResult = AddressType.Shielded
)
}

View File

@ -44,11 +44,6 @@ class SecurityWarningViewTest : UiTestPrerequisites() {
it.assertHasClickAction()
it.assertIsNotEnabled()
}
composeTestRule.onNodeWithTag(SecurityScreenTag.WARNING_TEXT_TAG).also {
it.assertExists()
it.assertIsDisplayed()
}
}
@Test

View File

@ -1,6 +1,5 @@
package co.electriccoin.zcash.ui.screen.securitywarning.view
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.ui.test.junit4.ComposeContentTestRule
import co.electriccoin.zcash.ui.design.theme.ZcashTheme
@ -34,13 +33,9 @@ class SecurityWarningViewTestSetup(private val composeTestRule: ComposeContentTe
@Suppress("TestFunctionName")
fun DefaultContent() {
SecurityWarning(
SnackbarHostState(),
onBack = {
onBackCount.incrementAndGet()
},
onPrivacyPolicy = {
// Not tested yet. UI testing of clicking on an AnnotatedString Text part is complicated.
},
onAcknowledged = {
onAcknowledged.getAndSet(it)
},

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