Compare commits

...

184 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
Honza Rychnovský 070be83506
[#1267] Release 0.2.0 (560)
Closes #1267
2024-02-27 12:07:49 +01:00
dependabot[bot] b49709216d
Bump actions/download-artifact from 4.1.2 to 4.1.3 (#1266)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](eaceaf801f...87c55149d9)

---
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-02-27 10:15:31 +01:00
Honza Rychnovský 7285137f2e
[#1144] Send.Form screen rework
* [#1144] Send.Form screen rework

- This follows the new Figma design. It also adds the TextFields values validation and proper UI reactions.
- Closes #340
- Closes #810
- Closes #1157
- Closes #1158
- Closes #1253
- Closes #1254
- Closes #826
- Follow-ups: #1047, #1257

* Changelog update
2024-02-27 10:13:44 +01:00
dependabot[bot] 4bba077fbd
Bump google-github-actions/auth from 2.1.1 to 2.1.2 (#1261)
Bumps [google-github-actions/auth](https://github.com/google-github-actions/auth) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/google-github-actions/auth/releases)
- [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md)
- [Commits](a6e2e39c0a...55bd3a7c6e)

---
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-02-26 12:53:44 +01:00
Honza Rychnovský bf618a1ba3
[#1151] Background syncing
* [#1151] Background syncing

- A periodic background block synchronization has been added. When the device is connected to the internet using an unmetered connection and is plugged into the power, the background task will start to synchronize blocks randomly between 3 and 4 a.m.
- The background worker was in place but not fully working, plus was set to trigger randomly in 24 hours
- Changelog update
- Closes #1151
- Closes #634
- Its follow-up #1249
- Its follow-up #1258
2024-02-16 22:00:18 +01:00
dependabot[bot] 79de1690bb
Bump gradle/gradle-build-action from 3.0.0 to 3.1.0 (#1247)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](3b1b3b9a21...29c0906b64)

---
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-02-14 09:21:39 +01:00
Honza Rychnovský 6a5637a87d
[#1245] Release 0.2.0 (554)
Closes #1245
2024-02-13 14:27:38 +01:00
Honza Rychnovský 26a73f8e59
[#1166] Add shielding funds feature
* [#1166] Add shielding funds feature

- Changelog updated
- Closes #1127
- Closes #1166
- Related #238
2024-02-13 09:30:51 +01:00
dependabot[bot] 01e3741f22
Bump gradle/wrapper-validation-action from 1.1.0 to 2.1.1 (#1239)
Bumps [gradle/wrapper-validation-action](https://github.com/gradle/wrapper-validation-action) from 1.1.0 to 2.1.1.
- [Release notes](https://github.com/gradle/wrapper-validation-action/releases)
- [Commits](56b90f209b...699bb18358)

---
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-02-12 22:36:55 +01:00
dependabot[bot] abcb7885b3
Bump clamav/clamav from 1.2.1 to 1.3.0 in /.github/actions/antivirus (#1230)
Bumps clamav/clamav from 1.2.1 to 1.3.0.

---
updated-dependencies:
- dependency-name: clamav/clamav
  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-12 22:36:18 +01:00
dependabot[bot] 7c7e210327
Bump actions/upload-artifact from 4.3.0 to 4.3.1 (#1223)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](26f96dfa69...5d5d22a312)

---
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-02-12 22:35:22 +01:00
dependabot[bot] 29757a2009
Bump google-github-actions/auth from 2.1.0 to 2.1.1 (#1222)
Bumps [google-github-actions/auth](https://github.com/google-github-actions/auth) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/google-github-actions/auth/releases)
- [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md)
- [Commits](5a50e58116...a6e2e39c0a)

---
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-02-12 22:34:48 +01:00
dependabot[bot] 2f70cb9d41
Bump actions/download-artifact from 4.1.1 to 4.1.2 (#1221)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.1 to 4.1.2.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](6b208ae046...eaceaf801f)

---
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-02-12 18:44:36 +01:00
dependabot[bot] bcadf5ca16
Bump gradle/gradle-build-action from 2.12.0 to 3.0.0 (#1215)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 2.12.0 to 3.0.0.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](a8f75513ea...3b1b3b9a21)

---
updated-dependencies:
- dependency-name: gradle/gradle-build-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-02-12 18:24:59 +01:00
Honza Rychnovský cc333ea902
[#1165] Syncing progressbar
* [#1165] Syncing progressbar

-  UI + logic + tests
- Closes  #1165

* Changelog update
2024-02-08 11:28:00 +01:00
Honza Rychnovský 1058802b19
[#1219] Current balances UI
* [#1219] Current balances UI

- This represents UI changes for balance, change, and transaction on the Balances screen
- Reworked StyledBalance to be more reusable, too
- Adopted the latest SDK changes related to change pending and pending transactions
- Closes #1224
- Closes #1219

* Adopted latest SDK snapshot version
2024-02-07 18:28:26 +01:00
Honza Rychnovský c5efcabf4c
[#1216] Home screen tabs UI improvements
Closing #1216
2024-02-01 19:36:44 +01:00
Honza Rychnovský 392689e676
[#1032] Prevent font ligatures on addresses 2024-02-01 00:13:40 +01:00
Honza Rychnovský 7630e4fcdf
[#1212] Adopt Zcash SDK 2.0.6
- Closes #1212
2024-02-01 00:13:25 +01:00
Honza Rychnovský dcd2cbd177
[#1210] Release 0.2.0 (541) 2024-01-30 23:05:09 +01:00
Honza Rychnovský f61f7d09c7
[#1208] Release 0.2.0 (540)
* Release 0.2.0 (540)

Closes #1208
2024-01-28 01:55:25 +01:00
Honza Rychnovský b79739db0c
[#1206] Clear focus on Send Form
* [#1206] Clear focus on Send Form

- Closes #1206
2024-01-28 01:28:27 +01:00
Honza Rychnovský 3240c3baa8
[#1196] Balances widget on Balances screen
* [#1196] Integrate Balances widget to Balances

- Closing #1196
- Changelog update
2024-01-28 01:26:11 +01:00
Honza Rychnovský b68d93b137
[#1201] Enhance SendStage.SendFailure with error
* [#1201] Enhance SendStage.SendFailure with error

- Closes #1201
- The changes also contain custom saver for SendStage
- The error is printed on the SendFailure screen as a simple text for now
- Changelog updated
2024-01-26 13:59:23 +01:00
Honza Rychnovský 7e27bdddff
[#1195] Integrate Current Balances widget to Send
- Closes #1195
- The fixture recipient address type changed from the unified to the sapling on several tests to avoid temporary address TODO text obtained from the SDK fixture
- WalletDisplayValues have the updateAvailable optional with false as a default value
- Changelog updated
2024-01-26 12:44:46 +01:00
dependabot[bot] 1944916606
Bump gradle/gradle-build-action from 2.11.1 to 2.12.0 (#1204)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 2.11.1 to 2.12.0.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](982da8e78c...a8f75513ea)

---
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-01-26 12:38:44 +01:00
dependabot[bot] 8c35596519
Bump actions/upload-artifact from 4.2.0 to 4.3.0 (#1200)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](694cdabd8b...26f96dfa69)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  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-01-24 09:11:09 +01:00
dependabot[bot] 19f34192a5
Bump google-github-actions/auth from 2.0.1 to 2.1.0 (#1198)
Bumps [google-github-actions/auth](https://github.com/google-github-actions/auth) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/google-github-actions/auth/releases)
- [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md)
- [Commits](f6de81663f...5a50e58116)

---
updated-dependencies:
- dependency-name: google-github-actions/auth
  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-01-23 15:34:05 +01:00
Honza Rychnovský 155b171b46
[#1156] Common current balance state UI component
* [#1156] Common current balance state UI component

- Closes #1156
- Created a reusable current balances widget UI component for the Account and Balances screen
- Incorporated into the Account screen
- Improved ZcashCurrency API with localized currency identificators

* Changelog update

* File follow-up on testing
2024-01-23 09:59:33 +01:00
dependabot[bot] 47bf1f9492
Bump actions/upload-artifact from 4.1.0 to 4.2.0 (#1192)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](1eb3cb2b3e...694cdabd8b)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  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-01-22 14:56:46 +01:00
Honza Rychnovský 323437e6fc
[#1188] Release v0.2.0 (530)
- Closes #1188
2024-01-15 20:06:00 +01:00
Honza Rychnovský 6519df7539
[#1145] Receive screen
- Closes #1145
- Closes #1057
- Closes #1088
- Closes #1154
- Closes #1155
- Closes #1185
2024-01-15 17:32:15 +01:00
dependabot[bot] a276cb41e0
Bump actions/upload-artifact from 4.0.0 to 4.1.0 (#1187)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](c7d193f32e...1eb3cb2b3e)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  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-01-15 08:23:08 +01:00
dependabot[bot] 99fcc92d1a
Bump actions/download-artifact from 4.1.0 to 4.1.1 (#1181)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](f44cd7b40b...6b208ae046)

---
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-01-11 11:41:59 +01:00
Honza Rychnovský b58d3069c2
[#1178] Slightly improve Update screen UI 2024-01-10 16:12:27 +01:00
dependabot[bot] 0ad1477e1b
Bump google-github-actions/auth from 2.0.0 to 2.0.1
Bumps [google-github-actions/auth](https://github.com/google-github-actions/auth) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/google-github-actions/auth/releases)
- [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md)
- [Commits](67e9c72af6...f6de81663f)

---
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-01-10 11:38:46 +01:00
Honza Rychnovský f711cd7cbd
[#883] Turn on NotEnoughSpace light theme
- Closes #883
- This removes the hardcoded dark theme from the NotEnoughSpace screen
2024-01-10 11:38:07 +01:00
Honza Rychnovský ef3788bb8a
[1174] Release v0.2.0 (523)
- Closes #1174
- Changelog updated
2024-01-09 14:04:35 +01:00
Honza Rychnovský f44ed53077
[#817] Simplify Send screenshot test
- Closes #817
- This issue is obsolete, as we introduced a new check on available balance to enable the Send button on the Send Form screen. The test can’t easily bypass this new check.
2024-01-09 12:39:44 +01:00
Honza Rychnovský d1eec2dae8
[#1153] Adopt SDK v2.0.4
* [#1153] Adopt SDK v2.0.4
- Closes #1153
- Add TODO inline
- Changelog update
2024-01-09 12:27:32 +01:00
Honza Rychnovský 803ea86d8d
[#1152] Adopt Bip-39 lib v1.0.7 2024-01-04 14:40:21 +01:00
Honza Rychnovský 2f33ccf818
[#1143] Transaction ID row in Transaction item
* [#1143] Transaction ID row in Transaction item

- Added a new transaction ID row into the transaction item on the Transactions screen
- It displays a TODO value instead of the TXID until the #1316 in SDK done
- Closes #1143

Changelog update
2024-01-02 14:25:24 +01:00
Honza Rychnovský b544de316d
[#1147] Show transaction memo
- Improves the screen UI so we’re able to call click, and query transaction memos
- These APIs will be useful once we approach screen refactoring according to the Figma design
- Adds UI test for the new feature
- Closes #1147

Changelog update
2024-01-02 09:03:12 +01:00
Honza Rychnovský d4fdb9aec2
[#1136] Release v0.2.0 (517)
* [#1136] Release v0.2.0 (517)

Closes #1136
2023-12-21 18:01:54 +01:00
Honza Rychnovský b42db7b035
[#1138] Malformed pattern: Grouping separator
* [#1138] Malformed pattern: Grouping separator

- This handles possible malformed format pattern exceptions in Zashi, but the proper solution needs to be provided within the SDK. See  #1315.
- Closes #1138

* Changelog update
2023-12-21 17:46:02 +01:00
Honza Rychnovský c901a63d54
[#1139] Malformed pattern for ICU DecimalFormat
- This handles possible malformed format pattern exceptions in Zashi, but the proper solution needs to be provided within the SDK. See  #1315.
- Closes #1139
2023-12-21 17:40:59 +01:00
Honza Rychnovský 90c982ac2a
[#1134] Home screens UI improvements
* [#1134] Improve Home sub-screens paddings

* [#1134] Rework Home Scaffold to ConstraintLayout

* [#1134] Rework Home screen TextFields

Plus, unify Home sub-screens bottom action buttons position

* [#1134] Fix Textfiled height jumping

* Changelog update
2023-12-21 16:15:20 +01:00
dependabot[bot] c813c54827
Bump actions/download-artifact from 4.0.0 to 4.1.0 (#1131)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](7a1cd3216c...f44cd7b40b)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  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>
2023-12-21 12:58:14 +01:00
dependabot[bot] 0799c9bdd6
Bump gradle/gradle-build-action from 2.11.0 to 2.11.1 (#1133)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 2.11.0 to 2.11.1.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](8cbcb9948b...982da8e78c)

---
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>
2023-12-21 09:12:43 +01:00
Honza Rychnovský c943fc58be
[#1121] Available balance check on Send
* [#1121] Available balance check on Send

Closes #1121

* Align UI tests

* Changelog update
2023-12-21 08:51:54 +01:00
Honza Rychnovský 4e3bea2c2f
[#1129] Fix failing Test Robo Debug
* [#1129] Fix failing Test Robo Debug

Closes #1129

* Changelog update

* Specify main-debug folder

* [#1129] Separate version flags

- Separate debuggable and run under a test service flags
- As we now have more flexibility in requesting the flags in runtime
2023-12-19 11:03:28 +01:00
Honza Rychnovský 4cf608b733
[#1079] Home screen bottom nav bar
* Changelog update

* [#1118] Account screen Balance Text line break

- Closes #1118

* [#1117] Reusable Loading screen indicator

- Closes #1117

* [#1116] Balances screen structure

- Closes #1116

* [#1079] Bottom bar - tabs navigation

- Closes #1079

* [#1079] Rework UI tests

* [#1079] File follow-ups

* [#1079] Fix static lint tools warnings

* [#1079] Improve Home sub-screens indexing

* [#1079] Reorg navigation into Home components

* [#1079] Align with Figma design

* [#1079] Update screenshot and UI tests
2023-12-18 14:31:25 +01:00
dependabot[bot] 94616c4a7a
Bump actions/upload-artifact from 3.1.3 to 4.0.0 (#1123)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3.1.3 to 4.0.0.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](a8a3f3ad30...c7d193f32e)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  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>
2023-12-16 16:08:50 +01:00
dependabot[bot] 666c8c62bf
Bump actions/download-artifact from 3.0.2 to 4.0.0 (#1124)
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3.0.2 to 4.0.0.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](9bc31d5ccc...7a1cd3216c)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  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>
2023-12-16 16:08:05 +01:00
dependabot[bot] 0074c2ebe3
Bump gradle/gradle-build-action from 2.10.0 to 2.11.0 (#1120)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 2.10.0 to 2.11.0.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](87a9a15658...8cbcb9948b)

---
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>
2023-12-13 09:23:29 +01:00
Honza Rychnovský d3c4730f42
[#1114] Release v0.2.0 (505)
Closes #1114
2023-12-11 16:22:49 +01:00
Honza Rychnovský c28dadaeed
[#1109] Detekt Compose Rules 0.3.5
- Closes #1109
- Fixed the new Detekt Compose warnings
2023-12-11 10:31:24 +01:00
Honza Rychnovský a3e7d8f6c4
[#1108] Ktlint 1.0.1
* [#1108] Ktlint 1.0.1

- Closes #1108
- Version and artefact update

* Fix ktlint warnings
2023-12-11 10:20:32 +01:00
Honza Rychnovský a10b372e73
[#908] EmulatorWtf 0.15.1
* [#908] EmulatorWtf 0.15.1

Closes #908
2023-12-11 10:19:44 +01:00
Honza Rychnovský c05991fbe1
[#1099] Other dependency update
Closes #1099
2023-12-11 10:19:07 +01:00
Honza Rychnovský 780014380f
[#1106] AndroidX dependency update
Closes #1106
2023-12-09 14:05:26 +01:00
Honza Rychnovský 987b08bb0a
[#1103][#1104] Kotlin and Compose dependency update
* [#1103] Compose dependency update

Closes #1103

* [#1104] Kotlin dependency update

- Closes #1104
2023-12-08 13:56:37 +01:00
Honza Rychnovský 4c97e2f82e
[#1098] Gradle 8.5
- Closes #1098
- Leverages new Gradle APIs from versions 8.4 and 8.5
- Follow-ups filled for the not-used but useful new APIs
2023-12-08 13:13:23 +01:00
Honza Rychnovský 06ca665fca
[#1096] Change brightness adjusting feature
* [#1096] Change brightness adjusting feature

- Closes #1096
- As reported by testers, the automatic brightness adjustment could be too invasive
- Switched to the on-demand feature after a new button click
- Tests aligned

* Align Screenshot tests

* Changelog update
2023-12-07 16:35:27 +01:00
Honza Rychnovský 201cdbbd07
[#1094] Add message under Doc and PP buttons
* [#1094] Add message under Doc and PP buttons

- Closes #1094
- Shows Toast UI message with Not implemented yet test after the buttons hit

* Changelog update
2023-12-07 08:14:16 +01:00
Honza Rychnovský 1310a0730d
[#1092] Duplicate Home to separate Account screen
- Closes #1092
- New Account screen + logic created
- Moved a few commonly used logic components into the common package
2023-12-06 15:29:12 +01:00
Honza Rychnovský dd81b90fbf
[#1089] Remove circular progress bar from Home
* [#1089] Remove circular progress bar from Home

Closes #1089

* Fix ktlint warning
2023-12-05 12:29:15 +01:00
Honza Rychnovský b88a64de9d
[#1069] Improve sideloading documentation
* [#1069] Improve sideloading doc

- Closes #1069
- The cmdline-tools path tested on a clear macOS installation

* Add install Java instruction
2023-12-05 08:55:41 +01:00
Honza Rychnovský f67c3fde8f
[#1082] Remove Side Navigation Drawer menu
- Closes #1082
- Closes #1086
- Added TODO links to the missing Settings actions
- Fixed About screen versionCode displaying
- Added app name to the About screen debug menu, as the Home screen does not contain it anymore
- Changelog updated
2023-12-04 15:45:30 +01:00
Honza Rychnovský ff0757b818
[#1080] Changelog update
Closes #1080
2023-12-01 15:21:20 +01:00
Honza Rychnovský 905a14db50
[#1003] Clear unused Onboarding alternatives
- Removes unused Oboarding alternative LongOnboarding screen with all related resources
- Removes related integration tests and screen decision logic
- Removes related is_short_onboaridng remote configuration logic
- Closes #1003
2023-11-30 20:50:59 +01:00
dependabot[bot] ec534550a7
Bump actions/setup-java from 3.13.0 to 4.0.0 (#1071)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3.13.0 to 4.0.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](0ab4596768...387ac29b30)

---
updated-dependencies:
- dependency-name: actions/setup-java
  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>
2023-11-30 09:07:14 +01:00
dependabot[bot] db152bab8d
Bump google-github-actions/auth from 1.2.0 to 2.0.0 (#1072)
Bumps [google-github-actions/auth](https://github.com/google-github-actions/auth) from 1.2.0 to 2.0.0.
- [Release notes](https://github.com/google-github-actions/auth/releases)
- [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md)
- [Commits](f105ef0cdb...67e9c72af6)

---
updated-dependencies:
- dependency-name: google-github-actions/auth
  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>
2023-11-30 09:06:30 +01:00
Honza Rychnovský b468b4c725
[#1067] Build universal release APK on CI
Closes #1067
2023-11-28 13:51:23 +01:00
Honza Rychnovský 3d33bb8ca5
[#1064] Restore Seed-Birthday Screen
* [#1064] Restore Seed-Birthday Screen

- Reworked Restore Seed-Birthday height screen
- Contains UI, screen logic and tests
- Closes #1064

* Update changelog

* [#859] Fix failing Restore screenshot test

Closes #859
2023-11-28 13:05:31 +01:00
dependabot[bot] 0054588ec0
Bump gradle/gradle-build-action from 2.9.0 to 2.10.0 (#1066)
Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 2.9.0 to 2.10.0.
- [Release notes](https://github.com/gradle/gradle-build-action/releases)
- [Commits](842c587ad8...87a9a15658)

---
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>
2023-11-28 10:09:54 +01:00
Honza Rychnovský b15c1e9063
[#1059] Restore Seed Screen
* [#1059] Restore Seed Screen

- Reworked UI according to Figma design
- Closes #1059

* Changelog update
2023-11-27 10:55:15 +01:00
Kris Nuttycombe cb9d3cf70b
Update the README for the Zashi Android repository. (#1041)
* Update the README for the Zashi Android repository.

This depends on [Electric-Coin-Company/zashi#1]

* Remove obsolete instructions from README.md

---------

Co-authored-by: Honza Rychnovský <rychnovsky.honza@gmail.com>
2023-11-23 12:01:14 +01:00
Honza Rychnovský f34aa78f3d
[#1054][#1055] Update buttons and screens spacings
- Done across all screens
- Closes #1054
- Closes #1055

Fix Ktlint warnings
2023-11-23 11:37:02 +01:00
Honza Rychnovský 8966615a39
[#1051] Fix Export Data FileProvider
- Both debug and production builds of the app can now be deployed on the same device
- Closes #1051
2023-11-23 11:07:09 +01:00
Honza Rychnovský 771dc114da
[#1048] Seed Recovery Screen
[#1048] Seed Recovery Screen

Open Seed Recovery from the Settings screen

[#1014] Unify screen name with Figma

[#1048] UI + logic + tests

Improve click action effect on TopAppBar

[#1049] Add Changelog

Closes #1049

Update PR template
2023-11-23 10:41:59 +01:00
Honza Rychnovský cf45a0ef34
[#942] New Wallet Recovery Phrase Screen
[#942] New Wallet Recovery Phrase Screen

[#1006] Enhance VersionInfo with other fields

[#947] About screen UI + logic + tests

[#1040] Extract logo and title on top of screens

- Place it into a separate UI component
- Used across several screens
- Closes #1040

Remove long version of the Backup screen

- We previously had a configuration field that controlled which version of the screen should be displayed to a user
- Removed
- Partly solves #1003

Backup screen view redesign

Tests + docummentation

Update links to the Zashi Github repository

As the GitHub repository was recently moved from Zcash under the ECC company

[#1014] Unify screen name with Figma design

[#1045] Adopt Zcash SDK v2.0.3

Closes #1045

Fix screenshot test

The new wallet recovery screen is now much taller; scrolling to the acting button is needed.

Fix Restore screen test

Lint tools warnings
2023-11-23 10:00:13 +01:00
dependabot[bot] 22da30bc9a
Bump google-github-actions/auth from 1.1.1 to 1.2.0 (#1053)
Bumps [google-github-actions/auth](https://github.com/google-github-actions/auth) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/google-github-actions/auth/releases)
- [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md)
- [Commits](35b0e87d16...f105ef0cdb)

---
updated-dependencies:
- dependency-name: google-github-actions/auth
  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>
2023-11-21 09:38:52 +01:00
Honza Rychnovský 6aa8094ed7
[#1038] Primary button has colored shadow background
* [#1038] Primary button has colored shadow bg

- Closes #1038
- Also improves share_file_provider_paths content for exporting private data feature

* Reorder parameters
2023-11-14 16:00:00 +01:00
Honza Rychnovský 494d068168
[#1031] Export of private app data
* [#1031] Export of private app data UI+logic

- Closes #1031

* [#1031] Export of private app data tests

* Move provider to app/manifest

To avoid: The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER

* [#1037] Debuggable release build

- So we’re able to log or debug release app build while testing
- Default value false
- Closes #1037

* Fix file provider path in release build
2023-11-13 14:53:16 +01:00
Honza Rychnovský 70d5721845
[#992][#1025] Custom Google Play publishing
* [#992][#1025] Custom Google Play publishing

- Copy logic from working demo
- Documentation
- Update checkProperties task
- Update release listing
- Status completed
- Switch back to main branch
- Closes #992
- Closes #1025

* Deployment documentation

* Remove deprecated Gradle Publisher plugin

* Improve logging

Improve publishing task logging

* Resolve review comments

* Increase PR actions timeouts
2023-11-13 11:50:57 +01:00
Honza Rychnovský 6df3806a1f
[#998] Transaction History Compose Preview 2023-11-08 10:47:49 +01:00
Honza Rychnovský a15bea738f
[#355] Lock screen to portrait
- Adds capability to customize the screen lock via gradle.properties to enable it while developing or testing the app UI easily
- Closes #355
2023-11-08 10:47:31 +01:00
Honza Rychnovský 692e5fc0d2
[#1023] Remove zcash-android-wallet-plugins dependency
Closes #1023
2023-11-08 10:47:19 +01:00
Honza Rychnovský 84e591561d
[#1026] Restore Seed screen keyboard hides UI
Closes #1026
2023-11-08 10:47:03 +01:00
dependabot[bot] 7a59d49920
Bump clamav/clamav from 1.2.0 to 1.2.1 in /.github/actions/antivirus (#1024)
Bumps clamav/clamav from 1.2.0 to 1.2.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>
2023-11-03 16:51:03 +01:00
557 changed files with 21909 additions and 20216 deletions

View File

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

View File

@ -10,7 +10,7 @@
- [ ] Add **automated tests** as appropriate
- [ ] Update the [**manual tests**](../blob/main/docs/testing/manual_testing)[^2] as appropriate
- [ ] Check the **code coverage**[^3] report for the automated tests
- [ ] Update **documentation** as appropriate (e.g [README.md](../blob/main/README.md), and [**Architecture.md**](../blob/main/docs/Architecture.md), etc.)
- [ ] Update **documentation** as appropriate (e.g [**README.md**](../blob/main/README.md), [**Architecture.md**](../blob/main/docs/Architecture.md), [**CHANGELOG.md**](../blob/main/CHANGELOG.md), etc.)
- [ ] **Run the app** and try the changes
- [ ] Pull in the latest changes from the **main** branch and **squash** your commits before assigning a reviewer[^4]
@ -23,7 +23,7 @@
- [ ] Perform an **ad hoc review**[^5]
- [ ] Review the **automated tests**
- [ ] Review the **manual tests**
- [ ] Review the **documentation**, [**README.md**](../blob/main/README.md), and [**Architecture.md**](../blob/main/docs/Architecture.md) as appropriate
- [ ] Review the **documentation**, [**README.md**](../blob/main/README.md), [**Architecture.md**](../blob/main/docs/Architecture.md), etc. as appropriate
- [ ] **Run the app** and try the changes[^6]
[^1]: _Code often looks different when reviewing the diff in a browser, making it easier to spot potential bugs._

View File

@ -1,6 +1,8 @@
# Expected secrets
# GOOGLE_PLAY_CLOUD_PROJECT - Google Cloud project associated with Google Play
# GOOGLE_PLAY_SERVICE_ACCOUNT - Email address of service account
# GOOGLE_PLAY_SERVICE_ACCOUNT_KEY - Google Play Service Account key to authorize on Google Play
# GOOGLE_PLAY_PUBLISHER_API_KEY - Google Play Publisher API key to authorize the publisher on Google Play API
# GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER - Workload identity provider to generate temporary service account key
# UPLOAD_KEYSTORE_BASE_64 - The upload signing key for the app
# UPLOAD_KEYSTORE_PASSWORD - The password for UPLOAD_KEYSTORE_BASE_64
@ -36,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@56b90f209b02bf6d1deae490e9ef18b21a389cd4
uses: gradle/wrapper-validation-action@216d1ad2b3710bf005dc39237337b9673fd8fcd5
check_secrets:
environment: deployment
@ -54,9 +56,17 @@ jobs:
- id: check_secrets
env:
GOOGLE_PLAY_CLOUD_PROJECT: ${{ secrets.GOOGLE_PLAY_CLOUD_PROJECT }}
GOOGLE_PLAY_SERVICE_ACCOUNT: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT }}
GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER }}
if: "${{ env.GOOGLE_PLAY_CLOUD_PROJECT != '' && env.GOOGLE_PLAY_SERVICE_ACCOUNT != '' && env.GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER != '' }}"
# TODO [#1033]: Use token-based authorization on Google Play for automated deployment
# TODO [#1033]: https://github.com/Electric-Coin-Company/zashi-android/issues/1033
# Note that these properties are not currently used due to #1033
# GOOGLE_PLAY_SERVICE_ACCOUNT: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT }}
# GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER }}
GOOGLE_PLAY_SERVICE_ACCOUNT_KEY: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_KEY }}
GOOGLE_PLAY_PUBLISHER_API_KEY: ${{ secrets.GOOGLE_PLAY_PUBLISHER_API_KEY }}
if: "${{ env.GOOGLE_PLAY_CLOUD_PROJECT != '' &&
env.GOOGLE_PLAY_SERVICE_ACCOUNT_KEY != '' &&
env.GOOGLE_PLAY_PUBLISHER_API_KEY != ''
}}"
run: echo "defined=true" >> $GITHUB_OUTPUT
build_and_deploy:
@ -70,15 +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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 10
with:
gradle-home-cache-cleanup: true
@ -94,8 +107,12 @@ jobs:
echo ${FIREBASE_DEBUG_JSON_BASE64} | base64 --decode > app/src/debug/google-services.json
echo ${FIREBASE_RELEASE_JSON_BASE64} | base64 --decode > app/src/release/google-services.json
- name: Authenticate to Google Cloud for Google Play
# TODO [#1033]: Use token-based authorization on Google Play for automated deployment
# TODO [#1033]: https://github.com/Electric-Coin-Company/zashi-android/issues/1033
# Note that this step is not currently used due to #1033
if: false
id: auth_google_play
uses: google-github-actions/auth@35b0e87d162680511bf346c299f71c9c5c379033
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
with:
create_credentials_file: true
project_id: ${{ secrets.GOOGLE_PLAY_CLOUD_PROJECT }}
@ -108,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
@ -117,14 +141,21 @@ jobs:
timeout-minutes: 25
env:
ORG_GRADLE_PROJECT_ZCASH_SUPPORT_EMAIL_ADDRESS: ${{ vars.SUPPORT_EMAIL_ADDRESS }}
ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH: ${{ steps.auth_google_play.outputs.credentials_file_path }}
# TODO [#1033]: Use token-based authorization on Google Play for automated deployment
# TODO [#1033]: https://github.com/Electric-Coin-Company/zashi-android/issues/1033
# Note that these properties are not currently used due to #1033
# ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT }}
# ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH: ${{ steps.auth_google_play.outputs.credentials_file_path }}
ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT_KEY: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_KEY }}
ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_PUBLISHER_API_KEY: ${{ secrets.GOOGLE_PLAY_PUBLISHER_API_KEY }}
ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_DEPLOY_TRACK: internal
ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_DEPLOY_STATUS: completed
ORG_GRADLE_PROJECT_ZCASH_RELEASE_KEYSTORE_PATH: ${{ format('{0}/release.jks', env.home) }}
ORG_GRADLE_PROJECT_ZCASH_RELEASE_KEYSTORE_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_PASSWORD }}
ORG_GRADLE_PROJECT_ZCASH_RELEASE_KEY_ALIAS: ${{ secrets.UPLOAD_KEY_ALIAS }}
ORG_GRADLE_PROJECT_ZCASH_RELEASE_KEY_ALIAS_PASSWORD: ${{ secrets.UPLOAD_KEY_ALIAS_PASSWORD }}
ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_DEPLOY_MODE: deploy
run: |
./gradlew :app:assembleDebug :app:publishBundle :app:packageZcashmainnetReleaseUniversalApk
./gradlew :app:publishToGooglePlay
- name: Collect Artifacts
timeout-minutes: 1
env:
@ -133,11 +164,11 @@ jobs:
MAPPINGS_ZIP_PATH: ${{ format('{0}/artifacts/mappings.zip', env.home) }}
run: |
mkdir ${ARTIFACTS_DIR_PATH}
zip -r ${BINARIES_ZIP_PATH} . -i app/build/outputs/apk/\*/\*.apk app/build/outputs/universal_apk/\*/\*.apk app/build/outputs/bundle/\*/\*.aab
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@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
timeout-minutes: 1
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 5
with:
name: Binaries
path: ~/artifacts
@ -153,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@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
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@56b90f209b02bf6d1deae490e9ef18b21a389cd4
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Check properties
timeout-minutes: 4
@ -94,18 +94,18 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Detekt
timeout-minutes: 4
timeout-minutes: 10
run: |
./gradlew detektAll
- name: Collect Artifacts
@ -120,7 +120,7 @@ jobs:
zip -r ${REPORTS_ZIP_PATH} . -i build/reports/detekt/*
- name: Upload Artifacts
if: ${{ always() }}
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
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@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
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@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
timeout-minutes: 1
with:
name: Android Lint static analysis results
@ -217,18 +217,18 @@ jobs:
steps:
- name: Checkout
timeout-minutes: 1
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
- name: Set up Java
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
uses: gradle/gradle-build-action@4c39dd82cd5e1ec7c6fa0173bb41b4b6bb3b86ff
timeout-minutes: 5
- name: Test
timeout-minutes: 4
timeout-minutes: 10
run: |
# Note that we explicitly check just the Kotlin modules, to avoid compiling the Android modules here
./gradlew :configuration-api-lib:check :crash-lib:check :preference-api-lib:check :spackle-lib:check
@ -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@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
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@35b0e87d162680511bf346c299f71c9c5c379033
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@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
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@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
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@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
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@35b0e87d162680511bf346c299f71c9c5c379033
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
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@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
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@0ab4596768b603586c0de567f2430c30f5b0d2b0
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
timeout-minutes: 1
with:
distribution: 'temurin'
java-version: 17
- name: Set up Gradle
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
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@35b0e87d162680511bf346c299f71c9c5c379033
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@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
with:
name: Binaries
- name: Robo test

4
.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/
@ -24,3 +27,4 @@ local.properties
google-services.json
/.idea/kotlinc.xml
/.idea/other.xml
/.idea/appInsightsSettings.xml

197
CHANGELOG.md Normal file
View File

@ -0,0 +1,197 @@
# Changelog
All notable changes to this application will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this application adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
**Please be aware that this changelog primarily focuses on user-related modifications, emphasizing changes that can
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
- A periodic background block synchronization has been added. When the device is connected to the internet using an
unmetered connection and is plugged into the power, the background task will start to synchronize blocks randomly
between 3 and 4 a.m.
### Changed
- The Send screen form has changed its UI to align with the Figma design. All the form fields provide validations
and proper UI response.
## [0.2.0 (554)] - 2024-02-13
### Changed
- Update the Zcash SDK dependency to version 2.0.6, which adds more details on current balances
### Added
- The Balances screen now provides details on current balances like Change pending and Pending transactions
- The Balances screen adds a new Block synchronization progress bar and status, which were initially part of the
Account screen and redesigned
- The Balances screen supports transparent funds shielding within its new shielding panel
### Fixed
- Fixed character replacement in Zcash addresses on the Receive screen caused by ligatures in the app's primary font
using the secondary font. This will be revisited once a proper font is added.
- Improved spacing of titles of bottom navigation tabs, so they work better on smaller screens
## [0.2.0 (541)] - 2024-01-30
- Update the Zcash SDK dependency to version 2.0.5, which improves the performance of block synchronization
## [0.2.0 (540)] - 2024-01-27
### Added
- The current balance UI on top of the Account screen has been reworked. It now displays the currently available
balance as well.
- The same current balance UI was incorporated into the Send and Balances screens.
- The Send Error screen now contains a simple text with the reason for failure. The Send screen UI refactoring is
still in progress.
### Fixed
- Properly clearing focus from the Send text fields when moved to another screen
## [0.2.0 (530)] - 2024-01-16
### Changed
- The Not Enough Space screen used for notifying about insufficient free device disk space now provides the light
theme by default
- The App Update screen UI was improved to align with the other implemented screens according to the new design. Its
final design is still in progress.
- The Receive screen provides a new UI and features. The Unified and Transparent Zcash addresses are displayed on
this screen, together with buttons for copying the address and sharing the address's QR code.
### Removed
- Address Detail screen in favor of the Receive screen
## [0.2.0 (523)] - 2024-01-09
### Added
- Transaction history items now display Memos within the Android Toast, triggered by clicking the item
- Transaction history items add displaying transaction IDs; the ID element is also clickable
### Changed
- All project dependencies have been updated, including the Zcash SDK dependency
## [0.2.0 (517)] - 2023-12-21
### Changed
- Home screen navigation switched from the Side menu to the Bottom Navigation Tabs menu
- Re-enabled the possibility of installing different Zashi application build types on the same device simultaneously
(i.e., Mainnet, Testnet, Production, Debug)
- Send screen form now validates a maximum amount for sending with respect to the available balance
- Send form now supports software keyboard confirm actions
- And a few more miner UI improvements
### Fixed
- Resizing Send screen Form TextFields when focused
- Hidden Send screen Form TextFields behind the software keyboard when focused
- Monetary separators issues on the Send screen Form
## [0.2.0 (505)] - 2023-12-11
### Added
- Unfinished features show a "Not implemented yet" message after accessing in the app UI
### Changed
- Home and Receive screens have their Top app bar UI changed
- Automatic brightness adjustment switched to an on-demand feature after a new button is clicked on the Receive screen
### Removed
- Home screen side menu navigation was removed in favor of the Settings screen
## [0.2.0 (491)] - 2023-12-01
### Changed
- Updated user interface of these screens:
- New Wallet Recovery Seed screen (accessible from onboarding)
- Seed Recovery screen (accessible from Settings)
- Restore Seed screen for an existing wallet (accessible from onboarding)
- Restore Seed Birthday Height screen for an existing wallet (accessible from onboarding)

View File

@ -1,25 +1,46 @@
# Zashi Android Wallet
This is a sample implementation of a Zcash wallet for Android leveraging the [Zcash Android SDK](https://github.com/zcash/zcash-android-wallet-sdk). The goal is to exercise the SDK and related Zcash libraries, as well as demonstrate how the SDK works.
While we aim to continue improving this sample, it is not an official product. We open sourced it as a resource to make wallet development easier for the Zcash ecosystem.
This is the official home of the Zashi Zcash wallet for Android, a no-frills
Zcash mobile wallet leveraging the [Zcash Android SDK](https://github.com/Electric-Coin-Company/zcash-android-wallet-sdk).
# Getting Started
If you'd like to compile this application from source, please see our [Setup Documentation](docs/Setup.md) to get started.
# Beta Testing
The Zashi Android wallet is currently in closed beta testing, and will be
publicly available from the Google Play Store when testing is complete.
If you'd like to be added to the waitlist to become a Zashi beta tester,
please [sign up here](https://docs.google.com/forms/d/e/1FAIpQLSeQpykeMF8QcxnX5W8ya0pXIf5YPRRpUXD7H1gvbzv_WyASPw/viewform).
# Reporting an issue
If you wish to report a security issue, please follow our [Responsible Disclosure guidelines](https://github.com/zcash/ZcashLightClientKit/blob/master/responsible_disclosure.md). See the [Wallet App Threat Model](https://zcash.readthedocs.io/en/latest/rtd_pages/wallet_threat_model.html) for more information about the security and privacy limitations of the wallet.
If you'd like to report a technical issue or feature request for the Android Wallet, please file a [GitHub issue](https://github.com/zcash/secant-android-wallet/issues/new/choose).
If you'd like to report a technical issue or feature request for the Android
Wallet, please file a GitHub issue [here](https://github.com/Electric-Coin-Company/zashi-android/issues/new/choose).
For feature requests and issues related to the Zashi user interface that are
not Android-specific, please file a GitHub issue [here](https://github.com/Electric-Coin-Company/zashi/issues/new/choose).
If you wish to report a security issue, please follow our
[Responsible Disclosure guidelines](https://github.com/Electric-Coin-Company/zashi/blob/master/responsible_disclosure.md).
See the [Wallet App Threat Model](https://github.com/Electric-Coin-Company/zashi/blob/master/wallet_threat_model.md)
for more information about the security and privacy limitations of the wallet.
General Zcash questions and/or support requests and are best directed to either:
* [Zcash Forum](https://forum.zcashcommunity.com/)
* [Discord Community](https://discord.io/zcash-community)
# Contributing
Contributions are very much welcomed! Please read our [Contributing Guidelines](docs/CONTRIBUTING.md) to learn about our process.
# Getting Started
If you'd like to compile this application from source, please see our [Setup Documentation](docs/Setup.md) to get started.
# Forking
If you plan to fork the project to create a new app of your own, please make the following changes. (If you're making a GitHub fork to contribute back to the project, these steps are not necessary.)
If you plan to fork the project to create a new app of your own, please make
the following changes. (If you're making a GitHub fork to contribute back to
the project, these steps are not necessary.)
1. Change the app name under [gradle.properties](gradle.properties)
1. See `ZCASH_RELEASE_APP_NAME`
@ -34,11 +55,18 @@ If you plan to fork the project to create a new app of your own, please make the
1. Configure Firebase API keys and place them under `app/src/debug/google-services.json` and `app/src/release/google-services.json`
# Known Issues
1. Intel-based machines may have trouble building in Android Studio. The workaround is to add the following line to `~/.gradle/gradle.properties` `ZCASH_IS_DEPENDENCY_LOCKING_ENABLED=false`. See [#420](https://github.com/zcash/secant-android-wallet/issues/420) for more information.
1. During builds, a warning will be printed that says "Unable to detect AGP versions for included builds. All projects in the build should use the same AGP version." This can be safely ignored. The version under build-conventions is the same as the version used elsewhere in the application.
1. When the code coverage Gradle property `IS_ANDROID_INSTRUMENTATION_TEST_COVERAGE_ENABLED` is enabled, the debug app APK cannot be run. The coverage flag should therefore only be set when running automated tests.
1. During builds, a warning will be printed that says "Unable to detect AGP
versions for included builds. All projects in the build should use the same
AGP version." This can be safely ignored. The version under
build-conventions is the same as the version used elsewhere in the
application.
1. When the code coverage Gradle property
`IS_ANDROID_INSTRUMENTATION_TEST_COVERAGE_ENABLED` is enabled, the debug app
APK cannot be run. The coverage flag should therefore only be set when
running automated tests.
1. Test coverage for Compose code will be low, due to [known limitations](https://github.com/jacoco/jacoco/issues/1208) in the interaction between Compose and Jacoco.
1. Adding the `espresso-contrib` dependency will cause builds to fail, due to conflicting classes. This is a [known issue](https://github.com/zcash/zcash-android-wallet-sdk/issues/306) with the Zcash Android SDK.
1. Adding the `espresso-contrib` dependency will cause builds to fail, due to conflicting classes. This is a [known issue](https://github.com/Electric-Coin-Company/zcash-android-wallet-sdk/issues/306) with the Zcash Android SDK.
1. Android Studio will warn about the Gradle checksum. This is a [known issue](https://github.com/gradle/gradle/issues/9361) and can be safely ignored.
1. [#96](https://github.com/zcash/secant-android-wallet/issues/96) - Release builds print some R8 warnings which can be safely ignored.
1. [#96](https://github.com/Electric-Coin-Company/zashi-android/issues/96) - Release builds print some R8 warnings which can be safely ignored.
1. During app first launch, the following exception starting with `AndroidKeysetManager: keyset not found, will generate a new one` is printed twice. This exception is not an error, and the code is not being invoked twice.

View File

@ -1,3 +1,4 @@
import co.electriccoin.zcash.Git
import com.android.build.api.variant.BuildConfigField
import com.android.build.api.variant.ResValue
import java.util.Locale
@ -6,10 +7,10 @@ plugins {
id("com.android.application")
kotlin("android")
id("secant.android-build-conventions")
id("com.github.triplet.play")
id("com.osacky.fladle")
id("wtf.emulator.gradle")
id("secant.emulator-wtf-conventions")
id("secant.publish-conventions")
}
val hasFirebaseApiKeys = run {
@ -92,7 +93,7 @@ android {
releaseKeystorePassword,
releaseKeyAlias,
releaseKeyAliasPassword
).all { !it.isNullOrBlank() }
).all { it.isNotBlank() }
signingConfigs {
if (isReleaseSigningConfigured) {
@ -119,14 +120,19 @@ 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"
)
val isReleaseBuildDebuggable = project.property("IS_RELEASE_BUILD_DEBUGGABLE")
.toString().toBoolean()
isDebuggable = isReleaseBuildDebuggable
val isSignReleaseBuildWithDebugKey = project.property("IS_SIGN_RELEASE_BUILD_WITH_DEBUG_KEY")
.toString().toBoolean()
if (isReleaseSigningConfigured) {
signingConfig = signingConfigs.getByName("release")
} else if (isSignReleaseBuildWithDebugKey) {
@ -158,12 +164,6 @@ android {
resValue("string", "support_email_address", supportEmailAddress)
}
playConfigs {
register(testNetFlavorName) {
enabled.set(false)
}
}
testCoverage {
jacocoVersion = project.property("JACOCO_VERSION").toString()
}
@ -202,8 +202,6 @@ dependencies {
}
}
val googlePlayServiceKeyFilePath = project.property("ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH").toString()
androidComponents {
onVariants { variant ->
for (output in variant.outputs) {
@ -223,7 +221,9 @@ androidComponents {
ResValue(value = hasFirebaseApiKeys.toString())
)
if (googlePlayServiceKeyFilePath.isNotEmpty()) {
if (project.property("ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT_KEY").toString().isNotEmpty() &&
project.property("ZCASH_GOOGLE_PLAY_PUBLISHER_API_KEY").toString().isNotEmpty()
) {
// Update the versionName to reflect bumps in versionCode
val versionCodeOffset = 0 // Change this to zero the final digit of the versionName
@ -243,6 +243,9 @@ androidComponents {
}
output.versionName.set(processedVersionCode)
val gitInfo = Git.newInfo(Git.MAIN, parent!!.projectDir)
output.versionCode.set(gitInfo.commitCount)
}
}
@ -250,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",
@ -276,27 +280,6 @@ androidComponents {
}
}
if (googlePlayServiceKeyFilePath.isNotEmpty()) {
configure<com.github.triplet.gradle.play.PlayPublisherExtension> {
serviceAccountCredentials.set(File(googlePlayServiceKeyFilePath))
// For safety, only allow deployment to internal testing track
track.set("internal")
// Automatically manage version incrementing
resolutionStrategy.set(com.github.triplet.gradle.androidpublisher.ResolutionStrategy.AUTO)
val deployMode = project.property("ZCASH_GOOGLE_PLAY_DEPLOY_MODE").toString()
if ("build" == deployMode) {
releaseStatus.set(com.github.triplet.gradle.androidpublisher.ReleaseStatus.DRAFT)
// Prevent upload; only generates a build with the correct version number
commit.set(false)
} else if ("deploy" == deployMode) {
releaseStatus.set(com.github.triplet.gradle.androidpublisher.ReleaseStatus.COMPLETED)
}
}
}
fladle {
// Firebase Test Lab has min and max values that might differ from our project's
// These are determined by `gcloud firebase test android models list`

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
@ -23,4 +26,5 @@
# kotlinx.datetime supports kotlinx.serialization, but we don't use kotlinx.serialization elsewhere
# in the projects, so the classes aren't present. These warnings are safe to suppress.
-dontwarn kotlinx.serialization.KSerializer
-dontwarn kotlinx.serialization.Serializable
-dontwarn kotlinx.serialization.Serializable
-dontwarn kotlinx.serialization.internal.AbstractPolymorphicSerializer

View File

@ -10,7 +10,6 @@ import org.junit.Assert.assertEquals
import org.junit.Test
class AndroidApiTest {
@Test
@SmallTest
fun checkTargetApi() {

View File

@ -28,6 +28,16 @@
android:shell="true"
tools:targetApi="29" />
<provider
android:name="co.electriccoin.zcash.global.ShareFileProvider"
android:authorities="co.electriccoin.zcash.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/share_file_provider_paths" />
</provider>
</application>
</manifest>

View File

@ -9,7 +9,6 @@ import kotlinx.coroutines.launch
@Suppress("unused")
class ZcashApplication : CoroutineApplication() {
override fun onCreate() {
super.onCreate()

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:name="co.electriccoin.zcash.app.ZcashApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher_square"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name">
<provider
android:name="co.electriccoin.zcash.global.ShareFileProvider"
android:authorities="co.electriccoin.zcash.debug.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/share_file_provider_paths" />
</provider>
</application>
</manifest>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:name="co.electriccoin.zcash.app.ZcashApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher_square"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name">
<provider
android:name="co.electriccoin.zcash.global.ShareFileProvider"
android:authorities="co.electriccoin.zcash.provider.testnet"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/share_file_provider_paths" />
</provider>
</application>
</manifest>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:name="co.electriccoin.zcash.app.ZcashApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher_square"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name">
<provider
android:name="co.electriccoin.zcash.global.ShareFileProvider"
android:authorities="co.electriccoin.zcash.debug.provider.testnet"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/share_file_provider_paths" />
</provider>
</application>
</manifest>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Overlay from sdk-ext-lib. -->
<bool name="zcash_is_testnet">true</bool>
</resources>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View File

@ -41,6 +41,10 @@ dependencies {
val rootProperties = getRootProperties()
implementation("com.android.tools.build:gradle:${rootProperties.getProperty("ANDROID_GRADLE_PLUGIN_VERSION")}")
implementation("com.google.apis:google-api-services-androidpublisher:${rootProperties.getProperty
("PLAY_PUBLISHER_API_VERSION")}")
implementation("com.google.auth:google-auth-library-oauth2-http:${rootProperties.getProperty
("GOOGLE_AUTH_LIB_JAVA_VERSION")}")
implementation("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:${rootProperties.getProperty("DETEKT_VERSION")}")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProperties.getProperty("KOTLIN_VERSION")}")
implementation("wtf.emulator:gradle-plugin:${rootProperties.getProperty("EMULATOR_WTF_GRADLE_PLUGIN_VERSION")}")

View File

@ -1,38 +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.1.0=classpath
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.1.0=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.0=classpath
org.jetbrains.kotlin:kotlin-assignment:1.9.0=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.0=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.0=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.0=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.0=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.0=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.0=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.0=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.0=classpath
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.0=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.0=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.0=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.0=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,66 +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.grpc:proto-google-common-protos:2.0.1=runtimeClasspath
com.google.auto.value:auto-value-annotations:1.6.2=runtimeClasspath
com.google.code.findbugs:jsr305:3.0.2=runtimeClasspath
com.google.code.gson:gson:2.8.9=runtimeClasspath
com.google.api-client:google-api-client:2.2.0=compileClasspath,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
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.11.0=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=runtimeClasspath
com.google.guava:guava:31.1-jre=runtimeClasspath
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=runtimeClasspath
com.google.j2objc:j2objc-annotations:1.3=runtimeClasspath
com.google.guava:failureaccess:1.0.1=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
com.google.j2objc:j2objc-annotations:2.8=runtimeClasspath
com.google.jimfs:jimfs:1.1=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.oauth-client:google-oauth-client:1.34.1=compileClasspath,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
@ -68,29 +80,32 @@ com.sun.activation:javax.activation:1.2.0=runtimeClasspath
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.11=runtimeClasspath
commons-io:commons-io:2.12.0=runtimeClasspath
commons-logging:commons-logging:1.2=runtimeClasspath
io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.0=compileClasspath,runtimeClasspath
io.grpc:grpc-api:1.45.1=runtimeClasspath
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.perfmark:perfmark-api:0.23.0=runtimeClasspath
commons-codec:commons-codec:1.15=compileClasspath,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.6=compileClasspath,runtimeClasspath
io.grpc:grpc-api:1.57.0=runtimeClasspath
io.grpc:grpc-context:1.27.2=compileClasspath
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.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
@ -100,80 +115,76 @@ net.java.dev.jna:jna:5.6.0=runtimeClasspath
net.sf.jopt-simple:jopt-simple:4.9=runtimeClasspath
net.sf.kxml:kxml2:2.3.0=runtimeClasspath
org.apache.commons:commons-compress:1.21=runtimeClasspath
org.apache.httpcomponents:httpclient:4.5.13=runtimeClasspath
org.apache.httpcomponents:httpcore:4.4.15=runtimeClasspath
org.apache.httpcomponents:httpclient:4.5.14=compileClasspath,runtimeClasspath
org.apache.httpcomponents:httpcore:4.4.16=compileClasspath,runtimeClasspath
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=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.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.0=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.0=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.0=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.10=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.10=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.10=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.10=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.10=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-native-utils:1.9.10=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-project-model:1.9.10=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.0=compileClasspath
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.0=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-script-runtime:1.9.0=kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.0=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-common:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.0=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.0=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.0=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.10=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=compileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=compileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.20-RC2=runtimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.9.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-tooling-core:1.9.10=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-util-io:1.9.10=compileClasspath,runtimeClasspath
org.jetbrains.kotlin:kotlin-util-klib:1.9.10=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.12.2=runtimeClasspath
wtf.emulator:gradle-compat-6-6:0.12.2=runtimeClasspath
wtf.emulator:gradle-compat-7-6:0.12.2=runtimeClasspath
wtf.emulator:gradle-compat-api:0.12.2=runtimeClasspath
wtf.emulator:gradle-compat:0.12.2=runtimeClasspath
wtf.emulator:gradle-plugin:0.12.2=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

@ -5,7 +5,7 @@ plugins {
val ktlint by configurations.creating
dependencies {
ktlint("com.pinterest:ktlint:${project.property("KTLINT_VERSION")}") {
ktlint("com.pinterest.ktlint:ktlint-cli:${project.property("KTLINT_VERSION")}") {
attributes {
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named<Bundling>(Bundling.EXTERNAL))
}

View File

@ -0,0 +1,392 @@
import com.android.build.gradle.internal.tasks.factory.dependsOn
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport
import com.google.api.client.http.AbstractInputStreamContent
import com.google.api.client.http.FileContent
import com.google.api.client.http.HttpBackOffUnsuccessfulResponseHandler
import com.google.api.client.http.HttpRequest
import com.google.api.client.http.HttpTransport
import com.google.api.client.http.apache.v2.ApacheHttpTransport
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.api.client.json.JsonFactory
import com.google.api.client.json.gson.GsonFactory
import com.google.api.client.util.ExponentialBackOff
import com.google.api.services.androidpublisher.AndroidPublisher
import com.google.api.services.androidpublisher.AndroidPublisherRequestInitializer
import com.google.api.services.androidpublisher.AndroidPublisherScopes
import com.google.api.services.androidpublisher.model.AppEdit
import com.google.api.services.androidpublisher.model.Bundle
import com.google.api.services.androidpublisher.model.Track
import com.google.api.services.androidpublisher.model.TrackRelease
import com.google.auth.http.HttpCredentialsAdapter
import com.google.auth.oauth2.GoogleCredentials
import org.apache.http.auth.AuthScope
import org.apache.http.auth.UsernamePasswordCredentials
import org.apache.http.impl.client.BasicCredentialsProvider
import org.apache.http.impl.client.ProxyAuthenticationStrategy
import java.io.FileInputStream
import java.io.IOException
import java.security.GeneralSecurityException
import java.security.KeyStore
@CacheableTask
abstract class PublishToGooglePlay @Inject constructor(
private val gpServiceAccountKey: String,
private val gpPublisherApiKey: String,
private val track: String,
private val status: String
) : DefaultTask() {
// Note that we need to have all the necessary custom task properties part of the task (i.e. no external
// dependencies allowed) to avoid:
// PublishToGooglePlay is a non-static inner class.
init {
description = "Publish universal Zcash wallet apk to Google Play release channel." // $NON-NLS-1$
group = "publishing" // $NON-NLS-1$
}
private fun log(message: String) {
println("${PublishToGooglePlay::class.java.name}: $message")
}
// Global instance of the JSON factory
private val jsonFactory: JsonFactory by lazy {
GsonFactory.getDefaultInstance()
}
// Global instance of the HTTP transport
@get:Throws(GeneralSecurityException::class, IOException::class)
private val trustedTransport: HttpTransport by lazy {
buildTransport()
}
/**
* Prepares a new trusted [HttpTransport] object to authorize [AndroidPublisher] on Google Play Publish API.
*/
private fun buildTransport(): HttpTransport {
val trustStore: String? = System.getProperty("javax.net.ssl.trustStore", null)
val trustStorePassword: String? =
System.getProperty("javax.net.ssl.trustStorePassword", null)
return if (trustStore == null) {
createHttpTransport()
} else {
val ks = KeyStore.getInstance(KeyStore.getDefaultType())
FileInputStream(trustStore).use { fis ->
ks.load(fis, trustStorePassword?.toCharArray())
}
NetHttpTransport.Builder().trustCertificates(ks).build()
}
}
private fun createHttpTransport(): HttpTransport {
val protocols = arrayOf("https", "http")
for (protocol in protocols) {
val proxyHost = System.getProperty("$protocol.proxyHost")
val proxyUser = System.getProperty("$protocol.proxyUser")
val proxyPassword = System.getProperty("$protocol.proxyPassword")
if (proxyHost != null && proxyUser != null && proxyPassword != null) {
val defaultProxyPort = if (protocol == "http") "80" else "443"
val proxyPort = Integer.parseInt(System.getProperty("$protocol.proxyPort", defaultProxyPort))
val credentials = BasicCredentialsProvider()
credentials.setCredentials(
AuthScope(proxyHost, proxyPort),
UsernamePasswordCredentials(proxyUser, proxyPassword)
)
val httpClient = ApacheHttpTransport.newDefaultHttpClientBuilder()
.setProxyAuthenticationStrategy(ProxyAuthenticationStrategy.INSTANCE)
.setDefaultCredentialsProvider(credentials)
.build()
return ApacheHttpTransport(httpClient)
}
}
return GoogleNetHttpTransport.newTrustedTransport()
}
private class AndroidPublisherAdapter(
credential: GoogleCredentials,
) : HttpCredentialsAdapter(credential) {
override fun initialize(request: HttpRequest) {
val backOffHandler = HttpBackOffUnsuccessfulResponseHandler(
ExponentialBackOff.Builder()
.setMaxElapsedTimeMillis(TimeUnit.MINUTES.toMillis(3).toInt())
.build()
)
super.initialize(
request.setReadTimeout(0)
.setUnsuccessfulResponseHandler(backOffHandler)
)
}
}
/**
* Build service account credential using secret service json key file.
*
* @return OAuth credential for the given service key file path
* @throws IOException in case an incorrect key file path is provided or the credential cannot be created from
* the stream
*/
@Throws(IOException::class)
private fun getCredentialFromServiceKeyFile(serviceKey: String): GoogleCredentials {
log("Authorizing using non-empty service key: ${serviceKey.isNotEmpty()}")
return GoogleCredentials.fromStream(serviceKey.byteInputStream())
.also {
it.createScoped(listOf(AndroidPublisherScopes.ANDROIDPUBLISHER))
}
}
/**
* Prepares API communication service and returns [AndroidPublisher] upon which API requests can be performed. This
* operation performs all the necessary setup steps for running the requests.
*
* @param applicationName The package name of the application, e.g.: com.example.app
* @param serviceAccountKey The service account key for the API communication authorization
* @param publisherApiKey The Google Play Publisher API key for the API communication authorization
* @return The {@Link AndroidPublisher} service
*/
private fun initService(
applicationName: String,
serviceAccountKey: String,
publisherApiKey: String
): AndroidPublisher {
log("Initializing Google Play communication for: $applicationName")
// Running authorization
val credential = getCredentialFromServiceKeyFile(serviceAccountKey)
val httpInitializer = AndroidPublisherAdapter(credential)
// Set up and return API client
return AndroidPublisher.Builder(
trustedTransport,
jsonFactory,
httpInitializer
)
.setApplicationName(applicationName)
.setAndroidPublisherRequestInitializer(AndroidPublisherRequestInitializer(publisherApiKey))
.build()
}
@Throws(IllegalStateException::class, IOException::class, GeneralSecurityException::class)
@Suppress("LongMethod")
private fun runPublish(
track: String,
status: String,
serviceAccountKey: String,
publisherApiKey: String
) {
val packageName = project.property("ZCASH_RELEASE_PACKAGE_NAME").toString()
// Walk through the build directory and find the prepared release aab file
val apkFile = File("app/build/outputs/bundle/").walk()
.filter { it.name.endsWith("release.aab") }
.firstOrNull() ?: error("Universal release apk not found")
log("Publish - APK found: ${apkFile.name}")
val apkFileContent: AbstractInputStreamContent = FileContent(
"application/octet-stream", // APK file type
apkFile
)
// Create the Google Play API service for communication
val service: AndroidPublisher = initService(
packageName,
serviceAccountKey,
publisherApiKey
)
val edits: AndroidPublisher.Edits = service.edits()
// Create a new edit to make changes to the existing listing
val editRequest: AndroidPublisher.Edits.Insert = edits
.insert(
packageName,
null // Intentionally no content provided
)
log("Publish - Edits request: $editRequest")
val edit: AppEdit = editRequest.execute()
log("Publish - Edits excute: $edit")
val editId: String = edit.id
log("Publish - Edit with id: $editId")
val uploadRequest: AndroidPublisher.Edits.Bundles.Upload = edits
.bundles()
.upload(
packageName,
editId,
apkFileContent
)
val bundle: Bundle = uploadRequest.execute()
// Version code
val bundleVersionCodes: MutableList<Long> = ArrayList()
bundleVersionCodes.add(bundle.versionCode.toLong())
// Version name
val gradleVersionName = project.property("ZCASH_VERSION_NAME").toString()
val versionName = "$gradleVersionName (${bundle.versionCode.toLong()}): Automated Internal Testing Release"
log("Publish - Version: $versionName has been uploaded")
// Assign bundle to the selected track
val updateTrackRequest: AndroidPublisher.Edits.Tracks.Update = edits
.tracks()
.update(
packageName,
editId,
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)
)
)
)
val updatedTrack: Track = updateTrackRequest.execute()
log("Track ${updatedTrack.track} has been updated")
// Commit changes for edit
val commitRequest: AndroidPublisher.Edits.Commit = edits.commit(
packageName,
editId
)
val appEdit: AppEdit = commitRequest.execute()
log("App edit with id ${appEdit.id} has been committed")
}
@TaskAction
fun runTask() {
log("Publish starting for track: $track and status: $status")
runPublish(
track,
status,
gpServiceAccountKey,
gpPublisherApiKey
)
log("Publishing done")
}
}
/**
* The release track identifier. This class also serves as a type-safe custom task input validation.
*/
enum class PublishTrack {
INTERNAL, // Internal testing track
ALPHA, // Closed testing track
BETA, // Open testing track. Note that use of this track is not supported by this task.
PRODUCTION; // Production track. Note that use of this track is not supported by this task.
companion object {
@Throws(IllegalArgumentException::class)
fun new(identifier: String): PublishTrack {
// Throws IllegalArgumentException if the specified name does not match any of the defined enum constants
return values().find { it.name.lowercase() == identifier }
?: throw IllegalArgumentException("Unsupported enum value: $identifier")
}
}
@Throws(IllegalStateException::class)
fun toGooglePlayIdentifier(): String {
return when (this) {
INTERNAL -> "internal" // $NON-NLS-1$
ALPHA -> "alpha" // $NON-NLS-1$
BETA, PRODUCTION -> error("For security reasons, this script does not support the $this option. Promote " +
"the app manually from a lower testing channel instead.")
}
}
}
/**
* The status of a release. This class also serves as a type-safe custom task input validation.
*/
enum class PublishStatus {
STATUS_UNSPECIFIED, // Unspecified status.
DRAFT, // The release's APKs are not being served to users.
IN_PROGRESS, // The release's APKs are being served to a fraction of users, determined by 'userFraction'.
HALTED, // The release's APKs will no longer be served to users. Users who already have these APKs are unaffected.
COMPLETED; // The release will have no further changes. Its APKs are being served to all users, unless they are
// eligible to APKs of a more recent release.
companion object {
@Throws(IllegalArgumentException::class)
fun new(identifier: String): PublishStatus {
// Throws IllegalArgumentException if the specified name does not match any of the defined enum constants
return values().find { it.name.lowercase() == identifier }
?: throw IllegalArgumentException("Unsupported enum value: $identifier")
}
}
@Throws(IllegalStateException::class)
fun toGooglePlayIdentifier(): String {
return when (this) {
DRAFT -> "draft" // $NON-NLS-1$
COMPLETED -> "completed" // $NON-NLS-1$
STATUS_UNSPECIFIED, IN_PROGRESS, HALTED -> error("Not supported status: $this")
}
}
}
tasks {
// Validate Google Play Service Account KEY input
val googlePlayServiceAccountKey = project.property("ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT_KEY").toString()
if (googlePlayServiceAccountKey.isEmpty()) {
// The deployment will not run: service account key is empty
return@tasks
}
// Validate Google Play Publisher API KEY input
val googlePlayPublisherApiKey = project.property("ZCASH_GOOGLE_PLAY_PUBLISHER_API_KEY").toString()
if (googlePlayServiceAccountKey.isEmpty()) {
// The deployment will not run: publisher api key is empty
return@tasks
}
// Validate deploy track
val deployTrackString = project.property("ZCASH_GOOGLE_PLAY_DEPLOY_TRACK").toString()
val deployTrack = deployTrackString.let {
if (it.isEmpty()) {
// The deployment will not run: track empty
return@tasks
}
PublishTrack.new(it)
}
// Validate deploy status
val deployStatusString = project.property("ZCASH_GOOGLE_PLAY_DEPLOY_STATUS").toString()
val deployStatus = deployStatusString.let {
if (it.isEmpty()) {
// The deployment will not run: status empty
return@tasks
}
PublishStatus.new(it)
}
// The new task [publishToGooglePlay] runs [assembleDebug] and [bundleZcashmainnetRelease] as its
// dependencies.
// Note that we need to convert these Enums to Strings as enums are not assignable via Kotlin DSL to Gradle
// custom task, although it would be better to work with more type-safe Enums furthermore.
register<PublishToGooglePlay>(
"publishToGooglePlay", // $NON-NLS-1$
googlePlayServiceAccountKey,
googlePlayPublisherApiKey,
deployTrack.toGooglePlayIdentifier(),
deployStatus.toGooglePlayIdentifier()
)
.dependsOn(":app:assembleDebug")
.dependsOn(":app:bundleZcashmainnetRelease")
.dependsOn(":app:packageZcashmainnetReleaseUniversalApk")
println("Automated deployment task registered - all the necessary attributes set")
}

View File

@ -1,3 +1,4 @@
import co.electriccoin.zcash.Git
import java.text.SimpleDateFormat
import java.util.*
@ -13,7 +14,10 @@ plugins {
val generateBuildConfigTask = tasks.create("buildConfig") {
val generatedDir = layout.buildDirectory.dir("generated").get().asFile
val gitInfo = co.electriccoin.zcash.Git.newInfo(parent!!.projectDir)
val gitInfo = co.electriccoin.zcash.Git.newInfo(
Git.HEAD,
parent!!.projectDir
)
//val buildTimestamp = newIso8601Timestamp()
inputs.property("gitSha", gitInfo.sha)

View File

@ -3,45 +3,46 @@
# This file is expected to be part of source control.
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=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.10=kotlinBuildToolsApiClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,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.6.20=kotlinCompilerClasspathCopy
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=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.10=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=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.10=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.10=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.10=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.10=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.10=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.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.20=jvmTestImplementationCopy
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20=commonMainApiCopy,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.9.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
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.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.10=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.10=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.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains:annotations:13.0=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationCopy,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationCopy,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataCommonMain,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath
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,12 +97,14 @@ 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",
"ZCASH_SUPPORT_EMAIL_ADDRESS" to "support@electriccoin.co",
"IS_SECURE_SCREEN_PROTECTION_ACTIVE" to "true",
"IS_DARK_MODE_ENABLED" to "false",
"IS_SCREEN_ROTATION_ENABLED" to "false",
"ZCASH_DEBUG_KEYSTORE_PATH" to "",
"ZCASH_RELEASE_KEYSTORE_PATH" to "",
@ -111,9 +113,14 @@ tasks {
"ZCASH_RELEASE_KEY_ALIAS_PASSWORD" to "",
"IS_SIGN_RELEASE_BUILD_WITH_DEBUG_KEY" to "false",
"IS_RELEASE_BUILD_DEBUGGABLE" to "false",
"ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT" to "",
"ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT_KEY" to "",
"ZCASH_GOOGLE_PLAY_PUBLISHER_API_KEY" to "",
"ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH" to "",
"ZCASH_GOOGLE_PLAY_DEPLOY_MODE" to "build",
"ZCASH_GOOGLE_PLAY_DEPLOY_TRACK" to "internal",
"ZCASH_GOOGLE_PLAY_DEPLOY_STATUS" to "draft",
"SDK_INCLUDED_BUILD_PATH" to "",
"BIP_39_INCLUDED_BUILD_PATH" to ""

View File

@ -1,38 +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.1.0=classpath
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.1.0=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.0=classpath
org.jetbrains.kotlin:kotlin-assignment:1.9.0=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.0=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.0=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.0=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.0=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.0=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.0=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.0=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.0=classpath
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.0=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.0=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.0=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.0=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,36 +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.0=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.0=kotlinCompilerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.0=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.0=compileClasspath
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.0=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.0=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.0=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.0=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.0=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.0=kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10=testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=compileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10=testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=compileClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.7.10=kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.9.0=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

@ -6,13 +6,17 @@ import java.io.File
object Git {
// Get the info for the current branch
private const val HEAD = "HEAD"
const val HEAD = "HEAD" // $NON-NLS-1$
const val MAIN = "main" // $NON-NLS-1$
fun newInfo(workingDirectory: File): GitInfo {
fun newInfo(
branch: String,
workingDirectory: File
): GitInfo {
val git = Git.open(workingDirectory)
val repository = git.repository
val head: ObjectId = repository.resolve(HEAD)
val head: ObjectId = repository.resolve(branch)
val count = git.log().call().count()
return GitInfo(ObjectId.toString(head), count)

View File

@ -1,73 +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.grpc:proto-google-common-protos:2.0.1=classpath
com.google.auto.value:auto-value-annotations:1.6.2=classpath
com.google.api-client:google-api-client:2.2.0=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.8.9=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.11.0=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.j2objc:j2objc-annotations:1.3=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:2.8=classpath
com.google.jimfs:jimfs:1.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.oauth-client:google-oauth-client:1.34.1=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
@ -82,34 +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.11=classpath
commons-io:commons-io:2.12.0=classpath
commons-codec:commons-codec:1.15=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.perfmark:perfmark-api:0.23.0=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.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
@ -119,66 +126,63 @@ net.java.dev.jna:jna:5.6.0=classpath
net.sf.jopt-simple:jopt-simple:4.9=classpath
net.sf.kxml:kxml2:2.3.0=classpath
org.apache.commons:commons-compress:1.21=classpath
org.apache.httpcomponents:httpclient:4.5.13=classpath
org.apache.httpcomponents:httpcore:4.4.15=classpath
org.apache.httpcomponents:httpclient:4.5.14=classpath
org.apache.httpcomponents:httpcore:4.4.16=classpath
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.10=classpath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=classpath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=classpath
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.10=classpath
org.jetbrains.kotlin:kotlin-daemon-client:1.9.10=classpath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.10=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.10=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.10=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.10=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.10=classpath
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.10=classpath
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.10=classpath
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.10=classpath
org.jetbrains.kotlin:kotlin-native-utils:1.9.10=classpath
org.jetbrains.kotlin:kotlin-project-model:1.9.10=classpath
org.jetbrains.kotlin:kotlin-reflect:1.9.0=classpath
org.jetbrains.kotlin:kotlin-scripting-common:1.9.10=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.10=classpath
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.10=classpath
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.10=classpath
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=classpath
org.jetbrains.kotlin:kotlin-stdlib:1.9.0=classpath
org.jetbrains.kotlin:kotlin-tooling-core:1.9.10=classpath
org.jetbrains.kotlin:kotlin-util-io:1.9.10=classpath
org.jetbrains.kotlin:kotlin-util-klib:1.9.10=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.12.2=classpath
wtf.emulator:gradle-compat-6-6:0.12.2=classpath
wtf.emulator:gradle-compat-7-6:0.12.2=classpath
wtf.emulator:gradle-compat-api:0.12.2=classpath
wtf.emulator:gradle-compat:0.12.2=classpath
wtf.emulator:gradle-plugin:0.12.2=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

@ -7,51 +7,58 @@ org.hamcrest:hamcrest-core:1.3=jvmTestCompileClasspath,jvmTestRuntimeClasspath
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=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.10=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.10=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,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.10=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.10=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.10=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.10=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.10=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.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.20=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.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.10=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
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.9.10=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-test:1.9.10=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=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.5=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5=allSourceSetsCompileDependenciesMetadata,allSourceSetsRuntimeDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.1=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.1=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:atomicfu:0.20.2=metadataCommonMainCompileClasspath
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.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.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=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.kotlinx:kotlinx-coroutines-test-jvm:1.7.1=jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.1=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.4.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime:0.4.0=allSourceSetsCompileDependenciesMetadata,allSourceSetsRuntimeDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.2=allSourceSetsCompileDependenciesMetadata,allSourceSetsRuntimeDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains:annotations:13.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataCommonMain,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1=metadataCommonMainCompileClasspath
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
org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.2=allSourceSetsRuntimeDependenciesMetadata,metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.2=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
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
empty=archives,commonMainIntransitiveDependenciesMetadata,commonMainRuntimeOnlyDependenciesMetadata,commonTestIntransitiveDependenciesMetadata,commonTestRuntimeOnlyDependenciesMetadata,default,jvmMainIntransitiveDependenciesMetadata,jvmMainRuntimeOnlyDependenciesMetadata,jvmTestIntransitiveDependenciesMetadata,jvmTestRuntimeOnlyDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDef,kotlinScriptDefExtensions,koverAggregatedSetup,koverExternalArtifacts,testKotlinScriptDef,testKotlinScriptDefExtensions

View File

@ -7,7 +7,6 @@ import kotlinx.coroutines.flow.Flow
* Provides a remote config implementation.
*/
interface ConfigurationProvider {
/**
* @return The configuration if it has been loaded already. If not loaded, returns an empty configuration.
*/

View File

@ -40,19 +40,32 @@ private data class MergingConfiguration(private val configurations: PersistentLi
return null != configurations.firstWithKey(key)
}
override fun getBoolean(key: ConfigKey, defaultValue: Boolean): Boolean {
// 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
): Boolean {
return configurations.firstWithKey(key)?.let {
return it.getBoolean(key, defaultValue)
} ?: defaultValue
}
override fun getInt(key: ConfigKey, defaultValue: Int): Int {
// 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
): Int {
return configurations.firstWithKey(key)?.let {
return it.getInt(key, defaultValue)
} ?: defaultValue
}
override fun getString(key: ConfigKey, defaultValue: String): String {
override fun getString(
key: ConfigKey,
defaultValue: String
): String {
return configurations.firstWithKey(key)?.let {
return it.getString(key, defaultValue)
} ?: defaultValue

View File

@ -6,7 +6,7 @@ data class BooleanConfigurationEntry(
override val key: ConfigKey,
private val defaultValue: Boolean
) : DefaultEntry<Boolean> {
override fun getValue(configuration: Configuration) =
configuration.getBoolean(key, defaultValue)
// 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

@ -8,16 +8,16 @@ import co.electriccoin.zcash.configuration.model.map.Configuration
* variation in default value. Clients define the key and default value together, rather than just
* the key.
*/
/*
* API note: the default value is not available through the public interface in order to prevent
* clients from accidentally using the default value instead of the configuration value.
*
* Implementation note: although primitives would be nice, Objects don't increase memory usage much.
* The autoboxing cache solves Booleans, and Strings are already objects, so that just leaves Integers.
* Overall the number of Integer configuration entries is expected to be low compared to Booleans,
* and perhaps many Integer values will also fit within the autoboxing cache.
*/
interface DefaultEntry<T> {
/*
* API note: the default value is not available through the public interface in order to prevent
* clients from accidentally using the default value instead of the configuration value.
*
* Implementation note: although primitives would be nice, Objects don't increase memory usage much.
* The autoboxing cache solves Booleans, and Strings are already objects, so that just leaves Integers.
* Overall the number of Integer configuration entries is expected to be low compared to Booleans,
* and perhaps many Integer values will also fit within the autoboxing cache.
*/
val key: ConfigKey

View File

@ -6,6 +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

@ -6,6 +6,5 @@ data class StringConfigurationEntry(
override val key: ConfigKey,
private val defaultValue: String
) : DefaultEntry<String> {
override fun getValue(configuration: Configuration) = configuration.getString(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

@ -26,7 +26,10 @@ interface Configuration {
* be returned if type coercion fails.
* @return boolean mapping for `key` or `defaultValue`.
*/
fun getBoolean(key: ConfigKey, defaultValue: Boolean): Boolean
fun getBoolean(
key: ConfigKey,
defaultValue: Boolean
): Boolean
/**
* @param key Key to use to retrieve the value.
@ -35,7 +38,10 @@ interface Configuration {
* be returned if type coercion fails.
* @return int mapping for `key` or `defaultValue`.
*/
fun getInt(key: ConfigKey, defaultValue: Int): Int
fun getInt(
key: ConfigKey,
defaultValue: Int
): Int
/**
* @param key Key to use to retrieve the value.
@ -44,5 +50,8 @@ interface Configuration {
* be returned if type coercion fails.
* @return String mapping for `key` or `defaultValue`.
*/
fun getString(key: ConfigKey, defaultValue: String): String
fun getString(
key: ConfigKey,
defaultValue: String
): String
}

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,30 +11,42 @@ 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
override fun getInt(key: ConfigKey, defaultValue: Int) = configurationMapping[key.key]?.let {
@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
override fun getString(key: ConfigKey, defaultValue: String) =
configurationMapping.getOrElse(key.key) { defaultValue }
override fun getString(
key: ConfigKey,
defaultValue: String
) = configurationMapping.getOrElse(key.key) { defaultValue }
override fun hasKey(key: ConfigKey) = configurationMapping.containsKey(key.key)
}

View File

@ -18,72 +18,98 @@ import kotlin.test.assertTrue
class MergingConfigurationProviderTest {
@Test
fun peek_ordering() {
val configurationProvider = MergingConfigurationProvider(
persistentListOf(
MockConfigurationProvider(
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()), null)
),
MockConfigurationProvider(
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()), null)
val configurationProvider =
MergingConfigurationProvider(
persistentListOf(
MockConfigurationProvider(
StringConfiguration(
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()),
null
)
),
MockConfigurationProvider(
StringConfiguration(
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()),
null
)
)
)
)
)
assertTrue(BooleanDefaultEntryFixture.newTrueEntry().getValue(configurationProvider.peekConfiguration()))
}
@Test
fun getFlow_ordering() = runTest {
val configurationProvider = MergingConfigurationProvider(
persistentListOf(
MockConfigurationProvider(
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()), null)
),
MockConfigurationProvider(
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()), null)
fun getFlow_ordering() =
runTest {
val configurationProvider =
MergingConfigurationProvider(
persistentListOf(
MockConfigurationProvider(
StringConfiguration(
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()),
null
)
),
MockConfigurationProvider(
StringConfiguration(
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()),
null
)
)
)
)
)
)
assertTrue(
BooleanDefaultEntryFixture.newTrueEntry().getValue(configurationProvider.getConfigurationFlow().first())
)
}
assertTrue(
BooleanDefaultEntryFixture.newTrueEntry().getValue(configurationProvider.getConfigurationFlow().first())
)
}
@Test
fun getFlow_empty() = runTest {
val configurationProvider = MergingConfigurationProvider(
emptyList<ConfigurationProvider>().toPersistentList()
)
fun getFlow_empty() =
runTest {
val configurationProvider =
MergingConfigurationProvider(
emptyList<ConfigurationProvider>().toPersistentList()
)
val firstMergedConfiguration = configurationProvider.getConfigurationFlow().first()
val firstMergedConfiguration = configurationProvider.getConfigurationFlow().first()
assertTrue(BooleanDefaultEntryFixture.newTrueEntry().getValue(firstMergedConfiguration))
}
assertTrue(BooleanDefaultEntryFixture.newTrueEntry().getValue(firstMergedConfiguration))
}
@Test
fun getUpdatedAt_newest() = runTest {
val older = "2023-01-15T08:38:45.415Z".toInstant()
val newer = "2023-01-17T08:38:45.415Z".toInstant()
fun getUpdatedAt_newest() =
runTest {
val older = "2023-01-15T08:38:45.415Z".toInstant()
val newer = "2023-01-17T08:38:45.415Z".toInstant()
val configurationProvider = MergingConfigurationProvider(
persistentListOf(
MockConfigurationProvider(
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()), older)
),
MockConfigurationProvider(
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()), newer)
val configurationProvider =
MergingConfigurationProvider(
persistentListOf(
MockConfigurationProvider(
StringConfiguration(
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()),
older
)
),
MockConfigurationProvider(
StringConfiguration(
persistentMapOf(
BooleanDefaultEntryFixture.KEY.key to false.toString()
),
newer
)
)
)
)
)
)
val updatedAt = configurationProvider.getConfigurationFlow().first().updatedAt
assertEquals(newer, updatedAt)
}
val updatedAt = configurationProvider.getConfigurationFlow().first().updatedAt
assertEquals(newer, updatedAt)
}
}
private class MockConfigurationProvider(private val configuration: Configuration) : ConfigurationProvider {
override fun peekConfiguration(): Configuration {
return configuration
}

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
@ -11,32 +12,44 @@ import kotlinx.datetime.Instant
* though, making the initial mapping thread-safe.
*/
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
override fun getInt(key: ConfigKey, defaultValue: Int) = configurationMapping[key.key]?.let {
@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
override fun getString(key: ConfigKey, defaultValue: String) =
configurationMapping.getOrElse(key.key) { defaultValue }
override fun getString(
key: ConfigKey,
defaultValue: String
) = configurationMapping.getOrElse(key.key) { defaultValue }
override fun hasKey(key: ConfigKey) = configurationMapping.containsKey(key.key)
}

View File

@ -4,7 +4,6 @@ import co.electriccoin.zcash.configuration.model.entry.BooleanConfigurationEntry
import co.electriccoin.zcash.configuration.model.entry.ConfigKey
object BooleanDefaultEntryFixture {
val KEY = ConfigKey("some_boolean_key") // $NON-NLS
fun newTrueEntry() = BooleanConfigurationEntry(KEY, true)

View File

@ -6,5 +6,9 @@ import co.electriccoin.zcash.configuration.model.entry.IntegerConfigurationEntry
object IntegerDefaultEntryFixture {
val KEY = ConfigKey("some_string_key") // $NON-NLS
const val DEFAULT_VALUE = 123
fun newEntry(key: ConfigKey = KEY, value: Int = DEFAULT_VALUE) = IntegerConfigurationEntry(key, value)
fun newEntry(
key: ConfigKey = KEY,
value: Int = DEFAULT_VALUE
) = IntegerConfigurationEntry(key, value)
}

View File

@ -6,5 +6,9 @@ import co.electriccoin.zcash.configuration.model.entry.StringConfigurationEntry
object StringDefaultEntryFixture {
val KEY = ConfigKey("some_string_key") // $NON-NLS
const val DEFAULT_VALUE = "some_default_value" // $NON-NLS
fun newEntryEntry(key: ConfigKey = KEY, value: String = DEFAULT_VALUE) = StringConfigurationEntry(key, value)
fun newEntryEntry(
key: ConfigKey = KEY,
value: String = DEFAULT_VALUE
) = StringConfigurationEntry(key, value)
}

View File

@ -8,25 +8,28 @@ import co.electriccoin.zcash.spackle.LazyWithArgument
import kotlinx.collections.immutable.toPersistentList
object AndroidConfigurationFactory {
private val instance = LazyWithArgument<Context, ConfigurationProvider> { context ->
new(context)
}
private val instance =
LazyWithArgument<Context, ConfigurationProvider> { context ->
new(context)
}
fun getInstance(context: Context): ConfigurationProvider = instance.getInstance(context)
// Context will be needed for most cloud providers, e.g. to integrate with Firebase or other
// remote configuration providers.
private fun new(@Suppress("UNUSED_PARAMETER") context: Context): ConfigurationProvider {
val configurationProviders = buildList<ConfigurationProvider> {
// For ordering, ensure the IntentConfigurationProvider is first so that it can
// override any other configuration providers.
if (BuildConfig.DEBUG) {
add(IntentConfigurationProvider)
}
private fun new(
@Suppress("UNUSED_PARAMETER") context: Context
): ConfigurationProvider {
val configurationProviders =
buildList<ConfigurationProvider> {
// For ordering, ensure the IntentConfigurationProvider is first so that it can
// override any other configuration providers.
if (BuildConfig.DEBUG) {
add(IntentConfigurationProvider)
}
// In the future, add a third party cloud-based configuration provider
}
// In the future, add a third party cloud-based configuration provider
}
return MergingConfigurationProvider(configurationProviders.toPersistentList())
}

View File

@ -8,7 +8,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
internal object IntentConfigurationProvider : ConfigurationProvider {
private val configurationStateFlow = MutableStateFlow(StringConfiguration(persistentMapOf(), null))
override fun peekConfiguration() = configurationStateFlow.value

View File

@ -8,18 +8,22 @@ import kotlinx.collections.immutable.toPersistentMap
import kotlinx.datetime.Clock
class IntentConfigurationReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
override fun onReceive(
context: Context?,
intent: Intent?
) {
intent?.defuse()?.let {
val key = it.getStringExtra(ConfigurationIntent.EXTRA_STRING_KEY)
val value = it.getStringExtra(ConfigurationIntent.EXTRA_STRING_VALUE)
if (null != key) {
val existingConfiguration = IntentConfigurationProvider.peekConfiguration().configurationMapping
val newConfiguration = if (null == value) {
existingConfiguration.remove(key)
} else {
existingConfiguration + (key to value)
}
val newConfiguration =
if (null == value) {
existingConfiguration.remove(key)
} else {
existingConfiguration + (key to value)
}
IntentConfigurationProvider.setConfiguration(
StringConfiguration(newConfiguration.toPersistentMap(), Clock.System.now())
@ -34,7 +38,9 @@ private fun Intent.defuse(): Intent? {
return try {
extras?.containsKey(null)
this
} catch (@Suppress("SwallowedException", "TooGenericExceptionCaught") e: Exception) {
} catch (
@Suppress("SwallowedException", "TooGenericExceptionCaught") e: Exception
) {
null
}
}

View File

@ -9,7 +9,6 @@ import java.util.concurrent.CountDownLatch
import java.util.concurrent.atomic.AtomicBoolean
class AndroidUncaughtExceptionHandlerTest {
@Test(expected = IllegalStateException::class)
fun requires_main_thread() {
AndroidUncaughtExceptionHandler.register(ApplicationProvider.getApplicationContext())

View File

@ -12,7 +12,6 @@ import org.junit.Assert.assertTrue
import org.junit.Test
class Components {
@Test
@SmallTest
fun process_names() {
@ -26,16 +25,18 @@ class Components {
}
}
private fun PackageManager.getProviderInfoCompat(componentName: ComponentName) = if (AndroidApiVersion.isAtLeastT) {
getProviderInfo(componentName, PackageManager.ComponentInfoFlags.of(0))
} else {
@Suppress("Deprecation")
getProviderInfo(componentName, 0)
}
private fun PackageManager.getProviderInfoCompat(componentName: ComponentName) =
if (AndroidApiVersion.isAtLeastT) {
getProviderInfo(componentName, PackageManager.ComponentInfoFlags.of(0))
} else {
@Suppress("Deprecation")
getProviderInfo(componentName, 0)
}
private fun PackageManager.getReceiverInfoCompat(componentName: ComponentName) = if (AndroidApiVersion.isAtLeastT) {
getReceiverInfo(componentName, PackageManager.ComponentInfoFlags.of(0))
} else {
@Suppress("Deprecation")
getReceiverInfo(componentName, 0)
}
private fun PackageManager.getReceiverInfoCompat(componentName: ComponentName) =
if (AndroidApiVersion.isAtLeastT) {
getReceiverInfo(componentName, PackageManager.ComponentInfoFlags.of(0))
} else {
@Suppress("Deprecation")
getReceiverInfo(componentName, 0)
}

View File

@ -6,7 +6,6 @@ import org.junit.Assert.assertEquals
import org.junit.Test
class ReportableExceptionTest {
@Test
fun bundle() {
val reportableException = ReportableExceptionFixture.new()

View File

@ -9,8 +9,9 @@ import java.io.File
@Suppress("ReturnCount")
suspend fun ExceptionPath.getExceptionDirectory(context: Context): File? {
val exceptionDirectory = context.getExternalFilesDirSuspend(null)
?.let { File(File(it, ExceptionPath.LOG_DIRECTORY_NAME), ExceptionPath.EXCEPTION_DIRECTORY_NAME) }
val exceptionDirectory =
context.getExternalFilesDirSuspend(null)
?.let { File(File(it, ExceptionPath.LOG_DIRECTORY_NAME), ExceptionPath.EXCEPTION_DIRECTORY_NAME) }
if (null == exceptionDirectory) {
Twig.info { "Unable to get external storage directory; external storage may not be available" }
@ -27,9 +28,13 @@ suspend fun ExceptionPath.getExceptionDirectory(context: Context): File? {
return exceptionDirectory
}
suspend fun ExceptionPath.getExceptionPath(context: Context, exception: ReportableException): File? {
val exceptionDirectory = getExceptionDirectory(context)
?: return null
suspend fun ExceptionPath.getExceptionPath(
context: Context,
exception: ReportableException
): File? {
val exceptionDirectory =
getExceptionDirectory(context)
?: return null
return File(exceptionDirectory, newExceptionFileName(exception))
}

View File

@ -11,7 +11,6 @@ import co.electriccoin.zcash.spackle.process.ProcessNameCompat
import java.util.Collections
object GlobalCrashReporter {
internal const val CRASH_PROCESS_NAME_SUFFIX = ":crash" // $NON-NLS
private val intrinsicLock = Any()
@ -33,17 +32,18 @@ object GlobalCrashReporter {
synchronized(intrinsicLock) {
if (registeredCrashReporters == null) {
registeredCrashReporters = Collections.synchronizedList(
// To prevent a race condition, register the LocalCrashReporter first.
// FirebaseCrashReporter does some asynchronous registration internally, while
// LocalCrashReporter uses AndroidUncaughtExceptionHandler which needs to read
// and write the default UncaughtExceptionHandler. The only way to ensure
// interleaving doesn't happen is to register the LocalCrashReporter first.
listOfNotNull(
LocalCrashReporter.getInstance(context),
FirebaseCrashReporter(context),
registeredCrashReporters =
Collections.synchronizedList(
// To prevent a race condition, register the LocalCrashReporter first.
// FirebaseCrashReporter does some asynchronous registration internally, while
// LocalCrashReporter uses AndroidUncaughtExceptionHandler which needs to read
// and write the default UncaughtExceptionHandler. The only way to ensure
// interleaving doesn't happen is to register the LocalCrashReporter first.
listOfNotNull(
LocalCrashReporter.getInstance(context),
FirebaseCrashReporter(context),
)
)
)
}
}

View File

@ -3,7 +3,6 @@ package co.electriccoin.zcash.crash.android.internal
import androidx.annotation.AnyThread
interface CrashReporter {
/**
* Report a caught exception, e.g. within a try-catch.
*/

View File

@ -30,9 +30,10 @@ object FirebaseAppCache {
}
}
private suspend fun getFirebaseAppContainer(context: Context): FirebaseAppContainer = withContext(Dispatchers.IO) {
val firebaseApp = FirebaseApp.initializeApp(context)
FirebaseAppContainer(firebaseApp)
}
private suspend fun getFirebaseAppContainer(context: Context): FirebaseAppContainer =
withContext(Dispatchers.IO) {
val firebaseApp = FirebaseApp.initializeApp(context)
FirebaseAppContainer(firebaseApp)
}
private class FirebaseAppContainer(val firebaseApp: FirebaseApp?)

View File

@ -25,13 +25,13 @@ import kotlinx.coroutines.async
internal class FirebaseCrashReporter(
context: Context
) : CrashReporter {
@OptIn(kotlinx.coroutines.DelicateCoroutinesApi::class)
private val analyticsScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
private val initFirebaseJob: Deferred<CrashReporter?> = analyticsScope.async {
FirebaseCrashReporterImpl.getInstance(context)
}
private val initFirebaseJob: Deferred<CrashReporter?> =
analyticsScope.async {
FirebaseCrashReporterImpl.getInstance(context)
}
@AnyThread
override fun reportCaughtException(exception: Throwable) {
@ -67,10 +67,14 @@ private class FirebaseCrashReporterImpl(
private val firebaseCrashlytics: FirebaseCrashlytics,
private val firebaseInstallations: FirebaseInstallations
) : 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() {
@ -90,30 +94,32 @@ private class FirebaseCrashReporterImpl(
* early crashes may be missed. This is a tradeoff we are willing to make in order to avoid
* ANRs.
*/
private val lazyWithArgument = SuspendingLazy<Context, CrashReporter?> {
if (it.resources.getBoolean(R.bool.co_electriccoin_zcash_crash_is_firebase_enabled)) {
private val lazyWithArgument =
SuspendingLazy<Context, CrashReporter?> {
if (it.resources.getBoolean(R.bool.co_electriccoin_zcash_crash_is_firebase_enabled)) {
// Workaround for disk IO on main thread in Firebase initialization
val firebaseApp = FirebaseAppCache.getFirebaseApp(it)
if (firebaseApp == null) {
Twig.warn { "Unable to initialize Crashlytics. FirebaseApp is null" }
return@SuspendingLazy null
// Workaround for disk IO on main thread in Firebase initialization
val firebaseApp = FirebaseAppCache.getFirebaseApp(it)
if (firebaseApp == null) {
Twig.warn { "Unable to initialize Crashlytics. FirebaseApp is null" }
return@SuspendingLazy null
}
val firebaseInstallations = FirebaseInstallations.getInstance(firebaseApp)
val firebaseCrashlytics =
FirebaseCrashlytics.getInstance().apply {
setCustomKey(
CrashlyticsUserProperties.IS_TEST,
EmulatorWtfUtil.isEmulatorWtf(it) || FirebaseTestLabUtil.isFirebaseTestLab(it)
)
}
FirebaseCrashReporterImpl(firebaseCrashlytics, firebaseInstallations)
} else {
Twig.warn { "Unable to initialize Crashlytics. Configure API keys in the app module" }
null
}
val firebaseInstallations = FirebaseInstallations.getInstance(firebaseApp)
val firebaseCrashlytics = FirebaseCrashlytics.getInstance().apply {
setCustomKey(
CrashlyticsUserProperties.IS_TEST,
EmulatorWtfUtil.isEmulatorWtf(it) || FirebaseTestLabUtil.isFirebaseTestLab(it)
)
}
FirebaseCrashReporterImpl(firebaseCrashlytics, firebaseInstallations)
} else {
Twig.warn { "Unable to initialize Crashlytics. Configure API keys in the app module" }
null
}
}
suspend fun getInstance(context: Context): CrashReporter? {
return lazyWithArgument.getInstance(context)

View File

@ -8,9 +8,13 @@ import co.electriccoin.zcash.crash.android.getExceptionPath
import co.electriccoin.zcash.crash.write
internal object AndroidExceptionReporter {
internal suspend fun reportException(context: Context, reportableException: ReportableException) {
val exceptionPath = ExceptionPath.getExceptionPath(context, reportableException)
?: return
internal suspend fun reportException(
context: Context,
reportableException: ReportableException
) {
val exceptionPath =
ExceptionPath.getExceptionPath(context, reportableException)
?: return
reportableException.write(exceptionPath)

View File

@ -13,8 +13,9 @@ internal fun ReportableException.Companion.new(
isUncaught: Boolean,
clock: Clock = Clock.System
): ReportableException {
val versionName = context.packageManager.getPackageInfoCompat(context.packageName, 0L).versionName
?: "null"
val versionName =
context.packageManager.getPackageInfoCompat(context.packageName, 0L).versionName
?: "null"
return ReportableException(
throwable.javaClass.name,
@ -25,15 +26,16 @@ internal fun ReportableException.Companion.new(
)
}
internal fun ReportableException.toBundle() = Bundle().apply {
// Although Exception is Serializable, some Kotlin Coroutines exception classes break this
// API contract. Therefore we have to convert to a string here.
putSerializable(ReportableException.EXTRA_STRING_CLASS_NAME, exceptionClass)
putSerializable(ReportableException.EXTRA_STRING_TRACE, exceptionTrace)
putString(ReportableException.EXTRA_STRING_APP_VERSION, appVersion)
putBoolean(ReportableException.EXTRA_BOOLEAN_IS_UNCAUGHT, isUncaught)
putLong(ReportableException.EXTRA_LONG_WALLTIME_MILLIS, time.toEpochMilliseconds())
}
internal fun ReportableException.toBundle() =
Bundle().apply {
// Although Exception is Serializable, some Kotlin Coroutines exception classes break this
// API contract. Therefore we have to convert to a string here.
putSerializable(ReportableException.EXTRA_STRING_CLASS_NAME, exceptionClass)
putSerializable(ReportableException.EXTRA_STRING_TRACE, exceptionTrace)
putString(ReportableException.EXTRA_STRING_APP_VERSION, appVersion)
putBoolean(ReportableException.EXTRA_BOOLEAN_IS_UNCAUGHT, isUncaught)
putLong(ReportableException.EXTRA_LONG_WALLTIME_MILLIS, time.toEpochMilliseconds())
}
internal fun ReportableException.Companion.fromBundle(bundle: Bundle): ReportableException {
val className = bundle.getString(EXTRA_STRING_CLASS_NAME)!!

View File

@ -12,14 +12,17 @@ internal class AndroidUncaughtExceptionHandler(
context: Context,
private val defaultUncaughtExceptionHandler: Thread.UncaughtExceptionHandler
) : Thread.UncaughtExceptionHandler {
private val applicationContext = context.applicationContext
override fun uncaughtException(t: Thread, e: Throwable) {
override fun uncaughtException(
t: Thread,
e: Throwable
) {
val reportableException = ReportableException.new(applicationContext, e, true)
val isUseSecondaryProcess = applicationContext.resources
.getBoolean(R.bool.co_electriccoin_zcash_crash_is_use_secondary_process)
val isUseSecondaryProcess =
applicationContext.resources
.getBoolean(R.bool.co_electriccoin_zcash_crash_is_use_secondary_process)
if (isUseSecondaryProcess) {
applicationContext.sendBroadcast(ExceptionReceiver.newIntent(applicationContext, reportableException))
@ -31,7 +34,6 @@ internal class AndroidUncaughtExceptionHandler(
}
companion object {
private val isInitialized = AtomicBoolean(false)
/**

View File

@ -8,16 +8,18 @@ import kotlinx.coroutines.GlobalScope
@OptIn(kotlinx.coroutines.DelicateCoroutinesApi::class)
class ExceptionReceiver : CoroutineBroadcastReceiver(GlobalScope) {
override suspend fun onReceiveSuspend(context: Context, intent: Intent) {
val reportableException = intent.extras?.let { ReportableException.fromBundle(it) }
?: return
override suspend fun onReceiveSuspend(
context: Context,
intent: Intent
) {
val reportableException =
intent.extras?.let { ReportableException.fromBundle(it) }
?: return
AndroidExceptionReporter.reportException(context, reportableException)
}
companion object {
/**
* @return Explicit intent to broadcast to log the exception.
*/

View File

@ -14,7 +14,6 @@ import kotlinx.coroutines.launch
* Registers an exception handler to write exceptions to disk.
*/
internal class LocalCrashReporter(private val applicationContext: Context) : CrashReporter {
private val crashReportingScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
@AnyThread
@ -36,10 +35,11 @@ internal class LocalCrashReporter(private val applicationContext: Context) : Cra
}
companion object {
private val lazyWithArgument = LazyWithArgument<Context, CrashReporter> {
AndroidUncaughtExceptionHandler.register(it)
LocalCrashReporter(it.applicationContext)
}
private val lazyWithArgument =
LazyWithArgument<Context, CrashReporter> {
AndroidUncaughtExceptionHandler.register(it)
LocalCrashReporter(it.applicationContext)
}
fun getInstance(context: Context): CrashReporter {
return lazyWithArgument.getInstance(context)

View File

@ -7,75 +7,81 @@ org.hamcrest:hamcrest-core:1.3=commonTestImplementationCopy,jvmTestCompileClassp
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=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.10=kotlinBuildToolsApiClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,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.6.20=kotlinCompilerClasspathCopy
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=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.10=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=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.10=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.10=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.10=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.10=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.10=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.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,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=metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
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=metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
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,metadataCompileClasspath
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.10=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
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.10=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.10=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.10=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=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:atomicfu:0.20.2=metadataCommonMainCompileClasspath
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.1=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.1=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=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.kotlinx:kotlinx-coroutines-core:1.7.1=metadataCommonMainCompileClasspath
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.1=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.1=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.4.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.5.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:kotlinx-datetime:0.3.2=commonMainApiCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
org.jetbrains.kotlinx:kotlinx-datetime:0.3.3=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
org.jetbrains.kotlinx:kotlinx-datetime:0.4.0=allSourceSetsCompileDependenciesMetadata,allSourceSetsRuntimeDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.2=allSourceSetsCompileDependenciesMetadata,allSourceSetsRuntimeDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains:annotations:13.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationCopy,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataCommonMain,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
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
org.jetbrains.kotlinx:kotlinx-serialization-core:1.3.2=allSourceSetsRuntimeDependenciesMetadata,metadataCommonMainCompileClasspath
org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.2=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
org.jetbrains:annotations:13.0=commonTestImplementationCopy,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
empty=archives,archivesCopy,commonMainCompileOnlyCopy,commonMainImplementationCopy,commonMainIntransitiveDependenciesMetadata,commonMainIntransitiveDependenciesMetadataCopy,commonMainRuntimeOnlyCopy,commonMainRuntimeOnlyDependenciesMetadata,commonTestCompileOnlyCopy,commonTestIntransitiveDependenciesMetadata,commonTestIntransitiveDependenciesMetadataCopy,commonTestRuntimeOnlyCopy,commonTestRuntimeOnlyDependenciesMetadata,default,defaultCopy,jvmCompileOnlyCopy,jvmMainApiCopy,jvmMainCompileOnlyCopy,jvmMainImplementationCopy,jvmMainIntransitiveDependenciesMetadata,jvmMainIntransitiveDependenciesMetadataCopy,jvmMainRuntimeOnlyCopy,jvmMainRuntimeOnlyDependenciesMetadata,jvmRuntimeOnlyCopy,jvmSourceArtifactsCopy,jvmTestApiCopy,jvmTestCompileOnlyCopy,jvmTestIntransitiveDependenciesMetadata,jvmTestIntransitiveDependenciesMetadataCopy,jvmTestRuntimeOnlyCopy,jvmTestRuntimeOnlyDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinCompilerPluginClasspathCopy,kotlinNativeCompilerPluginClasspath,kotlinNativeCompilerPluginClasspathCopy,kotlinScriptDef,kotlinScriptDefCopy,kotlinScriptDefExtensions,kotlinScriptDefExtensionsCopy,koverAggregatedSetup,koverExternalArtifacts,metadataCommonMainCompileOnlyCopy,metadataCompileOnlyCopy,testKotlinScriptDef,testKotlinScriptDefCopy,testKotlinScriptDefExtensions,testKotlinScriptDefExtensionsCopy

View File

@ -9,6 +9,5 @@ data class ReportableException(
val isUncaught: Boolean,
val time: Instant
) {
companion object
}

View File

@ -14,8 +14,10 @@ object ExceptionPath {
const val TYPE = "txt"
@Suppress("MaxLineLength")
fun newExceptionFileName(exception: ReportableException, uuid: UUID = UUID.randomUUID()) =
"${exception.time.epochSeconds}$SEPARATOR$uuid$SEPARATOR${exception.exceptionClass}$SEPARATOR${exception.isUncaught}.$TYPE"
fun newExceptionFileName(
exception: ReportableException,
uuid: UUID = UUID.randomUUID()
) = "${exception.time.epochSeconds}$SEPARATOR$uuid$SEPARATOR${exception.exceptionClass}$SEPARATOR${exception.isUncaught}.$TYPE"
// The exceptions are really just for debugging
@Suppress("ThrowsCount")

View File

@ -1,4 +1,4 @@
@file:Suppress("ktlint:filename")
@file:Suppress("ktlint:standard:filename")
package co.electriccoin.zcash.crash
@ -8,12 +8,13 @@ import kotlinx.coroutines.withContext
import java.io.File
suspend fun ReportableException.write(path: File) {
val exceptionString = buildString {
appendLine("App version: $appVersion")
appendLine("Is uncaught: $isUncaught")
appendLine("Time: $time")
append(exceptionTrace)
}
val exceptionString =
buildString {
appendLine("App version: $appVersion")
appendLine("Is uncaught: $isUncaught")
appendLine("Time: $time")
append(exceptionTrace)
}
withContext(Dispatchers.IO) {
path.writeAtomically { tempFile ->

View File

@ -1,4 +1,4 @@
@file:Suppress("ktlint:filename")
@file:Suppress("ktlint:standard:filename")
package co.electriccoin.zcash.crash

View File

@ -49,7 +49,7 @@ The logical components of the app are implemented as a number of Gradle modules.
* `spackle-android-lib` — Android-specific additions.
The following diagram shows a rough depiction of dependencies between the modules. Two notes on this diagram:
* `sdk-lib` is in a [different repository](https://github.com/zcash/zcash-android-wallet-sdk)
* `sdk-lib` is in a [different repository](https://github.com/Electric-Coin-Company/zcash-android-wallet-sdk)
* Although effort goes into ensuring this diagram stays up-to-date, Gradle build files are the authoritative source on dependencies
```mermaid

View File

@ -16,7 +16,7 @@ Pull requests should adhere to our [Code Review Guidelines](CODE_REVIEW_GUIDELIN
All contributions _will_ be licensed under the MIT license.
## Getting Started
Our backlog has many items [tagged with "good first issue"](https://github.com/zcash/secant-android-wallet/labels/good%20first%20issue). If you'd like to pick one of these up, please fork the repo and make a pull request for us to review.
Our backlog has many items [tagged with "good first issue"](https://github.com/Electric-Coin-Company/zashi-android/labels/good%20first%20issue). If you'd like to pick one of these up, please fork the repo and make a pull request for us to review.
Our [Architecture.md](Architecture.md) documentation is a good reference get oriented on the structure of the codebase.

View File

@ -12,20 +12,21 @@ Note that although these are called "release" keys, they may actually be the "up
After signing is configured, it is possible to then configure deployment to Google Play.
## Automated Deployment
Automated deployment to Google Play configured with the [Gradle Play Publisher plugin](https://github.com/Triple-T/gradle-play-publisher).
To perform a deployment:
1. Configure a Google Cloud service API key with the correct permissions
Automated deployment to Google Play is configured with custom
[Google Play publishing Gradle task](../build-conventions-secant/src/main/kotlin/secant.publish-conventions.gradle.kts).
To perform a deployment with this task:
1. Configure a Google Cloud service account and API key with the correct permissions
1. Configure a Google Play Publishing API key in Google Cloud console
1. Configure Gradle properties
1. `ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH` - Set to the path of the service key in JSON format
1. `ZCASH_GOOGLE_PLAY_DEPLOY_MODE` - Set to `deploy`
1. `ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT_KEY` - Set the Google Play Service Account enabled in the Google Cloud console
1. `ZCASH_GOOGLE_PLAY_PUBLISHER_API_KEY` - Set the Google Play Publish API enabled in the Google Cloud console
1. `ZCASH_GOOGLE_PLAY_DEPLOY_TRACK` - Set to `internal` or `alpha`
1. `ZCASH_GOOGLE_PLAY_DEPLOY_STATUS` - Set to `draft` or `completed`
1. Run the Gradle task `./gradlew :app:publishBundle`
To generate a build with a correct version that can be deployed manually later:
1. Configure a Google Cloud service API key with the correct permissions
1. Configure Gradle properties
1. `ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH` - Set to the path of the service key in JSON format
1. `ZCASH_GOOGLE_PLAY_DEPLOY_MODE` - Set to `build` (this is the default value)
1. Run the Gradle tasks `./gradlew :app:processReleaseVersionCodes :app:bundleRelease`
For more information about proper automated deployment setup, see
[Google Play publishing Gradle task](../build-conventions-secant/src/main/kotlin/secant.publish-conventions.gradle.kts)
documentation and related [gradle.properties](../gradle.properties) attributes.
Note that the above instructions are for repeat deployments. If you do not yet have an app listing, you'll need to create that manually.

View File

@ -47,7 +47,7 @@ Start by making sure the command line with Gradle works first, because **all the
1. To check out a git repo from GitHub, there are three authentication methods: SSH, HTTPS, and GitHub API. We recommend SSH.
1. Create a new SSH key, following [GitHub's instructions](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
1. Add the SSH key under [GitHub account settings](https://github.com/settings/keys)
1. Clone repo in a terminal on your computer `git clone git@github.com:zcash/secant-android-wallet.git`
1. Clone repo in a terminal on your computer `git clone git@github.com:Electric-Coin-Company/zashi-android.git`
1. Compile from the command line
1. Navigate to the repo checkout in a terminal
1. Compile the application with the gradle command `./gradlew assemble`
@ -166,24 +166,6 @@ For Continuous Integration, see [CI.md](CI.md). The rest of this section is reg
The Zcash testnet is an alternative blockchain that attempts to mimic the mainnet (main Zcash network) for testing purposes. Testnet coins are distinct from actual ZEC and do not have value. Developers and users can experiment with the testnet without having to use valuable currency. The testnet is also used to test network upgrades and their activation before committing to the upgrade on the main Zcash network. For more information on how to add testnet funds visit [Testnet Guide](https://zcash.readthedocs.io/en/latest/rtd_pages/testnet_guide.html) or go right to the [Testnet Faucet](https://faucet.zecpages.com/).
# Sideloading
Although the goal of this document is to enable readers to build the app from source, it is also possible to sideload debug builds created by Continuous Integration.
1. Go through the first two setup steps above, "Install Java" and "Install Android Studio and the Android SDK"
1. Obtain binary
1. Look under the [GitHub Actions tab](https://github.com/zcash/secant-android-wallet/actions). Every pull request and merge to the main branch will trigger a workflow that generates builds of the app. The workflows are called Pull Request and Deploy.
1. Click on a successful workflow
1. Scroll down the workflow results page to find an attached build output called Binaries
1. Download the Binaries file
1. Look for either the universal or debug APK in the flavor that you'd like to install. It should be under `app/build/outputs/`
1. Install binary
1. If using a virtual device, you can drag-and-drop the APK file onto the virtual device screen
1. If using a physical device, run the terminal command `adb install -r $PATH_TO_APK`
Notes:
- Apps can be distributed in two different formats: Application Package (APK) and Android App Bundle (AAB). AAB is uploaded to Google Play, and allows the store to deliver device-specific slices (e.g. CPU architecture, screen size, etc) for smaller downloads. APK is the format for sideloading. APK files are the original format from Android 1.0, and can be generated directly from a Gradle build. AAB files are a newer format, and APK files can also be derived from AAB. A "universal" APK is one that was derived from an AAB without any slicing. We use "universal" APKs for testing of release builds, as they are processed through bundletool (which has introduced bugs in the past) and therefore somewhat closer to what would be delivered to end user devices.
- Android apps must be digitally signed. The signing key is critical to app sandbox security (preventing other apps from reading our app's data). We have multiple signing configurations:
- If you build from source, your computer will generate a random debug signing key. This key will be consistent for multiple builds, allowing you to keep re-deploying changes of the app. But if you connect your physical Android device to a different computer, the debug key will be different and therefore the app will need to be uninstalled/reinstalled to update it.
- Debug builds on the CI server always have a new randomly generated signing key for each build. This means each time you sideload a CI generated debug build, uninstall/reinstall will be necessary.
- Release builds from a Pull Request workflow always have a new randomly generated signing key for each build. This means each time you sideload a CI generated debug build, uninstall/reinstall will be necessary.
- Release builds from a Deploy workflow always are signed with the "upload" keystore. The upload keystore is consistent and is the signing key for uploading to Google Play. Google Play will then re-sign the app with the signing keystore when delivering the app to end users. Therefore, moving between a release build downloaded from Google Play versus one sideloaded from a Deploy workflow will require uninstall/reinstall.
## Sideloading
Although the goal of this document is to enable readers to build the app from source, it is also possible to
sideload debug builds created by Continuous Integration. For more details see [Sideloading.md](Sideloading.md).

114
docs/Sideloading.md Normal file
View File

@ -0,0 +1,114 @@
# Sideloading
This documentation describes how to sideload a Debug or Universal release APK created by the project Continuous
Integration. It also provides details on how to install an Android emulator on a desktop machine for non-Android users.
1. Obtain binary
1. Look under the [GitHub Actions tab](https://github.com/Electric-Coin-Company/zashi-android/actions). Every
pull request and merge to the Main branch will trigger a workflow that generates builds of the app. The
workflows are called _Pull Request_ and _Deploy_.
1. Click on a successful workflow
1. Scroll down the workflow results page to find an attached build output called _Binaries_
1. Download the Binaries file
1. Look for either the Universal or Debug APK in the flavor that you'd like to install. It should be under
`app/build/outputs/`
1. Install binary
1. If using a **physical device**, run the terminal command `adb install -r $PATH_TO_APK` (see more about [ADB
commands](https://developer.android.com/tools/adb)). Alternatively, if you have the Android Studio installed, you
can drag-and-drop the selected APK file to the physical device screen shared in the Running devices panel.
Then, open the installed app from the device launcher.
1. If using a **virtual device**, you can drag-and-drop the APK file onto the virtual device screen as well. See the
next section on how to install an Android emulator on a desktop machine.
## Install emulator
Besides third-party, often paid solutions, there are two ways to run an Android emulator on a desktop. Note that the
following instructions describe the installation process on a Unix-based machine, but after a slight adjustment, it can
also be used for a Windows-based machine.
1. Install [Android Studio](https://developer.android.com/studio) using the instructions in the first steps of
[Setup](Setup.md) documentation. The Android studio installation requires about 8 GB RAM or more and 8 GB of available
disk space (IDE + Android SDK + Android Emulator).
1. The second option is to install the Android SDK tools only, which requires less disk space and is used
within the machine's terminal. Remember that this approach requires some manual steps, and you might need to
adjust the following commands based on the specific versions and configurations you choose.
- Tip: On Unix-based OS, SdkManager and the other tools are invoked with `./sdkmanager`. On Windows, SdkManager
is invoked with `sdkmanager`. Throughout the documentation, the macOS and Linux syntax is used by default.
1. Download and install **Java** if you haven't done so yet
- Install JVM 17 or greater on your system. Our setup has been tested with Java 17. Although a variety of
JVM distributions are available and should work, we have settled on recommending [Adoptium/Temurin]
(https://adoptium.net) because this is the default distribution used by Gradle toolchains. Be sure that the
`JAVA_HOME` environment variable points to the correct Java version using the command:
```
export JAVA_HOME="$(/usr/libexec/java_home)"
```
1. Download Android **cmdline-tools**
- If you haven't already, download the Android cmdline-tools from the official
[website](https://developer.android.com/studio), section _Command Line Tools_.
- Extract the downloaded archive to a location of your choice.
- In the unzipped cmdline-tools directory, create a subdirectory called `latest`.
- Move the original `cmdline-tools` directory contents, including the `lib` directory, `bin` directory,
`NOTICE.txt` file, and `source.properties` file, into the newly created `latest` directory.
- Move the updated `cmdline-tools` directory into a new directory, such as `android_sdk`. This new directory is
your Android SDK directory now.
- Open the Terminal cmdline app and navigate to the new `android_sdk` directory. You can now use the command-line
tools from this location.
1. Install Android **platform-tools** using the new `sdkmanager` with accepting all the necessary licence agreements
```
./cmdline-tools/latest/bin/sdkmanager "platform-tools"
```
2. Install Android SDK Packages using the new `sdkmanager`
- Run the following command to install the necessary SDK packages. Replace `<version>` with the desired
Android version (e.g., `34`), `<image-type>` with the system image type (e.g., `google_apis`), and `<abi>` with
the desired ABI (e.g., `arm64-v8a`).
```
./cmdline-tools/latest/bin/sdkmanager "platforms;android-<version>" "system-images;android-<version>;<image-type>;<abi>"
```
- Example of such a command:
```
./cmdline-tools/latest/bin/sdkmanager "platforms;android-34" "system-images;android-34;google_apis;arm64-v8a"
```
1. Create an AVD (Android Virtual Device)
- Run the following command to create an AVD. Replace `<avd-name>` with the desired name for
your AVD (e.g., `pixel7_api34`), `<image-type>`, `<verison>` and `<abi>` with the previously selected. Then,
also replace `<sd-card-size>` with the desired size for the SD card (e.g., `1024M`), and `<device>` with the
desired device (e.g., `pixel 7`).
```
./cmdline-tools/latest/bin/avdmanager create avd -n <avd-name> -k "system-images;android-<version>;<image-type>;<abi>" -c <sd-card-size> -d <device> --abi <abi> --force
```
- Example of such a command:
```
./cmdline-tools/latest/bin/avdmanager create avd -n pixel7_api34 -k "system-images;android-34;google_apis;arm64-v8a" -c 1024M -d pixel_7 --abi "arm64-v8a" --force
```
1. Run the Emulator
- Start the emulator with the following command. Replace `<avd-name>` with the name you gave to your AVD:
```
./emulator/emulator -avd <avd-name>
```
- Example of such a command:
```
./emulator/emulator -avd pixel7_api34
```
- Now, you should have the Android emulator running on your machine without installing the Android Studio, and
you can finish the app installation from the previous section.
### Build variants notes
- Apps can be distributed in two different formats: Application Package (APK) and Android App Bundle (AAB). AAB is
uploaded to Google Play, and allows the store to deliver device-specific slices (e.g. CPU architecture, screen
size, etc.) for smaller downloads. APK is the format for sideloading. APK files are the original format from
Android 1.0, and can be generated directly from a Gradle build. AAB files are a newer format, and APK files can
also be derived from AAB. A "universal" APK is one that was derived from an AAB without any slicing. We use
"universal" APKs for testing of release builds, as they are processed through bundletool (which has introduced
bugs in the past) and therefore somewhat closer to what would be delivered to end user devices.
- Android apps must be digitally signed. The signing key is critical to app sandbox security (preventing other apps
from reading our app's data). We have multiple signing configurations:
- If you build from source, your computer will generate a random debug signing key. This key will be consistent
for multiple builds, allowing you to keep re-deploying changes of the app. But if you connect your physical
Android device to a different computer, the debug key will be different and therefore the app will need to be
uninstalled/reinstalled to update it.
- Debug builds on the CI server always have a new randomly generated signing key for each build. This means each
time you sideload a CI generated debug build, uninstall/reinstall will be necessary.
- Release builds from a Pull Request workflow always have a new randomly generated signing key for each build.
This means each time you sideload a CI generated debug build, uninstall/reinstall will be necessary.
- Release builds from a Deploy workflow always are signed with the "upload" keystore. The upload keystore is
consistent and is the signing key for uploading to Google Play. Google Play will then re-sign the app with the
signing keystore when delivering the app to end users. Therefore, moving between a release build downloaded
from Google Play versus one sideloaded from a Deploy workflow will require uninstall/reinstall.

View File

@ -5,7 +5,7 @@ This documentation outlines our approach to testing. By running tests against ou
- TBD
<!-- TODO [#682]: Testing documentation update -->
<!-- TODO [#682]: https://github.com/zcash/secant-android-wallet/issues/682 -->
<!-- TODO [#682]: https://github.com/Electric-Coin-Company/zashi-android/issues/682 -->
## Manual testing

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

@ -1,3 +1,6 @@
<!-- TODO[#1074]: Check and update manual test guides -->
<!-- TODO [#1074]: https://github.com/Electric-Coin-Company/zashi-android/issues/1074 -->
# Testing screens with secure flag
1. install the app
1. go to screens with seed phrase:

View File

@ -2,7 +2,7 @@
org.gradle.caching=true
org.gradle.configureondemand=false
# We use increased amount of heap size here to bypass the OOM exception while building the project with ./gradlew
# build as described in https://github.com/zcash/kotlin-bip39/issues/201
# build as described in https://github.com/Electric-Coin-Company/kotlin-bip39/issues/201
org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=2g
org.gradle.parallel=true
org.gradle.vfs.watch=true
@ -14,6 +14,9 @@ android.nonTransitiveRClass=true
android.suppressUnsupportedCompileSdk=33
android.useAndroidX=true
# Enable Kotlin metadata version check for script compilation
org.gradle.kotlin.dsl.skipMetadataVersionCheck=false
# Kotlin compiler warnings can be considered errors, failing the build.
ZCASH_IS_TREAT_WARNINGS_AS_ERRORS=true
@ -24,7 +27,7 @@ IS_KOTLIN_TEST_COVERAGE_ENABLED=true
# The app module will crash at launch when coverage is enabled, so coverage is only enabled explicitly for tests.
# generation of instrumentation coverage is flaky, particularly when running ui-lib:connectedCheck
# TODO: [#705] Instrumentation coverage generation fails when run locally
# TODO: [#705] https://github.com/zcash/secant-android-wallet/issues/705
# TODO: [#705] https://github.com/Electric-Coin-Company/zashi-android/issues/705
IS_ANDROID_INSTRUMENTATION_TEST_COVERAGE_ENABLED=false
# Optionally configure test orchestrator.
@ -47,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.
# 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
@ -64,10 +75,11 @@ ZCASH_SUPPORT_EMAIL_ADDRESS=support@electriccoin.co
# Recommended protection of screens with sensitive data.
# It is enabled by default to protect the developers from revealing their wallet secrets by mistake.
IS_SECURE_SCREEN_PROTECTION_ACTIVE=true
# Forcibly turn on or off the UI dark mode support. If enabled, then the device's dark mode system setting value is
# applied.
IS_DARK_MODE_ENABLED=false
# Set whether the screen rotation is enabled or the screen orientation is locked in the portrait mode.
IS_SCREEN_ROTATION_ENABLED=false
# Set keystore details to enable build signing. Typically these
# are overridden via ~/.gradle/gradle.properties to allow secure injection.
@ -84,13 +96,32 @@ ZCASH_RELEASE_KEY_ALIAS_PASSWORD=
# be useful, for example, for running benchmark tests against a release build of the app signed with
# the default debug key configuration.
IS_SIGN_RELEASE_BUILD_WITH_DEBUG_KEY=false
# Switch this property to true only if you need the release build to be debuggable. It can be helpful, for example,
# for logging or debugging minified release app build.
IS_RELEASE_BUILD_DEBUGGABLE=false
# Optionally set the Google Play Service Key path to enable deployment
# Set the Google Play Service Account email address to enable deployment
# Note that this property is not currently used due to #1033
# TODO [#1033]: Use token-based authorization on Google Play for automated deployment
# TODO [#1033]: https://github.com/Electric-Coin-Company/zashi-android/issues/1033
ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT=
# Also, set the Google Play Service Key path to enable deployment. It's a path to the private key file (only used for
# Service Account auth).
# Note that this property is not currently used due to #1033
# TODO [#1033]: Use token-based authorization on Google Play for automated deployment
# TODO [#1033]: https://github.com/Electric-Coin-Company/zashi-android/issues/1033
ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH=
# Can be one of {build, deploy}.
# Build can be used to generate a version number for the next release, but does not ultimately create a release on Google Play.
# Deploy commits the build on Google Play, creating a new release
ZCASH_GOOGLE_PLAY_DEPLOY_MODE=build
# Set the Google Play Service Account key to authorize on Google Play
ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT_KEY=
# Set the Google Play Publisher API key to authorize the publisher on Google Play API
ZCASH_GOOGLE_PLAY_PUBLISHER_API_KEY=
# Can be one of {internal, alpha}. There are more of them {beta, production}, which are not supported for security
# reasons. Internal will deploy into the Internal and Alpha into the Closed testing tracks on Google Play.
ZCASH_GOOGLE_PLAY_DEPLOY_TRACK=internal
# Can be one of {draft, completed}.
# Draft can be used to generate a version number for the next release, but does not ultimately create a release on
# Google Play. Completed commits the build on Google Play, creating a new release.
ZCASH_GOOGLE_PLAY_DEPLOY_STATUS=draft
ZCASH_EMULATOR_WTF_API_KEY=
@ -110,61 +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.1.10
EMULATOR_WTF_GRADLE_PLUGIN_VERSION=0.12.2
FIREBASE_CRASHLYTICS_BUILD_TOOLS_VERSION=2.9.4
FLANK_VERSION=23.04.0
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=0.49.0
PLAY_PUBLISHER_PLUGIN_VERSION=3.8.4
KTLINT_VERSION=1.2.1
ACCOMPANIST_PERMISSIONS_VERSION=0.32.0
ANDROIDX_ACTIVITY_VERSION=1.8.0
ANDROIDX_ANNOTATION_VERSION=1.6.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-alpha06
ANDROIDX_COMPOSE_COMPILER_VERSION=1.5.3
ANDROIDX_COMPOSE_MATERIAL3_VERSION=1.1.0-rc01
ANDROIDX_COMPOSE_MATERIAL_ICONS_VERSION=1.5.0-beta02
ANDROIDX_COMPOSE_VERSION=1.4.3
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.1
ANDROIDX_NAVIGATION_COMPOSE_VERSION=2.5.3
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.0-alpha14
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_WORK_MANAGER_VERSION=2.8.1
CORE_LIBRARY_DESUGARING_VERSION=2.0.3
FIREBASE_BOM_VERSION_MATCHER=32.0.0
JACOCO_VERSION=0.8.9
KOTLIN_VERSION=1.9.10
KOTLINX_COROUTINES_VERSION=1.7.1
KOTLINX_DATETIME_VERSION=0.4.0
KOTLINX_IMMUTABLE_COLLECTIONS_VERSION=0.3.5
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.8.1
GOOGLE_AUTH_LIB_JAVA_VERSION=1.18.0
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.7
KOTLINX_SERIALIZABLE_JSON_VERSION=1.6.3
KOVER_VERSION=0.7.3
PLAY_APP_UPDATE_VERSION=2.0.1
PLAY_APP_UPDATE_KTX_VERSION=2.0.1
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.6
ZXING_VERSION=3.5.1
ZXING_VERSION=3.5.3
# Ensure a non-snapshot version is used before releasing to production.
ZCASH_SDK_VERSION=2.0.2
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=591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

14
gradlew vendored
View File

@ -145,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@ -153,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -202,11 +202,11 @@ fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \

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

@ -7,62 +7,66 @@ org.hamcrest:hamcrest-core:1.3=jvmTestCompileClasspath,jvmTestRuntimeClasspath
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=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=kotlinBuildToolsApiClasspath
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.10=kotlinBuildToolsApiClasspath
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,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.6.20=kotlinCompilerClasspathCopy
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=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.10=kotlinKlibCommonizerClasspath
org.jetbrains.kotlin:kotlin-reflect:1.6.10=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.10=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.10=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.10=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.10=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.10=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.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,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.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=metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains.kotlin:kotlin-stdlib:1.8.20=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.10=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
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-common:1.9.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
org.jetbrains.kotlin:kotlin-test-junit:1.9.10=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.10=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=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCommonMainCompileClasspath,metadataCompileClasspath
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.1=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
org.jetbrains.kotlinx:atomicfu:0.20.2=metadataCommonMainCompileClasspath
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.1=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=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.kotlinx:kotlinx-coroutines-core:1.7.1=metadataCommonMainCompileClasspath
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.1=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.1=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
org.jetbrains:annotations:13.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataCommonMain,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCommonMainCompileClasspath,metadataCompileClasspath
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
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,koverAggregatedSetup,koverExternalArtifacts,metadataCommonMainCompileOnlyCopy,metadataCompileOnlyCopy,testKotlinScriptDef,testKotlinScriptDefCopy,testKotlinScriptDefExtensions,testKotlinScriptDefExtensionsCopy

View File

@ -4,12 +4,16 @@ import co.electriccoin.zcash.preference.model.entry.PreferenceKey
import kotlinx.coroutines.flow.Flow
interface PreferenceProvider {
suspend fun hasKey(key: PreferenceKey): Boolean
suspend fun putString(key: PreferenceKey, value: String?)
suspend fun putString(
key: PreferenceKey,
value: String?
)
suspend fun getString(key: PreferenceKey): String?
fun observe(key: PreferenceKey): Flow<String?>
suspend fun clearPreferences(): Boolean
}

View File

@ -6,19 +6,22 @@ data class BooleanPreferenceDefault(
override val key: PreferenceKey,
private val defaultValue: Boolean
) : PreferenceDefault<Boolean> {
@Suppress("SwallowedException")
override suspend fun getValue(preferenceProvider: PreferenceProvider) = preferenceProvider.getString(key)?.let {
try {
it.toBooleanStrict()
} catch (e: IllegalArgumentException) {
// TODO [#32]: Log coercion failure instead of just silently returning default
// TODO [#32]: https://github.com/zcash/secant-android-wallet/issues/32
defaultValue
}
} ?: defaultValue
override suspend fun getValue(preferenceProvider: PreferenceProvider) =
preferenceProvider.getString(key)?.let {
try {
it.toBooleanStrict()
} catch (e: IllegalArgumentException) {
// TODO [#32]: Log coercion failure instead of just silently returning default
// TODO [#32]: https://github.com/Electric-Coin-Company/zashi-android/issues/32
defaultValue
}
} ?: defaultValue
override suspend fun putValue(preferenceProvider: PreferenceProvider, newValue: Boolean) {
override suspend fun putValue(
preferenceProvider: PreferenceProvider,
newValue: Boolean
) {
preferenceProvider.putString(key, newValue.toString())
}
}

View File

@ -6,18 +6,21 @@ data class IntegerPreferenceDefault(
override val key: PreferenceKey,
private val defaultValue: Int
) : PreferenceDefault<Int> {
override suspend fun getValue(preferenceProvider: PreferenceProvider) =
preferenceProvider.getString(key)?.let {
try {
it.toInt()
} catch (e: NumberFormatException) {
// TODO [#32]: Log coercion failure instead of just silently returning default
// TODO [#32]: https://github.com/Electric-Coin-Company/zashi-android/issues/32
defaultValue
}
} ?: defaultValue
override suspend fun getValue(preferenceProvider: PreferenceProvider) = preferenceProvider.getString(key)?.let {
try {
it.toInt()
} catch (e: NumberFormatException) {
// TODO [#32]: Log coercion failure instead of just silently returning default
// TODO [#32]: https://github.com/zcash/secant-android-wallet/issues/32
defaultValue
}
} ?: defaultValue
override suspend fun putValue(preferenceProvider: PreferenceProvider, newValue: Int) {
override suspend fun putValue(
preferenceProvider: PreferenceProvider,
newValue: Int
) {
preferenceProvider.putString(key, newValue.toString())
}
}

View File

@ -11,16 +11,16 @@ import kotlinx.coroutines.flow.map
* variation in default value. Clients define the key and default value together, rather than just
* the key.
*/
/*
* API note: the default value is not available through the public interface in order to prevent
* clients from accidentally using the default value instead of the preference value.
*
* Implementation note: although primitives would be nice, Objects don't increase memory usage much.
* The autoboxing cache solves Booleans, and Strings are already objects, so that just leaves Integers.
* Overall the number of Integer preference entries is expected to be low compared to Booleans,
* and perhaps many Integer values will also fit within the autoboxing cache.
*/
interface PreferenceDefault<T> {
/*
* API note: the default value is not available through the public interface in order to prevent
* clients from accidentally using the default value instead of the preference value.
*
* Implementation note: although primitives would be nice, Objects don't increase memory usage much.
* The autoboxing cache solves Booleans, and Strings are already objects, so that just leaves Integers.
* Overall the number of Integer preference entries is expected to be low compared to Booleans,
* and perhaps many Integer values will also fit within the autoboxing cache.
*/
val key: PreferenceKey
@ -34,14 +34,18 @@ interface PreferenceDefault<T> {
* @param preferenceProvider Provides actual preference values.
* @param newValue New value to write.
*/
suspend fun putValue(preferenceProvider: PreferenceProvider, newValue: T)
suspend fun putValue(
preferenceProvider: PreferenceProvider,
newValue: T
)
/**
* @param preferenceProvider Provides actual preference values.
* @return Flow that emits preference changes. Note that implementations should emit an initial value
* indicating what was stored in the preferences, in addition to subsequent updates.
*/
fun observe(preferenceProvider: PreferenceProvider): Flow<T> = preferenceProvider.observe(key)
.map { getValue(preferenceProvider) }
.distinctUntilChanged()
fun observe(preferenceProvider: PreferenceProvider): Flow<T> =
preferenceProvider.observe(key)
.map { getValue(preferenceProvider) }
.distinctUntilChanged()
}

View File

@ -6,11 +6,14 @@ data class StringPreferenceDefault(
override val key: PreferenceKey,
private val defaultValue: String
) : PreferenceDefault<String> {
override suspend fun getValue(preferenceProvider: PreferenceProvider) =
preferenceProvider.getString(key)
?: defaultValue
override suspend fun getValue(preferenceProvider: PreferenceProvider) = preferenceProvider.getString(key)
?: defaultValue
override suspend fun putValue(preferenceProvider: PreferenceProvider, newValue: String) {
override suspend fun putValue(
preferenceProvider: PreferenceProvider,
newValue: String
) {
preferenceProvider.putString(key, newValue)
}
}

View File

@ -16,32 +16,38 @@ class BooleanPreferenceDefaultTest {
}
@Test
fun value_default_true() = runTest {
val entry = BooleanPreferenceDefaultFixture.newTrue()
assertTrue(entry.getValue(MockPreferenceProvider()))
}
@Test
fun value_default_false() = runTest {
val entry = BooleanPreferenceDefaultFixture.newFalse()
assertFalse(entry.getValue(MockPreferenceProvider()))
}
@Test
fun value_from_config_false() = runTest {
val entry = BooleanPreferenceDefaultFixture.newTrue()
val mockPreferenceProvider = MockPreferenceProvider {
mutableMapOf(BooleanPreferenceDefaultFixture.KEY.key to false.toString())
fun value_default_true() =
runTest {
val entry = BooleanPreferenceDefaultFixture.newTrue()
assertTrue(entry.getValue(MockPreferenceProvider()))
}
assertFalse(entry.getValue(mockPreferenceProvider))
}
@Test
fun value_from_config_true() = runTest {
val entry = BooleanPreferenceDefaultFixture.newTrue()
val mockPreferenceProvider = MockPreferenceProvider {
mutableMapOf(BooleanPreferenceDefaultFixture.KEY.key to true.toString())
fun value_default_false() =
runTest {
val entry = BooleanPreferenceDefaultFixture.newFalse()
assertFalse(entry.getValue(MockPreferenceProvider()))
}
@Test
fun value_from_config_false() =
runTest {
val entry = BooleanPreferenceDefaultFixture.newTrue()
val mockPreferenceProvider =
MockPreferenceProvider {
mutableMapOf(BooleanPreferenceDefaultFixture.KEY.key to false.toString())
}
assertFalse(entry.getValue(mockPreferenceProvider))
}
@Test
fun value_from_config_true() =
runTest {
val entry = BooleanPreferenceDefaultFixture.newTrue()
val mockPreferenceProvider =
MockPreferenceProvider {
mutableMapOf(BooleanPreferenceDefaultFixture.KEY.key to true.toString())
}
assertTrue(entry.getValue(mockPreferenceProvider))
}
assertTrue(entry.getValue(mockPreferenceProvider))
}
}

View File

@ -15,20 +15,23 @@ class IntegerPreferenceDefaultTest {
}
@Test
fun value_default() = runTest {
val entry = IntegerPreferenceDefaultFixture.new()
assertEquals(IntegerPreferenceDefaultFixture.DEFAULT_VALUE, entry.getValue(MockPreferenceProvider()))
}
@Test
fun value_override() = runTest {
val expected = IntegerPreferenceDefaultFixture.DEFAULT_VALUE + 5
val entry = IntegerPreferenceDefaultFixture.new()
val mockPreferenceProvider = MockPreferenceProvider {
mutableMapOf(StringDefaultPreferenceFixture.KEY.key to expected.toString())
fun value_default() =
runTest {
val entry = IntegerPreferenceDefaultFixture.new()
assertEquals(IntegerPreferenceDefaultFixture.DEFAULT_VALUE, entry.getValue(MockPreferenceProvider()))
}
assertEquals(expected, entry.getValue(mockPreferenceProvider))
}
@Test
fun value_override() =
runTest {
val expected = IntegerPreferenceDefaultFixture.DEFAULT_VALUE + 5
val entry = IntegerPreferenceDefaultFixture.new()
val mockPreferenceProvider =
MockPreferenceProvider {
mutableMapOf(StringDefaultPreferenceFixture.KEY.key to expected.toString())
}
assertEquals(expected, entry.getValue(mockPreferenceProvider))
}
}

View File

@ -14,19 +14,22 @@ class StringPreferenceDefaultTest {
}
@Test
fun value_default() = runTest {
val entry = StringDefaultPreferenceFixture.new()
assertEquals(StringDefaultPreferenceFixture.DEFAULT_VALUE, entry.getValue(MockPreferenceProvider()))
}
@Test
fun value_override() = runTest {
val entry = StringDefaultPreferenceFixture.new()
val mockPreferenceProvider = MockPreferenceProvider {
mutableMapOf(StringDefaultPreferenceFixture.KEY.key to "override")
fun value_default() =
runTest {
val entry = StringDefaultPreferenceFixture.new()
assertEquals(StringDefaultPreferenceFixture.DEFAULT_VALUE, entry.getValue(MockPreferenceProvider()))
}
assertEquals("override", entry.getValue(mockPreferenceProvider))
}
@Test
fun value_override() =
runTest {
val entry = StringDefaultPreferenceFixture.new()
val mockPreferenceProvider =
MockPreferenceProvider {
mutableMapOf(StringDefaultPreferenceFixture.KEY.key to "override")
}
assertEquals("override", entry.getValue(mockPreferenceProvider))
}
}

View File

@ -11,7 +11,6 @@ import kotlinx.coroutines.flow.flow
class MockPreferenceProvider(
mutableMapFactory: () -> MutableMap<String, String?> = { mutableMapOf() }
) : PreferenceProvider {
private val map = mutableMapFactory()
override suspend fun getString(key: PreferenceKey) = map[key.key]
@ -19,9 +18,17 @@ 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(key: PreferenceKey, value: String?) {
override suspend fun putString(
key: PreferenceKey,
value: String?
) {
map[key.key] = value
}
}

View File

@ -5,6 +5,8 @@ import co.electriccoin.zcash.preference.model.entry.PreferenceKey
object BooleanPreferenceDefaultFixture {
val KEY = PreferenceKey("some_boolean_key") // $NON-NLS
fun newTrue() = BooleanPreferenceDefault(KEY, true)
fun newFalse() = BooleanPreferenceDefault(KEY, false)
}

View File

@ -6,6 +6,9 @@ import co.electriccoin.zcash.preference.model.entry.PreferenceKey
object IntegerPreferenceDefaultFixture {
val KEY = PreferenceKey("some_string_key") // $NON-NLS
const val DEFAULT_VALUE = 123
fun new(preferenceKey: PreferenceKey = KEY, value: Int = DEFAULT_VALUE) =
IntegerPreferenceDefault(preferenceKey, value)
fun new(
preferenceKey: PreferenceKey = KEY,
value: Int = DEFAULT_VALUE
) = IntegerPreferenceDefault(preferenceKey, value)
}

View File

@ -6,6 +6,9 @@ import co.electriccoin.zcash.preference.model.entry.StringPreferenceDefault
object StringDefaultPreferenceFixture {
val KEY = PreferenceKey("some_string_key") // $NON-NLS
const val DEFAULT_VALUE = "some_default_value" // $NON-NLS
fun new(preferenceKey: PreferenceKey = KEY, value: String = DEFAULT_VALUE) =
StringPreferenceDefault(preferenceKey, value)
fun new(
preferenceKey: PreferenceKey = KEY,
value: String = DEFAULT_VALUE
) = StringPreferenceDefault(preferenceKey, value)
}

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