Compare commits
200 Commits
Author | SHA1 | Date |
---|---|---|
|
987595eaa2 | |
|
20348014be | |
|
4ca4e81f1a | |
|
16091334f3 | |
|
a950a68a5c | |
|
39136ee67c | |
|
4cdb9f3024 | |
|
0a35c4fffd | |
|
34e741e3b3 | |
|
cc07535f44 | |
|
6f878ea609 | |
|
d813c1a9da | |
|
75e90607d1 | |
|
030d2e20b0 | |
|
fbf4a73208 | |
|
7e9e89725b | |
|
00db536674 | |
|
02e67ae778 | |
|
9fdfcf39dd | |
|
6ee0deeb5c | |
|
a97b71d922 | |
|
b235e0cc82 | |
|
6c3307748a | |
|
c3cf711ee6 | |
|
5c21a776d5 | |
|
6160554d64 | |
|
2828c25c21 | |
|
e2ddebe47c | |
|
448177c2d1 | |
|
09febc6ff1 | |
|
a1cf59f9b2 | |
|
eae133f650 | |
|
b0ccdef6e3 | |
|
a95172ad76 | |
|
9b2bad6f10 | |
|
9ca5548ca3 | |
|
841e0e76d1 | |
|
e1a805fc0a | |
|
9ae38c92bc | |
|
b9249d6ebf | |
|
2ac9f5ebd4 | |
|
e0439f0ca9 | |
|
abafc0387f | |
|
d9565e68e0 | |
|
45ca274f98 | |
|
66ba050719 | |
|
1ffbaf986f | |
|
992c1dd197 | |
|
32e68c3d91 | |
|
dd371348eb | |
|
6ef9d9f02e | |
|
551055e65c | |
|
ff2ce3a379 | |
|
786c8c2cab | |
|
fb5d446bab | |
|
b00c807df1 | |
|
533f335038 | |
|
e3fb6083c9 | |
|
681fb6ae85 | |
|
7cc067af49 | |
|
9c9388a695 | |
|
e92c0b613c | |
|
cada044991 | |
|
895d692588 | |
|
81508f6466 | |
|
afd47e513e | |
|
0e6b8f83a0 | |
|
fc1ce4087d | |
|
316bc8702a | |
|
dc955d6ee3 | |
|
bd8cbcab10 | |
|
47937ffabc | |
|
cad8e48bf8 | |
|
bcdf328cb4 | |
|
ed34fb1b3a | |
|
c9308546ab | |
|
c6aac62070 | |
|
0d3d0c4d19 | |
|
af92f1b52f | |
|
bca1c32b8c | |
|
b34d086cc0 | |
|
8c027003cc | |
|
84c7618037 | |
|
e398af5690 | |
|
2c45ab642b | |
|
c8a14f0375 | |
|
a8ad649ef8 | |
|
4ae3fde690 | |
|
c99c2907b1 | |
|
809820c1f2 | |
|
8b58233648 | |
|
e2eb043afb | |
|
73de78caf9 | |
|
7f3e55cc82 | |
|
3845772071 | |
|
24cd22186f | |
|
fe5236fdae | |
|
8e495a542f | |
|
d309da9287 | |
|
fd7703e005 | |
|
d076605444 | |
|
9a929c1109 | |
|
e000745885 | |
|
5bf7a635ff | |
|
45ab8ce8c9 | |
|
cc5f3504fe | |
|
8f44794f9e | |
|
c8e3a05eb9 | |
|
77c9f3198a | |
|
070be83506 | |
|
b49709216d | |
|
7285137f2e | |
|
4bba077fbd | |
|
bf618a1ba3 | |
|
79de1690bb | |
|
6a5637a87d | |
|
26a73f8e59 | |
|
01e3741f22 | |
|
abcb7885b3 | |
|
7c7e210327 | |
|
29757a2009 | |
|
2f70cb9d41 | |
|
bcadf5ca16 | |
|
cc333ea902 | |
|
1058802b19 | |
|
c5efcabf4c | |
|
392689e676 | |
|
7630e4fcdf | |
|
dcd2cbd177 | |
|
f61f7d09c7 | |
|
b79739db0c | |
|
3240c3baa8 | |
|
b68d93b137 | |
|
7e27bdddff | |
|
1944916606 | |
|
8c35596519 | |
|
19f34192a5 | |
|
155b171b46 | |
|
47bf1f9492 | |
|
323437e6fc | |
|
6519df7539 | |
|
a276cb41e0 | |
|
99fcc92d1a | |
|
b58d3069c2 | |
|
0ad1477e1b | |
|
f711cd7cbd | |
|
ef3788bb8a | |
|
f44ed53077 | |
|
d1eec2dae8 | |
|
803ea86d8d | |
|
2f33ccf818 | |
|
b544de316d | |
|
d4fdb9aec2 | |
|
b42db7b035 | |
|
c901a63d54 | |
|
90c982ac2a | |
|
c813c54827 | |
|
0799c9bdd6 | |
|
c943fc58be | |
|
4e3bea2c2f | |
|
4cf608b733 | |
|
94616c4a7a | |
|
666c8c62bf | |
|
0074c2ebe3 | |
|
d3c4730f42 | |
|
c28dadaeed | |
|
a3e7d8f6c4 | |
|
a10b372e73 | |
|
c05991fbe1 | |
|
780014380f | |
|
987b08bb0a | |
|
4c97e2f82e | |
|
06ca665fca | |
|
201cdbbd07 | |
|
1310a0730d | |
|
dd81b90fbf | |
|
b88a64de9d | |
|
f67c3fde8f | |
|
ff0757b818 | |
|
905a14db50 | |
|
ec534550a7 | |
|
db152bab8d | |
|
b468b4c725 | |
|
3d33bb8ca5 | |
|
0054588ec0 | |
|
b15c1e9063 | |
|
cb9d3cf70b | |
|
f34aa78f3d | |
|
8966615a39 | |
|
771dc114da | |
|
cf45a0ef34 | |
|
22da30bc9a | |
|
6aa8094ed7 | |
|
494d068168 | |
|
70d5721845 | |
|
6df3806a1f | |
|
a15bea738f | |
|
692e5fc0d2 | |
|
84e591561d | |
|
7a59d49920 |
|
@ -1,3 +1,3 @@
|
||||||
FROM clamav/clamav:1.2.0
|
FROM clamav/clamav:1.3.1
|
||||||
RUN freshclam
|
RUN freshclam
|
||||||
ENTRYPOINT ["clamscan", "--recursive"]
|
ENTRYPOINT ["clamscan", "--recursive"]
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
- [ ] Add **automated tests** as appropriate
|
- [ ] Add **automated tests** as appropriate
|
||||||
- [ ] Update the [**manual tests**](../blob/main/docs/testing/manual_testing)[^2] 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
|
- [ ] 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
|
- [ ] **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]
|
- [ ] 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]
|
- [ ] Perform an **ad hoc review**[^5]
|
||||||
- [ ] Review the **automated tests**
|
- [ ] Review the **automated tests**
|
||||||
- [ ] Review the **manual 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]
|
- [ ] **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]: _Code often looks different when reviewing the diff in a browser, making it easier to spot potential bugs._
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
# Expected secrets
|
# Expected secrets
|
||||||
# GOOGLE_PLAY_CLOUD_PROJECT - Google Cloud project associated with Google Play
|
# GOOGLE_PLAY_CLOUD_PROJECT - Google Cloud project associated with Google Play
|
||||||
# GOOGLE_PLAY_SERVICE_ACCOUNT - Email address of service account
|
# 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
|
# 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_BASE_64 - The upload signing key for the app
|
||||||
# UPLOAD_KEYSTORE_PASSWORD - The password for UPLOAD_KEYSTORE_BASE_64
|
# UPLOAD_KEYSTORE_PASSWORD - The password for UPLOAD_KEYSTORE_BASE_64
|
||||||
|
@ -36,12 +38,12 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
# Gradle Wrapper validation can be flaky
|
# Gradle Wrapper validation can be flaky
|
||||||
# https://github.com/gradle/wrapper-validation-action/issues/40
|
# https://github.com/gradle/wrapper-validation-action/issues/40
|
||||||
- name: Gradle Wrapper Validation
|
- name: Gradle Wrapper Validation
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: gradle/wrapper-validation-action@56b90f209b02bf6d1deae490e9ef18b21a389cd4
|
uses: gradle/wrapper-validation-action@88425854a36845f9c881450d9660b5fd46bee142
|
||||||
|
|
||||||
check_secrets:
|
check_secrets:
|
||||||
environment: deployment
|
environment: deployment
|
||||||
|
@ -54,9 +56,17 @@ jobs:
|
||||||
- id: check_secrets
|
- id: check_secrets
|
||||||
env:
|
env:
|
||||||
GOOGLE_PLAY_CLOUD_PROJECT: ${{ secrets.GOOGLE_PLAY_CLOUD_PROJECT }}
|
GOOGLE_PLAY_CLOUD_PROJECT: ${{ secrets.GOOGLE_PLAY_CLOUD_PROJECT }}
|
||||||
GOOGLE_PLAY_SERVICE_ACCOUNT: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT }}
|
# TODO [#1033]: Use token-based authorization on Google Play for automated deployment
|
||||||
GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER: ${{ secrets.GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER }}
|
# TODO [#1033]: https://github.com/Electric-Coin-Company/zashi-android/issues/1033
|
||||||
if: "${{ env.GOOGLE_PLAY_CLOUD_PROJECT != '' && env.GOOGLE_PLAY_SERVICE_ACCOUNT != '' && env.GOOGLE_PLAY_WORKLOAD_IDENTITY_PROVIDER != '' }}"
|
# 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
|
run: echo "defined=true" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
build_and_deploy:
|
build_and_deploy:
|
||||||
|
@ -70,15 +80,18 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
|
fetch-depth: 0 # To fetch all commits
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
with:
|
with:
|
||||||
gradle-home-cache-cleanup: true
|
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_DEBUG_JSON_BASE64} | base64 --decode > app/src/debug/google-services.json
|
||||||
echo ${FIREBASE_RELEASE_JSON_BASE64} | base64 --decode > app/src/release/google-services.json
|
echo ${FIREBASE_RELEASE_JSON_BASE64} | base64 --decode > app/src/release/google-services.json
|
||||||
- name: Authenticate to Google Cloud for Google Play
|
- 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
|
id: auth_google_play
|
||||||
uses: google-github-actions/auth@35b0e87d162680511bf346c299f71c9c5c379033
|
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
|
||||||
with:
|
with:
|
||||||
create_credentials_file: true
|
create_credentials_file: true
|
||||||
project_id: ${{ secrets.GOOGLE_PLAY_CLOUD_PROJECT }}
|
project_id: ${{ secrets.GOOGLE_PLAY_CLOUD_PROJECT }}
|
||||||
|
@ -108,6 +125,13 @@ jobs:
|
||||||
echo "home=${HOME}" >> "$GITHUB_ENV"
|
echo "home=${HOME}" >> "$GITHUB_ENV"
|
||||||
- name: Export Signing Key
|
- name: Export Signing Key
|
||||||
env:
|
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_KEYSTORE_BASE_64: ${{ secrets.UPLOAD_KEYSTORE_BASE_64 }}
|
||||||
SIGNING_KEY_PATH: ${{ format('{0}/release.jks', env.home) }}
|
SIGNING_KEY_PATH: ${{ format('{0}/release.jks', env.home) }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
@ -117,14 +141,21 @@ jobs:
|
||||||
timeout-minutes: 25
|
timeout-minutes: 25
|
||||||
env:
|
env:
|
||||||
ORG_GRADLE_PROJECT_ZCASH_SUPPORT_EMAIL_ADDRESS: ${{ vars.SUPPORT_EMAIL_ADDRESS }}
|
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_PATH: ${{ format('{0}/release.jks', env.home) }}
|
||||||
ORG_GRADLE_PROJECT_ZCASH_RELEASE_KEYSTORE_PASSWORD: ${{ secrets.UPLOAD_KEYSTORE_PASSWORD }}
|
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: ${{ secrets.UPLOAD_KEY_ALIAS }}
|
||||||
ORG_GRADLE_PROJECT_ZCASH_RELEASE_KEY_ALIAS_PASSWORD: ${{ secrets.UPLOAD_KEY_ALIAS_PASSWORD }}
|
ORG_GRADLE_PROJECT_ZCASH_RELEASE_KEY_ALIAS_PASSWORD: ${{ secrets.UPLOAD_KEY_ALIAS_PASSWORD }}
|
||||||
ORG_GRADLE_PROJECT_ZCASH_GOOGLE_PLAY_DEPLOY_MODE: deploy
|
|
||||||
run: |
|
run: |
|
||||||
./gradlew :app:assembleDebug :app:publishBundle :app:packageZcashmainnetReleaseUniversalApk
|
./gradlew :app:publishToGooglePlay
|
||||||
- name: Collect Artifacts
|
- name: Collect Artifacts
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
env:
|
env:
|
||||||
|
@ -133,11 +164,11 @@ jobs:
|
||||||
MAPPINGS_ZIP_PATH: ${{ format('{0}/artifacts/mappings.zip', env.home) }}
|
MAPPINGS_ZIP_PATH: ${{ format('{0}/artifacts/mappings.zip', env.home) }}
|
||||||
run: |
|
run: |
|
||||||
mkdir ${ARTIFACTS_DIR_PATH}
|
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
|
zip -r ${MAPPINGS_ZIP_PATH} . -i app/build/outputs/mapping/\*/mapping.txt
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 1
|
timeout-minutes: 5
|
||||||
with:
|
with:
|
||||||
name: Binaries
|
name: Binaries
|
||||||
path: ~/artifacts
|
path: ~/artifacts
|
||||||
|
@ -153,9 +184,9 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Download release artifact
|
- name: Download release artifact
|
||||||
uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
|
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
|
||||||
with:
|
with:
|
||||||
name: Binaries
|
name: Binaries
|
||||||
- name: Unzip artifacts
|
- name: Unzip artifacts
|
||||||
|
|
|
@ -32,12 +32,12 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
# Gradle Wrapper validation can be flaky
|
# Gradle Wrapper validation can be flaky
|
||||||
# https://github.com/gradle/wrapper-validation-action/issues/40
|
# https://github.com/gradle/wrapper-validation-action/issues/40
|
||||||
- name: Gradle Wrapper Validation
|
- name: Gradle Wrapper Validation
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: gradle/wrapper-validation-action@56b90f209b02bf6d1deae490e9ef18b21a389cd4
|
uses: gradle/wrapper-validation-action@88425854a36845f9c881450d9660b5fd46bee142
|
||||||
|
|
||||||
check_firebase_secrets:
|
check_firebase_secrets:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -71,15 +71,15 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Check properties
|
- name: Check properties
|
||||||
timeout-minutes: 4
|
timeout-minutes: 4
|
||||||
|
@ -94,18 +94,18 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Detekt
|
- name: Detekt
|
||||||
timeout-minutes: 4
|
timeout-minutes: 10
|
||||||
run: |
|
run: |
|
||||||
./gradlew detektAll
|
./gradlew detektAll
|
||||||
- name: Collect Artifacts
|
- name: Collect Artifacts
|
||||||
|
@ -120,7 +120,7 @@ jobs:
|
||||||
zip -r ${REPORTS_ZIP_PATH} . -i build/reports/detekt/*
|
zip -r ${REPORTS_ZIP_PATH} . -i build/reports/detekt/*
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
name: Detekt static analysis results
|
name: Detekt static analysis results
|
||||||
|
@ -134,15 +134,15 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Ktlint
|
- name: Ktlint
|
||||||
timeout-minutes: 4
|
timeout-minutes: 4
|
||||||
|
@ -160,7 +160,7 @@ jobs:
|
||||||
zip -r ${REPORTS_ZIP_PATH} . -i build/reports/ktlint/\*
|
zip -r ${REPORTS_ZIP_PATH} . -i build/reports/ktlint/\*
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
name: Ktlint static analysis results
|
name: Ktlint static analysis results
|
||||||
|
@ -174,15 +174,15 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Android Lint
|
- name: Android Lint
|
||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
|
@ -203,7 +203,7 @@ jobs:
|
||||||
zip -r ${LINT_ZIP_PATH} . -i \*build/reports/\*
|
zip -r ${LINT_ZIP_PATH} . -i \*build/reports/\*
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
name: Android Lint static analysis results
|
name: Android Lint static analysis results
|
||||||
|
@ -217,18 +217,18 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Test
|
- name: Test
|
||||||
timeout-minutes: 4
|
timeout-minutes: 10
|
||||||
run: |
|
run: |
|
||||||
# Note that we explicitly check just the Kotlin modules, to avoid compiling the Android modules here
|
# 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
|
./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
|
zip -r ${RESULTS_ZIP_PATH} . -i \*build/reports/\* \*/build/kover/html/\* \*/build/kover/xml/report.xml
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
name: Test Kotlin modules results
|
name: Test Kotlin modules results
|
||||||
|
@ -261,15 +261,15 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Build
|
- name: Build
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
|
@ -277,7 +277,7 @@ jobs:
|
||||||
./gradlew assembleDebug assembleAndroidTest assembleZcashmainnetDebug assembleZcashtestnetDebug
|
./gradlew assembleDebug assembleAndroidTest assembleZcashmainnetDebug assembleZcashtestnetDebug
|
||||||
- name: Authenticate to Google Cloud for Firebase Test Lab
|
- name: Authenticate to Google Cloud for Firebase Test Lab
|
||||||
id: auth_test_lab
|
id: auth_test_lab
|
||||||
uses: google-github-actions/auth@35b0e87d162680511bf346c299f71c9c5c379033
|
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
|
||||||
with:
|
with:
|
||||||
create_credentials_file: true
|
create_credentials_file: true
|
||||||
project_id: ${{ vars.FIREBASE_TEST_LAB_PROJECT }}
|
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/\*
|
zip -r ${TEST_RESULTS_ZIP_PATH} . -i build/fladle/\* \*/build/outputs/androidTest-results/\*
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
name: Test Android modules with FTL results
|
name: Test Android modules with FTL results
|
||||||
|
@ -324,15 +324,15 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Build and test
|
- name: Build and test
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
|
@ -356,7 +356,7 @@ jobs:
|
||||||
zip -r ${TEST_RESULTS_ZIP_PATH} . -i \*/build/test-results/\*
|
zip -r ${TEST_RESULTS_ZIP_PATH} . -i \*/build/test-results/\*
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
name: Test Android libs with WTF results
|
name: Test Android libs with WTF results
|
||||||
|
@ -371,15 +371,15 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Build and test
|
- name: Build and test
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
|
@ -403,7 +403,7 @@ jobs:
|
||||||
zip -r ${TEST_RESULTS_ZIP_PATH} . -i \*/build/test-results/\*
|
zip -r ${TEST_RESULTS_ZIP_PATH} . -i \*/build/test-results/\*
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
name: Test Android app with WTF results
|
name: Test Android app with WTF results
|
||||||
|
@ -421,15 +421,15 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Export Google Services JSON
|
- name: Export Google Services JSON
|
||||||
env:
|
env:
|
||||||
|
@ -451,7 +451,7 @@ jobs:
|
||||||
./gradlew :app:assembleDebug
|
./gradlew :app:assembleDebug
|
||||||
- name: Authenticate to Google Cloud for Firebase Test Lab
|
- name: Authenticate to Google Cloud for Firebase Test Lab
|
||||||
id: auth_test_lab
|
id: auth_test_lab
|
||||||
uses: google-github-actions/auth@35b0e87d162680511bf346c299f71c9c5c379033
|
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
|
||||||
with:
|
with:
|
||||||
create_credentials_file: true
|
create_credentials_file: true
|
||||||
project_id: ${{ vars.FIREBASE_TEST_LAB_PROJECT }}
|
project_id: ${{ vars.FIREBASE_TEST_LAB_PROJECT }}
|
||||||
|
@ -475,15 +475,15 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Export Google Services JSON
|
- name: Export Google Services JSON
|
||||||
env:
|
env:
|
||||||
|
@ -530,7 +530,7 @@ jobs:
|
||||||
zip -r ${MAPPINGS_ZIP_PATH} . -i *app/build/outputs/mapping/*/mapping.txt
|
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/\*
|
zip -r ${COMPOSE_METRICS_ZIP_PATH} . -i \*/build/compose-metrics/\* \*/build/compose-reports/\*
|
||||||
- name: Upload Artifacts
|
- name: Upload Artifacts
|
||||||
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
|
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||||
timeout-minutes: 2
|
timeout-minutes: 2
|
||||||
with:
|
with:
|
||||||
name: Binaries
|
name: Binaries
|
||||||
|
@ -548,19 +548,19 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
|
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||||
- name: Set up Java
|
- name: Set up Java
|
||||||
uses: actions/setup-java@0ab4596768b603586c0de567f2430c30f5b0d2b0
|
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9
|
||||||
timeout-minutes: 1
|
timeout-minutes: 1
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 17
|
java-version: 17
|
||||||
- name: Set up Gradle
|
- name: Set up Gradle
|
||||||
uses: gradle/gradle-build-action@842c587ad8aa4c68eeba24c396e15af4c2e9f30a
|
uses: gradle/gradle-build-action@66535aaf56f831b35e3a8481c9c99b665b84dd45
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
- name: Authenticate to Google Cloud for Firebase Test Lab
|
- name: Authenticate to Google Cloud for Firebase Test Lab
|
||||||
id: auth_test_lab
|
id: auth_test_lab
|
||||||
uses: google-github-actions/auth@35b0e87d162680511bf346c299f71c9c5c379033
|
uses: google-github-actions/auth@71fee32a0bb7e97b4d33d548e7d957010649d8fa
|
||||||
with:
|
with:
|
||||||
create_credentials_file: true
|
create_credentials_file: true
|
||||||
project_id: ${{ vars.FIREBASE_TEST_LAB_PROJECT }}
|
project_id: ${{ vars.FIREBASE_TEST_LAB_PROJECT }}
|
||||||
|
@ -568,7 +568,7 @@ jobs:
|
||||||
workload_identity_provider: ${{ secrets.FIREBASE_TEST_LAB_WORKLOAD_IDENTITY_PROVIDER }}
|
workload_identity_provider: ${{ secrets.FIREBASE_TEST_LAB_WORKLOAD_IDENTITY_PROVIDER }}
|
||||||
access_token_lifetime: '900s'
|
access_token_lifetime: '900s'
|
||||||
- name: Download a single artifact
|
- name: Download a single artifact
|
||||||
uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
|
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
|
||||||
with:
|
with:
|
||||||
name: Binaries
|
name: Binaries
|
||||||
- name: Robo test
|
- name: Robo test
|
||||||
|
|
|
@ -9,6 +9,9 @@ syntax: glob
|
||||||
.idea/modules.xml
|
.idea/modules.xml
|
||||||
.idea/tasks.xml
|
.idea/tasks.xml
|
||||||
.idea/workspace.xml
|
.idea/workspace.xml
|
||||||
|
.idea/deploymentTargetSelector.xml
|
||||||
|
.idea/migrations.xml
|
||||||
|
.idea/studiobot.xml
|
||||||
.settings
|
.settings
|
||||||
*.iml
|
*.iml
|
||||||
bin/
|
bin/
|
||||||
|
@ -24,3 +27,4 @@ local.properties
|
||||||
google-services.json
|
google-services.json
|
||||||
/.idea/kotlinc.xml
|
/.idea/kotlinc.xml
|
||||||
/.idea/other.xml
|
/.idea/other.xml
|
||||||
|
/.idea/appInsightsSettings.xml
|
||||||
|
|
|
@ -0,0 +1,232 @@
|
||||||
|
# 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
|
||||||
|
- New bubble message style for the Send and Transaction history item text components
|
||||||
|
- Display all messages within the transaction history record when it is expanded
|
||||||
|
- The Dark mode is now officially supported by the entire app UI
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- The Not Enough Free Space screen UI has been slightly refactored to align with the latest design guidelines
|
||||||
|
|
||||||
|
## [1.1.1 (660)] - 2024-06-05
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Grid pattern background has been added to several screens
|
||||||
|
- A new disconnected dialog reminder has been added to inform users about possible server issues
|
||||||
|
- When the app is experiencing such server connection issues, a new DISCONNECTED label will be displayed below the
|
||||||
|
screen title
|
||||||
|
- The transaction history list will be displayed when the app has server connection issues. Such a list might have a
|
||||||
|
slightly different order.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- The color palette used across the app has been reworked to align with the updated design document
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- An updated snapshot Zcash SDK version has been adopted to improve unstable lightwalletd communication
|
||||||
|
- Transaction submission has been slightly refactored to improve its stability
|
||||||
|
|
||||||
|
## [1.1 (655)] - 2024-05-24
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
- Synchronizer status details are now available to users by pressing the simple status view placed above the
|
||||||
|
synchronization progress bar. The details are displayed within a dialog window on the Balances and Account screens.
|
||||||
|
This view also occasionally presents information about a possible Zashi app update available on Google Play. The
|
||||||
|
app redirects users to the Google Play Zashi page by pressing the view.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- The app dialog window has now a bit more rounded corners
|
||||||
|
- A few more minor UI improvements
|
||||||
|
|
||||||
|
## [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
|
# 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
|
# Beta Testing
|
||||||
If you'd like to compile this application from source, please see our [Setup Documentation](docs/Setup.md) to get started.
|
|
||||||
|
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
|
# 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:
|
General Zcash questions and/or support requests and are best directed to either:
|
||||||
* [Zcash Forum](https://forum.zcashcommunity.com/)
|
* [Zcash Forum](https://forum.zcashcommunity.com/)
|
||||||
* [Discord Community](https://discord.io/zcash-community)
|
* [Discord Community](https://discord.io/zcash-community)
|
||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
Contributions are very much welcomed! Please read our [Contributing Guidelines](docs/CONTRIBUTING.md) to learn about our process.
|
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
|
# 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. Change the app name under [gradle.properties](gradle.properties)
|
||||||
1. See `ZCASH_RELEASE_APP_NAME`
|
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`
|
1. Configure Firebase API keys and place them under `app/src/debug/google-services.json` and `app/src/release/google-services.json`
|
||||||
|
|
||||||
# Known Issues
|
# 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. During builds, a warning will be printed that says "Unable to detect AGP
|
||||||
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.
|
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. 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. 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. 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.BuildConfigField
|
||||||
import com.android.build.api.variant.ResValue
|
import com.android.build.api.variant.ResValue
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
@ -6,10 +7,10 @@ plugins {
|
||||||
id("com.android.application")
|
id("com.android.application")
|
||||||
kotlin("android")
|
kotlin("android")
|
||||||
id("secant.android-build-conventions")
|
id("secant.android-build-conventions")
|
||||||
id("com.github.triplet.play")
|
|
||||||
id("com.osacky.fladle")
|
id("com.osacky.fladle")
|
||||||
id("wtf.emulator.gradle")
|
id("wtf.emulator.gradle")
|
||||||
id("secant.emulator-wtf-conventions")
|
id("secant.emulator-wtf-conventions")
|
||||||
|
id("secant.publish-conventions")
|
||||||
}
|
}
|
||||||
|
|
||||||
val hasFirebaseApiKeys = run {
|
val hasFirebaseApiKeys = run {
|
||||||
|
@ -92,7 +93,7 @@ android {
|
||||||
releaseKeystorePassword,
|
releaseKeystorePassword,
|
||||||
releaseKeyAlias,
|
releaseKeyAlias,
|
||||||
releaseKeyAliasPassword
|
releaseKeyAliasPassword
|
||||||
).all { !it.isNullOrBlank() }
|
).all { it.isNotBlank() }
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
if (isReleaseSigningConfigured) {
|
if (isReleaseSigningConfigured) {
|
||||||
|
@ -119,14 +120,19 @@ android {
|
||||||
getByName("release").apply {
|
getByName("release").apply {
|
||||||
isMinifyEnabled = project.property("IS_MINIFY_ENABLED").toString().toBoolean()
|
isMinifyEnabled = project.property("IS_MINIFY_ENABLED").toString().toBoolean()
|
||||||
isShrinkResources = 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(
|
proguardFiles(
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
"proguard-project.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")
|
val isSignReleaseBuildWithDebugKey = project.property("IS_SIGN_RELEASE_BUILD_WITH_DEBUG_KEY")
|
||||||
.toString().toBoolean()
|
.toString().toBoolean()
|
||||||
|
|
||||||
if (isReleaseSigningConfigured) {
|
if (isReleaseSigningConfigured) {
|
||||||
signingConfig = signingConfigs.getByName("release")
|
signingConfig = signingConfigs.getByName("release")
|
||||||
} else if (isSignReleaseBuildWithDebugKey) {
|
} else if (isSignReleaseBuildWithDebugKey) {
|
||||||
|
@ -158,12 +164,6 @@ android {
|
||||||
resValue("string", "support_email_address", supportEmailAddress)
|
resValue("string", "support_email_address", supportEmailAddress)
|
||||||
}
|
}
|
||||||
|
|
||||||
playConfigs {
|
|
||||||
register(testNetFlavorName) {
|
|
||||||
enabled.set(false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
testCoverage {
|
testCoverage {
|
||||||
jacocoVersion = project.property("JACOCO_VERSION").toString()
|
jacocoVersion = project.property("JACOCO_VERSION").toString()
|
||||||
}
|
}
|
||||||
|
@ -202,8 +202,6 @@ dependencies {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val googlePlayServiceKeyFilePath = project.property("ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH").toString()
|
|
||||||
|
|
||||||
androidComponents {
|
androidComponents {
|
||||||
onVariants { variant ->
|
onVariants { variant ->
|
||||||
for (output in variant.outputs) {
|
for (output in variant.outputs) {
|
||||||
|
@ -223,7 +221,9 @@ androidComponents {
|
||||||
ResValue(value = hasFirebaseApiKeys.toString())
|
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
|
// Update the versionName to reflect bumps in versionCode
|
||||||
|
|
||||||
val versionCodeOffset = 0 // Change this to zero the final digit of the versionName
|
val versionCodeOffset = 0 // Change this to zero the final digit of the versionName
|
||||||
|
@ -243,6 +243,9 @@ androidComponents {
|
||||||
}
|
}
|
||||||
|
|
||||||
output.versionName.set(processedVersionCode)
|
output.versionName.set(processedVersionCode)
|
||||||
|
|
||||||
|
val gitInfo = Git.newInfo(Git.MAIN, parent!!.projectDir)
|
||||||
|
output.versionCode.set(gitInfo.commitCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,6 +253,7 @@ androidComponents {
|
||||||
".readme",
|
".readme",
|
||||||
))
|
))
|
||||||
|
|
||||||
|
// The fixed Locale.US is intended
|
||||||
if (variant.name.lowercase(Locale.US).contains("release")) {
|
if (variant.name.lowercase(Locale.US).contains("release")) {
|
||||||
variant.packaging.resources.excludes.addAll(listOf(
|
variant.packaging.resources.excludes.addAll(listOf(
|
||||||
"**/*.kotlin_metadata",
|
"**/*.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 {
|
fladle {
|
||||||
// Firebase Test Lab has min and max values that might differ from our project's
|
// 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`
|
// These are determined by `gcloud firebase test android models list`
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
# Generate the combined proguard configuration for debugging.
|
# Generate the combined proguard configuration for debugging.
|
||||||
-printconfiguration build/outputs/proguard-config.txt
|
-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 androidx.compose.ui.util.MathHelpersKt
|
||||||
-dontwarn com.google.common.util.concurrent.ListenableFuture
|
-dontwarn com.google.common.util.concurrent.ListenableFuture
|
||||||
-dontwarn com.google.errorprone.annotations.InlineMe
|
-dontwarn com.google.errorprone.annotations.InlineMe
|
||||||
|
@ -23,4 +26,5 @@
|
||||||
# kotlinx.datetime supports kotlinx.serialization, but we don't use kotlinx.serialization elsewhere
|
# 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.
|
# in the projects, so the classes aren't present. These warnings are safe to suppress.
|
||||||
-dontwarn kotlinx.serialization.KSerializer
|
-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
|
import org.junit.Test
|
||||||
|
|
||||||
class AndroidApiTest {
|
class AndroidApiTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@SmallTest
|
@SmallTest
|
||||||
fun checkTargetApi() {
|
fun checkTargetApi() {
|
||||||
|
|
|
@ -28,6 +28,16 @@
|
||||||
android:shell="true"
|
android:shell="true"
|
||||||
tools:targetApi="29" />
|
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>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
|
@ -9,7 +9,6 @@ import kotlinx.coroutines.launch
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class ZcashApplication : CoroutineApplication() {
|
class ZcashApplication : CoroutineApplication() {
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.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()
|
val rootProperties = getRootProperties()
|
||||||
|
|
||||||
implementation("com.android.tools.build:gradle:${rootProperties.getProperty("ANDROID_GRADLE_PLUGIN_VERSION")}")
|
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("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:${rootProperties.getProperty("DETEKT_VERSION")}")
|
||||||
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProperties.getProperty("KOTLIN_VERSION")}")
|
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${rootProperties.getProperty("KOTLIN_VERSION")}")
|
||||||
implementation("wtf.emulator:gradle-plugin:${rootProperties.getProperty("EMULATOR_WTF_GRADLE_PLUGIN_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.
|
# This is a Gradle generated file for dependency locking.
|
||||||
# Manual edits can break the build and are not advised.
|
# Manual edits can break the build and are not advised.
|
||||||
# This file is expected to be part of source control.
|
# 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.kotlin-dsl:org.gradle.kotlin.kotlin-dsl.gradle.plugin:4.3.0=classpath
|
||||||
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.1.0=classpath
|
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.3.0=classpath
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
|
||||||
org.jetbrains.kotlin:kotlin-android-extensions:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-android-extensions:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-assignment:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-assignment:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-client:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-daemon-client:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-native-utils:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-native-utils:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-project-model:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-project-model:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-common:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-scripting-common:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-tooling-core:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-util-io:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-util-klib:1.9.22=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.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=classpath
|
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=classpath
|
||||||
org.jetbrains:annotations:13.0=classpath
|
org.jetbrains:annotations:13.0=classpath
|
||||||
empty=
|
empty=
|
||||||
|
|
|
@ -1,66 +1,78 @@
|
||||||
# This is a Gradle generated file for dependency locking.
|
# This is a Gradle generated file for dependency locking.
|
||||||
# Manual edits can break the build and are not advised.
|
# Manual edits can break the build and are not advised.
|
||||||
# This file is expected to be part of source control.
|
# This file is expected to be part of source control.
|
||||||
androidx.databinding:databinding-common:8.1.1=runtimeClasspath
|
androidx.databinding:databinding-common:8.3.0=runtimeClasspath
|
||||||
androidx.databinding:databinding-compiler-common:8.1.1=runtimeClasspath
|
androidx.databinding:databinding-compiler-common:8.3.0=runtimeClasspath
|
||||||
com.android.databinding:baseLibrary:8.1.1=runtimeClasspath
|
com.android.databinding:baseLibrary:8.3.0=runtimeClasspath
|
||||||
com.android.tools.analytics-library:crash:31.1.1=runtimeClasspath
|
com.android.tools.analytics-library:crash:31.3.0=runtimeClasspath
|
||||||
com.android.tools.analytics-library:protos:31.1.1=runtimeClasspath
|
com.android.tools.analytics-library:protos:31.3.0=runtimeClasspath
|
||||||
com.android.tools.analytics-library:shared:31.1.1=runtimeClasspath
|
com.android.tools.analytics-library:shared:31.3.0=runtimeClasspath
|
||||||
com.android.tools.analytics-library:tracker:31.1.1=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-core:1.0.0-beta10=runtimeClasspath
|
||||||
com.android.tools.build.jetifier:jetifier-processor: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:aapt2-proto:8.3.0-10880808=runtimeClasspath
|
||||||
com.android.tools.build:aaptcompiler:8.1.1=runtimeClasspath
|
com.android.tools.build:aaptcompiler:8.3.0=runtimeClasspath
|
||||||
com.android.tools.build:apksig:8.1.1=compileClasspath,runtimeClasspath
|
com.android.tools.build:apksig:8.3.0=compileClasspath,runtimeClasspath
|
||||||
com.android.tools.build:apkzlib:8.1.1=compileClasspath,runtimeClasspath
|
com.android.tools.build:apkzlib:8.3.0=compileClasspath,runtimeClasspath
|
||||||
com.android.tools.build:builder-model:8.1.1=compileClasspath,runtimeClasspath
|
com.android.tools.build:builder-model:8.3.0=compileClasspath,runtimeClasspath
|
||||||
com.android.tools.build:builder-test-api:8.1.1=runtimeClasspath
|
com.android.tools.build:builder-test-api:8.3.0=runtimeClasspath
|
||||||
com.android.tools.build:builder:8.1.1=compileClasspath,runtimeClasspath
|
com.android.tools.build:builder:8.3.0=compileClasspath,runtimeClasspath
|
||||||
com.android.tools.build:bundletool:1.14.0=runtimeClasspath
|
com.android.tools.build:bundletool:1.15.6=runtimeClasspath
|
||||||
com.android.tools.build:gradle-api:8.1.1=compileClasspath,runtimeClasspath
|
com.android.tools.build:gradle-api:8.3.0=compileClasspath,runtimeClasspath
|
||||||
com.android.tools.build:gradle-settings-api:8.1.1=runtimeClasspath
|
com.android.tools.build:gradle-settings-api:8.3.0=runtimeClasspath
|
||||||
com.android.tools.build:gradle:8.1.1=compileClasspath,runtimeClasspath
|
com.android.tools.build:gradle:8.3.0=compileClasspath,runtimeClasspath
|
||||||
com.android.tools.build:manifest-merger:31.1.1=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.build:transform-api:2.0.0-deprecated-use-gradle-api=runtimeClasspath
|
||||||
com.android.tools.ddms:ddmlib:31.1.1=runtimeClasspath
|
com.android.tools.ddms:ddmlib:31.3.0=runtimeClasspath
|
||||||
com.android.tools.layoutlib:layoutlib-api:31.1.1=runtimeClasspath
|
com.android.tools.layoutlib:layoutlib-api:31.3.0=runtimeClasspath
|
||||||
com.android.tools.lint:lint-model:31.1.1=runtimeClasspath
|
com.android.tools.lint:lint-model:31.3.0=runtimeClasspath
|
||||||
com.android.tools.lint:lint-typedef-remover:31.1.1=runtimeClasspath
|
com.android.tools.lint:lint-typedef-remover:31.3.0=runtimeClasspath
|
||||||
com.android.tools.utp:android-device-provider-ddmlib-proto:31.1.1=runtimeClasspath
|
com.android.tools.utp:android-device-provider-ddmlib-proto:31.3.0=runtimeClasspath
|
||||||
com.android.tools.utp:android-device-provider-gradle-proto:31.1.1=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.1.1=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.1.1=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.1.1=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.1.1=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.1.1=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.1.1=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.1.1=runtimeClasspath
|
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.3.0=runtimeClasspath
|
||||||
com.android.tools:annotations:31.1.1=runtimeClasspath
|
com.android.tools:annotations:31.3.0=runtimeClasspath
|
||||||
com.android.tools:common:31.1.1=runtimeClasspath
|
com.android.tools:common:31.3.0=runtimeClasspath
|
||||||
com.android.tools:dvlib:31.1.1=runtimeClasspath
|
com.android.tools:dvlib:31.3.0=runtimeClasspath
|
||||||
com.android.tools:repository:31.1.1=runtimeClasspath
|
com.android.tools:repository:31.3.0=runtimeClasspath
|
||||||
com.android.tools:sdk-common:31.1.1=runtimeClasspath
|
com.android.tools:sdk-common:31.3.0=runtimeClasspath
|
||||||
com.android.tools:sdklib:31.1.1=runtimeClasspath
|
com.android.tools:sdklib:31.3.0=runtimeClasspath
|
||||||
com.android:signflinger:8.1.1=runtimeClasspath
|
com.android:signflinger:8.3.0=runtimeClasspath
|
||||||
com.android:zipflinger:8.1.1=compileClasspath,runtimeClasspath
|
com.android:zipflinger:8.3.0=compileClasspath,runtimeClasspath
|
||||||
com.google.android:annotations:4.1.1.4=runtimeClasspath
|
com.google.android:annotations:4.1.1.4=runtimeClasspath
|
||||||
com.google.api.grpc:proto-google-common-protos:2.0.1=runtimeClasspath
|
com.google.api-client:google-api-client:2.2.0=compileClasspath,runtimeClasspath
|
||||||
com.google.auto.value:auto-value-annotations:1.6.2=runtimeClasspath
|
com.google.api.grpc:proto-google-common-protos:2.17.0=runtimeClasspath
|
||||||
com.google.code.findbugs:jsr305:3.0.2=runtimeClasspath
|
com.google.apis:google-api-services-androidpublisher:v3-rev20231030-2.0.0=compileClasspath,runtimeClasspath
|
||||||
com.google.code.gson:gson:2.8.9=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.crypto.tink:tink:1.7.0=runtimeClasspath
|
||||||
com.google.dagger:dagger:2.28.3=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.flatbuffers:flatbuffers-java:1.12.0=runtimeClasspath
|
||||||
com.google.guava:failureaccess:1.0.1=runtimeClasspath
|
com.google.guava:failureaccess:1.0.1=compileClasspath,runtimeClasspath
|
||||||
com.google.guava:guava:31.1-jre=runtimeClasspath
|
com.google.guava:guava:31.1-jre=compileClasspath
|
||||||
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=runtimeClasspath
|
com.google.guava:guava:32.0.1-jre=runtimeClasspath
|
||||||
com.google.j2objc:j2objc-annotations:1.3=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.jimfs:jimfs:1.1=runtimeClasspath
|
||||||
com.google.protobuf:protobuf-java-util:3.19.3=runtimeClasspath
|
com.google.oauth-client:google-oauth-client:1.34.1=compileClasspath,runtimeClasspath
|
||||||
com.google.protobuf:protobuf-java:3.19.3=runtimeClasspath
|
com.google.protobuf:protobuf-java-util:3.22.3=runtimeClasspath
|
||||||
com.google.testing.platform:core-proto:0.0.8-alpha08=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.googlecode.juniversalchardet:juniversalchardet:1.0.3=runtimeClasspath
|
||||||
com.squareup:javapoet:1.10.0=runtimeClasspath
|
com.squareup:javapoet:1.10.0=runtimeClasspath
|
||||||
com.squareup:javawriter:2.5.0=compileClasspath,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.istack:istack-commons-runtime:3.0.8=runtimeClasspath
|
||||||
com.sun.xml.fastinfoset:FastInfoset:1.2.16=runtimeClasspath
|
com.sun.xml.fastinfoset:FastInfoset:1.2.16=runtimeClasspath
|
||||||
com.vdurmont:semver4j:3.1.0=runtimeClasspath
|
com.vdurmont:semver4j:3.1.0=runtimeClasspath
|
||||||
commons-codec:commons-codec:1.11=runtimeClasspath
|
commons-codec:commons-codec:1.15=compileClasspath,runtimeClasspath
|
||||||
commons-io:commons-io:2.12.0=runtimeClasspath
|
commons-io:commons-io:2.15.1=runtimeClasspath
|
||||||
commons-logging:commons-logging:1.2=runtimeClasspath
|
commons-logging:commons-logging:1.2=compileClasspath,runtimeClasspath
|
||||||
io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.0=compileClasspath,runtimeClasspath
|
io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.6=compileClasspath,runtimeClasspath
|
||||||
io.grpc:grpc-api:1.45.1=runtimeClasspath
|
io.grpc:grpc-api:1.57.0=runtimeClasspath
|
||||||
io.grpc:grpc-context:1.45.1=runtimeClasspath
|
io.grpc:grpc-context:1.27.2=compileClasspath
|
||||||
io.grpc:grpc-core:1.45.1=runtimeClasspath
|
io.grpc:grpc-context:1.57.0=runtimeClasspath
|
||||||
io.grpc:grpc-netty:1.45.1=runtimeClasspath
|
io.grpc:grpc-core:1.57.0=runtimeClasspath
|
||||||
io.grpc:grpc-protobuf-lite:1.45.1=runtimeClasspath
|
io.grpc:grpc-netty:1.57.0=runtimeClasspath
|
||||||
io.grpc:grpc-protobuf:1.45.1=runtimeClasspath
|
io.grpc:grpc-protobuf-lite:1.57.0=runtimeClasspath
|
||||||
io.grpc:grpc-stub:1.45.1=runtimeClasspath
|
io.grpc:grpc-protobuf:1.57.0=runtimeClasspath
|
||||||
io.netty:netty-buffer:4.1.72.Final=runtimeClasspath
|
io.grpc:grpc-stub:1.57.0=runtimeClasspath
|
||||||
io.netty:netty-codec-http2:4.1.72.Final=runtimeClasspath
|
io.netty:netty-buffer:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-codec-http:4.1.72.Final=runtimeClasspath
|
io.netty:netty-codec-http2:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-codec-socks:4.1.72.Final=runtimeClasspath
|
io.netty:netty-codec-http:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-codec:4.1.72.Final=runtimeClasspath
|
io.netty:netty-codec-socks:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-common:4.1.72.Final=runtimeClasspath
|
io.netty:netty-codec:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-handler-proxy:4.1.72.Final=runtimeClasspath
|
io.netty:netty-common:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-handler:4.1.72.Final=runtimeClasspath
|
io.netty:netty-handler-proxy:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-resolver:4.1.72.Final=runtimeClasspath
|
io.netty:netty-handler:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-tcnative-classes:2.0.46.Final=runtimeClasspath
|
io.netty:netty-resolver:4.1.93.Final=runtimeClasspath
|
||||||
io.netty:netty-transport:4.1.72.Final=runtimeClasspath
|
io.netty:netty-transport-native-unix-common:4.1.93.Final=runtimeClasspath
|
||||||
io.perfmark:perfmark-api:0.23.0=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.activation:jakarta.activation-api:1.2.1=runtimeClasspath
|
||||||
jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=runtimeClasspath
|
jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=runtimeClasspath
|
||||||
javax.annotation:javax.annotation-api:1.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.jopt-simple:jopt-simple:4.9=runtimeClasspath
|
||||||
net.sf.kxml:kxml2:2.3.0=runtimeClasspath
|
net.sf.kxml:kxml2:2.3.0=runtimeClasspath
|
||||||
org.apache.commons:commons-compress:1.21=runtimeClasspath
|
org.apache.commons:commons-compress:1.21=runtimeClasspath
|
||||||
org.apache.httpcomponents:httpclient:4.5.13=runtimeClasspath
|
org.apache.httpcomponents:httpclient:4.5.14=compileClasspath,runtimeClasspath
|
||||||
org.apache.httpcomponents:httpcore:4.4.15=runtimeClasspath
|
org.apache.httpcomponents:httpcore:4.4.16=compileClasspath,runtimeClasspath
|
||||||
org.apache.httpcomponents:httpmime:4.5.6=runtimeClasspath
|
org.apache.httpcomponents:httpmime:4.5.6=runtimeClasspath
|
||||||
org.bitbucket.b_c:jose4j:0.7.0=runtimeClasspath
|
org.bitbucket.b_c:jose4j:0.7.0=runtimeClasspath
|
||||||
org.bouncycastle:bcpkix-jdk15on:1.67=runtimeClasspath
|
org.bouncycastle:bcpkix-jdk15on:1.67=runtimeClasspath
|
||||||
org.bouncycastle:bcprov-jdk15on:1.67=runtimeClasspath
|
org.bouncycastle:bcprov-jdk15on:1.67=runtimeClasspath
|
||||||
org.checkerframework:checker-qual:3.12.0=runtimeClasspath
|
org.checkerframework:checker-qual:3.12.0=compileClasspath
|
||||||
org.codehaus.mojo:animal-sniffer-annotations:1.19=runtimeClasspath
|
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:jaxb-runtime:2.3.2=runtimeClasspath
|
||||||
org.glassfish.jaxb:txw2:2.3.2=runtimeClasspath
|
org.glassfish.jaxb:txw2:2.3.2=runtimeClasspath
|
||||||
org.jdom:jdom2:2.0.6=runtimeClasspath
|
org.jdom:jdom2:2.0.6=runtimeClasspath
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,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-android-extensions:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.0=kotlinCompilerPluginClasspathMain
|
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.0=kotlinCompilerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22=kotlinCompilerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-client:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.0=kotlinCompilerClasspath
|
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.22=kotlinCompilerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.10=compileClasspath,runtimeClasspath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.23=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.10=compileClasspath,runtimeClasspath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.23=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.10=compileClasspath,runtimeClasspath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.23=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.10=compileClasspath,runtimeClasspath
|
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.23=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.10=compileClasspath,runtimeClasspath
|
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.23=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-native-utils:1.9.10=compileClasspath,runtimeClasspath
|
org.jetbrains.kotlin:kotlin-native-utils:1.9.23=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-project-model:1.9.10=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.6.10=kotlinCompilerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.8.20-RC2=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-reflect:1.9.20=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.9.0=compileClasspath
|
org.jetbrains.kotlin:kotlin-reflect:1.9.22=compileClasspath
|
||||||
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.0=kotlinCompilerPluginClasspathMain
|
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
|
||||||
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.9.0=kotlinCompilerPluginClasspathMain
|
org.jetbrains.kotlin:kotlin-scripting-common:1.9.22=kotlinCompilerPluginClasspathMain
|
||||||
org.jetbrains.kotlin:kotlin-scripting-common:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=runtimeClasspath
|
||||||
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-embeddable:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=runtimeClasspath
|
||||||
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-compiler-impl-embeddable:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.0=kotlinCompilerPluginClasspathMain
|
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.22=kotlinCompilerPluginClasspathMain
|
||||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.10=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20-RC2=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
|
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20-RC2=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib:1.9.20=runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=compileClasspath
|
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20-RC2=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-tooling-core:1.9.23=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=compileClasspath
|
org.jetbrains.kotlin:kotlin-util-io:1.9.23=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.8.20-RC2=runtimeClasspath
|
org.jetbrains.kotlin:kotlin-util-klib:1.9.23=compileClasspath,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.kotlinx.kover:org.jetbrains.kotlinx.kover.gradle.plugin:0.7.3=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:kotlinx-coroutines-core-jvm:1.5.0=runtimeClasspath
|
||||||
org.jetbrains.kotlinx:kover-gradle-plugin:0.7.3=compileClasspath,runtimeClasspath
|
org.jetbrains.kotlinx:kover-gradle-plugin:0.7.3=compileClasspath,runtimeClasspath
|
||||||
org.jetbrains:annotations:13.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,runtimeClasspath
|
org.jetbrains:annotations:13.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
|
||||||
org.json:json:20230227=runtimeClasspath
|
org.jetbrains:annotations:23.0.0=runtimeClasspath
|
||||||
|
org.json:json:20240205=runtimeClasspath
|
||||||
org.jvnet.staxex:stax-ex:1.8.1=runtimeClasspath
|
org.jvnet.staxex:stax-ex:1.8.1=runtimeClasspath
|
||||||
org.ow2.asm:asm-analysis:9.2=runtimeClasspath
|
org.ow2.asm:asm-analysis:9.6=runtimeClasspath
|
||||||
org.ow2.asm:asm-commons:9.2=runtimeClasspath
|
org.ow2.asm:asm-commons:9.6=runtimeClasspath
|
||||||
org.ow2.asm:asm-tree:9.2=runtimeClasspath
|
org.ow2.asm:asm-tree:9.6=runtimeClasspath
|
||||||
org.ow2.asm:asm-util:9.2=runtimeClasspath
|
org.ow2.asm:asm-util:9.6=runtimeClasspath
|
||||||
org.ow2.asm:asm:9.2=compileClasspath,runtimeClasspath
|
org.ow2.asm:asm:9.6=compileClasspath,runtimeClasspath
|
||||||
org.slf4j:slf4j-api:1.7.30=runtimeClasspath
|
org.slf4j:slf4j-api:1.7.30=runtimeClasspath
|
||||||
org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2=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-1:0.16.2=runtimeClasspath
|
||||||
wtf.emulator:gradle-compat-6-6:0.12.2=runtimeClasspath
|
wtf.emulator:gradle-compat-6-6:0.16.2=runtimeClasspath
|
||||||
wtf.emulator:gradle-compat-7-6:0.12.2=runtimeClasspath
|
wtf.emulator:gradle-compat-7-6:0.16.2=runtimeClasspath
|
||||||
wtf.emulator:gradle-compat-api:0.12.2=runtimeClasspath
|
wtf.emulator:gradle-compat-api:0.16.2=runtimeClasspath
|
||||||
wtf.emulator:gradle-compat:0.12.2=runtimeClasspath
|
wtf.emulator:gradle-compat:0.16.2=runtimeClasspath
|
||||||
wtf.emulator:gradle-plugin:0.12.2=compileClasspath,runtimeClasspath
|
wtf.emulator:gradle-plugin:0.16.2=compileClasspath,runtimeClasspath
|
||||||
xerces:xercesImpl:2.12.0=runtimeClasspath
|
|
||||||
xml-apis:xml-apis:1.4.01=runtimeClasspath
|
|
||||||
empty=annotationProcessor,kotlinScriptDefExtensions
|
empty=annotationProcessor,kotlinScriptDefExtensions
|
||||||
|
|
|
@ -175,7 +175,7 @@ fun com.android.build.gradle.BaseExtension.configureBaseExtension() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this is CommonExtension<*, *, *, *, *>) {
|
if (this is CommonExtension<*, *, *, *, *, *>) {
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
jvmTarget = project.property("ANDROID_JVM_TARGET").toString()
|
jvmTarget = project.property("ANDROID_JVM_TARGET").toString()
|
||||||
allWarningsAsErrors = project.property("ZCASH_IS_TREAT_WARNINGS_AS_ERRORS").toString().toBoolean()
|
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)
|
(this as ExtensionAware).extensions.configure("kotlinOptions", block)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ plugins {
|
||||||
val ktlint by configurations.creating
|
val ktlint by configurations.creating
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
ktlint("com.pinterest:ktlint:${project.property("KTLINT_VERSION")}") {
|
ktlint("com.pinterest.ktlint:ktlint-cli:${project.property("KTLINT_VERSION")}") {
|
||||||
attributes {
|
attributes {
|
||||||
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named<Bundling>(Bundling.EXTERNAL))
|
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.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
@ -13,7 +14,10 @@ plugins {
|
||||||
val generateBuildConfigTask = tasks.create("buildConfig") {
|
val generateBuildConfigTask = tasks.create("buildConfig") {
|
||||||
val generatedDir = layout.buildDirectory.dir("generated").get().asFile
|
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()
|
//val buildTimestamp = newIso8601Timestamp()
|
||||||
|
|
||||||
inputs.property("gitSha", gitInfo.sha)
|
inputs.property("gitSha", gitInfo.sha)
|
||||||
|
|
|
@ -3,45 +3,46 @@
|
||||||
# This file is expected to be part of source control.
|
# This file is expected to be part of source control.
|
||||||
junit:junit:4.13.2=commonTestImplementationCopy,jvmTestCompileClasspath,jvmTestImplementationCopy,jvmTestRuntimeClasspath
|
junit:junit:4.13.2=commonTestImplementationCopy,jvmTestCompileClasspath,jvmTestImplementationCopy,jvmTestRuntimeClasspath
|
||||||
org.hamcrest:hamcrest-core:1.3=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.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=kotlinBuildToolsApiClasspath
|
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.10=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.6.20=kotlinCompilerClasspathCopy
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=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.6.20=kotlinKlibCommonizerClasspathCopy
|
||||||
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.10=kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.23=kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinCompilerClasspath,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.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.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.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.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.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.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.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.6.20=commonTestImplementationCopy,jvmTestImplementationCopy
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10=allSourceSetsRuntimeDependenciesMetadata
|
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.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.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.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.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.6.20=commonTestImplementationCopy,jvmTestImplementationCopy
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
|
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-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.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
|
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=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-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.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.20=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestCompileClasspathCopy2,jvmTestImplementationCopy,jvmTestImplementationDependenciesMetadataCopy,jvmTestRuntimeClasspathCopy,jvmTestRuntimeClasspathCopy2
|
||||||
org.jetbrains.kotlin:kotlin-test:1.6.21=commonTestImplementationCopy2,jvmTestImplementationCopy2
|
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: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.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
|
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 "",
|
"ZCASH_EMULATOR_WTF_API_KEY" to "",
|
||||||
|
|
||||||
"IS_MINIFY_ENABLED" to "true",
|
"IS_MINIFY_ENABLED" to "true",
|
||||||
|
"NDK_DEBUG_SYMBOL_LEVEL" to "symbol_table",
|
||||||
|
|
||||||
"ZCASH_RELEASE_APP_NAME" to "Zashi",
|
"ZCASH_RELEASE_APP_NAME" to "Zashi",
|
||||||
"ZCASH_RELEASE_PACKAGE_NAME" to "co.electriccoin.zcash",
|
"ZCASH_RELEASE_PACKAGE_NAME" to "co.electriccoin.zcash",
|
||||||
"ZCASH_SUPPORT_EMAIL_ADDRESS" to "support@electriccoin.co",
|
"ZCASH_SUPPORT_EMAIL_ADDRESS" to "support@electriccoin.co",
|
||||||
"IS_SECURE_SCREEN_PROTECTION_ACTIVE" to "true",
|
"IS_SECURE_SCREEN_PROTECTION_ACTIVE" to "true",
|
||||||
"IS_DARK_MODE_ENABLED" to "false",
|
"IS_DARK_MODE_ENABLED" to "false",
|
||||||
|
"IS_SCREEN_ROTATION_ENABLED" to "false",
|
||||||
|
|
||||||
"ZCASH_DEBUG_KEYSTORE_PATH" to "",
|
"ZCASH_DEBUG_KEYSTORE_PATH" to "",
|
||||||
"ZCASH_RELEASE_KEYSTORE_PATH" to "",
|
"ZCASH_RELEASE_KEYSTORE_PATH" to "",
|
||||||
|
@ -111,9 +113,14 @@ tasks {
|
||||||
"ZCASH_RELEASE_KEY_ALIAS_PASSWORD" to "",
|
"ZCASH_RELEASE_KEY_ALIAS_PASSWORD" to "",
|
||||||
|
|
||||||
"IS_SIGN_RELEASE_BUILD_WITH_DEBUG_KEY" to "false",
|
"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_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 "",
|
"SDK_INCLUDED_BUILD_PATH" to "",
|
||||||
"BIP_39_INCLUDED_BUILD_PATH" to ""
|
"BIP_39_INCLUDED_BUILD_PATH" to ""
|
||||||
|
|
|
@ -1,38 +1,35 @@
|
||||||
# This is a Gradle generated file for dependency locking.
|
# This is a Gradle generated file for dependency locking.
|
||||||
# Manual edits can break the build and are not advised.
|
# Manual edits can break the build and are not advised.
|
||||||
# This file is expected to be part of source control.
|
# 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.kotlin-dsl.base:org.gradle.kotlin.kotlin-dsl.base.gradle.plugin:4.3.0=classpath
|
||||||
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.1.0=classpath
|
org.gradle.kotlin:gradle-kotlin-dsl-plugins:4.3.0=classpath
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
|
||||||
org.jetbrains.kotlin:kotlin-android-extensions:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-android-extensions:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-assignment:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-assignment:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-client:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-daemon-client:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-native-utils:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-native-utils:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-project-model:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-project-model:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-common:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-scripting-common:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-tooling-core:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-util-io:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-util-klib:1.9.22=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.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=classpath
|
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=classpath
|
||||||
org.jetbrains:annotations:13.0=classpath
|
org.jetbrains:annotations:13.0=classpath
|
||||||
empty=
|
empty=
|
||||||
|
|
|
@ -4,36 +4,28 @@
|
||||||
com.googlecode.javaewah:JavaEWAH:1.1.13=buildScriptClasspath,compileClasspath,testCompileClasspath,testRuntimeClasspath
|
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.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.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.0=kotlinCompilerPluginClasspathMain
|
org.jetbrains.kotlin:kotlin-assignment-compiler-plugin-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.0=kotlinCompilerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22=kotlinCompilerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.0=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-api:1.7.10=kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-model: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-native-utils:1.7.10=kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-project-model: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.6.10=kotlinCompilerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.7.10=testCompileClasspath,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-reflect:1.9.22=compileClasspath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.9.0=compileClasspath
|
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.22=kotlinCompilerPluginClasspathMain
|
||||||
org.jetbrains.kotlin:kotlin-sam-with-receiver-compiler-plugin-embeddable:1.9.0=kotlinCompilerPluginClasspathMain
|
|
||||||
org.jetbrains.kotlin:kotlin-sam-with-receiver:1.7.10=kotlinCompilerPluginClasspathTest
|
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.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.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.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.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.7.10=kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.0=kotlinCompilerPluginClasspathMain
|
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.22=kotlinCompilerPluginClasspathMain
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10=kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath
|
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain
|
||||||
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-tooling-core:1.7.10=kotlinCompilerPluginClasspathTest
|
org.jetbrains.kotlin:kotlin-tooling-core:1.7.10=kotlinCompilerPluginClasspathTest
|
||||||
org.jetbrains.kotlin:kotlin-util-io: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
|
org.jetbrains:annotations:13.0=compileClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,testCompileClasspath,testRuntimeClasspath
|
||||||
|
|
|
@ -6,13 +6,17 @@ import java.io.File
|
||||||
|
|
||||||
object Git {
|
object Git {
|
||||||
// Get the info for the current branch
|
// 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 git = Git.open(workingDirectory)
|
||||||
val repository = git.repository
|
val repository = git.repository
|
||||||
|
|
||||||
val head: ObjectId = repository.resolve(HEAD)
|
val head: ObjectId = repository.resolve(branch)
|
||||||
val count = git.log().call().count()
|
val count = git.log().call().count()
|
||||||
|
|
||||||
return GitInfo(ObjectId.toString(head), count)
|
return GitInfo(ObjectId.toString(head), count)
|
||||||
|
|
|
@ -1,73 +1,80 @@
|
||||||
# This is a Gradle generated file for dependency locking.
|
# This is a Gradle generated file for dependency locking.
|
||||||
# Manual edits can break the build and are not advised.
|
# Manual edits can break the build and are not advised.
|
||||||
# This file is expected to be part of source control.
|
# This file is expected to be part of source control.
|
||||||
androidx.databinding:databinding-common:8.1.1=classpath
|
androidx.databinding:databinding-common:8.3.0=classpath
|
||||||
androidx.databinding:databinding-compiler-common:8.1.1=classpath
|
androidx.databinding:databinding-compiler-common:8.3.0=classpath
|
||||||
com.android.databinding:baseLibrary:8.1.1=classpath
|
com.android.databinding:baseLibrary:8.3.0=classpath
|
||||||
com.android.tools.analytics-library:crash:31.1.1=classpath
|
com.android.tools.analytics-library:crash:31.3.0=classpath
|
||||||
com.android.tools.analytics-library:protos:31.1.1=classpath
|
com.android.tools.analytics-library:protos:31.3.0=classpath
|
||||||
com.android.tools.analytics-library:shared:31.1.1=classpath
|
com.android.tools.analytics-library:shared:31.3.0=classpath
|
||||||
com.android.tools.analytics-library:tracker:31.1.1=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-core:1.0.0-beta10=classpath
|
||||||
com.android.tools.build.jetifier:jetifier-processor: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:aapt2-proto:8.3.0-10880808=classpath
|
||||||
com.android.tools.build:aaptcompiler:8.1.1=classpath
|
com.android.tools.build:aaptcompiler:8.3.0=classpath
|
||||||
com.android.tools.build:apksig:8.1.1=classpath
|
com.android.tools.build:apksig:8.3.0=classpath
|
||||||
com.android.tools.build:apkzlib:8.1.1=classpath
|
com.android.tools.build:apkzlib:8.3.0=classpath
|
||||||
com.android.tools.build:builder-model:8.1.1=classpath
|
com.android.tools.build:builder-model:8.3.0=classpath
|
||||||
com.android.tools.build:builder-test-api:8.1.1=classpath
|
com.android.tools.build:builder-test-api:8.3.0=classpath
|
||||||
com.android.tools.build:builder:8.1.1=classpath
|
com.android.tools.build:builder:8.3.0=classpath
|
||||||
com.android.tools.build:bundletool:1.14.0=classpath
|
com.android.tools.build:bundletool:1.15.6=classpath
|
||||||
com.android.tools.build:gradle-api:8.1.1=classpath
|
com.android.tools.build:gradle-api:8.3.0=classpath
|
||||||
com.android.tools.build:gradle-settings-api:8.1.1=classpath
|
com.android.tools.build:gradle-settings-api:8.3.0=classpath
|
||||||
com.android.tools.build:gradle:8.1.1=classpath
|
com.android.tools.build:gradle:8.3.0=classpath
|
||||||
com.android.tools.build:manifest-merger:31.1.1=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.build:transform-api:2.0.0-deprecated-use-gradle-api=classpath
|
||||||
com.android.tools.ddms:ddmlib:31.1.1=classpath
|
com.android.tools.ddms:ddmlib:31.3.0=classpath
|
||||||
com.android.tools.layoutlib:layoutlib-api:31.1.1=classpath
|
com.android.tools.layoutlib:layoutlib-api:31.3.0=classpath
|
||||||
com.android.tools.lint:lint-model:31.1.1=classpath
|
com.android.tools.lint:lint-model:31.3.0=classpath
|
||||||
com.android.tools.lint:lint-typedef-remover:31.1.1=classpath
|
com.android.tools.lint:lint-typedef-remover:31.3.0=classpath
|
||||||
com.android.tools.utp:android-device-provider-ddmlib-proto:31.1.1=classpath
|
com.android.tools.utp:android-device-provider-ddmlib-proto:31.3.0=classpath
|
||||||
com.android.tools.utp:android-device-provider-gradle-proto:31.1.1=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.1.1=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.1.1=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.1.1=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.1.1=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.1.1=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.1.1=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.1.1=classpath
|
com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.3.0=classpath
|
||||||
com.android.tools:annotations:31.1.1=classpath
|
com.android.tools:annotations:31.3.0=classpath
|
||||||
com.android.tools:common:31.1.1=classpath
|
com.android.tools:common:31.3.0=classpath
|
||||||
com.android.tools:dvlib:31.1.1=classpath
|
com.android.tools:dvlib:31.3.0=classpath
|
||||||
com.android.tools:repository:31.1.1=classpath
|
com.android.tools:repository:31.3.0=classpath
|
||||||
com.android.tools:sdk-common:31.1.1=classpath
|
com.android.tools:sdk-common:31.3.0=classpath
|
||||||
com.android.tools:sdklib:31.1.1=classpath
|
com.android.tools:sdklib:31.3.0=classpath
|
||||||
com.android:signflinger:8.1.1=classpath
|
com.android:signflinger:8.3.0=classpath
|
||||||
com.android:zipflinger:8.1.1=classpath
|
com.android:zipflinger:8.3.0=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.51.0=classpath,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.51.0=classpath
|
||||||
com.github.ben-manes:gradle-versions-plugin:0.47.0=classpath
|
|
||||||
com.google.android.gms:strict-version-matcher-plugin:1.2.4=classpath
|
com.google.android.gms:strict-version-matcher-plugin:1.2.4=classpath
|
||||||
com.google.android:annotations:4.1.1.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.api-client:google-api-client:2.2.0=classpath
|
||||||
com.google.auto.value:auto-value-annotations:1.6.2=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.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.crypto.tink:tink:1.7.0=classpath
|
||||||
com.google.dagger:dagger:2.28.3=classpath
|
com.google.dagger:dagger:2.28.3=classpath
|
||||||
com.google.errorprone:error_prone_annotations:2.11.0=classpath
|
com.google.errorprone:error_prone_annotations:2.18.0=classpath
|
||||||
com.google.firebase:firebase-crashlytics-buildtools:2.9.4=classpath
|
com.google.firebase:firebase-crashlytics-buildtools:2.9.9=classpath
|
||||||
com.google.firebase:firebase-crashlytics-gradle:2.9.4=classpath
|
com.google.firebase:firebase-crashlytics-gradle:2.9.9=classpath
|
||||||
com.google.flatbuffers:flatbuffers-java:1.12.0=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: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.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.jimfs:jimfs:1.1=classpath
|
||||||
com.google.protobuf:protobuf-java-util:3.19.3=classpath
|
com.google.oauth-client:google-oauth-client:1.34.1=classpath
|
||||||
com.google.protobuf:protobuf-java:3.19.3=classpath
|
com.google.protobuf:protobuf-java-util:3.22.3=classpath
|
||||||
com.google.testing.platform:core-proto:0.0.8-alpha08=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.googlecode.juniversalchardet:juniversalchardet:1.0.3=classpath
|
||||||
com.osacky.flank.gradle:fladle:0.17.4=classpath
|
com.osacky.flank.gradle:fladle:0.17.4=classpath
|
||||||
com.osacky.fulladle:com.osacky.fulladle.gradle.plugin:0.17.3=classpathCopy
|
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.activation:javax.activation:1.2.0=classpath
|
||||||
com.sun.istack:istack-commons-runtime:3.0.8=classpath
|
com.sun.istack:istack-commons-runtime:3.0.8=classpath
|
||||||
com.sun.xml.fastinfoset:FastInfoset:1.2.16=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
|
com.vdurmont:semver4j:3.1.0=classpath
|
||||||
commons-codec:commons-codec:1.11=classpath
|
commons-codec:commons-codec:1.15=classpath
|
||||||
commons-io:commons-io:2.12.0=classpath
|
commons-io:commons-io:2.15.1=classpath
|
||||||
commons-logging:commons-logging:1.2=classpath
|
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.6=classpath
|
||||||
io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.0=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.19.0=classpathCopy
|
||||||
io.gitlab.arturbosch.detekt:io.gitlab.arturbosch.detekt.gradle.plugin:1.20.0=classpathCopy2
|
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-api:1.57.0=classpath
|
||||||
io.grpc:grpc-context:1.45.1=classpath
|
io.grpc:grpc-context:1.57.0=classpath
|
||||||
io.grpc:grpc-core:1.45.1=classpath
|
io.grpc:grpc-core:1.57.0=classpath
|
||||||
io.grpc:grpc-netty:1.45.1=classpath
|
io.grpc:grpc-netty:1.57.0=classpath
|
||||||
io.grpc:grpc-protobuf-lite:1.45.1=classpath
|
io.grpc:grpc-protobuf-lite:1.57.0=classpath
|
||||||
io.grpc:grpc-protobuf:1.45.1=classpath
|
io.grpc:grpc-protobuf:1.57.0=classpath
|
||||||
io.grpc:grpc-stub:1.45.1=classpath
|
io.grpc:grpc-stub:1.57.0=classpath
|
||||||
io.netty:netty-buffer:4.1.72.Final=classpath
|
io.netty:netty-buffer:4.1.93.Final=classpath
|
||||||
io.netty:netty-codec-http2:4.1.72.Final=classpath
|
io.netty:netty-codec-http2:4.1.93.Final=classpath
|
||||||
io.netty:netty-codec-http:4.1.72.Final=classpath
|
io.netty:netty-codec-http:4.1.93.Final=classpath
|
||||||
io.netty:netty-codec-socks:4.1.72.Final=classpath
|
io.netty:netty-codec-socks:4.1.93.Final=classpath
|
||||||
io.netty:netty-codec:4.1.72.Final=classpath
|
io.netty:netty-codec:4.1.93.Final=classpath
|
||||||
io.netty:netty-common:4.1.72.Final=classpath
|
io.netty:netty-common:4.1.93.Final=classpath
|
||||||
io.netty:netty-handler-proxy:4.1.72.Final=classpath
|
io.netty:netty-handler-proxy:4.1.93.Final=classpath
|
||||||
io.netty:netty-handler:4.1.72.Final=classpath
|
io.netty:netty-handler:4.1.93.Final=classpath
|
||||||
io.netty:netty-resolver:4.1.72.Final=classpath
|
io.netty:netty-resolver:4.1.93.Final=classpath
|
||||||
io.netty:netty-tcnative-classes:2.0.46.Final=classpath
|
io.netty:netty-transport-native-unix-common:4.1.93.Final=classpath
|
||||||
io.netty:netty-transport:4.1.72.Final=classpath
|
io.netty:netty-transport:4.1.93.Final=classpath
|
||||||
io.perfmark:perfmark-api:0.23.0=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.activation:jakarta.activation-api:1.2.1=classpath
|
||||||
jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=classpath
|
jakarta.xml.bind:jakarta.xml.bind-api:2.3.2=classpath
|
||||||
javax.annotation:javax.annotation-api:1.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.jopt-simple:jopt-simple:4.9=classpath
|
||||||
net.sf.kxml:kxml2:2.3.0=classpath
|
net.sf.kxml:kxml2:2.3.0=classpath
|
||||||
org.apache.commons:commons-compress:1.21=classpath
|
org.apache.commons:commons-compress:1.21=classpath
|
||||||
org.apache.httpcomponents:httpclient:4.5.13=classpath
|
org.apache.httpcomponents:httpclient:4.5.14=classpath
|
||||||
org.apache.httpcomponents:httpcore:4.4.15=classpath
|
org.apache.httpcomponents:httpcore:4.4.16=classpath
|
||||||
org.apache.httpcomponents:httpmime:4.5.6=classpath
|
org.apache.httpcomponents:httpmime:4.5.6=classpath
|
||||||
org.bitbucket.b_c:jose4j:0.7.0=classpath
|
org.bitbucket.b_c:jose4j:0.7.0=classpath
|
||||||
org.bouncycastle:bcpkix-jdk15on:1.67=classpath
|
org.bouncycastle:bcpkix-jdk15on:1.67=classpath
|
||||||
org.bouncycastle:bcprov-jdk15on:1.67=classpath
|
org.bouncycastle:bcprov-jdk15on:1.67=classpath
|
||||||
org.checkerframework:checker-qual:3.12.0=classpath
|
org.checkerframework:checker-qual:3.33.0=classpath
|
||||||
org.codehaus.mojo:animal-sniffer-annotations:1.19=classpath
|
org.codehaus.mojo:animal-sniffer-annotations:1.23=classpath
|
||||||
org.glassfish.jaxb:jaxb-runtime:2.3.2=classpath
|
org.glassfish.jaxb:jaxb-runtime:2.3.2=classpath
|
||||||
org.glassfish.jaxb:txw2:2.3.2=classpath
|
org.glassfish.jaxb:txw2:2.3.2=classpath
|
||||||
org.jdom:jdom2:2.0.6=classpath
|
org.jdom:jdom2:2.0.6=classpath
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=classpath
|
||||||
org.jetbrains.kotlin:kotlin-android-extensions:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-android-extensions:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-client:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-daemon-client:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-annotations:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-api:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-idea-proto:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-idea:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin-model:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-gradle-plugins-bom:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-klib-commonizer-api:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-native-utils:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-native-utils:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-project-model:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-project-model:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-reflect:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-common:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-scripting-common:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-scripting-jvm:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20=classpath
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.9.0=classpath
|
org.jetbrains.kotlin:kotlin-stdlib:1.9.22=classpath
|
||||||
org.jetbrains.kotlin:kotlin-tooling-core:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-tooling-core:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-util-io:1.9.10=classpath
|
org.jetbrains.kotlin:kotlin-util-io:1.9.23=classpath
|
||||||
org.jetbrains.kotlin:kotlin-util-klib:1.9.10=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.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:kotlinx-coroutines-core-jvm:1.5.0=classpath
|
||||||
org.jetbrains.kotlinx:kover-gradle-plugin:0.7.3=classpath
|
org.jetbrains.kotlinx:kover-gradle-plugin:0.7.3=classpath
|
||||||
org.jetbrains:annotations:13.0=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.jvnet.staxex:stax-ex:1.8.1=classpath
|
||||||
org.ow2.asm:asm-analysis:9.2=classpath
|
org.ow2.asm:asm-analysis:9.6=classpath
|
||||||
org.ow2.asm:asm-commons:9.2=classpath
|
org.ow2.asm:asm-commons:9.6=classpath
|
||||||
org.ow2.asm:asm-tree:9.2=classpath
|
org.ow2.asm:asm-tree:9.6=classpath
|
||||||
org.ow2.asm:asm-util:9.2=classpath
|
org.ow2.asm:asm-util:9.6=classpath
|
||||||
org.ow2.asm:asm:9.2=classpath
|
org.ow2.asm:asm:9.6=classpath
|
||||||
org.slf4j:slf4j-api:1.7.30=classpath
|
org.slf4j:slf4j-api:1.7.30=classpath
|
||||||
org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2=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-1:0.16.2=classpath
|
||||||
wtf.emulator:gradle-compat-6-6:0.12.2=classpath
|
wtf.emulator:gradle-compat-6-6:0.16.2=classpath
|
||||||
wtf.emulator:gradle-compat-7-6:0.12.2=classpath
|
wtf.emulator:gradle-compat-7-6:0.16.2=classpath
|
||||||
wtf.emulator:gradle-compat-api:0.12.2=classpath
|
wtf.emulator:gradle-compat-api:0.16.2=classpath
|
||||||
wtf.emulator:gradle-compat:0.12.2=classpath
|
wtf.emulator:gradle-compat:0.16.2=classpath
|
||||||
wtf.emulator:gradle-plugin:0.12.2=classpath
|
wtf.emulator:gradle-plugin:0.16.2=classpath
|
||||||
xerces:xercesImpl:2.12.0=classpath
|
|
||||||
xml-apis:xml-apis:1.4.01=classpath
|
|
||||||
xmlpull:xmlpull:1.1.3.1=classpath
|
|
||||||
empty=
|
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:coverage-report:1.0.21=koverJvmReporter
|
||||||
org.jetbrains.intellij.deps:intellij-coverage-agent:1.0.724=koverJvmAgent,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:intellij-coverage-reporter:1.0.724=koverJvmReporter
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=kotlinBuildToolsApiClasspath
|
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.10=kotlinBuildToolsApiClasspath
|
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.23=kotlinBuildToolsApiClasspath
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.23=kotlinBuildToolsApiClasspath
|
||||||
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-klib-commonizer-embeddable:1.9.10=kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-runner:1.9.23=kotlinBuildToolsApiClasspath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
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.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.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.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.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.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.10=allSourceSetsRuntimeDependenciesMetadata
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain,metadataCommonMainCompileClasspath
|
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.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath
|
||||||
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
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
|
org.jetbrains.kotlin:kotlin-stdlib:1.8.20=metadataCommonMainCompileClasspath
|
||||||
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:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
|
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-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.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
|
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=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-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
|
||||||
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.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.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:kotlinx-collections-immutable-jvm:0.3.5=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
org.jetbrains.kotlinx:atomicfu:0.23.1=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
|
||||||
org.jetbrains.kotlinx:kotlinx-collections-immutable: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-collections-immutable-jvm:0.3.7=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.1=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5=allSourceSetsRuntimeDependenciesMetadata,metadataCommonMainCompileClasspath
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.1=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
|
||||||
|
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
||||||
|
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=kotlinBuildToolsApiClasspath
|
||||||
|
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=allSourceSetsRuntimeDependenciesMetadata
|
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-test-jvm:1.7.1=jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmCompileClasspath,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmRuntimeClasspath,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath,metadataCompileClasspath
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.1=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileClasspath,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,jvmTestRuntimeClasspath
|
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.8.0=jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
||||||
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.4.0=jvmCompileClasspath,jvmRuntimeClasspath,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: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-datetime-jvm:0.5.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
||||||
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.kotlinx:kotlinx-datetime:0.4.0=allSourceSetsRuntimeDependenciesMetadata,metadataCommonMainCompileClasspath
|
||||||
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-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:16.0.2=koverJvmReporter
|
||||||
org.jetbrains:annotations:23.0.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
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
|
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.
|
* Provides a remote config implementation.
|
||||||
*/
|
*/
|
||||||
interface ConfigurationProvider {
|
interface ConfigurationProvider {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The configuration if it has been loaded already. If not loaded, returns an empty configuration.
|
* @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)
|
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 configurations.firstWithKey(key)?.let {
|
||||||
return it.getBoolean(key, defaultValue)
|
return it.getBoolean(key, defaultValue)
|
||||||
} ?: 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 configurations.firstWithKey(key)?.let {
|
||||||
return it.getInt(key, defaultValue)
|
return it.getInt(key, defaultValue)
|
||||||
} ?: defaultValue
|
} ?: defaultValue
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getString(key: ConfigKey, defaultValue: String): String {
|
override fun getString(
|
||||||
|
key: ConfigKey,
|
||||||
|
defaultValue: String
|
||||||
|
): String {
|
||||||
return configurations.firstWithKey(key)?.let {
|
return configurations.firstWithKey(key)?.let {
|
||||||
return it.getString(key, defaultValue)
|
return it.getString(key, defaultValue)
|
||||||
} ?: defaultValue
|
} ?: defaultValue
|
||||||
|
|
|
@ -6,7 +6,7 @@ data class BooleanConfigurationEntry(
|
||||||
override val key: ConfigKey,
|
override val key: ConfigKey,
|
||||||
private val defaultValue: Boolean
|
private val defaultValue: Boolean
|
||||||
) : DefaultEntry<Boolean> {
|
) : DefaultEntry<Boolean> {
|
||||||
|
// TODO [#1373]: Catch and log Configuration Key Coercion Failures
|
||||||
override fun getValue(configuration: Configuration) =
|
// TODO [#1373]: https://github.com/Electric-Coin-Company/zashi-android/issues/1373
|
||||||
configuration.getBoolean(key, defaultValue)
|
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
|
* variation in default value. Clients define the key and default value together, rather than just
|
||||||
* the key.
|
* 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> {
|
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
|
val key: ConfigKey
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ data class IntegerConfigurationEntry(
|
||||||
override val key: ConfigKey,
|
override val key: ConfigKey,
|
||||||
private val defaultValue: Int
|
private val defaultValue: Int
|
||||||
) : DefaultEntry<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)
|
override fun getValue(configuration: Configuration) = configuration.getInt(key, defaultValue)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,5 @@ data class StringConfigurationEntry(
|
||||||
override val key: ConfigKey,
|
override val key: ConfigKey,
|
||||||
private val defaultValue: String
|
private val defaultValue: String
|
||||||
) : DefaultEntry<String> {
|
) : DefaultEntry<String> {
|
||||||
|
|
||||||
override fun getValue(configuration: Configuration) = configuration.getString(key, defaultValue)
|
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.
|
* be returned if type coercion fails.
|
||||||
* @return boolean mapping for `key` or `defaultValue`.
|
* @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.
|
* @param key Key to use to retrieve the value.
|
||||||
|
@ -35,7 +38,10 @@ interface Configuration {
|
||||||
* be returned if type coercion fails.
|
* be returned if type coercion fails.
|
||||||
* @return int mapping for `key` or `defaultValue`.
|
* @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.
|
* @param key Key to use to retrieve the value.
|
||||||
|
@ -44,5 +50,8 @@ interface Configuration {
|
||||||
* be returned if type coercion fails.
|
* be returned if type coercion fails.
|
||||||
* @return String mapping for `key` or `defaultValue`.
|
* @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
|
package co.electriccoin.zcash.configuration.model.map
|
||||||
|
|
||||||
import co.electriccoin.zcash.configuration.model.entry.ConfigKey
|
import co.electriccoin.zcash.configuration.model.entry.ConfigKey
|
||||||
|
import co.electriccoin.zcash.configuration.model.exception.ConfigurationParseException
|
||||||
import kotlinx.collections.immutable.PersistentMap
|
import kotlinx.collections.immutable.PersistentMap
|
||||||
import kotlinx.datetime.Instant
|
import kotlinx.datetime.Instant
|
||||||
|
|
||||||
|
@ -10,30 +11,42 @@ data class StringConfiguration(
|
||||||
val configurationMapping: PersistentMap<String, String>,
|
val configurationMapping: PersistentMap<String, String>,
|
||||||
override val updatedAt: Instant?
|
override val updatedAt: Instant?
|
||||||
) : Configuration {
|
) : Configuration {
|
||||||
|
@Throws(ConfigurationParseException::class)
|
||||||
override fun getBoolean(
|
override fun getBoolean(
|
||||||
key: ConfigKey,
|
key: ConfigKey,
|
||||||
defaultValue: Boolean
|
defaultValue: Boolean
|
||||||
) = configurationMapping[key.key]?.let {
|
) = configurationMapping[key.key]?.let {
|
||||||
try {
|
try {
|
||||||
it.toBooleanStrict()
|
it.toBooleanStrict()
|
||||||
} catch (@Suppress("SwallowedException") e: IllegalArgumentException) {
|
} catch (e: IllegalArgumentException) {
|
||||||
// In the future, log coercion failure as this could mean someone made an error in the remote config console
|
throw ConfigurationParseException(
|
||||||
defaultValue
|
"Failed while parsing String value to Boolean. This could mean " +
|
||||||
|
"someone made an error in the remote config console",
|
||||||
|
e
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} ?: defaultValue
|
} ?: 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 {
|
try {
|
||||||
it.toInt()
|
it.toInt()
|
||||||
} catch (@Suppress("SwallowedException") e: NumberFormatException) {
|
} catch (e: IllegalArgumentException) {
|
||||||
// In the future, log coercion failure as this could mean someone made an error in the remote config console
|
throw ConfigurationParseException(
|
||||||
defaultValue
|
"Failed while parsing String value to Int. This could mean " +
|
||||||
|
"someone made an error in the remote config console",
|
||||||
|
e
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} ?: defaultValue
|
} ?: defaultValue
|
||||||
|
|
||||||
override fun getString(key: ConfigKey, defaultValue: String) =
|
override fun getString(
|
||||||
configurationMapping.getOrElse(key.key) { defaultValue }
|
key: ConfigKey,
|
||||||
|
defaultValue: String
|
||||||
|
) = configurationMapping.getOrElse(key.key) { defaultValue }
|
||||||
|
|
||||||
override fun hasKey(key: ConfigKey) = configurationMapping.containsKey(key.key)
|
override fun hasKey(key: ConfigKey) = configurationMapping.containsKey(key.key)
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,72 +18,98 @@ import kotlin.test.assertTrue
|
||||||
class MergingConfigurationProviderTest {
|
class MergingConfigurationProviderTest {
|
||||||
@Test
|
@Test
|
||||||
fun peek_ordering() {
|
fun peek_ordering() {
|
||||||
val configurationProvider = MergingConfigurationProvider(
|
val configurationProvider =
|
||||||
persistentListOf(
|
MergingConfigurationProvider(
|
||||||
MockConfigurationProvider(
|
persistentListOf(
|
||||||
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()), null)
|
MockConfigurationProvider(
|
||||||
),
|
StringConfiguration(
|
||||||
MockConfigurationProvider(
|
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()),
|
||||||
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()), null)
|
null
|
||||||
|
)
|
||||||
|
),
|
||||||
|
MockConfigurationProvider(
|
||||||
|
StringConfiguration(
|
||||||
|
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()),
|
||||||
|
null
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
assertTrue(BooleanDefaultEntryFixture.newTrueEntry().getValue(configurationProvider.peekConfiguration()))
|
assertTrue(BooleanDefaultEntryFixture.newTrueEntry().getValue(configurationProvider.peekConfiguration()))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getFlow_ordering() = runTest {
|
fun getFlow_ordering() =
|
||||||
val configurationProvider = MergingConfigurationProvider(
|
runTest {
|
||||||
persistentListOf(
|
val configurationProvider =
|
||||||
MockConfigurationProvider(
|
MergingConfigurationProvider(
|
||||||
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()), null)
|
persistentListOf(
|
||||||
),
|
MockConfigurationProvider(
|
||||||
MockConfigurationProvider(
|
StringConfiguration(
|
||||||
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()), null)
|
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()),
|
||||||
|
null
|
||||||
|
)
|
||||||
|
),
|
||||||
|
MockConfigurationProvider(
|
||||||
|
StringConfiguration(
|
||||||
|
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()),
|
||||||
|
null
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
assertTrue(
|
assertTrue(
|
||||||
BooleanDefaultEntryFixture.newTrueEntry().getValue(configurationProvider.getConfigurationFlow().first())
|
BooleanDefaultEntryFixture.newTrueEntry().getValue(configurationProvider.getConfigurationFlow().first())
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getFlow_empty() = runTest {
|
fun getFlow_empty() =
|
||||||
val configurationProvider = MergingConfigurationProvider(
|
runTest {
|
||||||
emptyList<ConfigurationProvider>().toPersistentList()
|
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
|
@Test
|
||||||
fun getUpdatedAt_newest() = runTest {
|
fun getUpdatedAt_newest() =
|
||||||
val older = "2023-01-15T08:38:45.415Z".toInstant()
|
runTest {
|
||||||
val newer = "2023-01-17T08:38:45.415Z".toInstant()
|
val older = "2023-01-15T08:38:45.415Z".toInstant()
|
||||||
|
val newer = "2023-01-17T08:38:45.415Z".toInstant()
|
||||||
|
|
||||||
val configurationProvider = MergingConfigurationProvider(
|
val configurationProvider =
|
||||||
persistentListOf(
|
MergingConfigurationProvider(
|
||||||
MockConfigurationProvider(
|
persistentListOf(
|
||||||
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()), older)
|
MockConfigurationProvider(
|
||||||
),
|
StringConfiguration(
|
||||||
MockConfigurationProvider(
|
persistentMapOf(BooleanDefaultEntryFixture.KEY.key to true.toString()),
|
||||||
StringConfiguration(persistentMapOf(BooleanDefaultEntryFixture.KEY.key to false.toString()), newer)
|
older
|
||||||
|
)
|
||||||
|
),
|
||||||
|
MockConfigurationProvider(
|
||||||
|
StringConfiguration(
|
||||||
|
persistentMapOf(
|
||||||
|
BooleanDefaultEntryFixture.KEY.key to false.toString()
|
||||||
|
),
|
||||||
|
newer
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
val updatedAt = configurationProvider.getConfigurationFlow().first().updatedAt
|
val updatedAt = configurationProvider.getConfigurationFlow().first().updatedAt
|
||||||
assertEquals(newer, updatedAt)
|
assertEquals(newer, updatedAt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MockConfigurationProvider(private val configuration: Configuration) : ConfigurationProvider {
|
private class MockConfigurationProvider(private val configuration: Configuration) : ConfigurationProvider {
|
||||||
|
|
||||||
override fun peekConfiguration(): Configuration {
|
override fun peekConfiguration(): Configuration {
|
||||||
return configuration
|
return configuration
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package co.electriccoin.zcash.configuration.test
|
package co.electriccoin.zcash.configuration.test
|
||||||
|
|
||||||
import co.electriccoin.zcash.configuration.model.entry.ConfigKey
|
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 co.electriccoin.zcash.configuration.model.map.Configuration
|
||||||
import kotlinx.datetime.Instant
|
import kotlinx.datetime.Instant
|
||||||
|
|
||||||
|
@ -11,32 +12,44 @@ import kotlinx.datetime.Instant
|
||||||
* though, making the initial mapping thread-safe.
|
* though, making the initial mapping thread-safe.
|
||||||
*/
|
*/
|
||||||
class MockConfiguration(private val configurationMapping: Map<String, String> = emptyMap()) : Configuration {
|
class MockConfiguration(private val configurationMapping: Map<String, String> = emptyMap()) : Configuration {
|
||||||
|
|
||||||
override val updatedAt: Instant? = null
|
override val updatedAt: Instant? = null
|
||||||
|
|
||||||
|
@Throws(ConfigurationParseException::class)
|
||||||
override fun getBoolean(
|
override fun getBoolean(
|
||||||
key: ConfigKey,
|
key: ConfigKey,
|
||||||
defaultValue: Boolean
|
defaultValue: Boolean
|
||||||
) = configurationMapping[key.key]?.let {
|
) = configurationMapping[key.key]?.let {
|
||||||
try {
|
try {
|
||||||
it.toBooleanStrict()
|
it.toBooleanStrict()
|
||||||
} catch (@Suppress("SwallowedException") e: IllegalArgumentException) {
|
} catch (e: IllegalArgumentException) {
|
||||||
// In the future, log coercion failure as this could mean someone made an error in the remote config console
|
throw ConfigurationParseException(
|
||||||
defaultValue
|
"Failed while parsing String value to Boolean. This could mean " +
|
||||||
|
"someone made an error in the remote config console",
|
||||||
|
e
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} ?: defaultValue
|
} ?: 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 {
|
try {
|
||||||
it.toInt()
|
it.toInt()
|
||||||
} catch (@Suppress("SwallowedException") e: NumberFormatException) {
|
} catch (e: IllegalArgumentException) {
|
||||||
// In the future, log coercion failure as this could mean someone made an error in the remote config console
|
throw ConfigurationParseException(
|
||||||
defaultValue
|
"Failed while parsing String value to Int. This could mean " +
|
||||||
|
"someone made an error in the remote config console",
|
||||||
|
e
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} ?: defaultValue
|
} ?: defaultValue
|
||||||
|
|
||||||
override fun getString(key: ConfigKey, defaultValue: String) =
|
override fun getString(
|
||||||
configurationMapping.getOrElse(key.key) { defaultValue }
|
key: ConfigKey,
|
||||||
|
defaultValue: String
|
||||||
|
) = configurationMapping.getOrElse(key.key) { defaultValue }
|
||||||
|
|
||||||
override fun hasKey(key: ConfigKey) = configurationMapping.containsKey(key.key)
|
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
|
import co.electriccoin.zcash.configuration.model.entry.ConfigKey
|
||||||
|
|
||||||
object BooleanDefaultEntryFixture {
|
object BooleanDefaultEntryFixture {
|
||||||
|
|
||||||
val KEY = ConfigKey("some_boolean_key") // $NON-NLS
|
val KEY = ConfigKey("some_boolean_key") // $NON-NLS
|
||||||
|
|
||||||
fun newTrueEntry() = BooleanConfigurationEntry(KEY, true)
|
fun newTrueEntry() = BooleanConfigurationEntry(KEY, true)
|
||||||
|
|
|
@ -6,5 +6,9 @@ import co.electriccoin.zcash.configuration.model.entry.IntegerConfigurationEntry
|
||||||
object IntegerDefaultEntryFixture {
|
object IntegerDefaultEntryFixture {
|
||||||
val KEY = ConfigKey("some_string_key") // $NON-NLS
|
val KEY = ConfigKey("some_string_key") // $NON-NLS
|
||||||
const val DEFAULT_VALUE = 123
|
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 {
|
object StringDefaultEntryFixture {
|
||||||
val KEY = ConfigKey("some_string_key") // $NON-NLS
|
val KEY = ConfigKey("some_string_key") // $NON-NLS
|
||||||
const val DEFAULT_VALUE = "some_default_value" // $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
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
|
|
||||||
object AndroidConfigurationFactory {
|
object AndroidConfigurationFactory {
|
||||||
|
private val instance =
|
||||||
private val instance = LazyWithArgument<Context, ConfigurationProvider> { context ->
|
LazyWithArgument<Context, ConfigurationProvider> { context ->
|
||||||
new(context)
|
new(context)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getInstance(context: Context): ConfigurationProvider = instance.getInstance(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
|
// Context will be needed for most cloud providers, e.g. to integrate with Firebase or other
|
||||||
// remote configuration providers.
|
// remote configuration providers.
|
||||||
private fun new(@Suppress("UNUSED_PARAMETER") context: Context): ConfigurationProvider {
|
private fun new(
|
||||||
val configurationProviders = buildList<ConfigurationProvider> {
|
@Suppress("UNUSED_PARAMETER") context: Context
|
||||||
// For ordering, ensure the IntentConfigurationProvider is first so that it can
|
): ConfigurationProvider {
|
||||||
// override any other configuration providers.
|
val configurationProviders =
|
||||||
if (BuildConfig.DEBUG) {
|
buildList<ConfigurationProvider> {
|
||||||
add(IntentConfigurationProvider)
|
// 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())
|
return MergingConfigurationProvider(configurationProviders.toPersistentList())
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
|
||||||
internal object IntentConfigurationProvider : ConfigurationProvider {
|
internal object IntentConfigurationProvider : ConfigurationProvider {
|
||||||
|
|
||||||
private val configurationStateFlow = MutableStateFlow(StringConfiguration(persistentMapOf(), null))
|
private val configurationStateFlow = MutableStateFlow(StringConfiguration(persistentMapOf(), null))
|
||||||
|
|
||||||
override fun peekConfiguration() = configurationStateFlow.value
|
override fun peekConfiguration() = configurationStateFlow.value
|
||||||
|
|
|
@ -8,18 +8,22 @@ import kotlinx.collections.immutable.toPersistentMap
|
||||||
import kotlinx.datetime.Clock
|
import kotlinx.datetime.Clock
|
||||||
|
|
||||||
class IntentConfigurationReceiver : BroadcastReceiver() {
|
class IntentConfigurationReceiver : BroadcastReceiver() {
|
||||||
override fun onReceive(context: Context?, intent: Intent?) {
|
override fun onReceive(
|
||||||
|
context: Context?,
|
||||||
|
intent: Intent?
|
||||||
|
) {
|
||||||
intent?.defuse()?.let {
|
intent?.defuse()?.let {
|
||||||
val key = it.getStringExtra(ConfigurationIntent.EXTRA_STRING_KEY)
|
val key = it.getStringExtra(ConfigurationIntent.EXTRA_STRING_KEY)
|
||||||
val value = it.getStringExtra(ConfigurationIntent.EXTRA_STRING_VALUE)
|
val value = it.getStringExtra(ConfigurationIntent.EXTRA_STRING_VALUE)
|
||||||
|
|
||||||
if (null != key) {
|
if (null != key) {
|
||||||
val existingConfiguration = IntentConfigurationProvider.peekConfiguration().configurationMapping
|
val existingConfiguration = IntentConfigurationProvider.peekConfiguration().configurationMapping
|
||||||
val newConfiguration = if (null == value) {
|
val newConfiguration =
|
||||||
existingConfiguration.remove(key)
|
if (null == value) {
|
||||||
} else {
|
existingConfiguration.remove(key)
|
||||||
existingConfiguration + (key to value)
|
} else {
|
||||||
}
|
existingConfiguration + (key to value)
|
||||||
|
}
|
||||||
|
|
||||||
IntentConfigurationProvider.setConfiguration(
|
IntentConfigurationProvider.setConfiguration(
|
||||||
StringConfiguration(newConfiguration.toPersistentMap(), Clock.System.now())
|
StringConfiguration(newConfiguration.toPersistentMap(), Clock.System.now())
|
||||||
|
@ -34,7 +38,9 @@ private fun Intent.defuse(): Intent? {
|
||||||
return try {
|
return try {
|
||||||
extras?.containsKey(null)
|
extras?.containsKey(null)
|
||||||
this
|
this
|
||||||
} catch (@Suppress("SwallowedException", "TooGenericExceptionCaught") e: Exception) {
|
} catch (
|
||||||
|
@Suppress("SwallowedException", "TooGenericExceptionCaught") e: Exception
|
||||||
|
) {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import java.util.concurrent.CountDownLatch
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
|
|
||||||
class AndroidUncaughtExceptionHandlerTest {
|
class AndroidUncaughtExceptionHandlerTest {
|
||||||
|
|
||||||
@Test(expected = IllegalStateException::class)
|
@Test(expected = IllegalStateException::class)
|
||||||
fun requires_main_thread() {
|
fun requires_main_thread() {
|
||||||
AndroidUncaughtExceptionHandler.register(ApplicationProvider.getApplicationContext())
|
AndroidUncaughtExceptionHandler.register(ApplicationProvider.getApplicationContext())
|
||||||
|
|
|
@ -12,7 +12,6 @@ import org.junit.Assert.assertTrue
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class Components {
|
class Components {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@SmallTest
|
@SmallTest
|
||||||
fun process_names() {
|
fun process_names() {
|
||||||
|
@ -26,16 +25,18 @@ class Components {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun PackageManager.getProviderInfoCompat(componentName: ComponentName) = if (AndroidApiVersion.isAtLeastT) {
|
private fun PackageManager.getProviderInfoCompat(componentName: ComponentName) =
|
||||||
getProviderInfo(componentName, PackageManager.ComponentInfoFlags.of(0))
|
if (AndroidApiVersion.isAtLeastT) {
|
||||||
} else {
|
getProviderInfo(componentName, PackageManager.ComponentInfoFlags.of(0))
|
||||||
@Suppress("Deprecation")
|
} else {
|
||||||
getProviderInfo(componentName, 0)
|
@Suppress("Deprecation")
|
||||||
}
|
getProviderInfo(componentName, 0)
|
||||||
|
}
|
||||||
|
|
||||||
private fun PackageManager.getReceiverInfoCompat(componentName: ComponentName) = if (AndroidApiVersion.isAtLeastT) {
|
private fun PackageManager.getReceiverInfoCompat(componentName: ComponentName) =
|
||||||
getReceiverInfo(componentName, PackageManager.ComponentInfoFlags.of(0))
|
if (AndroidApiVersion.isAtLeastT) {
|
||||||
} else {
|
getReceiverInfo(componentName, PackageManager.ComponentInfoFlags.of(0))
|
||||||
@Suppress("Deprecation")
|
} else {
|
||||||
getReceiverInfo(componentName, 0)
|
@Suppress("Deprecation")
|
||||||
}
|
getReceiverInfo(componentName, 0)
|
||||||
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import org.junit.Assert.assertEquals
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class ReportableExceptionTest {
|
class ReportableExceptionTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun bundle() {
|
fun bundle() {
|
||||||
val reportableException = ReportableExceptionFixture.new()
|
val reportableException = ReportableExceptionFixture.new()
|
||||||
|
|
|
@ -9,8 +9,9 @@ import java.io.File
|
||||||
|
|
||||||
@Suppress("ReturnCount")
|
@Suppress("ReturnCount")
|
||||||
suspend fun ExceptionPath.getExceptionDirectory(context: Context): File? {
|
suspend fun ExceptionPath.getExceptionDirectory(context: Context): File? {
|
||||||
val exceptionDirectory = context.getExternalFilesDirSuspend(null)
|
val exceptionDirectory =
|
||||||
?.let { File(File(it, ExceptionPath.LOG_DIRECTORY_NAME), ExceptionPath.EXCEPTION_DIRECTORY_NAME) }
|
context.getExternalFilesDirSuspend(null)
|
||||||
|
?.let { File(File(it, ExceptionPath.LOG_DIRECTORY_NAME), ExceptionPath.EXCEPTION_DIRECTORY_NAME) }
|
||||||
|
|
||||||
if (null == exceptionDirectory) {
|
if (null == exceptionDirectory) {
|
||||||
Twig.info { "Unable to get external storage directory; external storage may not be available" }
|
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
|
return exceptionDirectory
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun ExceptionPath.getExceptionPath(context: Context, exception: ReportableException): File? {
|
suspend fun ExceptionPath.getExceptionPath(
|
||||||
val exceptionDirectory = getExceptionDirectory(context)
|
context: Context,
|
||||||
?: return null
|
exception: ReportableException
|
||||||
|
): File? {
|
||||||
|
val exceptionDirectory =
|
||||||
|
getExceptionDirectory(context)
|
||||||
|
?: return null
|
||||||
|
|
||||||
return File(exceptionDirectory, newExceptionFileName(exception))
|
return File(exceptionDirectory, newExceptionFileName(exception))
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@ import co.electriccoin.zcash.spackle.process.ProcessNameCompat
|
||||||
import java.util.Collections
|
import java.util.Collections
|
||||||
|
|
||||||
object GlobalCrashReporter {
|
object GlobalCrashReporter {
|
||||||
|
|
||||||
internal const val CRASH_PROCESS_NAME_SUFFIX = ":crash" // $NON-NLS
|
internal const val CRASH_PROCESS_NAME_SUFFIX = ":crash" // $NON-NLS
|
||||||
|
|
||||||
private val intrinsicLock = Any()
|
private val intrinsicLock = Any()
|
||||||
|
@ -33,17 +32,18 @@ object GlobalCrashReporter {
|
||||||
|
|
||||||
synchronized(intrinsicLock) {
|
synchronized(intrinsicLock) {
|
||||||
if (registeredCrashReporters == null) {
|
if (registeredCrashReporters == null) {
|
||||||
registeredCrashReporters = Collections.synchronizedList(
|
registeredCrashReporters =
|
||||||
// To prevent a race condition, register the LocalCrashReporter first.
|
Collections.synchronizedList(
|
||||||
// FirebaseCrashReporter does some asynchronous registration internally, while
|
// To prevent a race condition, register the LocalCrashReporter first.
|
||||||
// LocalCrashReporter uses AndroidUncaughtExceptionHandler which needs to read
|
// FirebaseCrashReporter does some asynchronous registration internally, while
|
||||||
// and write the default UncaughtExceptionHandler. The only way to ensure
|
// LocalCrashReporter uses AndroidUncaughtExceptionHandler which needs to read
|
||||||
// interleaving doesn't happen is to register the LocalCrashReporter first.
|
// and write the default UncaughtExceptionHandler. The only way to ensure
|
||||||
listOfNotNull(
|
// interleaving doesn't happen is to register the LocalCrashReporter first.
|
||||||
LocalCrashReporter.getInstance(context),
|
listOfNotNull(
|
||||||
FirebaseCrashReporter(context),
|
LocalCrashReporter.getInstance(context),
|
||||||
|
FirebaseCrashReporter(context),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ package co.electriccoin.zcash.crash.android.internal
|
||||||
import androidx.annotation.AnyThread
|
import androidx.annotation.AnyThread
|
||||||
|
|
||||||
interface CrashReporter {
|
interface CrashReporter {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Report a caught exception, e.g. within a try-catch.
|
* 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) {
|
private suspend fun getFirebaseAppContainer(context: Context): FirebaseAppContainer =
|
||||||
val firebaseApp = FirebaseApp.initializeApp(context)
|
withContext(Dispatchers.IO) {
|
||||||
FirebaseAppContainer(firebaseApp)
|
val firebaseApp = FirebaseApp.initializeApp(context)
|
||||||
}
|
FirebaseAppContainer(firebaseApp)
|
||||||
|
}
|
||||||
|
|
||||||
private class FirebaseAppContainer(val firebaseApp: FirebaseApp?)
|
private class FirebaseAppContainer(val firebaseApp: FirebaseApp?)
|
||||||
|
|
|
@ -25,13 +25,13 @@ import kotlinx.coroutines.async
|
||||||
internal class FirebaseCrashReporter(
|
internal class FirebaseCrashReporter(
|
||||||
context: Context
|
context: Context
|
||||||
) : CrashReporter {
|
) : CrashReporter {
|
||||||
|
|
||||||
@OptIn(kotlinx.coroutines.DelicateCoroutinesApi::class)
|
@OptIn(kotlinx.coroutines.DelicateCoroutinesApi::class)
|
||||||
private val analyticsScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
private val analyticsScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
||||||
|
|
||||||
private val initFirebaseJob: Deferred<CrashReporter?> = analyticsScope.async {
|
private val initFirebaseJob: Deferred<CrashReporter?> =
|
||||||
FirebaseCrashReporterImpl.getInstance(context)
|
analyticsScope.async {
|
||||||
}
|
FirebaseCrashReporterImpl.getInstance(context)
|
||||||
|
}
|
||||||
|
|
||||||
@AnyThread
|
@AnyThread
|
||||||
override fun reportCaughtException(exception: Throwable) {
|
override fun reportCaughtException(exception: Throwable) {
|
||||||
|
@ -67,10 +67,14 @@ private class FirebaseCrashReporterImpl(
|
||||||
private val firebaseCrashlytics: FirebaseCrashlytics,
|
private val firebaseCrashlytics: FirebaseCrashlytics,
|
||||||
private val firebaseInstallations: FirebaseInstallations
|
private val firebaseInstallations: FirebaseInstallations
|
||||||
) : CrashReporter {
|
) : CrashReporter {
|
||||||
|
|
||||||
@AnyThread
|
@AnyThread
|
||||||
override fun reportCaughtException(exception: Throwable) {
|
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() {
|
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
|
* early crashes may be missed. This is a tradeoff we are willing to make in order to avoid
|
||||||
* ANRs.
|
* ANRs.
|
||||||
*/
|
*/
|
||||||
private val lazyWithArgument = SuspendingLazy<Context, CrashReporter?> {
|
private val lazyWithArgument =
|
||||||
if (it.resources.getBoolean(R.bool.co_electriccoin_zcash_crash_is_firebase_enabled)) {
|
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
|
// Workaround for disk IO on main thread in Firebase initialization
|
||||||
val firebaseApp = FirebaseAppCache.getFirebaseApp(it)
|
val firebaseApp = FirebaseAppCache.getFirebaseApp(it)
|
||||||
if (firebaseApp == null) {
|
if (firebaseApp == null) {
|
||||||
Twig.warn { "Unable to initialize Crashlytics. FirebaseApp is null" }
|
Twig.warn { "Unable to initialize Crashlytics. FirebaseApp is null" }
|
||||||
return@SuspendingLazy 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? {
|
suspend fun getInstance(context: Context): CrashReporter? {
|
||||||
return lazyWithArgument.getInstance(context)
|
return lazyWithArgument.getInstance(context)
|
||||||
|
|
|
@ -8,9 +8,13 @@ import co.electriccoin.zcash.crash.android.getExceptionPath
|
||||||
import co.electriccoin.zcash.crash.write
|
import co.electriccoin.zcash.crash.write
|
||||||
|
|
||||||
internal object AndroidExceptionReporter {
|
internal object AndroidExceptionReporter {
|
||||||
internal suspend fun reportException(context: Context, reportableException: ReportableException) {
|
internal suspend fun reportException(
|
||||||
val exceptionPath = ExceptionPath.getExceptionPath(context, reportableException)
|
context: Context,
|
||||||
?: return
|
reportableException: ReportableException
|
||||||
|
) {
|
||||||
|
val exceptionPath =
|
||||||
|
ExceptionPath.getExceptionPath(context, reportableException)
|
||||||
|
?: return
|
||||||
|
|
||||||
reportableException.write(exceptionPath)
|
reportableException.write(exceptionPath)
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,9 @@ internal fun ReportableException.Companion.new(
|
||||||
isUncaught: Boolean,
|
isUncaught: Boolean,
|
||||||
clock: Clock = Clock.System
|
clock: Clock = Clock.System
|
||||||
): ReportableException {
|
): ReportableException {
|
||||||
val versionName = context.packageManager.getPackageInfoCompat(context.packageName, 0L).versionName
|
val versionName =
|
||||||
?: "null"
|
context.packageManager.getPackageInfoCompat(context.packageName, 0L).versionName
|
||||||
|
?: "null"
|
||||||
|
|
||||||
return ReportableException(
|
return ReportableException(
|
||||||
throwable.javaClass.name,
|
throwable.javaClass.name,
|
||||||
|
@ -25,15 +26,16 @@ internal fun ReportableException.Companion.new(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun ReportableException.toBundle() = Bundle().apply {
|
internal fun ReportableException.toBundle() =
|
||||||
// Although Exception is Serializable, some Kotlin Coroutines exception classes break this
|
Bundle().apply {
|
||||||
// API contract. Therefore we have to convert to a string here.
|
// Although Exception is Serializable, some Kotlin Coroutines exception classes break this
|
||||||
putSerializable(ReportableException.EXTRA_STRING_CLASS_NAME, exceptionClass)
|
// API contract. Therefore we have to convert to a string here.
|
||||||
putSerializable(ReportableException.EXTRA_STRING_TRACE, exceptionTrace)
|
putSerializable(ReportableException.EXTRA_STRING_CLASS_NAME, exceptionClass)
|
||||||
putString(ReportableException.EXTRA_STRING_APP_VERSION, appVersion)
|
putSerializable(ReportableException.EXTRA_STRING_TRACE, exceptionTrace)
|
||||||
putBoolean(ReportableException.EXTRA_BOOLEAN_IS_UNCAUGHT, isUncaught)
|
putString(ReportableException.EXTRA_STRING_APP_VERSION, appVersion)
|
||||||
putLong(ReportableException.EXTRA_LONG_WALLTIME_MILLIS, time.toEpochMilliseconds())
|
putBoolean(ReportableException.EXTRA_BOOLEAN_IS_UNCAUGHT, isUncaught)
|
||||||
}
|
putLong(ReportableException.EXTRA_LONG_WALLTIME_MILLIS, time.toEpochMilliseconds())
|
||||||
|
}
|
||||||
|
|
||||||
internal fun ReportableException.Companion.fromBundle(bundle: Bundle): ReportableException {
|
internal fun ReportableException.Companion.fromBundle(bundle: Bundle): ReportableException {
|
||||||
val className = bundle.getString(EXTRA_STRING_CLASS_NAME)!!
|
val className = bundle.getString(EXTRA_STRING_CLASS_NAME)!!
|
||||||
|
|
|
@ -12,14 +12,17 @@ internal class AndroidUncaughtExceptionHandler(
|
||||||
context: Context,
|
context: Context,
|
||||||
private val defaultUncaughtExceptionHandler: Thread.UncaughtExceptionHandler
|
private val defaultUncaughtExceptionHandler: Thread.UncaughtExceptionHandler
|
||||||
) : Thread.UncaughtExceptionHandler {
|
) : Thread.UncaughtExceptionHandler {
|
||||||
|
|
||||||
private val applicationContext = context.applicationContext
|
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 reportableException = ReportableException.new(applicationContext, e, true)
|
||||||
|
|
||||||
val isUseSecondaryProcess = applicationContext.resources
|
val isUseSecondaryProcess =
|
||||||
.getBoolean(R.bool.co_electriccoin_zcash_crash_is_use_secondary_process)
|
applicationContext.resources
|
||||||
|
.getBoolean(R.bool.co_electriccoin_zcash_crash_is_use_secondary_process)
|
||||||
|
|
||||||
if (isUseSecondaryProcess) {
|
if (isUseSecondaryProcess) {
|
||||||
applicationContext.sendBroadcast(ExceptionReceiver.newIntent(applicationContext, reportableException))
|
applicationContext.sendBroadcast(ExceptionReceiver.newIntent(applicationContext, reportableException))
|
||||||
|
@ -31,7 +34,6 @@ internal class AndroidUncaughtExceptionHandler(
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
private val isInitialized = AtomicBoolean(false)
|
private val isInitialized = AtomicBoolean(false)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,16 +8,18 @@ import kotlinx.coroutines.GlobalScope
|
||||||
|
|
||||||
@OptIn(kotlinx.coroutines.DelicateCoroutinesApi::class)
|
@OptIn(kotlinx.coroutines.DelicateCoroutinesApi::class)
|
||||||
class ExceptionReceiver : CoroutineBroadcastReceiver(GlobalScope) {
|
class ExceptionReceiver : CoroutineBroadcastReceiver(GlobalScope) {
|
||||||
|
override suspend fun onReceiveSuspend(
|
||||||
override suspend fun onReceiveSuspend(context: Context, intent: Intent) {
|
context: Context,
|
||||||
val reportableException = intent.extras?.let { ReportableException.fromBundle(it) }
|
intent: Intent
|
||||||
?: return
|
) {
|
||||||
|
val reportableException =
|
||||||
|
intent.extras?.let { ReportableException.fromBundle(it) }
|
||||||
|
?: return
|
||||||
|
|
||||||
AndroidExceptionReporter.reportException(context, reportableException)
|
AndroidExceptionReporter.reportException(context, reportableException)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Explicit intent to broadcast to log the exception.
|
* @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.
|
* Registers an exception handler to write exceptions to disk.
|
||||||
*/
|
*/
|
||||||
internal class LocalCrashReporter(private val applicationContext: Context) : CrashReporter {
|
internal class LocalCrashReporter(private val applicationContext: Context) : CrashReporter {
|
||||||
|
|
||||||
private val crashReportingScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
private val crashReportingScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
||||||
|
|
||||||
@AnyThread
|
@AnyThread
|
||||||
|
@ -36,10 +35,11 @@ internal class LocalCrashReporter(private val applicationContext: Context) : Cra
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val lazyWithArgument = LazyWithArgument<Context, CrashReporter> {
|
private val lazyWithArgument =
|
||||||
AndroidUncaughtExceptionHandler.register(it)
|
LazyWithArgument<Context, CrashReporter> {
|
||||||
LocalCrashReporter(it.applicationContext)
|
AndroidUncaughtExceptionHandler.register(it)
|
||||||
}
|
LocalCrashReporter(it.applicationContext)
|
||||||
|
}
|
||||||
|
|
||||||
fun getInstance(context: Context): CrashReporter {
|
fun getInstance(context: Context): CrashReporter {
|
||||||
return lazyWithArgument.getInstance(context)
|
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:coverage-report:1.0.21=koverJvmReporter
|
||||||
org.jetbrains.intellij.deps:intellij-coverage-agent:1.0.724=koverJvmAgent,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:intellij-coverage-reporter:1.0.724=koverJvmReporter
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=kotlinBuildToolsApiClasspath
|
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.10=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.6.20=kotlinCompilerClasspathCopy
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=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.6.20=kotlinKlibCommonizerClasspathCopy
|
||||||
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.10=kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.23=kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinCompilerClasspath,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.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.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.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.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.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.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.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.6.20=commonTestImplementationCopy
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10=allSourceSetsRuntimeDependenciesMetadata
|
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.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.6.0=commonTestImplementationCopy
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath
|
||||||
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.6.0=commonTestImplementationCopy
|
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.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.6.21=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath
|
||||||
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.6.20=commonTestImplementationCopy
|
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.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-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.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
|
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=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-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.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.20=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
|
||||||
org.jetbrains.kotlin:kotlin-test:1.6.21=commonTestImplementationCopy2
|
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.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.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.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.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.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.2=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=allSourceSetsRuntimeDependenciesMetadata
|
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.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.2=commonTestImplementationCopy2
|
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.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.2=commonTestImplementationCopy2
|
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.2=commonMainApiCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
|
||||||
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.3.3=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
|
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.2=commonMainApiCopy,jvmTestCompileClasspathCopy,jvmTestRuntimeClasspathCopy
|
||||||
org.jetbrains.kotlinx:kotlinx-datetime:0.3.3=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
|
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-datetime:0.4.0=allSourceSetsRuntimeDependenciesMetadata,metadataCommonMainCompileClasspath
|
||||||
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.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: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-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:16.0.2=koverJvmReporter
|
||||||
org.jetbrains:annotations:23.0.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
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
|
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 isUncaught: Boolean,
|
||||||
val time: Instant
|
val time: Instant
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object
|
companion object
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,10 @@ object ExceptionPath {
|
||||||
const val TYPE = "txt"
|
const val TYPE = "txt"
|
||||||
|
|
||||||
@Suppress("MaxLineLength")
|
@Suppress("MaxLineLength")
|
||||||
fun newExceptionFileName(exception: ReportableException, uuid: UUID = UUID.randomUUID()) =
|
fun newExceptionFileName(
|
||||||
"${exception.time.epochSeconds}$SEPARATOR$uuid$SEPARATOR${exception.exceptionClass}$SEPARATOR${exception.isUncaught}.$TYPE"
|
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
|
// The exceptions are really just for debugging
|
||||||
@Suppress("ThrowsCount")
|
@Suppress("ThrowsCount")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@file:Suppress("ktlint:filename")
|
@file:Suppress("ktlint:standard:filename")
|
||||||
|
|
||||||
package co.electriccoin.zcash.crash
|
package co.electriccoin.zcash.crash
|
||||||
|
|
||||||
|
@ -8,12 +8,13 @@ import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
suspend fun ReportableException.write(path: File) {
|
suspend fun ReportableException.write(path: File) {
|
||||||
val exceptionString = buildString {
|
val exceptionString =
|
||||||
appendLine("App version: $appVersion")
|
buildString {
|
||||||
appendLine("Is uncaught: $isUncaught")
|
appendLine("App version: $appVersion")
|
||||||
appendLine("Time: $time")
|
appendLine("Is uncaught: $isUncaught")
|
||||||
append(exceptionTrace)
|
appendLine("Time: $time")
|
||||||
}
|
append(exceptionTrace)
|
||||||
|
}
|
||||||
|
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
path.writeAtomically { tempFile ->
|
path.writeAtomically { tempFile ->
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@file:Suppress("ktlint:filename")
|
@file:Suppress("ktlint:standard:filename")
|
||||||
|
|
||||||
package co.electriccoin.zcash.crash
|
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.
|
* `spackle-android-lib` — Android-specific additions.
|
||||||
|
|
||||||
The following diagram shows a rough depiction of dependencies between the modules. Two notes on this diagram:
|
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
|
* Although effort goes into ensuring this diagram stays up-to-date, Gradle build files are the authoritative source on dependencies
|
||||||
|
|
||||||
```mermaid
|
```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.
|
All contributions _will_ be licensed under the MIT license.
|
||||||
|
|
||||||
## Getting Started
|
## 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.
|
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.
|
After signing is configured, it is possible to then configure deployment to Google Play.
|
||||||
|
|
||||||
## Automated Deployment
|
## Automated Deployment
|
||||||
Automated deployment to Google Play configured with the [Gradle Play Publisher plugin](https://github.com/Triple-T/gradle-play-publisher).
|
Automated deployment to Google Play is configured with custom
|
||||||
To perform a deployment:
|
[Google Play publishing Gradle task](../build-conventions-secant/src/main/kotlin/secant.publish-conventions.gradle.kts).
|
||||||
1. Configure a Google Cloud service API key with the correct permissions
|
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. 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_SERVICE_ACCOUNT_KEY` - Set the Google Play Service Account enabled in the Google Cloud console
|
||||||
1. `ZCASH_GOOGLE_PLAY_DEPLOY_MODE` - Set to `deploy`
|
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`
|
1. Run the Gradle task `./gradlew :app:publishBundle`
|
||||||
|
|
||||||
To generate a build with a correct version that can be deployed manually later:
|
For more information about proper automated deployment setup, see
|
||||||
1. Configure a Google Cloud service API key with the correct permissions
|
[Google Play publishing Gradle task](../build-conventions-secant/src/main/kotlin/secant.publish-conventions.gradle.kts)
|
||||||
1. Configure Gradle properties
|
documentation and related [gradle.properties](../gradle.properties) attributes.
|
||||||
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`
|
|
||||||
|
|
||||||
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.
|
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. 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. 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. 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. Compile from the command line
|
||||||
1. Navigate to the repo checkout in a terminal
|
1. Navigate to the repo checkout in a terminal
|
||||||
1. Compile the application with the gradle command `./gradlew assemble`
|
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/).
|
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
|
## 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.
|
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).
|
||||||
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.
|
|
|
@ -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
|
- TBD
|
||||||
<!-- TODO [#682]: Testing documentation update -->
|
<!-- 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
|
## 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
|
# 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. 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
|
# Testing screens with secure flag
|
||||||
1. install the app
|
1. install the app
|
||||||
1. go to screens with seed phrase:
|
1. go to screens with seed phrase:
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
org.gradle.caching=true
|
org.gradle.caching=true
|
||||||
org.gradle.configureondemand=false
|
org.gradle.configureondemand=false
|
||||||
# We use increased amount of heap size here to bypass the OOM exception while building the project with ./gradlew
|
# 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.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=2g
|
||||||
org.gradle.parallel=true
|
org.gradle.parallel=true
|
||||||
org.gradle.vfs.watch=true
|
org.gradle.vfs.watch=true
|
||||||
|
@ -14,6 +14,9 @@ android.nonTransitiveRClass=true
|
||||||
android.suppressUnsupportedCompileSdk=33
|
android.suppressUnsupportedCompileSdk=33
|
||||||
android.useAndroidX=true
|
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.
|
# Kotlin compiler warnings can be considered errors, failing the build.
|
||||||
ZCASH_IS_TREAT_WARNINGS_AS_ERRORS=true
|
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.
|
# 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
|
# generation of instrumentation coverage is flaky, particularly when running ui-lib:connectedCheck
|
||||||
# TODO: [#705] Instrumentation coverage generation fails when run locally
|
# 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
|
IS_ANDROID_INSTRUMENTATION_TEST_COVERAGE_ENABLED=false
|
||||||
|
|
||||||
# Optionally configure test orchestrator.
|
# Optionally configure test orchestrator.
|
||||||
|
@ -47,11 +50,19 @@ ZCASH_FIREBASE_TEST_LAB_PROJECT=
|
||||||
# Optionally disable minification
|
# Optionally disable minification
|
||||||
IS_MINIFY_ENABLED=true
|
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
|
# 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.
|
# If not using automated Google Play deployment, then these serve as the actual version numbers.
|
||||||
ZCASH_VERSION_CODE=1
|
ZCASH_VERSION_CODE=1
|
||||||
ZCASH_VERSION_NAME=0.2.0
|
ZCASH_VERSION_NAME=1.1.1
|
||||||
|
|
||||||
# Set these fields, as you need them (e.g. with values "Zcash X" and "co.electriccoin.zcash.x")
|
# 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
|
# 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.
|
# Recommended protection of screens with sensitive data.
|
||||||
# It is enabled by default to protect the developers from revealing their wallet secrets by mistake.
|
# It is enabled by default to protect the developers from revealing their wallet secrets by mistake.
|
||||||
IS_SECURE_SCREEN_PROTECTION_ACTIVE=true
|
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
|
# Forcibly turn on or off the UI dark mode support. If enabled, then the device's dark mode system setting value is
|
||||||
# applied.
|
# applied.
|
||||||
IS_DARK_MODE_ENABLED=false
|
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
|
# Set keystore details to enable build signing. Typically these
|
||||||
# are overridden via ~/.gradle/gradle.properties to allow secure injection.
|
# 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
|
# be useful, for example, for running benchmark tests against a release build of the app signed with
|
||||||
# the default debug key configuration.
|
# the default debug key configuration.
|
||||||
IS_SIGN_RELEASE_BUILD_WITH_DEBUG_KEY=false
|
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=
|
ZCASH_GOOGLE_PLAY_SERVICE_KEY_FILE_PATH=
|
||||||
# Can be one of {build, deploy}.
|
# Set the Google Play Service Account key to authorize on Google Play
|
||||||
# Build can be used to generate a version number for the next release, but does not ultimately create a release on Google Play.
|
ZCASH_GOOGLE_PLAY_SERVICE_ACCOUNT_KEY=
|
||||||
# Deploy commits the build on Google Play, creating a new release
|
# Set the Google Play Publisher API key to authorize the publisher on Google Play API
|
||||||
ZCASH_GOOGLE_PLAY_DEPLOY_MODE=build
|
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=
|
ZCASH_EMULATOR_WTF_API_KEY=
|
||||||
|
|
||||||
|
@ -110,61 +141,65 @@ ANDROID_COMPILE_SDK_VERSION=34
|
||||||
|
|
||||||
ANDROID_NDK_VERSION=23.0.7599858
|
ANDROID_NDK_VERSION=23.0.7599858
|
||||||
|
|
||||||
ANDROID_GRADLE_PLUGIN_VERSION=8.1.1
|
ANDROID_GRADLE_PLUGIN_VERSION=8.3.0
|
||||||
DETEKT_VERSION=1.23.0
|
DETEKT_VERSION=1.23.6
|
||||||
DETEKT_COMPOSE_RULES_VERSION=0.1.10
|
DETEKT_COMPOSE_RULES_VERSION=0.3.15
|
||||||
EMULATOR_WTF_GRADLE_PLUGIN_VERSION=0.12.2
|
EMULATOR_WTF_GRADLE_PLUGIN_VERSION=0.16.2
|
||||||
FIREBASE_CRASHLYTICS_BUILD_TOOLS_VERSION=2.9.4
|
FIREBASE_CRASHLYTICS_BUILD_TOOLS_VERSION=2.9.9
|
||||||
FLANK_VERSION=23.04.0
|
FLANK_VERSION=23.10.1
|
||||||
FULLADLE_VERSION=0.17.4
|
FULLADLE_VERSION=0.17.4
|
||||||
GOOGLE_PLAY_SERVICES_GRADLE_PLUGIN_VERSION=4.3.15
|
GOOGLE_PLAY_SERVICES_GRADLE_PLUGIN_VERSION=4.4.1
|
||||||
GRADLE_VERSIONS_PLUGIN_VERSION=0.47.0
|
GRADLE_VERSIONS_PLUGIN_VERSION=0.51.0
|
||||||
JGIT_VERSION=6.4.0.202211300538-r
|
JGIT_VERSION=6.4.0.202211300538-r
|
||||||
KTLINT_VERSION=0.49.0
|
KTLINT_VERSION=1.2.1
|
||||||
PLAY_PUBLISHER_PLUGIN_VERSION=3.8.4
|
|
||||||
|
|
||||||
ACCOMPANIST_PERMISSIONS_VERSION=0.32.0
|
ACCOMPANIST_PERMISSIONS_VERSION=0.34.0
|
||||||
ANDROIDX_ACTIVITY_VERSION=1.8.0
|
ANDROIDX_ACTIVITY_VERSION=1.8.2
|
||||||
ANDROIDX_ANNOTATION_VERSION=1.6.0
|
ANDROIDX_ANNOTATION_VERSION=1.7.1
|
||||||
ANDROIDX_APPCOMPAT_VERSION=1.6.1
|
ANDROIDX_APPCOMPAT_VERSION=1.6.1
|
||||||
ANDROIDX_CAMERA_VERSION=1.3.0-alpha06
|
ANDROIDX_BIOMETRIC_VERSION=1.2.0-alpha05
|
||||||
ANDROIDX_COMPOSE_COMPILER_VERSION=1.5.3
|
ANDROIDX_CAMERA_VERSION=1.3.2
|
||||||
ANDROIDX_COMPOSE_MATERIAL3_VERSION=1.1.0-rc01
|
ANDROIDX_COMPOSE_COMPILER_VERSION=1.5.11
|
||||||
ANDROIDX_COMPOSE_MATERIAL_ICONS_VERSION=1.5.0-beta02
|
ANDROIDX_COMPOSE_MATERIAL3_VERSION=1.2.1
|
||||||
ANDROIDX_COMPOSE_VERSION=1.4.3
|
ANDROIDX_COMPOSE_MATERIAL_ICONS_VERSION=1.6.5
|
||||||
|
ANDROIDX_COMPOSE_VERSION=1.6.6
|
||||||
ANDROIDX_CONSTRAINTLAYOUT_VERSION=1.0.1
|
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_ESPRESSO_VERSION=3.5.1
|
||||||
ANDROIDX_LIFECYCLE_VERSION=2.6.1
|
ANDROIDX_LIFECYCLE_VERSION=2.7.0
|
||||||
ANDROIDX_NAVIGATION_COMPOSE_VERSION=2.5.3
|
ANDROIDX_NAVIGATION_COMPOSE_VERSION=2.7.7
|
||||||
ANDROIDX_PROFILE_INSTALLER_VERSION=1.3.1
|
ANDROIDX_PROFILE_INSTALLER_VERSION=1.3.1
|
||||||
ANDROIDX_SECURITY_CRYPTO_VERSION=1.1.0-alpha06
|
ANDROIDX_SECURITY_CRYPTO_VERSION=1.1.0-alpha06
|
||||||
ANDROIDX_SPLASH_SCREEN_VERSION=1.0.1
|
ANDROIDX_SPLASH_SCREEN_VERSION=1.0.1
|
||||||
ANDROIDX_TEST_JUNIT_VERSION=1.1.5
|
ANDROIDX_TEST_JUNIT_VERSION=1.1.5
|
||||||
ANDROIDX_TEST_ORCHESTRATOR_VERSION=1.4.2
|
ANDROIDX_TEST_ORCHESTRATOR_VERSION=1.4.2
|
||||||
ANDROIDX_TEST_CORE_VERSION=1.5.0
|
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_TEST_RUNNER_VERSION=1.5.2
|
||||||
ANDROIDX_STARTUP_VERSION=1.1.1
|
ANDROIDX_STARTUP_VERSION=1.1.1
|
||||||
ANDROIDX_TEST_SERVICE_VERSION=1.4.2
|
ANDROIDX_TEST_SERVICE_VERSION=1.4.2
|
||||||
ANDROIDX_UI_AUTOMATOR_VERSION=2.2.0-alpha1
|
ANDROIDX_UI_AUTOMATOR_VERSION=2.3.0
|
||||||
ANDROIDX_WORK_MANAGER_VERSION=2.8.1
|
ANDROIDX_WORK_MANAGER_VERSION=2.9.0
|
||||||
CORE_LIBRARY_DESUGARING_VERSION=2.0.3
|
CORE_LIBRARY_DESUGARING_VERSION=2.0.4
|
||||||
FIREBASE_BOM_VERSION_MATCHER=32.0.0
|
FIREBASE_BOM_VERSION_MATCHER=32.8.1
|
||||||
JACOCO_VERSION=0.8.9
|
GOOGLE_AUTH_LIB_JAVA_VERSION=1.18.0
|
||||||
KOTLIN_VERSION=1.9.10
|
JACOCO_VERSION=0.8.12
|
||||||
KOTLINX_COROUTINES_VERSION=1.7.1
|
KOTLIN_VERSION=1.9.23
|
||||||
KOTLINX_DATETIME_VERSION=0.4.0
|
KOTLINX_COROUTINES_VERSION=1.8.0
|
||||||
KOTLINX_IMMUTABLE_COLLECTIONS_VERSION=0.3.5
|
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
|
KOVER_VERSION=0.7.3
|
||||||
PLAY_APP_UPDATE_VERSION=2.0.1
|
PLAY_APP_UPDATE_VERSION=2.1.0
|
||||||
PLAY_APP_UPDATE_KTX_VERSION=2.0.1
|
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_ANDROID_WALLET_PLUGINS_VERSION=1.0.0
|
||||||
ZCASH_BIP39_VERSION=1.0.6
|
ZXING_VERSION=3.5.3
|
||||||
ZXING_VERSION=3.5.1
|
|
||||||
|
|
||||||
# Ensure a non-snapshot version is used before releasing to production.
|
ZCASH_BIP39_VERSION=1.0.8
|
||||||
ZCASH_SDK_VERSION=2.0.2
|
|
||||||
|
# WARNING: Ensure a non-snapshot version is used before releasing to production
|
||||||
|
ZCASH_SDK_VERSION=2.1.2-SNAPSHOT
|
||||||
|
|
||||||
# Toolchain is the Java version used to build the application, which is separate from the
|
# Toolchain is the Java version used to build the application, which is separate from the
|
||||||
# Java version used to run the application.
|
# Java version used to run the application.
|
||||||
|
|
Binary file not shown.
|
@ -1,7 +1,7 @@
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=591855b517fc635b9e04de1d05d5e76ada3f89f5fc76f87978d1b245b4f69225
|
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|
|
@ -145,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
case $MAX_FD in #(
|
case $MAX_FD in #(
|
||||||
max*)
|
max*)
|
||||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
# 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 ) ||
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
warn "Could not query maximum file descriptor limit"
|
warn "Could not query maximum file descriptor limit"
|
||||||
esac
|
esac
|
||||||
|
@ -153,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
'' | soft) :;; #(
|
'' | soft) :;; #(
|
||||||
*)
|
*)
|
||||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
# 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" ||
|
ulimit -n "$MAX_FD" ||
|
||||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
esac
|
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.
|
# 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"'
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
# Collect all arguments for the java command;
|
# Collect all arguments for the java command:
|
||||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||||
# shell script including quotes and variable substitutions, so put them in
|
# and any embedded shellness will be escaped.
|
||||||
# double quotes to make sure that they get re-expanded; and
|
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||||
# * put everything else in single quotes, so that it's not re-expanded.
|
# treated as '${Hostname}' itself on the command line.
|
||||||
|
|
||||||
set -- \
|
set -- \
|
||||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
|
|
@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
if %ERRORLEVEL% equ 0 goto execute
|
if %ERRORLEVEL% equ 0 goto execute
|
||||||
|
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||||
echo location of your Java installation.
|
echo location of your Java installation. 1>&2
|
||||||
|
|
||||||
goto fail
|
goto fail
|
||||||
|
|
||||||
|
@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
if exist "%JAVA_EXE%" goto execute
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||||
echo location of your Java installation.
|
echo location of your Java installation. 1>&2
|
||||||
|
|
||||||
goto fail
|
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:coverage-report:1.0.21=koverJvmReporter
|
||||||
org.jetbrains.intellij.deps:intellij-coverage-agent:1.0.724=koverJvmAgent,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:intellij-coverage-reporter:1.0.724=koverJvmReporter
|
||||||
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-api:1.9.10=kotlinBuildToolsApiClasspath
|
org.jetbrains.kotlin:kotlin-build-common:1.9.23=kotlinBuildToolsApiClasspath
|
||||||
org.jetbrains.kotlin:kotlin-build-tools-impl:1.9.10=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.6.20=kotlinCompilerClasspathCopy
|
||||||
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.10=kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.23=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-daemon-embeddable:1.9.10=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.6.20=kotlinKlibCommonizerClasspathCopy
|
||||||
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.10=kotlinKlibCommonizerClasspath
|
org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.9.23=kotlinKlibCommonizerClasspath
|
||||||
org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinCompilerClasspath,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.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.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.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.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.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.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.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.10=allSourceSetsRuntimeDependenciesMetadata
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain,metadataCommonMainCompileClasspath
|
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.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.20=metadataCommonMainCompileClasspath
|
||||||
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.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.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.6.21=jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
|
||||||
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
|
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20=metadataCommonMainCompileClasspath
|
||||||
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
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.8.20=metadataCommonMainCompileClasspath,metadataCompileClasspath
|
|
||||||
org.jetbrains.kotlin:kotlin-stdlib:1.8.21=kotlinCompilerPluginClasspathMetadataCommonMain
|
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-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.10=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
|
org.jetbrains.kotlin:kotlin-test-annotations-common:1.9.23=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-common:1.9.23=allSourceSetsCompileDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmTestResolvableDependenciesMetadata
|
||||||
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,commonTestImplementationDependenciesMetadataCopy,jvmTestCompileClasspathCopy,jvmTestCompileClasspathCopy2,jvmTestImplementationCopy,jvmTestImplementationDependenciesMetadataCopy,jvmTestRuntimeClasspathCopy,jvmTestRuntimeClasspathCopy2
|
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.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.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:kotlinx-coroutines-bom:1.7.1=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
org.jetbrains.kotlinx:atomicfu:0.23.1=allSourceSetsCompileDependenciesMetadata,commonMainApiDependenciesMetadata,commonMainCompileOnlyDependenciesMetadata,commonMainImplementationDependenciesMetadata,commonMainResolvableDependenciesMetadata,commonTestApiDependenciesMetadata,commonTestCompileOnlyDependenciesMetadata,commonTestImplementationDependenciesMetadata,commonTestResolvableDependenciesMetadata,jvmMainApiDependenciesMetadata,jvmMainCompileOnlyDependenciesMetadata,jvmMainImplementationDependenciesMetadata,jvmMainResolvableDependenciesMetadata,jvmTestApiDependenciesMetadata,jvmTestCompileOnlyDependenciesMetadata,jvmTestImplementationDependenciesMetadata,jvmTestResolvableDependenciesMetadata,metadataCompileClasspath
|
||||||
|
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
||||||
|
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.0=kotlinBuildToolsApiClasspath
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1=commonMainApiCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
|
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.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.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.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.2=commonMainApiCopy2,jvmTestCompileClasspathCopy2,jvmTestRuntimeClasspathCopy2
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=allSourceSetsRuntimeDependenciesMetadata
|
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.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.2=commonTestImplementationCopy2
|
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.1=commonTestImplementationCopy,jvmTestCompileClasspathCopy,jvmTestImplementationCopy,jvmTestRuntimeClasspathCopy
|
||||||
org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.2=commonTestImplementationCopy2
|
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: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:annotations:13.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathJvmMain,kotlinCompilerPluginClasspathJvmTest,kotlinCompilerPluginClasspathMetadataCommonMain,kotlinCompilerPluginClasspathMetadataMain,kotlinKlibCommonizerClasspath,metadataCommonMainCompileClasspath
|
||||||
org.jetbrains:annotations:16.0.2=koverJvmReporter
|
org.jetbrains:annotations:16.0.2=koverJvmReporter
|
||||||
org.jetbrains:annotations:23.0.0=jvmCompileClasspath,jvmRuntimeClasspath,jvmTestCompileClasspath,jvmTestRuntimeClasspath
|
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
|
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
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
interface PreferenceProvider {
|
interface PreferenceProvider {
|
||||||
|
|
||||||
suspend fun hasKey(key: PreferenceKey): Boolean
|
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?
|
suspend fun getString(key: PreferenceKey): String?
|
||||||
|
|
||||||
fun observe(key: PreferenceKey): Flow<String?>
|
fun observe(key: PreferenceKey): Flow<String?>
|
||||||
|
|
||||||
|
suspend fun clearPreferences(): Boolean
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,19 +6,22 @@ data class BooleanPreferenceDefault(
|
||||||
override val key: PreferenceKey,
|
override val key: PreferenceKey,
|
||||||
private val defaultValue: Boolean
|
private val defaultValue: Boolean
|
||||||
) : PreferenceDefault<Boolean> {
|
) : PreferenceDefault<Boolean> {
|
||||||
|
|
||||||
@Suppress("SwallowedException")
|
@Suppress("SwallowedException")
|
||||||
override suspend fun getValue(preferenceProvider: PreferenceProvider) = preferenceProvider.getString(key)?.let {
|
override suspend fun getValue(preferenceProvider: PreferenceProvider) =
|
||||||
try {
|
preferenceProvider.getString(key)?.let {
|
||||||
it.toBooleanStrict()
|
try {
|
||||||
} catch (e: IllegalArgumentException) {
|
it.toBooleanStrict()
|
||||||
// TODO [#32]: Log coercion failure instead of just silently returning default
|
} catch (e: IllegalArgumentException) {
|
||||||
// TODO [#32]: https://github.com/zcash/secant-android-wallet/issues/32
|
// TODO [#32]: Log coercion failure instead of just silently returning default
|
||||||
defaultValue
|
// TODO [#32]: https://github.com/Electric-Coin-Company/zashi-android/issues/32
|
||||||
}
|
defaultValue
|
||||||
} ?: defaultValue
|
}
|
||||||
|
} ?: defaultValue
|
||||||
|
|
||||||
override suspend fun putValue(preferenceProvider: PreferenceProvider, newValue: Boolean) {
|
override suspend fun putValue(
|
||||||
|
preferenceProvider: PreferenceProvider,
|
||||||
|
newValue: Boolean
|
||||||
|
) {
|
||||||
preferenceProvider.putString(key, newValue.toString())
|
preferenceProvider.putString(key, newValue.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,18 +6,21 @@ data class IntegerPreferenceDefault(
|
||||||
override val key: PreferenceKey,
|
override val key: PreferenceKey,
|
||||||
private val defaultValue: Int
|
private val defaultValue: Int
|
||||||
) : PreferenceDefault<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 {
|
override suspend fun putValue(
|
||||||
try {
|
preferenceProvider: PreferenceProvider,
|
||||||
it.toInt()
|
newValue: Int
|
||||||
} 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) {
|
|
||||||
preferenceProvider.putString(key, newValue.toString())
|
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
|
* variation in default value. Clients define the key and default value together, rather than just
|
||||||
* the key.
|
* 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> {
|
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
|
val key: PreferenceKey
|
||||||
|
|
||||||
|
@ -34,14 +34,18 @@ interface PreferenceDefault<T> {
|
||||||
* @param preferenceProvider Provides actual preference values.
|
* @param preferenceProvider Provides actual preference values.
|
||||||
* @param newValue New value to write.
|
* @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.
|
* @param preferenceProvider Provides actual preference values.
|
||||||
* @return Flow that emits preference changes. Note that implementations should emit an initial value
|
* @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.
|
* indicating what was stored in the preferences, in addition to subsequent updates.
|
||||||
*/
|
*/
|
||||||
fun observe(preferenceProvider: PreferenceProvider): Flow<T> = preferenceProvider.observe(key)
|
fun observe(preferenceProvider: PreferenceProvider): Flow<T> =
|
||||||
.map { getValue(preferenceProvider) }
|
preferenceProvider.observe(key)
|
||||||
.distinctUntilChanged()
|
.map { getValue(preferenceProvider) }
|
||||||
|
.distinctUntilChanged()
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,11 +6,14 @@ data class StringPreferenceDefault(
|
||||||
override val key: PreferenceKey,
|
override val key: PreferenceKey,
|
||||||
private val defaultValue: String
|
private val defaultValue: String
|
||||||
) : PreferenceDefault<String> {
|
) : PreferenceDefault<String> {
|
||||||
|
override suspend fun getValue(preferenceProvider: PreferenceProvider) =
|
||||||
|
preferenceProvider.getString(key)
|
||||||
|
?: defaultValue
|
||||||
|
|
||||||
override suspend fun getValue(preferenceProvider: PreferenceProvider) = preferenceProvider.getString(key)
|
override suspend fun putValue(
|
||||||
?: defaultValue
|
preferenceProvider: PreferenceProvider,
|
||||||
|
newValue: String
|
||||||
override suspend fun putValue(preferenceProvider: PreferenceProvider, newValue: String) {
|
) {
|
||||||
preferenceProvider.putString(key, newValue)
|
preferenceProvider.putString(key, newValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,32 +16,38 @@ class BooleanPreferenceDefaultTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun value_default_true() = runTest {
|
fun value_default_true() =
|
||||||
val entry = BooleanPreferenceDefaultFixture.newTrue()
|
runTest {
|
||||||
assertTrue(entry.getValue(MockPreferenceProvider()))
|
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())
|
|
||||||
}
|
}
|
||||||
assertFalse(entry.getValue(mockPreferenceProvider))
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun value_from_config_true() = runTest {
|
fun value_default_false() =
|
||||||
val entry = BooleanPreferenceDefaultFixture.newTrue()
|
runTest {
|
||||||
val mockPreferenceProvider = MockPreferenceProvider {
|
val entry = BooleanPreferenceDefaultFixture.newFalse()
|
||||||
mutableMapOf(BooleanPreferenceDefaultFixture.KEY.key to true.toString())
|
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
|
@Test
|
||||||
fun value_default() = runTest {
|
fun value_default() =
|
||||||
val entry = IntegerPreferenceDefaultFixture.new()
|
runTest {
|
||||||
assertEquals(IntegerPreferenceDefaultFixture.DEFAULT_VALUE, entry.getValue(MockPreferenceProvider()))
|
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())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
@Test
|
||||||
fun value_default() = runTest {
|
fun value_default() =
|
||||||
val entry = StringDefaultPreferenceFixture.new()
|
runTest {
|
||||||
assertEquals(StringDefaultPreferenceFixture.DEFAULT_VALUE, entry.getValue(MockPreferenceProvider()))
|
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")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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(
|
class MockPreferenceProvider(
|
||||||
mutableMapFactory: () -> MutableMap<String, String?> = { mutableMapOf() }
|
mutableMapFactory: () -> MutableMap<String, String?> = { mutableMapOf() }
|
||||||
) : PreferenceProvider {
|
) : PreferenceProvider {
|
||||||
|
|
||||||
private val map = mutableMapFactory()
|
private val map = mutableMapFactory()
|
||||||
|
|
||||||
override suspend fun getString(key: PreferenceKey) = map[key.key]
|
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
|
// For the mock implementation, does not support observability of changes
|
||||||
override fun observe(key: PreferenceKey): Flow<String?> = flow { emit(getString(key)) }
|
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 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
|
map[key.key] = value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,8 @@ import co.electriccoin.zcash.preference.model.entry.PreferenceKey
|
||||||
|
|
||||||
object BooleanPreferenceDefaultFixture {
|
object BooleanPreferenceDefaultFixture {
|
||||||
val KEY = PreferenceKey("some_boolean_key") // $NON-NLS
|
val KEY = PreferenceKey("some_boolean_key") // $NON-NLS
|
||||||
|
|
||||||
fun newTrue() = BooleanPreferenceDefault(KEY, true)
|
fun newTrue() = BooleanPreferenceDefault(KEY, true)
|
||||||
|
|
||||||
fun newFalse() = BooleanPreferenceDefault(KEY, false)
|
fun newFalse() = BooleanPreferenceDefault(KEY, false)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,9 @@ import co.electriccoin.zcash.preference.model.entry.PreferenceKey
|
||||||
object IntegerPreferenceDefaultFixture {
|
object IntegerPreferenceDefaultFixture {
|
||||||
val KEY = PreferenceKey("some_string_key") // $NON-NLS
|
val KEY = PreferenceKey("some_string_key") // $NON-NLS
|
||||||
const val DEFAULT_VALUE = 123
|
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 {
|
object StringDefaultPreferenceFixture {
|
||||||
val KEY = PreferenceKey("some_string_key") // $NON-NLS
|
val KEY = PreferenceKey("some_string_key") // $NON-NLS
|
||||||
const val DEFAULT_VALUE = "some_default_value" // $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