Compare commits
184 Commits
Author | SHA1 | Date |
---|---|---|
Honza Rychnovský | 00db536674 | |
dependabot[bot] | 02e67ae778 | |
dependabot[bot] | 9fdfcf39dd | |
Honza Rychnovský | 6ee0deeb5c | |
Honza Rychnovský | a97b71d922 | |
dependabot[bot] | b235e0cc82 | |
Honza Rychnovský | 6c3307748a | |
Honza Rychnovský | c3cf711ee6 | |
Honza Rychnovský | 5c21a776d5 | |
Honza Rychnovský | 6160554d64 | |
Honza Rychnovský | 2828c25c21 | |
Honza Rychnovský | e2ddebe47c | |
Honza Rychnovský | 448177c2d1 | |
Honza Rychnovský | 09febc6ff1 | |
Honza Rychnovský | a1cf59f9b2 | |
Honza Rychnovský | eae133f650 | |
Honza Rychnovský | b0ccdef6e3 | |
Honza Rychnovský | a95172ad76 | |
Honza Rychnovský | 9b2bad6f10 | |
dependabot[bot] | 9ca5548ca3 | |
dependabot[bot] | 841e0e76d1 | |
dependabot[bot] | e1a805fc0a | |
dependabot[bot] | 9ae38c92bc | |
Honza Rychnovský | b9249d6ebf | |
Honza Rychnovský | 2ac9f5ebd4 | |
Honza Rychnovský | e0439f0ca9 | |
Honza Rychnovský | abafc0387f | |
Honza Rychnovský | d9565e68e0 | |
Honza Rychnovský | 45ca274f98 | |
Honza Rychnovský | 66ba050719 | |
Honza Rychnovský | 1ffbaf986f | |
dependabot[bot] | 992c1dd197 | |
dependabot[bot] | 32e68c3d91 | |
Honza Rychnovský | dd371348eb | |
dependabot[bot] | 6ef9d9f02e | |
Honza Rychnovský | 551055e65c | |
Honza Rychnovský | ff2ce3a379 | |
Honza Rychnovský | 786c8c2cab | |
Honza Rychnovský | fb5d446bab | |
Honza Rychnovský | b00c807df1 | |
dependabot[bot] | 533f335038 | |
dependabot[bot] | e3fb6083c9 | |
dependabot[bot] | 681fb6ae85 | |
dependabot[bot] | 7cc067af49 | |
Honza Rychnovský | 9c9388a695 | |
Honza Rychnovský | e92c0b613c | |
dependabot[bot] | cada044991 | |
Honza Rychnovský | 895d692588 | |
Honza Rychnovský | 81508f6466 | |
Honza Rychnovský | afd47e513e | |
Honza Rychnovský | 0e6b8f83a0 | |
dependabot[bot] | fc1ce4087d | |
dependabot[bot] | 316bc8702a | |
Honza Rychnovský | dc955d6ee3 | |
Honza Rychnovský | bd8cbcab10 | |
Honza Rychnovský | 47937ffabc | |
Honza Rychnovský | cad8e48bf8 | |
Honza Rychnovský | bcdf328cb4 | |
dependabot[bot] | ed34fb1b3a | |
Honza Rychnovský | c9308546ab | |
Honza Rychnovský | c6aac62070 | |
Honza Rychnovský | 0d3d0c4d19 | |
dependabot[bot] | af92f1b52f | |
Honza Rychnovský | bca1c32b8c | |
Honza Rychnovský | b34d086cc0 | |
Honza Rychnovský | 8c027003cc | |
dependabot[bot] | 84c7618037 | |
Honza Rychnovský | e398af5690 | |
Honza Rychnovský | 2c45ab642b | |
Honza Rychnovský | c8a14f0375 | |
Honza Rychnovský | a8ad649ef8 | |
Honza Rychnovský | 4ae3fde690 | |
Honza Rychnovský | c99c2907b1 | |
Honza Rychnovský | 809820c1f2 | |
Honza Rychnovský | 8b58233648 | |
Honza Rychnovský | e2eb043afb | |
dependabot[bot] | 73de78caf9 | |
Honza Rychnovský | 7f3e55cc82 | |
Honza Rychnovský | 3845772071 | |
dependabot[bot] | 24cd22186f | |
Honza Rychnovský | fe5236fdae | |
dependabot[bot] | 8e495a542f | |
Honza Rychnovský | d309da9287 | |
dependabot[bot] | fd7703e005 | |
Honza Rychnovský | d076605444 | |
Honza Rychnovský | 9a929c1109 | |
Honza Rychnovský | e000745885 | |
Honza Rychnovský | 5bf7a635ff | |
Honza Rychnovský | 45ab8ce8c9 | |
Honza Rychnovský | cc5f3504fe | |
dependabot[bot] | 8f44794f9e | |
Honza Rychnovský | c8e3a05eb9 | |
dependabot[bot] | 77c9f3198a | |
Honza Rychnovský | 070be83506 | |
dependabot[bot] | b49709216d | |
Honza Rychnovský | 7285137f2e | |
dependabot[bot] | 4bba077fbd | |
Honza Rychnovský | bf618a1ba3 | |
dependabot[bot] | 79de1690bb | |
Honza Rychnovský | 6a5637a87d | |
Honza Rychnovský | 26a73f8e59 | |
dependabot[bot] | 01e3741f22 | |
dependabot[bot] | abcb7885b3 | |
dependabot[bot] | 7c7e210327 | |
dependabot[bot] | 29757a2009 | |
dependabot[bot] | 2f70cb9d41 | |
dependabot[bot] | bcadf5ca16 | |
Honza Rychnovský | cc333ea902 | |
Honza Rychnovský | 1058802b19 | |
Honza Rychnovský | c5efcabf4c | |
Honza Rychnovský | 392689e676 | |
Honza Rychnovský | 7630e4fcdf | |
Honza Rychnovský | dcd2cbd177 | |
Honza Rychnovský | f61f7d09c7 | |
Honza Rychnovský | b79739db0c | |
Honza Rychnovský | 3240c3baa8 | |
Honza Rychnovský | b68d93b137 | |
Honza Rychnovský | 7e27bdddff | |
dependabot[bot] | 1944916606 | |
dependabot[bot] | 8c35596519 | |
dependabot[bot] | 19f34192a5 | |
Honza Rychnovský | 155b171b46 | |
dependabot[bot] | 47bf1f9492 | |
Honza Rychnovský | 323437e6fc | |
Honza Rychnovský | 6519df7539 | |
dependabot[bot] | a276cb41e0 | |
dependabot[bot] | 99fcc92d1a | |
Honza Rychnovský | b58d3069c2 | |
dependabot[bot] | 0ad1477e1b | |
Honza Rychnovský | f711cd7cbd | |
Honza Rychnovský | ef3788bb8a | |
Honza Rychnovský | f44ed53077 | |
Honza Rychnovský | d1eec2dae8 | |
Honza Rychnovský | 803ea86d8d | |
Honza Rychnovský | 2f33ccf818 | |
Honza Rychnovský | b544de316d | |
Honza Rychnovský | d4fdb9aec2 | |
Honza Rychnovský | b42db7b035 | |
Honza Rychnovský | c901a63d54 | |
Honza Rychnovský | 90c982ac2a | |
dependabot[bot] | c813c54827 | |
dependabot[bot] | 0799c9bdd6 | |
Honza Rychnovský | c943fc58be | |
Honza Rychnovský | 4e3bea2c2f | |
Honza Rychnovský | 4cf608b733 | |
dependabot[bot] | 94616c4a7a | |
dependabot[bot] | 666c8c62bf | |
dependabot[bot] | 0074c2ebe3 | |
Honza Rychnovský | d3c4730f42 | |
Honza Rychnovský | c28dadaeed | |
Honza Rychnovský | a3e7d8f6c4 | |
Honza Rychnovský | a10b372e73 | |
Honza Rychnovský | c05991fbe1 | |
Honza Rychnovský | 780014380f | |
Honza Rychnovský | 987b08bb0a | |
Honza Rychnovský | 4c97e2f82e | |
Honza Rychnovský | 06ca665fca | |
Honza Rychnovský | 201cdbbd07 | |
Honza Rychnovský | 1310a0730d | |
Honza Rychnovský | dd81b90fbf | |
Honza Rychnovský | b88a64de9d | |
Honza Rychnovský | f67c3fde8f | |
Honza Rychnovský | ff0757b818 | |
Honza Rychnovský | 905a14db50 | |
dependabot[bot] | ec534550a7 | |
dependabot[bot] | db152bab8d | |
Honza Rychnovský | b468b4c725 | |
Honza Rychnovský | 3d33bb8ca5 | |
dependabot[bot] | 0054588ec0 | |
Honza Rychnovský | b15c1e9063 | |
Kris Nuttycombe | cb9d3cf70b | |
Honza Rychnovský | f34aa78f3d | |
Honza Rychnovský | 8966615a39 | |
Honza Rychnovský | 771dc114da | |
Honza Rychnovský | cf45a0ef34 | |
dependabot[bot] | 22da30bc9a | |
Honza Rychnovský | 6aa8094ed7 | |
Honza Rychnovský | 494d068168 | |
Honza Rychnovský | 70d5721845 | |
Honza Rychnovský | 6df3806a1f | |
Honza Rychnovský | a15bea738f | |
Honza Rychnovský | 692e5fc0d2 | |
Honza Rychnovský | 84e591561d | |
dependabot[bot] | 7a59d49920 |
|
@ -1,3 +1,3 @@
|
|||
FROM clamav/clamav:1.2.0
|
||||
FROM clamav/clamav:1.3.1
|
||||
RUN freshclam
|
||||
ENTRYPOINT ["clamscan", "--recursive"]
|
||||
|
|
|
@ -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._
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
52
README.md
52
README.md
|
@ -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.
|
||||
|
|
|
@ -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`
|
||||
|
|
|
@ -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
|
|
@ -10,7 +10,6 @@ import org.junit.Assert.assertEquals
|
|||
import org.junit.Test
|
||||
|
||||
class AndroidApiTest {
|
||||
|
||||
@Test
|
||||
@SmallTest
|
||||
fun checkTargetApi() {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -9,7 +9,6 @@ import kotlinx.coroutines.launch
|
|||
|
||||
@Suppress("unused")
|
||||
class ZcashApplication : CoroutineApplication() {
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 |
|
@ -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>
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#FFFFFF</color>
|
||||
</resources>
|
|
@ -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")}")
|
||||
|
|
|
@ -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=
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ""
|
||||
|
|
|
@ -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=
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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=
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@ import org.junit.Assert.assertEquals
|
|||
import org.junit.Test
|
||||
|
||||
class ReportableExceptionTest {
|
||||
|
||||
@Test
|
||||
fun bundle() {
|
||||
val reportableException = ReportableExceptionFixture.new()
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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?)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)!!
|
||||
|
|
|
@ -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)
|
||||
|
||||
/**
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -9,6 +9,5 @@ data class ReportableException(
|
|||
val isUncaught: Boolean,
|
||||
val time: Instant
|
||||
) {
|
||||
|
||||
companion object
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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 ->
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
@file:Suppress("ktlint:filename")
|
||||
@file:Suppress("ktlint:standard:filename")
|
||||
|
||||
package co.electriccoin.zcash.crash
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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).
|
|
@ -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.
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
@ -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
|
||||
|
|
|
@ -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" \
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue