From 9ca7e2b04d2a7370a45c0b725eeb93cc0dc5cd9d Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Mon, 27 Mar 2023 13:36:03 -0700 Subject: [PATCH 01/63] Migrate to rules_jvm_external 5.1. --- WORKSPACE | 3 + third_party/maven_install.json | 17015 +++++++++++++------------------ third_party/versions.bzl | 4 +- 3 files changed, 6814 insertions(+), 10208 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 7b21505c587..b900329c12e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -184,7 +184,9 @@ http_jar( # Note to developers: new dependencies should be added to //third_party:versions.bzl, not here. maven_install( artifacts = DAGGER_ARTIFACTS + get_maven_dependencies(), + duplicate_version_warning = "error", fail_if_repin_required = True, + fetch_javadoc = True, fetch_sources = True, maven_install_json = "//third_party:maven_install.json", repositories = DAGGER_REPOSITORIES + [ @@ -192,6 +194,7 @@ maven_install( "https://maven.google.com", "https://repo1.maven.org/maven2", ], + strict_visibility = True, ) load("@maven//:defs.bzl", "pinned_maven_install") diff --git a/third_party/maven_install.json b/third_party/maven_install.json index 3522dd4d415..f685727dfd3 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,10209 +1,6812 @@ { - "dependency_tree": { - "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -109720896, - "__RESOLVED_ARTIFACTS_HASH": 860179600, - "conflict_resolution": { - "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", - "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", - "androidx.recyclerview:recyclerview:1.0.0": "androidx.recyclerview:recyclerview:1.1.0", - "androidx.test:core:1.0.0": "androidx.test:core:1.4.0", - "com.google.guava:guava:28.1-android": "com.google.guava:guava:30.1.1-android", - "com.google.truth:truth:0.43": "com.google.truth:truth:1.1.3", - "junit:junit:4.12": "junit:junit:4.13.2", - "org.jetbrains.kotlin:kotlin-reflect:1.3.41": "org.jetbrains.kotlin:kotlin-reflect:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "org.mockito:mockito-core:2.19.0": "org.mockito:mockito-core:3.9.0" - }, - "dependencies": [ - { - "coord": "android.arch.core:common:1.1.1", - "dependencies": [ - "com.android.support:support-annotations:28.0.0" - ], - "directDependencies": [ - "com.android.support:support-annotations:28.0.0" - ], - "file": "v1/https/maven.google.com/android/arch/core/common/1.1.1/common-1.1.1.jar", - "mirror_urls": [ - "https://maven.google.com/android/arch/core/common/1.1.1/common-1.1.1.jar", - "https://repo1.maven.org/maven2/android/arch/core/common/1.1.1/common-1.1.1.jar", - "https://maven.fabric.io/public/android/arch/core/common/1.1.1/common-1.1.1.jar", - "https://maven.google.com/android/arch/core/common/1.1.1/common-1.1.1.jar", - "https://repo1.maven.org/maven2/android/arch/core/common/1.1.1/common-1.1.1.jar" - ], - "sha256": "3a616a32f433e9e23f556b38575c31b013613d3ae85206263b7625fe1f4c151a", - "url": "https://maven.google.com/android/arch/core/common/1.1.1/common-1.1.1.jar" - }, - { - "coord": "android.arch.core:common:jar:sources:1.1.1", - "dependencies": [ - "com.android.support:support-annotations:jar:sources:28.0.0" - ], - "directDependencies": [ - "com.android.support:support-annotations:jar:sources:28.0.0" - ], - "file": "v1/https/maven.google.com/android/arch/core/common/1.1.1/common-1.1.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/android/arch/core/common/1.1.1/common-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/android/arch/core/common/1.1.1/common-1.1.1-sources.jar", - "https://maven.fabric.io/public/android/arch/core/common/1.1.1/common-1.1.1-sources.jar", - "https://maven.google.com/android/arch/core/common/1.1.1/common-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/android/arch/core/common/1.1.1/common-1.1.1-sources.jar" - ], - "sha256": "a92362968c7894fafedddbd1092aa7f775cb9a955aa794ab4c89e5bd386aec0c", - "url": "https://maven.google.com/android/arch/core/common/1.1.1/common-1.1.1-sources.jar" - }, - { - "coord": "android.arch.core:core-testing:1.1.1", - "dependencies": [ - "org.hamcrest:hamcrest-core:1.3", - "org.mockito:mockito-core:3.9.0", - "com.android.support:support-annotations:28.0.0", - "android.arch.core:runtime:aar:1.1.1", - "junit:junit:4.13.2", - "android.arch.core:common:1.1.1" - ], - "directDependencies": [ - "android.arch.core:runtime:aar:1.1.1", - "com.android.support:support-annotations:28.0.0", - "junit:junit:4.13.2", - "org.mockito:mockito-core:3.9.0" - ], - "file": "v1/https/maven.google.com/android/arch/core/core-testing/1.1.1/core-testing-1.1.1.aar", - "mirror_urls": [ - "https://maven.google.com/android/arch/core/core-testing/1.1.1/core-testing-1.1.1.aar", - "https://repo1.maven.org/maven2/android/arch/core/core-testing/1.1.1/core-testing-1.1.1.aar", - "https://maven.fabric.io/public/android/arch/core/core-testing/1.1.1/core-testing-1.1.1.aar", - "https://maven.google.com/android/arch/core/core-testing/1.1.1/core-testing-1.1.1.aar", - "https://repo1.maven.org/maven2/android/arch/core/core-testing/1.1.1/core-testing-1.1.1.aar" - ], - "sha256": "150a6f028af6c57ca6de66cb185a135cdcf737f597443acc4cf8aeeec064fff3", - "url": "https://maven.google.com/android/arch/core/core-testing/1.1.1/core-testing-1.1.1.aar" - }, - { - "coord": "android.arch.core:core-testing:jar:sources:1.1.1", - "dependencies": [ - "com.android.support:support-annotations:jar:sources:28.0.0", - "android.arch.core:runtime:aar:sources:1.1.1", - "junit:junit:jar:sources:4.13.2", - "org.mockito:mockito-core:jar:sources:3.9.0", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "android.arch.core:common:jar:sources:1.1.1" - ], - "directDependencies": [ - "android.arch.core:runtime:aar:sources:1.1.1", - "com.android.support:support-annotations:jar:sources:28.0.0", - "junit:junit:jar:sources:4.13.2", - "org.mockito:mockito-core:jar:sources:3.9.0" - ], - "file": "v1/https/maven.google.com/android/arch/core/core-testing/1.1.1/core-testing-1.1.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/android/arch/core/core-testing/1.1.1/core-testing-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/android/arch/core/core-testing/1.1.1/core-testing-1.1.1-sources.jar", - "https://maven.fabric.io/public/android/arch/core/core-testing/1.1.1/core-testing-1.1.1-sources.jar", - "https://maven.google.com/android/arch/core/core-testing/1.1.1/core-testing-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/android/arch/core/core-testing/1.1.1/core-testing-1.1.1-sources.jar" - ], - "sha256": "9b15768758ff58fd31be63cc5dd5932805676e52c1147b897cc46302976126b3", - "url": "https://maven.google.com/android/arch/core/core-testing/1.1.1/core-testing-1.1.1-sources.jar" - }, - { - "coord": "android.arch.core:runtime:aar:1.1.1", - "dependencies": [ - "com.android.support:support-annotations:28.0.0", - "android.arch.core:common:1.1.1" - ], - "directDependencies": [ - "android.arch.core:common:1.1.1", - "com.android.support:support-annotations:28.0.0" - ], - "file": "v1/https/maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar", - "mirror_urls": [ - "https://maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar", - "https://repo1.maven.org/maven2/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar", - "https://maven.fabric.io/public/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar", - "https://maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar", - "https://repo1.maven.org/maven2/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar" - ], - "sha256": "c3215aa5873311b3f88a6f4e4a3c25ad89971bc127de8c3e1291c57f93a05c39", - "url": "https://maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1.aar" - }, - { - "coord": "android.arch.core:runtime:aar:sources:1.1.1", - "dependencies": [ - "android.arch.core:common:jar:sources:1.1.1", - "com.android.support:support-annotations:jar:sources:28.0.0" - ], - "directDependencies": [ - "android.arch.core:common:jar:sources:1.1.1", - "com.android.support:support-annotations:jar:sources:28.0.0" - ], - "file": "v1/https/maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/android/arch/core/runtime/1.1.1/runtime-1.1.1-sources.jar", - "https://maven.fabric.io/public/android/arch/core/runtime/1.1.1/runtime-1.1.1-sources.jar", - "https://maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/android/arch/core/runtime/1.1.1/runtime-1.1.1-sources.jar" - ], - "sha256": "2819725bae3f0eac99197f810824a084d45d3b63922a87ace3329a64d0fb2420", - "url": "https://maven.google.com/android/arch/core/runtime/1.1.1/runtime-1.1.1-sources.jar" - }, - { - "coord": "androidx.activity:activity:aar:1.1.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.annotation:annotation:1.1.0", - "androidx.savedstate:savedstate:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.arch.core:core-common:2.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:1.0.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.savedstate:savedstate:aar:1.0.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/activity/activity/1.1.0/activity-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/activity/activity/1.1.0/activity-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/activity/activity/1.1.0/activity-1.1.0.aar", - "https://maven.fabric.io/public/androidx/activity/activity/1.1.0/activity-1.1.0.aar", - "https://maven.google.com/androidx/activity/activity/1.1.0/activity-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/activity/activity/1.1.0/activity-1.1.0.aar" - ], - "sha256": "4f2b35916768032f7d0c20e250e28b29037ed4ce9ebf3da4fcd51bcb0c6067ef", - "url": "https://maven.google.com/androidx/activity/activity/1.1.0/activity-1.1.0.aar" - }, - { - "coord": "androidx.activity:activity:aar:sources:1.1.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.savedstate:savedstate:aar:sources:1.0.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.savedstate:savedstate:aar:sources:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/activity/activity/1.1.0/activity-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/activity/activity/1.1.0/activity-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/activity/activity/1.1.0/activity-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/activity/activity/1.1.0/activity-1.1.0-sources.jar", - "https://maven.google.com/androidx/activity/activity/1.1.0/activity-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/activity/activity/1.1.0/activity-1.1.0-sources.jar" - ], - "sha256": "1a17836d7c91c4e3f983bba1072fa972bde277b57a718292f7c6d22659bb1f7e", - "url": "https://maven.google.com/androidx/activity/activity/1.1.0/activity-1.1.0-sources.jar" - }, - { - "coord": "androidx.annotation:annotation-experimental:1.0.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0.aar", - "https://maven.fabric.io/public/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0.aar", - "https://maven.google.com/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0.aar" - ], - "sha256": "b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11", - "url": "https://maven.google.com/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0.aar" - }, - { - "coord": "androidx.annotation:annotation-experimental:jar:sources:1.0.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0-sources.jar", - "https://maven.google.com/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0-sources.jar" - ], - "sha256": "66bf83ada560031d10f6ec01e9f0e92aface467ab532db6e67f12703f50b6776", - "url": "https://maven.google.com/androidx/annotation/annotation-experimental/1.0.0/annotation-experimental-1.0.0-sources.jar" - }, - { - "coord": "androidx.annotation:annotation:1.1.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", - "https://repo1.maven.org/maven2/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", - "https://maven.fabric.io/public/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", - "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar", - "https://repo1.maven.org/maven2/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar" - ], - "sha256": "d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692", - "url": "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0.jar" - }, - { - "coord": "androidx.annotation:annotation:jar:sources:1.1.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", - "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar" - ], - "sha256": "92bcd2773b5624fd88b7ee21d5685145d7cafed59316c4ce83de33a7b2dd8c02", - "url": "https://maven.google.com/androidx/annotation/annotation/1.1.0/annotation-1.1.0-sources.jar" - }, - { - "coord": "androidx.appcompat:appcompat-resources:aar:1.2.0", - "dependencies": [ - "androidx.interpolator:interpolator:aar:1.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.vectordrawable:vectordrawable-animated:aar:1.1.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.vectordrawable:vectordrawable-animated:aar:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0.aar", - "https://maven.fabric.io/public/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0.aar", - "https://maven.google.com/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0.aar" - ], - "sha256": "c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5", - "url": "https://maven.google.com/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0.aar" - }, - { - "coord": "androidx.appcompat:appcompat-resources:aar:sources:1.2.0", - "dependencies": [ - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "androidx.vectordrawable:vectordrawable-animated:aar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.vectordrawable:vectordrawable-animated:aar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0-sources.jar", - "https://maven.google.com/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0-sources.jar" - ], - "sha256": "2deb19e61f184904d1880f67a355da562516b5e5251dc55156eab94039244f09", - "url": "https://maven.google.com/androidx/appcompat/appcompat-resources/1.2.0/appcompat-resources-1.2.0-sources.jar" - }, - { - "coord": "androidx.appcompat:appcompat:1.2.0", - "dependencies": [ - "androidx.interpolator:interpolator:aar:1.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0", - "androidx.cursoradapter:cursoradapter:aar:1.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.drawerlayout:drawerlayout:aar:1.1.0", - "androidx.appcompat:appcompat-resources:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.vectordrawable:vectordrawable-animated:aar:1.1.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.cursoradapter:cursoradapter:aar:1.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.drawerlayout:drawerlayout:aar:1.1.0", - "androidx.appcompat:appcompat-resources:aar:1.2.0", - "androidx.core:core:aar:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0.aar", - "https://maven.fabric.io/public/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0.aar", - "https://maven.google.com/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0.aar" - ], - "sha256": "3d2131a55a61a777322e2126e0018011efa6339e53b44153eb651b16020cca70", - "url": "https://maven.google.com/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0.aar" - }, - { - "coord": "androidx.appcompat:appcompat:jar:sources:1.2.0", - "dependencies": [ - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "androidx.vectordrawable:vectordrawable-animated:aar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.drawerlayout:drawerlayout:aar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.cursoradapter:cursoradapter:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.appcompat:appcompat-resources:aar:sources:1.2.0", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.drawerlayout:drawerlayout:aar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.cursoradapter:cursoradapter:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.appcompat:appcompat-resources:aar:sources:1.2.0" - ], - "file": "v1/https/maven.google.com/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0-sources.jar", - "https://maven.google.com/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0-sources.jar" - ], - "sha256": "5c7408a4894d4d6c713c18bf53e724091d46e44a22ed9ea6275c8bb97f6dc9f3", - "url": "https://maven.google.com/androidx/appcompat/appcompat/1.2.0/appcompat-1.2.0-sources.jar" - }, - { - "coord": "androidx.arch.core:core-common:2.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/arch/core/core-common/2.1.0/core-common-2.1.0.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/arch/core/core-common/2.1.0/core-common-2.1.0.jar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-common/2.1.0/core-common-2.1.0.jar", - "https://maven.fabric.io/public/androidx/arch/core/core-common/2.1.0/core-common-2.1.0.jar", - "https://maven.google.com/androidx/arch/core/core-common/2.1.0/core-common-2.1.0.jar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-common/2.1.0/core-common-2.1.0.jar" - ], - "sha256": "fe1237bf029d063e7f29fe39aeaf73ef74c8b0a3658486fc29d3c54326653889", - "url": "https://maven.google.com/androidx/arch/core/core-common/2.1.0/core-common-2.1.0.jar" - }, - { - "coord": "androidx.arch.core:core-common:jar:sources:2.1.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/arch/core/core-common/2.1.0/core-common-2.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/arch/core/core-common/2.1.0/core-common-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-common/2.1.0/core-common-2.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/arch/core/core-common/2.1.0/core-common-2.1.0-sources.jar", - "https://maven.google.com/androidx/arch/core/core-common/2.1.0/core-common-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-common/2.1.0/core-common-2.1.0-sources.jar" - ], - "sha256": "01ef2736c9b688658d7446e8396099ff0c598d9a7e753131d566f953270c5878", - "url": "https://maven.google.com/androidx/arch/core/core-common/2.1.0/core-common-2.1.0-sources.jar" - }, - { - "coord": "androidx.arch.core:core-runtime:aar:2.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.arch.core:core-common:2.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.arch.core:core-common:2.1.0" - ], - "file": "v1/https/maven.google.com/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0.aar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0.aar", - "https://maven.fabric.io/public/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0.aar", - "https://maven.google.com/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0.aar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0.aar" - ], - "sha256": "dd77615bd3dd275afb11b62df25bae46b10b4a117cd37943af45bdcbf8755852", - "url": "https://maven.google.com/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0.aar" - }, - { - "coord": "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "dependencies": [ - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.arch.core:core-common:jar:sources:2.1.0" - ], - "file": "v1/https/maven.google.com/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0-sources.jar", - "https://maven.google.com/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0-sources.jar" - ], - "sha256": "913acdee357814e814745466a46a793e8ad7410086ba4548458b83cd6a98424b", - "url": "https://maven.google.com/androidx/arch/core/core-runtime/2.1.0/core-runtime-2.1.0-sources.jar" - }, - { - "coord": "androidx.arch.core:core-testing:2.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "org.objenesis:objenesis:3.2", - "org.hamcrest:hamcrest-core:1.3", - "org.mockito:mockito-core:3.9.0", - "junit:junit:4.13.2", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.arch.core:core-runtime:aar:2.1.0", - "junit:junit:4.13.2", - "org.mockito:mockito-core:3.9.0" - ], - "file": "v1/https/maven.google.com/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0.aar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0.aar", - "https://maven.fabric.io/public/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0.aar", - "https://maven.google.com/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0.aar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0.aar" - ], - "sha256": "c57ffade2a9a844bd62b4f4c3916fad5e09e9f24cceba27e932c25bb7a6d1d8f", - "url": "https://maven.google.com/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0.aar" - }, - { - "coord": "androidx.arch.core:core-testing:jar:sources:2.1.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "junit:junit:jar:sources:4.13.2", - "org.mockito:mockito-core:jar:sources:3.9.0", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "androidx.annotation:annotation:jar:sources:1.1.0", - "org.objenesis:objenesis:jar:sources:3.2" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "junit:junit:jar:sources:4.13.2", - "org.mockito:mockito-core:jar:sources:3.9.0" - ], - "file": "v1/https/maven.google.com/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0-sources.jar", - "https://maven.google.com/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0-sources.jar" - ], - "sha256": "68ef3af5efcd66013bbaf53c8a927354a142ddb16db804a0a83cf70176efabdc", - "url": "https://maven.google.com/androidx/arch/core/core-testing/2.1.0/core-testing-2.1.0-sources.jar" - }, - { - "coord": "androidx.cardview:cardview:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/cardview/cardview/1.0.0/cardview-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/cardview/cardview/1.0.0/cardview-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/cardview/cardview/1.0.0/cardview-1.0.0.aar", - "https://maven.fabric.io/public/androidx/cardview/cardview/1.0.0/cardview-1.0.0.aar", - "https://maven.google.com/androidx/cardview/cardview/1.0.0/cardview-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/cardview/cardview/1.0.0/cardview-1.0.0.aar" - ], - "sha256": "1193c04c22a3d6b5946dae9f4e8c59d6adde6a71b6bd5d87fb99d82dda1afec7", - "url": "https://maven.google.com/androidx/cardview/cardview/1.0.0/cardview-1.0.0.aar" - }, - { - "coord": "androidx.cardview:cardview:jar:sources:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/cardview/cardview/1.0.0/cardview-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/cardview/cardview/1.0.0/cardview-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/cardview/cardview/1.0.0/cardview-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/cardview/cardview/1.0.0/cardview-1.0.0-sources.jar", - "https://maven.google.com/androidx/cardview/cardview/1.0.0/cardview-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/cardview/cardview/1.0.0/cardview-1.0.0-sources.jar" - ], - "sha256": "ad7a28e7768893f8b33a8b7b275a92e33c125243ca4a9130a984c40e578e19b4", - "url": "https://maven.google.com/androidx/cardview/cardview/1.0.0/cardview-1.0.0-sources.jar" - }, - { - "coord": "androidx.collection:collection:1.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/collection/collection/1.1.0/collection-1.1.0.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/collection/collection/1.1.0/collection-1.1.0.jar", - "https://repo1.maven.org/maven2/androidx/collection/collection/1.1.0/collection-1.1.0.jar", - "https://maven.fabric.io/public/androidx/collection/collection/1.1.0/collection-1.1.0.jar", - "https://maven.google.com/androidx/collection/collection/1.1.0/collection-1.1.0.jar", - "https://repo1.maven.org/maven2/androidx/collection/collection/1.1.0/collection-1.1.0.jar" - ], - "sha256": "632a0e5407461de774409352940e292a291037724207a787820c77daf7d33b72", - "url": "https://maven.google.com/androidx/collection/collection/1.1.0/collection-1.1.0.jar" - }, - { - "coord": "androidx.collection:collection:jar:sources:1.1.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/collection/collection/1.1.0/collection-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/collection/collection/1.1.0/collection-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/collection/collection/1.1.0/collection-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/collection/collection/1.1.0/collection-1.1.0-sources.jar", - "https://maven.google.com/androidx/collection/collection/1.1.0/collection-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/collection/collection/1.1.0/collection-1.1.0-sources.jar" - ], - "sha256": "158ae7efee9c7394a241139ebf220751f8b812eda40269a38ef725dbe784b98d", - "url": "https://maven.google.com/androidx/collection/collection/1.1.0/collection-1.1.0-sources.jar" - }, - { - "coord": "androidx.constraintlayout:constraintlayout-solver:2.0.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/constraintlayout/constraintlayout-solver/2.0.1/constraintlayout-solver-2.0.1.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/constraintlayout/constraintlayout-solver/2.0.1/constraintlayout-solver-2.0.1.jar", - "https://repo1.maven.org/maven2/androidx/constraintlayout/constraintlayout-solver/2.0.1/constraintlayout-solver-2.0.1.jar", - "https://maven.fabric.io/public/androidx/constraintlayout/constraintlayout-solver/2.0.1/constraintlayout-solver-2.0.1.jar", - "https://maven.google.com/androidx/constraintlayout/constraintlayout-solver/2.0.1/constraintlayout-solver-2.0.1.jar", - "https://repo1.maven.org/maven2/androidx/constraintlayout/constraintlayout-solver/2.0.1/constraintlayout-solver-2.0.1.jar" - ], - "sha256": "b23732edbb3511d937fea1ffef047b0e6c001b50c1921f0d959fc384d706ec6a", - "url": "https://maven.google.com/androidx/constraintlayout/constraintlayout-solver/2.0.1/constraintlayout-solver-2.0.1.jar" - }, - { - "coord": "androidx.constraintlayout:constraintlayout:2.0.1", - "dependencies": [ - "androidx.constraintlayout:constraintlayout-solver:2.0.1", - "androidx.interpolator:interpolator:aar:1.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0", - "androidx.cursoradapter:cursoradapter:aar:1.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.drawerlayout:drawerlayout:aar:1.1.0", - "androidx.appcompat:appcompat-resources:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.core:core:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.vectordrawable:vectordrawable-animated:aar:1.1.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0", - "androidx.appcompat:appcompat:1.2.0" - ], - "directDependencies": [ - "androidx.appcompat:appcompat:1.2.0", - "androidx.constraintlayout:constraintlayout-solver:2.0.1", - "androidx.core:core:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/constraintlayout/constraintlayout/2.0.1/constraintlayout-2.0.1.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/constraintlayout/constraintlayout/2.0.1/constraintlayout-2.0.1.aar", - "https://repo1.maven.org/maven2/androidx/constraintlayout/constraintlayout/2.0.1/constraintlayout-2.0.1.aar", - "https://maven.fabric.io/public/androidx/constraintlayout/constraintlayout/2.0.1/constraintlayout-2.0.1.aar", - "https://maven.google.com/androidx/constraintlayout/constraintlayout/2.0.1/constraintlayout-2.0.1.aar", - "https://repo1.maven.org/maven2/androidx/constraintlayout/constraintlayout/2.0.1/constraintlayout-2.0.1.aar" - ], - "sha256": "ec15b5d4a2eff07888bc1499ce2e2c6efe24c0ed60cc57b08c9dc4b6fd3c2189", - "url": "https://maven.google.com/androidx/constraintlayout/constraintlayout/2.0.1/constraintlayout-2.0.1.aar" - }, - { - "coord": "androidx.coordinatorlayout:coordinatorlayout:1.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.customview:customview:aar:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.customview:customview:aar:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0.aar", - "https://maven.fabric.io/public/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0.aar", - "https://maven.google.com/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0.aar" - ], - "sha256": "44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb", - "url": "https://maven.google.com/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0.aar" - }, - { - "coord": "androidx.coordinatorlayout:coordinatorlayout:jar:sources:1.1.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.customview:customview:aar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.customview:customview:aar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0-sources.jar", - "https://maven.google.com/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0-sources.jar" - ], - "sha256": "c8904cffcfb757cf14d8c0cf7563274edc3a8bc883ca9203b4b98e9823f7b22b", - "url": "https://maven.google.com/androidx/coordinatorlayout/coordinatorlayout/1.1.0/coordinatorlayout-1.1.0-sources.jar" - }, - { - "coord": "androidx.core:core-ktx:1.0.1", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.core:core:aar:1.3.1", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1.aar", - "https://repo1.maven.org/maven2/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1.aar", - "https://maven.fabric.io/public/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1.aar", - "https://maven.google.com/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1.aar", - "https://repo1.maven.org/maven2/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1.aar" - ], - "sha256": "a151b7e21acc3d272e1d397a2084e76ccce88e8542adcc4e0cf1e0655063255f", - "url": "https://maven.google.com/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1.aar" - }, - { - "coord": "androidx.core:core-ktx:jar:sources:1.0.1", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1-sources.jar", - "https://repo1.maven.org/maven2/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1-sources.jar", - "https://maven.fabric.io/public/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1-sources.jar", - "https://maven.google.com/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1-sources.jar", - "https://repo1.maven.org/maven2/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1-sources.jar" - ], - "sha256": "a477aafb6356210d5d6a64f0d5e57e5500e1906ba1a3f49d449081589e785626", - "url": "https://maven.google.com/androidx/core/core-ktx/1.0.1/core-ktx-1.0.1-sources.jar" - }, - { - "coord": "androidx.core:core:1.3.1", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/core/core/1.3.1/core-1.3.1.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/core/core/1.3.1/core-1.3.1.aar", - "https://repo1.maven.org/maven2/androidx/core/core/1.3.1/core-1.3.1.aar", - "https://maven.fabric.io/public/androidx/core/core/1.3.1/core-1.3.1.aar", - "https://maven.google.com/androidx/core/core/1.3.1/core-1.3.1.aar", - "https://repo1.maven.org/maven2/androidx/core/core/1.3.1/core-1.3.1.aar" - ], - "sha256": "e92ea65a37d589943d405a6a54d1be9d12a225948f26c4e41e511dd55e81efb6", - "url": "https://maven.google.com/androidx/core/core/1.3.1/core-1.3.1.aar" - }, - { - "coord": "androidx.core:core:aar:sources:1.3.1", - "dependencies": [ - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/core/core/1.3.1/core-1.3.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/core/core/1.3.1/core-1.3.1-sources.jar", - "https://repo1.maven.org/maven2/androidx/core/core/1.3.1/core-1.3.1-sources.jar", - "https://maven.fabric.io/public/androidx/core/core/1.3.1/core-1.3.1-sources.jar", - "https://maven.google.com/androidx/core/core/1.3.1/core-1.3.1-sources.jar", - "https://repo1.maven.org/maven2/androidx/core/core/1.3.1/core-1.3.1-sources.jar" - ], - "sha256": "ae0e7ef2b5be9a59ef6d8c831090ba3e4407f9ae21e453c1df9f6b82cb46be28", - "url": "https://maven.google.com/androidx/core/core/1.3.1/core-1.3.1-sources.jar" - }, - { - "coord": "androidx.cursoradapter:cursoradapter:aar:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0.aar", - "https://maven.fabric.io/public/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0.aar", - "https://maven.google.com/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0.aar" - ], - "sha256": "a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564", - "url": "https://maven.google.com/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0.aar" - }, - { - "coord": "androidx.cursoradapter:cursoradapter:aar:sources:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0-sources.jar", - "https://maven.google.com/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0-sources.jar" - ], - "sha256": "99b72a3aec8c9edfd9de20f5913ce4c413bca2f0cf9877b504e26aa03ef50323", - "url": "https://maven.google.com/androidx/cursoradapter/cursoradapter/1.0.0/cursoradapter-1.0.0-sources.jar" - }, - { - "coord": "androidx.customview:customview:aar:1.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/customview/customview/1.1.0/customview-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/customview/customview/1.1.0/customview-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/customview/customview/1.1.0/customview-1.1.0.aar", - "https://maven.fabric.io/public/androidx/customview/customview/1.1.0/customview-1.1.0.aar", - "https://maven.google.com/androidx/customview/customview/1.1.0/customview-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/customview/customview/1.1.0/customview-1.1.0.aar" - ], - "sha256": "01f76ab043770a97b054046f9815717b82ce0355c02967d16c61981359dc189a", - "url": "https://maven.google.com/androidx/customview/customview/1.1.0/customview-1.1.0.aar" - }, - { - "coord": "androidx.customview:customview:aar:sources:1.1.0", - "dependencies": [ - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/customview/customview/1.1.0/customview-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/customview/customview/1.1.0/customview-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/customview/customview/1.1.0/customview-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/customview/customview/1.1.0/customview-1.1.0-sources.jar", - "https://maven.google.com/androidx/customview/customview/1.1.0/customview-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/customview/customview/1.1.0/customview-1.1.0-sources.jar" - ], - "sha256": "0f119c77c7613881901cbcd149e718409480c08c39661737750a35f5d6b5dfd2", - "url": "https://maven.google.com/androidx/customview/customview/1.1.0/customview-1.1.0-sources.jar" - }, - { - "coord": "androidx.databinding:databinding-adapters:3.4.2", - "dependencies": [ - "androidx.databinding:databinding-common:3.4.2", - "androidx.collection:collection:1.1.0", - "androidx.databinding:databinding-runtime:3.4.2", - "androidx.lifecycle:lifecycle-runtime:2.2.0" - ], - "directDependencies": [ - "androidx.databinding:databinding-common:3.4.2", - "androidx.databinding:databinding-runtime:3.4.2" - ], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2.aar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2.aar", - "https://maven.fabric.io/public/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2.aar", - "https://maven.google.com/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2.aar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2.aar" - ], - "sha256": "840a66744866185b6a74fd99e6596bf1eb0720837c3ae470c25212bccc563939", - "url": "https://maven.google.com/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2.aar" - }, - { - "coord": "androidx.databinding:databinding-adapters:jar:sources:3.4.2", - "dependencies": [ - "androidx.databinding:databinding-runtime:jar:sources:3.4.2", - "androidx.databinding:databinding-common:jar:sources:3.4.2", - "androidx.lifecycle:lifecycle-runtime:jar:sources:2.2.0", - "androidx.collection:collection:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.databinding:databinding-common:jar:sources:3.4.2", - "androidx.databinding:databinding-runtime:jar:sources:3.4.2" - ], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2-sources.jar", - "https://maven.fabric.io/public/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2-sources.jar", - "https://maven.google.com/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2-sources.jar" - ], - "sha256": "201336b6c7563cf4bf7481dc24bf8cf81944d1ff0dde75e66f989fbf599c2ac5", - "url": "https://maven.google.com/androidx/databinding/databinding-adapters/3.4.2/databinding-adapters-3.4.2-sources.jar" - }, - { - "coord": "androidx.databinding:databinding-common:3.4.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2.jar", - "https://maven.fabric.io/public/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2.jar", - "https://maven.google.com/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2.jar" - ], - "sha256": "52886c0ef6cfa492d07b40c3952201d6d2f0cfc680144fbefc69d2d5cb786c25", - "url": "https://maven.google.com/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2.jar" - }, - { - "coord": "androidx.databinding:databinding-common:jar:sources:3.4.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2-sources.jar", - "https://maven.fabric.io/public/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2-sources.jar", - "https://maven.google.com/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2-sources.jar" - ], - "sha256": "c06f772438c32b6cb47b4bfe44129b77c9c9470a7f9c69af1383a31f8d050eef", - "url": "https://maven.google.com/androidx/databinding/databinding-common/3.4.2/databinding-common-3.4.2-sources.jar" - }, - { - "coord": "androidx.databinding:databinding-compiler-common:3.4.2", - "dependencies": [ - "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta04", - "com.android.tools:annotations:26.4.2", - "androidx.databinding:databinding-common:3.4.2", - "com.android.databinding:baseLibrary:3.4.2", - "org.antlr:antlr4:4.5.3", - "commons-io:commons-io:2.4", - "com.google.guava:guava:30.1.1-android", - "com.googlecode.juniversalchardet:juniversalchardet:1.0.3", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "com.squareup:javapoet:1.11.1", - "com.google.code.gson:gson:2.8.5", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta04", - "com.android.tools:annotations:26.4.2", - "androidx.databinding:databinding-common:3.4.2", - "com.android.databinding:baseLibrary:3.4.2", - "org.antlr:antlr4:4.5.3", - "commons-io:commons-io:2.4", - "com.google.guava:guava:30.1.1-android", - "com.googlecode.juniversalchardet:juniversalchardet:1.0.3", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "com.squareup:javapoet:1.11.1", - "com.google.code.gson:gson:2.8.5" - ], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2.jar", - "https://maven.fabric.io/public/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2.jar", - "https://maven.google.com/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2.jar" - ], - "sha256": "770b6a82da0684f93d037ed5d241248cb25862ed14ecd7d9ec8c756153266051", - "url": "https://maven.google.com/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2.jar" - }, - { - "coord": "androidx.databinding:databinding-compiler-common:jar:sources:3.4.2", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "com.android.tools:annotations:jar:sources:26.4.2", - "com.android.tools.build.jetifier:jetifier-core:jar:sources:1.0.0-beta04", - "com.android.databinding:baseLibrary:jar:sources:3.4.2", - "org.antlr:antlr4:jar:sources:4.5.3", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "androidx.databinding:databinding-common:jar:sources:3.4.2", - "com.squareup:javapoet:jar:sources:1.11.1", - "commons-io:commons-io:jar:sources:2.4", - "com.google.code.gson:gson:jar:sources:2.8.5", - "com.googlecode.juniversalchardet:juniversalchardet:jar:sources:1.0.3" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.android.tools:annotations:jar:sources:26.4.2", - "com.android.tools.build.jetifier:jetifier-core:jar:sources:1.0.0-beta04", - "com.android.databinding:baseLibrary:jar:sources:3.4.2", - "org.antlr:antlr4:jar:sources:4.5.3", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "androidx.databinding:databinding-common:jar:sources:3.4.2", - "com.squareup:javapoet:jar:sources:1.11.1", - "commons-io:commons-io:jar:sources:2.4", - "com.google.code.gson:gson:jar:sources:2.8.5", - "com.googlecode.juniversalchardet:juniversalchardet:jar:sources:1.0.3" - ], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2-sources.jar", - "https://maven.fabric.io/public/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2-sources.jar", - "https://maven.google.com/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2-sources.jar" - ], - "sha256": "7a4baf3d6a0c08e9221e2059c505714c1ba3bb2be20ff7f0ee24210a5dbc51ba", - "url": "https://maven.google.com/androidx/databinding/databinding-compiler-common/3.4.2/databinding-compiler-common-3.4.2-sources.jar" - }, - { - "coord": "androidx.databinding:databinding-compiler:3.4.2", - "dependencies": [ - "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta04", - "com.android.tools:annotations:26.4.2", - "androidx.databinding:databinding-common:3.4.2", - "com.android.databinding:baseLibrary:3.4.2", - "org.antlr:antlr4:4.5.3", - "commons-io:commons-io:2.4", - "com.google.guava:guava:30.1.1-android", - "com.googlecode.juniversalchardet:juniversalchardet:1.0.3", - "androidx.databinding:databinding-compiler-common:3.4.2", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "com.squareup:javapoet:1.11.1", - "com.google.code.gson:gson:2.8.5", - "commons-codec:commons-codec:1.10", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "androidx.databinding:databinding-common:3.4.2", - "org.antlr:antlr4:4.5.3", - "commons-io:commons-io:2.4", - "com.googlecode.juniversalchardet:juniversalchardet:1.0.3", - "androidx.databinding:databinding-compiler-common:3.4.2", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "commons-codec:commons-codec:1.10" - ], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2.jar", - "https://maven.fabric.io/public/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2.jar", - "https://maven.google.com/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2.jar" - ], - "sha256": "07a9fb44f43048b18f149add7835e1239e92057e6748affde2d2bccf330c4242", - "url": "https://maven.google.com/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2.jar" - }, - { - "coord": "androidx.databinding:databinding-compiler:jar:sources:3.4.2", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "commons-codec:commons-codec:jar:sources:1.10", - "com.android.tools:annotations:jar:sources:26.4.2", - "com.android.tools.build.jetifier:jetifier-core:jar:sources:1.0.0-beta04", - "com.android.databinding:baseLibrary:jar:sources:3.4.2", - "androidx.databinding:databinding-compiler-common:jar:sources:3.4.2", - "org.antlr:antlr4:jar:sources:4.5.3", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "androidx.databinding:databinding-common:jar:sources:3.4.2", - "com.squareup:javapoet:jar:sources:1.11.1", - "commons-io:commons-io:jar:sources:2.4", - "com.google.code.gson:gson:jar:sources:2.8.5", - "com.googlecode.juniversalchardet:juniversalchardet:jar:sources:1.0.3" - ], - "directDependencies": [ - "commons-codec:commons-codec:jar:sources:1.10", - "androidx.databinding:databinding-compiler-common:jar:sources:3.4.2", - "org.antlr:antlr4:jar:sources:4.5.3", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "androidx.databinding:databinding-common:jar:sources:3.4.2", - "commons-io:commons-io:jar:sources:2.4", - "com.googlecode.juniversalchardet:juniversalchardet:jar:sources:1.0.3" - ], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2-sources.jar", - "https://maven.fabric.io/public/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2-sources.jar", - "https://maven.google.com/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2-sources.jar" - ], - "sha256": "55abb3bae194f31d0823807fd798b95447fb988f7f1291195e040b281f258464", - "url": "https://maven.google.com/androidx/databinding/databinding-compiler/3.4.2/databinding-compiler-3.4.2-sources.jar" - }, - { - "coord": "androidx.databinding:databinding-runtime:3.4.2", - "dependencies": [ - "androidx.databinding:databinding-common:3.4.2", - "androidx.collection:collection:1.1.0", - "androidx.lifecycle:lifecycle-runtime:2.2.0" - ], - "directDependencies": [ - "androidx.collection:collection:1.1.0", - "androidx.databinding:databinding-common:3.4.2", - "androidx.lifecycle:lifecycle-runtime:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2.aar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2.aar", - "https://maven.fabric.io/public/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2.aar", - "https://maven.google.com/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2.aar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2.aar" - ], - "sha256": "80d966bf58b971334d65b213b2ab16fe827bbb95389a9c6a52b141853f529b30", - "url": "https://maven.google.com/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2.aar" - }, - { - "coord": "androidx.databinding:databinding-runtime:jar:sources:3.4.2", - "dependencies": [ - "androidx.databinding:databinding-common:jar:sources:3.4.2", - "androidx.lifecycle:lifecycle-runtime:jar:sources:2.2.0", - "androidx.collection:collection:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.databinding:databinding-common:jar:sources:3.4.2", - "androidx.lifecycle:lifecycle-runtime:jar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2-sources.jar", - "https://maven.fabric.io/public/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2-sources.jar", - "https://maven.google.com/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2-sources.jar" - ], - "sha256": "5d9c949b8d3f14102a1aa85a036057bb32c715a414438c76af06c772f935bf91", - "url": "https://maven.google.com/androidx/databinding/databinding-runtime/3.4.2/databinding-runtime-3.4.2-sources.jar" - }, - { - "coord": "androidx.documentfile:documentfile:aar:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0.aar", - "https://maven.fabric.io/public/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0.aar", - "https://maven.google.com/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0.aar" - ], - "sha256": "865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487", - "url": "https://maven.google.com/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0.aar" - }, - { - "coord": "androidx.documentfile:documentfile:aar:sources:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0-sources.jar", - "https://maven.google.com/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0-sources.jar" - ], - "sha256": "79c2424477565d0500b47c8288fb8e6dd9c8306984e8dbd38d576f013873b410", - "url": "https://maven.google.com/androidx/documentfile/documentfile/1.0.0/documentfile-1.0.0-sources.jar" - }, - { - "coord": "androidx.drawerlayout:drawerlayout:1.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0", - "androidx.customview:customview:aar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.customview:customview:aar:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0.aar", - "https://maven.fabric.io/public/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0.aar", - "https://maven.google.com/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0.aar" - ], - "sha256": "9d79030ad4f93b1c6296f7a8391710f9e9e3228a3b10964c4bb0a042fd6257b8", - "url": "https://maven.google.com/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0.aar" - }, - { - "coord": "androidx.drawerlayout:drawerlayout:aar:sources:1.1.0", - "dependencies": [ - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.customview:customview:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.customview:customview:aar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0-sources.jar", - "https://maven.google.com/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0-sources.jar" - ], - "sha256": "2273fcbb290a092634b90e0556dfb1ae978d9ed011be5692bd9e6659633b6850", - "url": "https://maven.google.com/androidx/drawerlayout/drawerlayout/1.1.0/drawerlayout-1.1.0-sources.jar" - }, - { - "coord": "androidx.dynamicanimation:dynamicanimation:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0.aar", - "https://maven.fabric.io/public/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0.aar", - "https://maven.google.com/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0.aar" - ], - "sha256": "ce005162c229bf308d2d5b12fb6cad0874069cbbeaccee63a8193bd08d40de04", - "url": "https://maven.google.com/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0.aar" - }, - { - "coord": "androidx.dynamicanimation:dynamicanimation:jar:sources:1.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0-sources.jar", - "https://maven.google.com/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0-sources.jar" - ], - "sha256": "7ddbf0b830e295b8013a41c2c6771416118bcc8d61328a881daae657c1429196", - "url": "https://maven.google.com/androidx/dynamicanimation/dynamicanimation/1.0.0/dynamicanimation-1.0.0-sources.jar" - }, - { - "coord": "androidx.exifinterface:exifinterface:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0.aar", - "https://maven.fabric.io/public/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0.aar", - "https://maven.google.com/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0.aar" - ], - "sha256": "ee48be10aab8f54efff4c14b77d11e10b9eeee4379d5ef6bf297a2923c55cc11", - "url": "https://maven.google.com/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0.aar" - }, - { - "coord": "androidx.exifinterface:exifinterface:jar:sources:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0-sources.jar", - "https://maven.google.com/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0-sources.jar" - ], - "sha256": "b9404066c090ba7ee2980698448ecc4a0d9280e4916be3b9d6d6b1cdc90e4a4c", - "url": "https://maven.google.com/androidx/exifinterface/exifinterface/1.0.0/exifinterface-1.0.0-sources.jar" - }, - { - "coord": "androidx.fragment:fragment:1.2.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.annotation:annotation:1.1.0", - "androidx.savedstate:savedstate:aar:1.0.0", - "androidx.collection:collection:1.1.0", - "androidx.activity:activity:aar:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.arch.core:core-common:2.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.viewpager:viewpager:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:1.0.0", - "androidx.arch.core:core-runtime:aar:2.1.0", - "androidx.loader:loader:aar:1.0.0", - "androidx.customview:customview:aar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.activity:activity:aar:1.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.viewpager:viewpager:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/fragment/fragment/1.2.0/fragment-1.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/fragment/fragment/1.2.0/fragment-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/fragment/fragment/1.2.0/fragment-1.2.0.aar", - "https://maven.fabric.io/public/androidx/fragment/fragment/1.2.0/fragment-1.2.0.aar", - "https://maven.google.com/androidx/fragment/fragment/1.2.0/fragment-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/fragment/fragment/1.2.0/fragment-1.2.0.aar" - ], - "sha256": "fdd0eac80c6b26c79093a63fc699303f928cc1fa73ca7196d5590a77eb6d6873", - "url": "https://maven.google.com/androidx/fragment/fragment/1.2.0/fragment-1.2.0.aar" - }, - { - "coord": "androidx.fragment:fragment:aar:sources:1.2.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.viewpager:viewpager:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.savedstate:savedstate:aar:sources:1.0.0", - "androidx.activity:activity:aar:sources:1.1.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.customview:customview:aar:sources:1.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.viewpager:viewpager:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.activity:activity:aar:sources:1.1.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/fragment/fragment/1.2.0/fragment-1.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/fragment/fragment/1.2.0/fragment-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/fragment/fragment/1.2.0/fragment-1.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/fragment/fragment/1.2.0/fragment-1.2.0-sources.jar", - "https://maven.google.com/androidx/fragment/fragment/1.2.0/fragment-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/fragment/fragment/1.2.0/fragment-1.2.0-sources.jar" - ], - "sha256": "45606d34c38e29cf9ccf4bbec79c87836e7cc53bd300031792e589df16967cbb", - "url": "https://maven.google.com/androidx/fragment/fragment/1.2.0/fragment-1.2.0-sources.jar" - }, - { - "coord": "androidx.interpolator:interpolator:aar:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.aar", - "https://maven.fabric.io/public/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.aar", - "https://maven.google.com/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.aar" - ], - "sha256": "33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a", - "url": "https://maven.google.com/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0.aar" - }, - { - "coord": "androidx.interpolator:interpolator:aar:sources:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0-sources.jar", - "https://maven.google.com/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0-sources.jar" - ], - "sha256": "fa13ada71fe7bd9461f622f418e7c16a18e85da7708fb505c75229a9b8830345", - "url": "https://maven.google.com/androidx/interpolator/interpolator/1.0.0/interpolator-1.0.0-sources.jar" - }, - { - "coord": "androidx.legacy:legacy-support-core-utils:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.core:core:aar:1.3.1", - "androidx.print:print:aar:1.0.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0.aar", - "https://maven.fabric.io/public/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0.aar", - "https://maven.google.com/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0.aar" - ], - "sha256": "a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7", - "url": "https://maven.google.com/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0.aar" - }, - { - "coord": "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "directDependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0-sources.jar", - "https://maven.google.com/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0-sources.jar" - ], - "sha256": "dff5a95a7a706957b16edbf5b36c619fc869742bdf18845520d0cf71748c8070", - "url": "https://maven.google.com/androidx/legacy/legacy-support-core-utils/1.0.0/legacy-support-core-utils-1.0.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-common:2.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0.jar" - ], - "sha256": "63898dabf7cfe5ec5d7ed8b8c2564c1427be876e1496ead95c2703cf59d3734b", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0-sources.jar" - ], - "sha256": "faa1efdbf3fb66de1cd40132c9ae0f642e7ffb922d21fb3acf171903aeb8e872", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-common/2.2.0/lifecycle-common-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-extensions:2.2.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.annotation:annotation:1.1.0", - "androidx.savedstate:savedstate:aar:1.0.0", - "androidx.collection:collection:1.1.0", - "androidx.lifecycle:lifecycle-process:aar:2.2.0", - "androidx.activity:activity:aar:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-service:aar:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.arch.core:core-common:2.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.viewpager:viewpager:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:1.0.0", - "androidx.arch.core:core-runtime:aar:2.1.0", - "androidx.loader:loader:aar:1.0.0", - "androidx.customview:customview:aar:1.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.lifecycle:lifecycle-process:aar:2.2.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.lifecycle:lifecycle-service:aar:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.arch.core:core-common:2.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0.aar" - ], - "sha256": "648c8de1d10b025d524a2e46ac994fc3f6bf186826c09ec1a62d250bf1b877ae", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-extensions:jar:sources:2.2.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.viewpager:viewpager:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-process:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-service:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.savedstate:savedstate:aar:sources:1.0.0", - "androidx.activity:activity:aar:sources:1.1.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.customview:customview:aar:sources:1.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "directDependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-process:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-service:aar:sources:2.2.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0-sources.jar" - ], - "sha256": "3cc0bd51ff16c978cc4000a10e6df339febd97a0aed6aa301454b70798155cc4", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-extensions/2.2.0/lifecycle-extensions-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:2.2.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.arch.core:core-common:2.1.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0.aar" - ], - "sha256": "5951f882e95b7e05ceb9adfca0fa2ebd511d63ea5a00da4eae6c6d0c1903da18", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:sources:2.2.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0-sources.jar" - ], - "sha256": "d962111f3f83b59b90c7fee2f1c47a6532629cebc01c407be39adf34e4d0d09c", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core-ktx/2.2.0/lifecycle-livedata-core-ktx-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-livedata-core:2.2.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:2.1.0", - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.arch.core:core-common:2.1.0" - ], - "directDependencies": [ - "androidx.arch.core:core-common:2.1.0", - "androidx.arch.core:core-runtime:aar:2.1.0", - "androidx.lifecycle:lifecycle-common:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0.aar" - ], - "sha256": "556c1f3af90aa9d7d0d330565adbf6da71b2429148bac91e07c485f4f9abf614", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "dependencies": [ - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0-sources.jar" - ], - "sha256": "80de3a26fdd5857fea39d339a4d11e19c151a45ae52a16a4e237e0b4a50e10c4", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-core/2.2.0/lifecycle-livedata-core-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0", - "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:2.2.0", - "androidx.arch.core:core-common:2.1.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:2.2.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0.aar" - ], - "sha256": "69c3532a70d39adfa13458c9e06d7adcd88a2259f5e9ea517cc7eed26c5fc491", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-livedata-ktx:jar:sources:2.2.0", - "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:sources:2.2.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0-sources.jar" - ], - "sha256": "3b1a5683ffecf2f5ec7879db1b7debf03d94b49db0bc4e2cf49d340e194fa437", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.arch.core:core-common:2.1.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "androidx.arch.core:core-common:2.1.0", - "androidx.arch.core:core-runtime:aar:2.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0.aar" - ], - "sha256": "d83af94860aa9f64cbdc51f40796a7cf55b116f0e6efd752e845c0104c8b16f6", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "directDependencies": [ - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0-sources.jar" - ], - "sha256": "f774d6018dbc7f56c278130122e608d96304f8bd78e4778d44855a01f5982d13", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-livedata/2.2.0/lifecycle-livedata-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-process:aar:2.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.arch.core:core-common:2.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0.aar" - ], - "sha256": "3a977e7778fc8418742d388409daaba7ea8fea8823d21ffb96e4c4236f715070", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-process:aar:sources:2.2.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0-sources.jar" - ], - "sha256": "2a1f34b433f339ea4f93da82bf511deb4baaabca417271a55578b3c86e1373b1", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-process/2.2.0/lifecycle-process-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-runtime:2.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.arch.core:core-common:2.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.arch.core:core-common:2.1.0", - "androidx.lifecycle:lifecycle-common:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0.aar" - ], - "sha256": "2f866c07a1f33a8c9bb69a9545d4f20b4f0628cd0a155432386d7cb081e1e0bc", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "dependencies": [ - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0-sources.jar" - ], - "sha256": "3b7867671a7875525358a71e81adf66ba4d2a45cf2b53ffe5ad0350e3ea06362", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-runtime/2.2.0/lifecycle-runtime-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-service:aar:2.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.arch.core:core-common:2.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0.aar" - ], - "sha256": "ca2801ffc069555afed8eddd2292130f436956452bc8bbad30fb56f8e4e382a0", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-service:aar:sources:2.2.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0-sources.jar" - ], - "sha256": "672b07e4607fc897672d2794af751724306d418e7892b636002be8e3b78fc08c", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-service/2.2.0/lifecycle-service-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0.aar" - ], - "sha256": "f791001f2211947e56ad3d96d12c9ae93fc5589b88f08603f69a2265c9a7d702", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:sources:2.2.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources:1.4.1", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources:1.4.1" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0-sources.jar" - ], - "sha256": "9cab05f9a642bdcb8628d4e353efa1dc2784cdc5c337687470edd0c2cd2071a3", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-ktx/2.2.0/lifecycle-viewmodel-ktx-2.2.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:1.0.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.annotation:annotation:1.1.0", - "androidx.savedstate:savedstate:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.arch.core:core-common:2.1.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.savedstate:savedstate:aar:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0.aar" - ], - "sha256": "f4cceafbf86acfc7f3ba6a61d6dc6842a6738c1274610767d3ab8f8a114cba97", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:sources:1.0.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.savedstate:savedstate:aar:sources:1.0.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.savedstate:savedstate:aar:sources:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0-sources.jar" - ], - "sha256": "4f49bba528977fd1873796623dc5f6669a6e72a5b3b624c7cea2d9285b995dd9", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel-savedstate/1.0.0/lifecycle-viewmodel-savedstate-1.0.0-sources.jar" - }, - { - "coord": "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0.aar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0.aar", - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0.aar" - ], - "sha256": "967efab24d6c49dd414a8c0ac4a1cd09b018f0b8bb43b739ad360c4158ebde27", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0.aar" - }, - { - "coord": "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0-sources.jar", - "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0-sources.jar" - ], - "sha256": "e0eae37c00d8cb41817ed95712083c75e3a4e3f7815de04519a8200ec155ec3c", - "url": "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0/lifecycle-viewmodel-2.2.0-sources.jar" - }, - { - "coord": "androidx.loader:loader:aar:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/loader/loader/1.0.0/loader-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/loader/loader/1.0.0/loader-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/loader/loader/1.0.0/loader-1.0.0.aar", - "https://maven.fabric.io/public/androidx/loader/loader/1.0.0/loader-1.0.0.aar", - "https://maven.google.com/androidx/loader/loader/1.0.0/loader-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/loader/loader/1.0.0/loader-1.0.0.aar" - ], - "sha256": "11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025", - "url": "https://maven.google.com/androidx/loader/loader/1.0.0/loader-1.0.0.aar" - }, - { - "coord": "androidx.loader:loader:aar:sources:1.0.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/loader/loader/1.0.0/loader-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/loader/loader/1.0.0/loader-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/loader/loader/1.0.0/loader-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/loader/loader/1.0.0/loader-1.0.0-sources.jar", - "https://maven.google.com/androidx/loader/loader/1.0.0/loader-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/loader/loader/1.0.0/loader-1.0.0-sources.jar" - ], - "sha256": "efcbafaac8fc06bd5b162b57ac1e146d11919b79dea2202339470c931cecdc67", - "url": "https://maven.google.com/androidx/loader/loader/1.0.0/loader-1.0.0-sources.jar" - }, - { - "coord": "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0.aar", - "https://maven.fabric.io/public/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0.aar", - "https://maven.google.com/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0.aar" - ], - "sha256": "e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8", - "url": "https://maven.google.com/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0.aar" - }, - { - "coord": "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0-sources.jar", - "https://maven.google.com/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0-sources.jar" - ], - "sha256": "952b8567a76d6484aa96f9712b9dc90f21b83a73e2496daf243e2e1adfb65dd4", - "url": "https://maven.google.com/androidx/localbroadcastmanager/localbroadcastmanager/1.0.0/localbroadcastmanager-1.0.0-sources.jar" - }, - { - "coord": "androidx.multidex:multidex-instrumentation:2.0.0", - "dependencies": [ - "androidx.multidex:multidex:2.0.1" - ], - "directDependencies": [ - "androidx.multidex:multidex:2.0.1" - ], - "file": "v1/https/maven.google.com/androidx/multidex/multidex-instrumentation/2.0.0/multidex-instrumentation-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/multidex/multidex-instrumentation/2.0.0/multidex-instrumentation-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/multidex/multidex-instrumentation/2.0.0/multidex-instrumentation-2.0.0.aar", - "https://maven.fabric.io/public/androidx/multidex/multidex-instrumentation/2.0.0/multidex-instrumentation-2.0.0.aar", - "https://maven.google.com/androidx/multidex/multidex-instrumentation/2.0.0/multidex-instrumentation-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/multidex/multidex-instrumentation/2.0.0/multidex-instrumentation-2.0.0.aar" - ], - "sha256": "fb8115694b1731c23c1bbb628f5baaee37a8f3b50d69a7733b55278e101e1488", - "url": "https://maven.google.com/androidx/multidex/multidex-instrumentation/2.0.0/multidex-instrumentation-2.0.0.aar" - }, - { - "coord": "androidx.multidex:multidex:2.0.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/multidex/multidex/2.0.1/multidex-2.0.1.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/multidex/multidex/2.0.1/multidex-2.0.1.aar", - "https://repo1.maven.org/maven2/androidx/multidex/multidex/2.0.1/multidex-2.0.1.aar", - "https://maven.fabric.io/public/androidx/multidex/multidex/2.0.1/multidex-2.0.1.aar", - "https://maven.google.com/androidx/multidex/multidex/2.0.1/multidex-2.0.1.aar", - "https://repo1.maven.org/maven2/androidx/multidex/multidex/2.0.1/multidex-2.0.1.aar" - ], - "sha256": "42dd32ff9f97f85771b82a20003a8d70f68ab7b4ba328964312ce0732693db09", - "url": "https://maven.google.com/androidx/multidex/multidex/2.0.1/multidex-2.0.1.aar" - }, - { - "coord": "androidx.multidex:multidex:jar:sources:2.0.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/multidex/multidex/2.0.1/multidex-2.0.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/multidex/multidex/2.0.1/multidex-2.0.1-sources.jar", - "https://repo1.maven.org/maven2/androidx/multidex/multidex/2.0.1/multidex-2.0.1-sources.jar", - "https://maven.fabric.io/public/androidx/multidex/multidex/2.0.1/multidex-2.0.1-sources.jar", - "https://maven.google.com/androidx/multidex/multidex/2.0.1/multidex-2.0.1-sources.jar", - "https://repo1.maven.org/maven2/androidx/multidex/multidex/2.0.1/multidex-2.0.1-sources.jar" - ], - "sha256": "b0d707d4074dd1996d0780e0b84478d4ca54515de38fe8df542fbafc44ba2b20", - "url": "https://maven.google.com/androidx/multidex/multidex/2.0.1/multidex-2.0.1-sources.jar" - }, - { - "coord": "androidx.navigation:navigation-common-ktx:aar:2.0.0", - "dependencies": [ - "androidx.navigation:navigation-common:aar:2.0.0", - "androidx.collection:collection:1.1.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.collection:collection:1.1.0", - "androidx.navigation:navigation-common:aar:2.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0.aar", - "https://maven.fabric.io/public/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0.aar", - "https://maven.google.com/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0.aar" - ], - "sha256": "ed00b6f73d8acc7e06729f5f19cdeb410ca1d0e45afbcf6ff435a1091c3a3d57", - "url": "https://maven.google.com/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0.aar" - }, - { - "coord": "androidx.navigation:navigation-common-ktx:aar:sources:2.0.0", - "dependencies": [ - "androidx.navigation:navigation-common:aar:sources:2.0.0", - "androidx.core:core:aar:sources:1.3.1", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "androidx.collection:collection:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.navigation:navigation-common:aar:sources:2.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0-sources.jar", - "https://maven.google.com/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0-sources.jar" - ], - "sha256": "5c5c19c604b95ef8e2a37e3c56817c605eeaa687e48924bbb6a07641c504ae6a", - "url": "https://maven.google.com/androidx/navigation/navigation-common-ktx/2.0.0/navigation-common-ktx-2.0.0-sources.jar" - }, - { - "coord": "androidx.navigation:navigation-common:aar:2.0.0", - "dependencies": [ - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0.aar", - "https://maven.fabric.io/public/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0.aar", - "https://maven.google.com/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0.aar" - ], - "sha256": "542ec6f993b6d3bfafe2e53e0f250b8685331e2a0258f9313af9ee3376f93959", - "url": "https://maven.google.com/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0.aar" - }, - { - "coord": "androidx.navigation:navigation-common:aar:sources:2.0.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0-sources.jar", - "https://maven.google.com/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0-sources.jar" - ], - "sha256": "f183a513b99f071dafa39d59fc474f11c8e8012f62f250d4d8d5463f259bc495", - "url": "https://maven.google.com/androidx/navigation/navigation-common/2.0.0/navigation-common-2.0.0-sources.jar" - }, - { - "coord": "androidx.navigation:navigation-fragment-ktx:2.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.navigation:navigation-fragment:aar:2.0.0", - "androidx.navigation:navigation-common-ktx:aar:2.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.navigation:navigation-runtime-ktx:aar:2.0.0", - "androidx.navigation:navigation-common:aar:2.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "androidx.navigation:navigation-runtime:aar:2.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.navigation:navigation-fragment:aar:2.0.0", - "androidx.navigation:navigation-runtime-ktx:aar:2.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0.aar", - "https://maven.fabric.io/public/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0.aar", - "https://maven.google.com/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0.aar" - ], - "sha256": "8ad7b7ed765009271cc0fe97ea925b3fbd90a9bc80aeefb2708a554d7330b8d3", - "url": "https://maven.google.com/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0.aar" - }, - { - "coord": "androidx.navigation:navigation-fragment-ktx:jar:sources:2.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "androidx.navigation:navigation-common-ktx:aar:sources:2.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.navigation:navigation-runtime:aar:sources:2.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.navigation:navigation-fragment:aar:sources:2.0.0", - "androidx.navigation:navigation-common:aar:sources:2.0.0", - "androidx.loader:loader:aar:sources:1.0.0", - "androidx.navigation:navigation-runtime-ktx:aar:sources:2.0.0" - ], - "directDependencies": [ - "androidx.navigation:navigation-fragment:aar:sources:2.0.0", - "androidx.navigation:navigation-runtime-ktx:aar:sources:2.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0-sources.jar", - "https://maven.google.com/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0-sources.jar" - ], - "sha256": "482878c8b556ee07e9fd13fe9feee654fcbc984aa5224bfe7a5119796000020f", - "url": "https://maven.google.com/androidx/navigation/navigation-fragment-ktx/2.0.0/navigation-fragment-ktx-2.0.0-sources.jar" - }, - { - "coord": "androidx.navigation:navigation-fragment:2.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.navigation:navigation-common:aar:2.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.navigation:navigation-runtime:aar:2.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.fragment:fragment:aar:1.2.0", - "androidx.navigation:navigation-runtime:aar:2.0.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0.aar", - "https://maven.fabric.io/public/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0.aar", - "https://maven.google.com/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0.aar" - ], - "sha256": "38ddf1afc99a0585904f2121eee7131fef13595e64c9bb6b22f68dd66b8d1f9c", - "url": "https://maven.google.com/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0.aar" - }, - { - "coord": "androidx.navigation:navigation-fragment:aar:sources:2.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.navigation:navigation-runtime:aar:sources:2.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.navigation:navigation-common:aar:sources:2.0.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "directDependencies": [ - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.navigation:navigation-runtime:aar:sources:2.0.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0-sources.jar", - "https://maven.google.com/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0-sources.jar" - ], - "sha256": "bc3a5b4153f886f11c5e0ab5fcba2f329beaeb5c2fa00c9b7f176884a20c0ece", - "url": "https://maven.google.com/androidx/navigation/navigation-fragment/2.0.0/navigation-fragment-2.0.0-sources.jar" - }, - { - "coord": "androidx.navigation:navigation-runtime-ktx:aar:2.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.navigation:navigation-common-ktx:aar:2.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.navigation:navigation-common:aar:2.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "androidx.navigation:navigation-runtime:aar:2.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.navigation:navigation-common-ktx:aar:2.0.0", - "androidx.navigation:navigation-runtime:aar:2.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0.aar", - "https://maven.fabric.io/public/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0.aar", - "https://maven.google.com/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0.aar" - ], - "sha256": "41f1145f9aca5a7d97567dfe08924ec1cebcc72cb2c5d6d1a1cd31a780669358", - "url": "https://maven.google.com/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0.aar" - }, - { - "coord": "androidx.navigation:navigation-runtime-ktx:aar:sources:2.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "androidx.navigation:navigation-common-ktx:aar:sources:2.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.navigation:navigation-runtime:aar:sources:2.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.navigation:navigation-common:aar:sources:2.0.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "directDependencies": [ - "androidx.navigation:navigation-common-ktx:aar:sources:2.0.0", - "androidx.navigation:navigation-runtime:aar:sources:2.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0-sources.jar", - "https://maven.google.com/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0-sources.jar" - ], - "sha256": "7d82617dd32bfc2354d568826a465fd40aaf7eb38efd1fbc126703e86f534613", - "url": "https://maven.google.com/androidx/navigation/navigation-runtime-ktx/2.0.0/navigation-runtime-ktx-2.0.0-sources.jar" - }, - { - "coord": "androidx.navigation:navigation-runtime:aar:2.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.navigation:navigation-common:aar:2.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.navigation:navigation-common:aar:2.0.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0.aar", - "https://maven.fabric.io/public/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0.aar", - "https://maven.google.com/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0.aar" - ], - "sha256": "903cd93d3424300ff048a92086d773cfc5e23f928063d4493a45b4b042f2a550", - "url": "https://maven.google.com/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0.aar" - }, - { - "coord": "androidx.navigation:navigation-runtime:aar:sources:2.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.navigation:navigation-common:aar:sources:2.0.0", - "androidx.loader:loader:aar:sources:1.0.0" - ], - "directDependencies": [ - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.navigation:navigation-common:aar:sources:2.0.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0-sources.jar", - "https://maven.google.com/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0-sources.jar" - ], - "sha256": "266f7224c7d769f356cd03aa47c248eea61d3e1fb62ff75215657b2b7ee917a5", - "url": "https://maven.google.com/androidx/navigation/navigation-runtime/2.0.0/navigation-runtime-2.0.0-sources.jar" - }, - { - "coord": "androidx.navigation:navigation-ui-ktx:2.0.0", - "dependencies": [ - "androidx.navigation:navigation-ui:aar:2.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.navigation:navigation-common-ktx:aar:2.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.navigation:navigation-runtime-ktx:aar:2.0.0", - "com.google.android.material:material:1.3.0", - "androidx.navigation:navigation-common:aar:2.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "androidx.navigation:navigation-runtime:aar:2.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.navigation:navigation-runtime-ktx:aar:2.0.0", - "androidx.navigation:navigation-ui:aar:2.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0.aar", - "https://maven.fabric.io/public/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0.aar", - "https://maven.google.com/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0.aar" - ], - "sha256": "fb28826b4eb20a53e9398576bb9e7a3215cf970e99a05d7ccc0422d5978fa915", - "url": "https://maven.google.com/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0.aar" - }, - { - "coord": "androidx.navigation:navigation-ui-ktx:jar:sources:2.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "androidx.navigation:navigation-common-ktx:aar:sources:2.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.navigation:navigation-runtime:aar:sources:2.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.navigation:navigation-ui:aar:sources:2.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.navigation:navigation-common:aar:sources:2.0.0", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.material:material:jar:sources:1.3.0", - "androidx.navigation:navigation-runtime-ktx:aar:sources:2.0.0" - ], - "directDependencies": [ - "androidx.navigation:navigation-runtime-ktx:aar:sources:2.0.0", - "androidx.navigation:navigation-ui:aar:sources:2.0.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0-sources.jar", - "https://maven.google.com/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0-sources.jar" - ], - "sha256": "a6bd9b53e81130e6ee53294df495c114ef136517c330c7aac19ed979087815a3", - "url": "https://maven.google.com/androidx/navigation/navigation-ui-ktx/2.0.0/navigation-ui-ktx-2.0.0-sources.jar" - }, - { - "coord": "androidx.navigation:navigation-ui:2.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.material:material:1.3.0", - "androidx.navigation:navigation-common:aar:2.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.navigation:navigation-runtime:aar:2.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.navigation:navigation-runtime:aar:2.0.0", - "com.google.android.material:material:1.3.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0.aar", - "https://maven.fabric.io/public/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0.aar", - "https://maven.google.com/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0.aar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0.aar" - ], - "sha256": "d6edc08d69268967d11336bd8c2dce1f154f0ae8117be9874895f6974123ed20", - "url": "https://maven.google.com/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0.aar" - }, - { - "coord": "androidx.navigation:navigation-ui:aar:sources:2.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.navigation:navigation-runtime:aar:sources:2.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.navigation:navigation-common:aar:sources:2.0.0", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.material:material:jar:sources:1.3.0" - ], - "directDependencies": [ - "androidx.navigation:navigation-runtime:aar:sources:2.0.0", - "com.google.android.material:material:jar:sources:1.3.0" - ], - "file": "v1/https/maven.google.com/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0-sources.jar", - "https://maven.google.com/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0-sources.jar" - ], - "sha256": "60565a3ce3a9aed5a85ab4bcc1c60a516d026ad09ad26e2ecfd3899f0bd8740c", - "url": "https://maven.google.com/androidx/navigation/navigation-ui/2.0.0/navigation-ui-2.0.0-sources.jar" - }, - { - "coord": "androidx.print:print:aar:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/print/print/1.0.0/print-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/print/print/1.0.0/print-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/print/print/1.0.0/print-1.0.0.aar", - "https://maven.fabric.io/public/androidx/print/print/1.0.0/print-1.0.0.aar", - "https://maven.google.com/androidx/print/print/1.0.0/print-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/print/print/1.0.0/print-1.0.0.aar" - ], - "sha256": "1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd", - "url": "https://maven.google.com/androidx/print/print/1.0.0/print-1.0.0.aar" - }, - { - "coord": "androidx.print:print:aar:sources:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/print/print/1.0.0/print-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/print/print/1.0.0/print-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/print/print/1.0.0/print-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/print/print/1.0.0/print-1.0.0-sources.jar", - "https://maven.google.com/androidx/print/print/1.0.0/print-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/print/print/1.0.0/print-1.0.0-sources.jar" - ], - "sha256": "659b6e2047484dbae409b9b49c19f9ebd9540bb7ef3610438e2c2b15064fc217", - "url": "https://maven.google.com/androidx/print/print/1.0.0/print-1.0.0-sources.jar" - }, - { - "coord": "androidx.recyclerview:recyclerview:1.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.customview:customview:aar:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.customview:customview:aar:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0.aar", - "https://maven.fabric.io/public/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0.aar", - "https://maven.google.com/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0.aar" - ], - "sha256": "f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f", - "url": "https://maven.google.com/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0.aar" - }, - { - "coord": "androidx.recyclerview:recyclerview:aar:sources:1.1.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.customview:customview:aar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.customview:customview:aar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0-sources.jar", - "https://maven.google.com/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0-sources.jar" - ], - "sha256": "7552c8b621d59b68d2dc962d3bbeee8ccaea5b54cf0085adc85059d37584d93c", - "url": "https://maven.google.com/androidx/recyclerview/recyclerview/1.1.0/recyclerview-1.1.0-sources.jar" - }, - { - "coord": "androidx.room:room-common:2.2.5", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/room/room-common/2.2.5/room-common-2.2.5.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/room/room-common/2.2.5/room-common-2.2.5.jar", - "https://repo1.maven.org/maven2/androidx/room/room-common/2.2.5/room-common-2.2.5.jar", - "https://maven.fabric.io/public/androidx/room/room-common/2.2.5/room-common-2.2.5.jar", - "https://maven.google.com/androidx/room/room-common/2.2.5/room-common-2.2.5.jar", - "https://repo1.maven.org/maven2/androidx/room/room-common/2.2.5/room-common-2.2.5.jar" - ], - "sha256": "2b130dd4a1d3d91b6701ed33096d389f01c4fc1197a7acd6b91724ddc5acfc06", - "url": "https://maven.google.com/androidx/room/room-common/2.2.5/room-common-2.2.5.jar" - }, - { - "coord": "androidx.room:room-common:jar:sources:2.2.5", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/room/room-common/2.2.5/room-common-2.2.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/room/room-common/2.2.5/room-common-2.2.5-sources.jar", - "https://repo1.maven.org/maven2/androidx/room/room-common/2.2.5/room-common-2.2.5-sources.jar", - "https://maven.fabric.io/public/androidx/room/room-common/2.2.5/room-common-2.2.5-sources.jar", - "https://maven.google.com/androidx/room/room-common/2.2.5/room-common-2.2.5-sources.jar", - "https://repo1.maven.org/maven2/androidx/room/room-common/2.2.5/room-common-2.2.5-sources.jar" - ], - "sha256": "c78682d9435986ceec6a3349d22474f13e1aa3ec62d5aea01aacb5018c2fc2d2", - "url": "https://maven.google.com/androidx/room/room-common/2.2.5/room-common-2.2.5-sources.jar" - }, - { - "coord": "androidx.room:room-runtime:2.2.5", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.room:room-common:2.2.5", - "androidx.sqlite:sqlite:aar:2.1.0", - "androidx.sqlite:sqlite-framework:aar:2.1.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "androidx.arch.core:core-runtime:aar:2.1.0", - "androidx.room:room-common:2.2.5", - "androidx.sqlite:sqlite:aar:2.1.0", - "androidx.sqlite:sqlite-framework:aar:2.1.0" - ], - "file": "v1/https/maven.google.com/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5.aar", - "https://repo1.maven.org/maven2/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5.aar", - "https://maven.fabric.io/public/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5.aar", - "https://maven.google.com/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5.aar", - "https://repo1.maven.org/maven2/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5.aar" - ], - "sha256": "24a5549b796e43e337513d2908adac67f45350d9a90bca7e2e6120692140bb14", - "url": "https://maven.google.com/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5.aar" - }, - { - "coord": "androidx.room:room-runtime:aar:sources:2.2.5", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.room:room-common:jar:sources:2.2.5", - "androidx.sqlite:sqlite-framework:aar:sources:2.1.0", - "androidx.sqlite:sqlite:aar:sources:2.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.room:room-common:jar:sources:2.2.5", - "androidx.sqlite:sqlite:aar:sources:2.1.0", - "androidx.sqlite:sqlite-framework:aar:sources:2.1.0" - ], - "file": "v1/https/maven.google.com/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5-sources.jar", - "https://repo1.maven.org/maven2/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5-sources.jar", - "https://maven.fabric.io/public/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5-sources.jar", - "https://maven.google.com/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5-sources.jar", - "https://repo1.maven.org/maven2/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5-sources.jar" - ], - "sha256": "d7b194ff380442603a99761f283f607083aff7e4bee541aef98b27211b8fa4ce", - "url": "https://maven.google.com/androidx/room/room-runtime/2.2.5/room-runtime-2.2.5-sources.jar" - }, - { - "coord": "androidx.savedstate:savedstate:aar:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.arch.core:core-common:2.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.arch.core:core-common:2.1.0", - "androidx.lifecycle:lifecycle-common:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0.aar", - "https://maven.fabric.io/public/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0.aar", - "https://maven.google.com/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0.aar" - ], - "sha256": "2510a5619c37579c9ce1a04574faaf323cd0ffe2fc4e20fa8f8f01e5bb402e83", - "url": "https://maven.google.com/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0.aar" - }, - { - "coord": "androidx.savedstate:savedstate:aar:sources:1.0.0", - "dependencies": [ - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.arch.core:core-common:jar:sources:2.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "file": "v1/https/maven.google.com/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0-sources.jar", - "https://maven.google.com/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0-sources.jar" - ], - "sha256": "d6e27205d673e6a89a7ed0513d65376d2a6a00a951f60485659b25d946e8c743", - "url": "https://maven.google.com/androidx/savedstate/savedstate/1.0.0/savedstate-1.0.0-sources.jar" - }, - { - "coord": "androidx.sqlite:sqlite-framework:aar:2.1.0", - "dependencies": [ - "androidx.sqlite:sqlite:aar:2.1.0", - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.sqlite:sqlite:aar:2.1.0" - ], - "file": "v1/https/maven.google.com/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0.aar", - "https://repo1.maven.org/maven2/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0.aar", - "https://maven.fabric.io/public/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0.aar", - "https://maven.google.com/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0.aar", - "https://repo1.maven.org/maven2/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0.aar" - ], - "sha256": "8673737fdb2efbad91aeaeed1927ebb29212d36a867d93b9639c8069019f8a1e", - "url": "https://maven.google.com/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0.aar" - }, - { - "coord": "androidx.sqlite:sqlite-framework:aar:sources:2.1.0", - "dependencies": [ - "androidx.sqlite:sqlite:aar:sources:2.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.sqlite:sqlite:aar:sources:2.1.0" - ], - "file": "v1/https/maven.google.com/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0-sources.jar", - "https://maven.google.com/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0-sources.jar" - ], - "sha256": "5998669629684144592b0c6981c3f5e7935faaeeaa32c691ae58da3c54fb85a9", - "url": "https://maven.google.com/androidx/sqlite/sqlite-framework/2.1.0/sqlite-framework-2.1.0-sources.jar" - }, - { - "coord": "androidx.sqlite:sqlite:aar:2.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0.aar", - "https://repo1.maven.org/maven2/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0.aar", - "https://maven.fabric.io/public/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0.aar", - "https://maven.google.com/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0.aar", - "https://repo1.maven.org/maven2/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0.aar" - ], - "sha256": "8341ff092d6060d62a07227f29237155fff36fb16f96c95fbd9a884e375db912", - "url": "https://maven.google.com/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0.aar" - }, - { - "coord": "androidx.sqlite:sqlite:aar:sources:2.1.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0-sources.jar", - "https://maven.google.com/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0-sources.jar" - ], - "sha256": "db06b388994733ed3a678819fc91b572a92abdd7277fbb856a48969f6df6ecf1", - "url": "https://maven.google.com/androidx/sqlite/sqlite/2.1.0/sqlite-2.1.0-sources.jar" - }, - { - "coord": "androidx.test.espresso:espresso-accessibility:3.1.0", - "dependencies": [ - "org.hamcrest:hamcrest-core:1.3", - "androidx.test.espresso:espresso-core:3.2.0", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0" - ], - "directDependencies": [ - "androidx.test.espresso:espresso-core:3.2.0", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0" - ], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0.aar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0.aar", - "https://maven.google.com/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0.aar" - ], - "sha256": "e2ee8b50081c0b578521d112808321f737f3bf1acce035fe7be0e26ef00b491f", - "url": "https://maven.google.com/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0.aar" - }, - { - "coord": "androidx.test.espresso:espresso-accessibility:jar:sources:3.1.0", - "dependencies": [ - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources:2.0", - "androidx.test.espresso:espresso-core:jar:sources:3.2.0" - ], - "directDependencies": [ - "androidx.test.espresso:espresso-core:jar:sources:3.2.0", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources:2.0" - ], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0-sources.jar", - "https://maven.google.com/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0-sources.jar" - ], - "sha256": "8cbe8f83d472d324ac45372ba71b2004c66e81f8cdab1e1b3202020cfc958c11", - "url": "https://maven.google.com/androidx/test/espresso/espresso-accessibility/3.1.0/espresso-accessibility-3.1.0-sources.jar" - }, - { - "coord": "androidx.test.espresso:espresso-contrib:3.1.0", - "dependencies": [ - "androidx.test.espresso:espresso-core:3.2.0", - "androidx.interpolator:interpolator:aar:1.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.slidingpanelayout:slidingpanelayout:aar:1.0.0", - "org.hamcrest:hamcrest-core:1.3", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.cursoradapter:cursoradapter:aar:1.0.0", - "androidx.drawerlayout:drawerlayout:aar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.core:core:1.3.1", - "com.google.android.material:material:1.3.0", - "androidx.recyclerview:recyclerview:1.1.0", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0", - "androidx.test.espresso:espresso-idling-resource:3.2.0", - "androidx.coordinatorlayout:coordinatorlayout:aar:1.1.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.viewpager:viewpager:aar:1.0.0", - "androidx.asynclayoutinflater:asynclayoutinflater:aar:1.0.0", - "androidx.legacy:legacy-support-core-ui:aar:1.0.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:1.0.0", - "androidx.swiperefreshlayout:swiperefreshlayout:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0", - "androidx.customview:customview:aar:1.1.0" - ], - "directDependencies": [ - "androidx.test.espresso:espresso-core:3.2.0", - "androidx.core:core:1.3.1", - "com.google.android.material:material:1.3.0", - "androidx.recyclerview:recyclerview:1.1.0", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0", - "androidx.test.espresso:espresso-idling-resource:3.2.0", - "androidx.legacy:legacy-support-core-utils:1.0.0" - ], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0.aar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0.aar", - "https://maven.google.com/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0.aar" - ], - "sha256": "277c292f02816b5e49051485b11e612c0ba7d36fc76b7dac955fe37766ec2832", - "url": "https://maven.google.com/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0.aar" - }, - { - "coord": "androidx.test.espresso:espresso-contrib:jar:sources:3.1.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.recyclerview:recyclerview:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.swiperefreshlayout:swiperefreshlayout:aar:sources:1.0.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.coordinatorlayout:coordinatorlayout:aar:sources:1.1.0", - "androidx.test.espresso:espresso-core:jar:sources:3.2.0", - "androidx.core:core:jar:sources:1.3.1", - "androidx.drawerlayout:drawerlayout:aar:sources:1.1.0", - "androidx.viewpager:viewpager:aar:sources:1.0.0", - "androidx.asynclayoutinflater:asynclayoutinflater:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-ui:aar:sources:1.0.0", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources:2.0", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "androidx.legacy:legacy-support-core-utils:jar:sources:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.test.espresso:espresso-idling-resource:jar:sources:3.2.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.cursoradapter:cursoradapter:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.slidingpanelayout:slidingpanelayout:aar:sources:1.0.0", - "androidx.customview:customview:aar:sources:1.1.0", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.material:material:jar:sources:1.3.0" - ], - "directDependencies": [ - "androidx.recyclerview:recyclerview:jar:sources:1.1.0", - "androidx.test.espresso:espresso-core:jar:sources:3.2.0", - "androidx.core:core:jar:sources:1.3.1", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources:2.0", - "androidx.legacy:legacy-support-core-utils:jar:sources:1.0.0", - "androidx.test.espresso:espresso-idling-resource:jar:sources:3.2.0", - "com.google.android.material:material:jar:sources:1.3.0" - ], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0-sources.jar", - "https://maven.google.com/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0-sources.jar" - ], - "sha256": "a64d9cc5469b32a4f65e5b14021cfa27d9ba04733f7ca04aef644207c1d399b9", - "url": "https://maven.google.com/androidx/test/espresso/espresso-contrib/3.1.0/espresso-contrib-3.1.0-sources.jar" - }, - { - "coord": "androidx.test.espresso:espresso-core:3.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.test:monitor:1.4.0", - "com.google.code.findbugs:jsr305:3.0.2", - "org.hamcrest:hamcrest-library:1.3", - "androidx.test:runner:1.2.0", - "org.hamcrest:hamcrest-integration:1.3", - "org.hamcrest:hamcrest-core:1.3", - "androidx.test.espresso:espresso-idling-resource:3.2.0", - "com.squareup:javawriter:2.1.1", - "javax.inject:javax.inject:1", - "junit:junit:4.13.2", - "net.sf.kxml:kxml2:2.3.0" - ], - "directDependencies": [ - "com.google.code.findbugs:jsr305:3.0.2", - "org.hamcrest:hamcrest-library:1.3", - "androidx.test:runner:1.2.0", - "org.hamcrest:hamcrest-integration:1.3", - "androidx.test.espresso:espresso-idling-resource:3.2.0", - "com.squareup:javawriter:2.1.1", - "javax.inject:javax.inject:1" - ], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0.aar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0.aar", - "https://maven.google.com/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0.aar" - ], - "sha256": "beb4712c2520c1da30ac1f25506871f16ea5b83ee686ece5a258769df1a01e15", - "url": "https://maven.google.com/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0.aar" - }, - { - "coord": "androidx.test.espresso:espresso-core:jar:sources:3.2.0", - "dependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "androidx.test:monitor:jar:sources:1.4.0", - "org.hamcrest:hamcrest-integration:jar:sources:1.3", - "junit:junit:jar:sources:4.13.2", - "com.squareup:javawriter:jar:sources:2.1.1", - "javax.inject:javax.inject:jar:sources:1", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "androidx.test.espresso:espresso-idling-resource:jar:sources:3.2.0", - "org.hamcrest:hamcrest-library:jar:sources:1.3", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.test:runner:jar:sources:1.2.0", - "net.sf.kxml:kxml2:jar:sources:2.3.0" - ], - "directDependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "org.hamcrest:hamcrest-integration:jar:sources:1.3", - "com.squareup:javawriter:jar:sources:2.1.1", - "javax.inject:javax.inject:jar:sources:1", - "androidx.test.espresso:espresso-idling-resource:jar:sources:3.2.0", - "org.hamcrest:hamcrest-library:jar:sources:1.3", - "androidx.test:runner:jar:sources:1.2.0" - ], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0-sources.jar", - "https://maven.google.com/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0-sources.jar" - ], - "sha256": "08d443f440e8b4fdd5eb4dbc5447264d79350fa7fbc256762b86f1c9fabb6b07", - "url": "https://maven.google.com/androidx/test/espresso/espresso-core/3.2.0/espresso-core-3.2.0-sources.jar" - }, - { - "coord": "androidx.test.espresso:espresso-idling-resource:3.2.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0.aar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0.aar", - "https://maven.google.com/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0.aar" - ], - "sha256": "c1a0454fe95788122ba652c3ecff7ec538c7e27de206aed970f2809fb8090d09", - "url": "https://maven.google.com/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0.aar" - }, - { - "coord": "androidx.test.espresso:espresso-idling-resource:jar:sources:3.2.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0-sources.jar", - "https://maven.google.com/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0-sources.jar" - ], - "sha256": "38935cd32b5c0a868eb3a3cda9465004867d08e631bf872ffa8bbb158b3d32fc", - "url": "https://maven.google.com/androidx/test/espresso/espresso-idling-resource/3.2.0/espresso-idling-resource-3.2.0-sources.jar" - }, - { - "coord": "androidx.test.espresso:espresso-intents:3.1.0", - "dependencies": [ - "androidx.test:rules:1.1.0", - "androidx.test.espresso:espresso-core:3.2.0", - "androidx.test:runner:1.2.0" - ], - "directDependencies": [ - "androidx.test:rules:1.1.0", - "androidx.test.espresso:espresso-core:3.2.0" - ], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0.aar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0.aar", - "https://maven.google.com/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0.aar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0.aar" - ], - "sha256": "6c252ea1221a7973301b62d1695d4d73cb1b7c0853ee2ffdb8274886148f0af6", - "url": "https://maven.google.com/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0.aar" - }, - { - "coord": "androidx.test.espresso:espresso-intents:jar:sources:3.1.0", - "dependencies": [ - "androidx.test:rules:jar:sources:1.1.0", - "androidx.test:runner:jar:sources:1.2.0", - "androidx.test.espresso:espresso-core:jar:sources:3.2.0" - ], - "directDependencies": [ - "androidx.test:rules:jar:sources:1.1.0", - "androidx.test.espresso:espresso-core:jar:sources:3.2.0" - ], - "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0-sources.jar", - "https://maven.google.com/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0-sources.jar" - ], - "sha256": "133aa31a977ff67ce17b27d9d10cc2d3ca339e1fd538488feee6150f1b6552d7", - "url": "https://maven.google.com/androidx/test/espresso/espresso-intents/3.1.0/espresso-intents-3.1.0-sources.jar" - }, - { - "coord": "androidx.test.ext:junit:1.1.1", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.test:monitor:1.4.0", - "org.hamcrest:hamcrest-core:1.3", - "androidx.test:core:1.4.0", - "junit:junit:4.13.2" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.test:core:1.4.0", - "androidx.test:monitor:1.4.0", - "junit:junit:4.13.2" - ], - "file": "v1/https/maven.google.com/androidx/test/ext/junit/1.1.1/junit-1.1.1.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/ext/junit/1.1.1/junit-1.1.1.aar", - "https://repo1.maven.org/maven2/androidx/test/ext/junit/1.1.1/junit-1.1.1.aar", - "https://maven.fabric.io/public/androidx/test/ext/junit/1.1.1/junit-1.1.1.aar", - "https://maven.google.com/androidx/test/ext/junit/1.1.1/junit-1.1.1.aar", - "https://repo1.maven.org/maven2/androidx/test/ext/junit/1.1.1/junit-1.1.1.aar" - ], - "sha256": "449df418d2916a0f86fe7dafb1edb09480fafb6e995d5c751c7d0d1970d4ae72", - "url": "https://maven.google.com/androidx/test/ext/junit/1.1.1/junit-1.1.1.aar" - }, - { - "coord": "androidx.test.ext:junit:jar:sources:1.1.1", - "dependencies": [ - "androidx.test:monitor:jar:sources:1.4.0", - "androidx.test:core:jar:sources:1.4.0", - "junit:junit:jar:sources:4.13.2", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.test:core:jar:sources:1.4.0", - "androidx.test:monitor:jar:sources:1.4.0", - "junit:junit:jar:sources:4.13.2" - ], - "file": "v1/https/maven.google.com/androidx/test/ext/junit/1.1.1/junit-1.1.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/ext/junit/1.1.1/junit-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/ext/junit/1.1.1/junit-1.1.1-sources.jar", - "https://maven.fabric.io/public/androidx/test/ext/junit/1.1.1/junit-1.1.1-sources.jar", - "https://maven.google.com/androidx/test/ext/junit/1.1.1/junit-1.1.1-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/ext/junit/1.1.1/junit-1.1.1-sources.jar" - ], - "sha256": "e8abb0752a123d337be4cced50298067a8340135e64f0a24ff52345ed20cd292", - "url": "https://maven.google.com/androidx/test/ext/junit/1.1.1/junit-1.1.1-sources.jar" - }, - { - "coord": "androidx.test.ext:truth:1.4.0", - "dependencies": [ - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.annotation:annotation:1.1.0", - "com.google.truth:truth:1.1.3", - "androidx.test:monitor:1.4.0", - "com.google.guava:guava:30.1.1-android", - "androidx.test:core:1.4.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.test:core:1.4.0", - "com.google.guava:guava:30.1.1-android", - "com.google.truth:truth:1.1.3" - ], - "file": "v1/https/maven.google.com/androidx/test/ext/truth/1.4.0/truth-1.4.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/ext/truth/1.4.0/truth-1.4.0.aar", - "https://repo1.maven.org/maven2/androidx/test/ext/truth/1.4.0/truth-1.4.0.aar", - "https://maven.fabric.io/public/androidx/test/ext/truth/1.4.0/truth-1.4.0.aar", - "https://maven.google.com/androidx/test/ext/truth/1.4.0/truth-1.4.0.aar", - "https://repo1.maven.org/maven2/androidx/test/ext/truth/1.4.0/truth-1.4.0.aar" - ], - "sha256": "d067a9bdd009b08d4230f8283cb4579a1183ef45bbfa169fd6d0f112d6c324f6", - "url": "https://maven.google.com/androidx/test/ext/truth/1.4.0/truth-1.4.0.aar" - }, - { - "coord": "androidx.test.ext:truth:jar:sources:1.4.0", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "androidx.test:monitor:jar:sources:1.4.0", - "androidx.test:core:jar:sources:1.4.0", - "com.google.truth:truth:jar:sources:1.1.3", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.test:core:jar:sources:1.4.0", - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.google.truth:truth:jar:sources:1.1.3" - ], - "file": "v1/https/maven.google.com/androidx/test/ext/truth/1.4.0/truth-1.4.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/ext/truth/1.4.0/truth-1.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/ext/truth/1.4.0/truth-1.4.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/ext/truth/1.4.0/truth-1.4.0-sources.jar", - "https://maven.google.com/androidx/test/ext/truth/1.4.0/truth-1.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/ext/truth/1.4.0/truth-1.4.0-sources.jar" - ], - "sha256": "7c7d5f0b67046f2da28ad2b99e6af9fe7b228a4420dc5863e7428be3b8f928df", - "url": "https://maven.google.com/androidx/test/ext/truth/1.4.0/truth-1.4.0-sources.jar" - }, - { - "coord": "androidx.test.uiautomator:uiautomator:2.2.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0.aar", - "https://maven.fabric.io/public/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0.aar", - "https://maven.google.com/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0.aar", - "https://repo1.maven.org/maven2/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0.aar" - ], - "sha256": "2838e9d961dbffefbbd229a2bd4f6f82ac4fb2462975862a9e75e9ed325a3197", - "url": "https://maven.google.com/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0.aar" - }, - { - "coord": "androidx.test.uiautomator:uiautomator:jar:sources:2.2.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0-sources.jar", - "https://maven.google.com/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0-sources.jar" - ], - "sha256": "e1f438106ac0d26b80ecf4fd6ffe6d36f60e12bdcd6316903f802ed24d00be99", - "url": "https://maven.google.com/androidx/test/uiautomator/uiautomator/2.2.0/uiautomator-2.2.0-sources.jar" - }, - { - "coord": "androidx.test:core:1.4.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.test:monitor:1.4.0", - "androidx.lifecycle:lifecycle-common:2.2.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-common:2.2.0", - "androidx.test:monitor:1.4.0" - ], - "file": "v1/https/maven.google.com/androidx/test/core/1.4.0/core-1.4.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/core/1.4.0/core-1.4.0.aar", - "https://repo1.maven.org/maven2/androidx/test/core/1.4.0/core-1.4.0.aar", - "https://maven.fabric.io/public/androidx/test/core/1.4.0/core-1.4.0.aar", - "https://maven.google.com/androidx/test/core/1.4.0/core-1.4.0.aar", - "https://repo1.maven.org/maven2/androidx/test/core/1.4.0/core-1.4.0.aar" - ], - "sha256": "671284e62e393f16ceae1a99a3a9a07bf1aacda29f8fe7b6b884355ef34c09cf", - "url": "https://maven.google.com/androidx/test/core/1.4.0/core-1.4.0.aar" - }, - { - "coord": "androidx.test:core:jar:sources:1.4.0", - "dependencies": [ - "androidx.test:monitor:jar:sources:1.4.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0", - "androidx.test:monitor:jar:sources:1.4.0" - ], - "file": "v1/https/maven.google.com/androidx/test/core/1.4.0/core-1.4.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/core/1.4.0/core-1.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/core/1.4.0/core-1.4.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/core/1.4.0/core-1.4.0-sources.jar", - "https://maven.google.com/androidx/test/core/1.4.0/core-1.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/core/1.4.0/core-1.4.0-sources.jar" - ], - "sha256": "b3125d546acfea278b82250344c83826e872e3f461109daf0948806382603b30", - "url": "https://maven.google.com/androidx/test/core/1.4.0/core-1.4.0-sources.jar" - }, - { - "coord": "androidx.test:monitor:1.4.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/test/monitor/1.4.0/monitor-1.4.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/monitor/1.4.0/monitor-1.4.0.aar", - "https://repo1.maven.org/maven2/androidx/test/monitor/1.4.0/monitor-1.4.0.aar", - "https://maven.fabric.io/public/androidx/test/monitor/1.4.0/monitor-1.4.0.aar", - "https://maven.google.com/androidx/test/monitor/1.4.0/monitor-1.4.0.aar", - "https://repo1.maven.org/maven2/androidx/test/monitor/1.4.0/monitor-1.4.0.aar" - ], - "sha256": "46a912a1e175f27a97521af3f50e5af87c22c49275dd2c57c043740012806325", - "url": "https://maven.google.com/androidx/test/monitor/1.4.0/monitor-1.4.0.aar" - }, - { - "coord": "androidx.test:monitor:aar:sources:1.4.0", - "dependencies": [], - "directDependencies": [], - "exclusions": [ - "*:*" - ], - "file": "v1/https/maven.google.com/androidx/test/monitor/1.4.0/monitor-1.4.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/monitor/1.4.0/monitor-1.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/monitor/1.4.0/monitor-1.4.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/monitor/1.4.0/monitor-1.4.0-sources.jar", - "https://maven.google.com/androidx/test/monitor/1.4.0/monitor-1.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/monitor/1.4.0/monitor-1.4.0-sources.jar" - ], - "sha256": "a03ea6019c1ee7cc285afdbee98137ec463b891e6fc9176c121c5a70ec727f48", - "url": "https://maven.google.com/androidx/test/monitor/1.4.0/monitor-1.4.0-sources.jar" - }, - { - "coord": "androidx.test:rules:1.1.0", - "dependencies": [ - "androidx.test:runner:1.2.0" - ], - "directDependencies": [ - "androidx.test:runner:1.2.0" - ], - "file": "v1/https/maven.google.com/androidx/test/rules/1.1.0/rules-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/rules/1.1.0/rules-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/test/rules/1.1.0/rules-1.1.0.aar", - "https://maven.fabric.io/public/androidx/test/rules/1.1.0/rules-1.1.0.aar", - "https://maven.google.com/androidx/test/rules/1.1.0/rules-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/test/rules/1.1.0/rules-1.1.0.aar" - ], - "sha256": "0c5c87df67b358c1a17765357138ea1d4bb58c61159ae635b4cb4dcaa3bb5986", - "url": "https://maven.google.com/androidx/test/rules/1.1.0/rules-1.1.0.aar" - }, - { - "coord": "androidx.test:rules:jar:sources:1.1.0", - "dependencies": [ - "androidx.test:runner:jar:sources:1.2.0" - ], - "directDependencies": [ - "androidx.test:runner:jar:sources:1.2.0" - ], - "file": "v1/https/maven.google.com/androidx/test/rules/1.1.0/rules-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/rules/1.1.0/rules-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/rules/1.1.0/rules-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/rules/1.1.0/rules-1.1.0-sources.jar", - "https://maven.google.com/androidx/test/rules/1.1.0/rules-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/rules/1.1.0/rules-1.1.0-sources.jar" - ], - "sha256": "644ab3c4a55fea00bc36c814ca52abf8d0aacc43a685ff80ae033c534ec18dcb", - "url": "https://maven.google.com/androidx/test/rules/1.1.0/rules-1.1.0-sources.jar" - }, - { - "coord": "androidx.test:runner:1.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.test:monitor:1.4.0", - "org.hamcrest:hamcrest-core:1.3", - "junit:junit:4.13.2", - "net.sf.kxml:kxml2:2.3.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.test:monitor:1.4.0", - "junit:junit:4.13.2", - "net.sf.kxml:kxml2:2.3.0" - ], - "file": "v1/https/maven.google.com/androidx/test/runner/1.2.0/runner-1.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/runner/1.2.0/runner-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/test/runner/1.2.0/runner-1.2.0.aar", - "https://maven.fabric.io/public/androidx/test/runner/1.2.0/runner-1.2.0.aar", - "https://maven.google.com/androidx/test/runner/1.2.0/runner-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/test/runner/1.2.0/runner-1.2.0.aar" - ], - "sha256": "5387e011167a3c8da08d99b5d59248c0e2da839317b48ebf202e31dc1f791ec1", - "url": "https://maven.google.com/androidx/test/runner/1.2.0/runner-1.2.0.aar" - }, - { - "coord": "androidx.test:runner:jar:sources:1.2.0", - "dependencies": [ - "androidx.test:monitor:jar:sources:1.4.0", - "junit:junit:jar:sources:4.13.2", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "androidx.annotation:annotation:jar:sources:1.1.0", - "net.sf.kxml:kxml2:jar:sources:2.3.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.test:monitor:jar:sources:1.4.0", - "junit:junit:jar:sources:4.13.2", - "net.sf.kxml:kxml2:jar:sources:2.3.0" - ], - "file": "v1/https/maven.google.com/androidx/test/runner/1.2.0/runner-1.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/test/runner/1.2.0/runner-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/runner/1.2.0/runner-1.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/test/runner/1.2.0/runner-1.2.0-sources.jar", - "https://maven.google.com/androidx/test/runner/1.2.0/runner-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/test/runner/1.2.0/runner-1.2.0-sources.jar" - ], - "sha256": "ec71974ddd8245a85ca856577c70972fd4c484f715df0a26271f0c28f8a58739", - "url": "https://maven.google.com/androidx/test/runner/1.2.0/runner-1.2.0-sources.jar" - }, - { - "coord": "androidx.transition:transition:1.2.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/transition/transition/1.2.0/transition-1.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/transition/transition/1.2.0/transition-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/transition/transition/1.2.0/transition-1.2.0.aar", - "https://maven.fabric.io/public/androidx/transition/transition/1.2.0/transition-1.2.0.aar", - "https://maven.google.com/androidx/transition/transition/1.2.0/transition-1.2.0.aar", - "https://repo1.maven.org/maven2/androidx/transition/transition/1.2.0/transition-1.2.0.aar" - ], - "sha256": "a1e059b3bc0b43a58dec0efecdcaa89c82d2bca552ea5bacf6656c46e853157e", - "url": "https://maven.google.com/androidx/transition/transition/1.2.0/transition-1.2.0.aar" - }, - { - "coord": "androidx.transition:transition:jar:sources:1.2.0", - "dependencies": [ - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/transition/transition/1.2.0/transition-1.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/transition/transition/1.2.0/transition-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/transition/transition/1.2.0/transition-1.2.0-sources.jar", - "https://maven.fabric.io/public/androidx/transition/transition/1.2.0/transition-1.2.0-sources.jar", - "https://maven.google.com/androidx/transition/transition/1.2.0/transition-1.2.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/transition/transition/1.2.0/transition-1.2.0-sources.jar" - ], - "sha256": "86febeb3fbb96b93a355ada8a97e5c17355cf709e1bab178d5c4bc73c67c9887", - "url": "https://maven.google.com/androidx/transition/transition/1.2.0/transition-1.2.0-sources.jar" - }, - { - "coord": "androidx.vectordrawable:vectordrawable-animated:1.1.0", - "dependencies": [ - "androidx.interpolator:interpolator:aar:1.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.collection:collection:1.1.0", - "androidx.interpolator:interpolator:aar:1.0.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0.aar", - "https://maven.fabric.io/public/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0.aar", - "https://maven.google.com/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0.aar" - ], - "sha256": "76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8", - "url": "https://maven.google.com/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0.aar" - }, - { - "coord": "androidx.vectordrawable:vectordrawable-animated:aar:sources:1.1.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0-sources.jar", - "https://maven.google.com/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0-sources.jar" - ], - "sha256": "a3880c595965c55fd1bdee0554b99c66e9c28d3311b7ce6242189fc1f554fcf1", - "url": "https://maven.google.com/androidx/vectordrawable/vectordrawable-animated/1.1.0/vectordrawable-animated-1.1.0-sources.jar" - }, - { - "coord": "androidx.vectordrawable:vectordrawable:1.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0.aar", - "https://maven.fabric.io/public/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0.aar", - "https://maven.google.com/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0.aar" - ], - "sha256": "46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26", - "url": "https://maven.google.com/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0.aar" - }, - { - "coord": "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0-sources.jar", - "https://maven.google.com/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0-sources.jar" - ], - "sha256": "a1ae4fccc4ab76a734c10f79adf39262517658a79084bad467c4c6f41c478187", - "url": "https://maven.google.com/androidx/vectordrawable/vectordrawable/1.1.0/vectordrawable-1.1.0-sources.jar" - }, - { - "coord": "androidx.versionedparcelable:versionedparcelable:aar:1.1.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0.aar", - "https://maven.fabric.io/public/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0.aar", - "https://maven.google.com/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0.aar", - "https://repo1.maven.org/maven2/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0.aar" - ], - "sha256": "9a1d77140ac222b7866b5054ee7d159bc1800987ed2d46dd6afdd145abb710c1", - "url": "https://maven.google.com/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0.aar" - }, - { - "coord": "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "dependencies": [ - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0-sources.jar", - "https://maven.fabric.io/public/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0-sources.jar", - "https://maven.google.com/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0-sources.jar" - ], - "sha256": "135016af471acf4cd9583d36ceb779710c6b46812ccaaef7c526d5d60eae6b0b", - "url": "https://maven.google.com/androidx/versionedparcelable/versionedparcelable/1.1.0/versionedparcelable-1.1.0-sources.jar" - }, - { - "coord": "androidx.viewpager2:viewpager2:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.recyclerview:recyclerview:aar:1.1.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.customview:customview:aar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.recyclerview:recyclerview:aar:1.1.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1" - ], - "file": "v1/https/maven.google.com/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0.aar", - "https://maven.fabric.io/public/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0.aar", - "https://maven.google.com/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0.aar" - ], - "sha256": "e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af", - "url": "https://maven.google.com/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0.aar" - }, - { - "coord": "androidx.viewpager2:viewpager2:jar:sources:1.0.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.recyclerview:recyclerview:aar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.customview:customview:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.recyclerview:recyclerview:aar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0-sources.jar", - "https://maven.google.com/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0-sources.jar" - ], - "sha256": "b091618751f3ee04176d8f976077c353d7c902c4aeafc134d18aee3b771f19a1", - "url": "https://maven.google.com/androidx/viewpager2/viewpager2/1.0.0/viewpager2-1.0.0-sources.jar" - }, - { - "coord": "androidx.viewpager:viewpager:1.0.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.customview:customview:aar:1.1.0", - "androidx.core:core:aar:1.3.1" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.customview:customview:aar:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0.aar", - "https://maven.fabric.io/public/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0.aar", - "https://maven.google.com/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0.aar", - "https://repo1.maven.org/maven2/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0.aar" - ], - "sha256": "147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682", - "url": "https://maven.google.com/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0.aar" - }, - { - "coord": "androidx.viewpager:viewpager:aar:sources:1.0.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.customview:customview:aar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.customview:customview:aar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0-sources.jar", - "https://maven.fabric.io/public/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0-sources.jar", - "https://maven.google.com/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0-sources.jar" - ], - "sha256": "d4f9a044ab8c23392b12a3f2930d5fd6b5982421a746f2f2a812e9619431fbfd", - "url": "https://maven.google.com/androidx/viewpager/viewpager/1.0.0/viewpager-1.0.0-sources.jar" - }, - { - "coord": "androidx.work:work-runtime-ktx:2.4.0", - "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1", - "androidx.work:work-runtime:aar:2.4.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "androidx.work:work-runtime:aar:2.4.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1" - ], - "file": "v1/https/maven.google.com/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0.aar", - "https://repo1.maven.org/maven2/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0.aar", - "https://maven.fabric.io/public/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0.aar", - "https://maven.google.com/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0.aar", - "https://repo1.maven.org/maven2/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0.aar" - ], - "sha256": "290d2e9c1a22388b3f0c3dbc204a6176f8c49174126de884820befa83899f129", - "url": "https://maven.google.com/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0.aar" - }, - { - "coord": "androidx.work:work-runtime-ktx:aar:sources:2.4.0", - "dependencies": [ - "androidx.work:work-runtime:aar:sources:2.4.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources:1.4.1" - ], - "directDependencies": [ - "androidx.work:work-runtime:aar:sources:2.4.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources:1.4.1" - ], - "file": "v1/https/maven.google.com/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0-sources.jar", - "https://maven.fabric.io/public/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0-sources.jar", - "https://maven.google.com/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0-sources.jar" - ], - "sha256": "f2815313e99aff830108784a855c6112e6161b451f28b5ea8345936470e4422f", - "url": "https://maven.google.com/androidx/work/work-runtime-ktx/2.4.0/work-runtime-ktx-2.4.0-sources.jar" - }, - { - "coord": "androidx.work:work-runtime:2.4.0", - "dependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "androidx.annotation:annotation:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.room:room-common:2.2.5", - "androidx.lifecycle:lifecycle-service:aar:2.2.0", - "androidx.sqlite:sqlite:aar:2.1.0", - "androidx.room:room-runtime:aar:2.2.5", - "androidx.sqlite:sqlite-framework:aar:2.1.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.lifecycle:lifecycle-service:aar:2.2.0", - "androidx.sqlite:sqlite:aar:2.1.0", - "androidx.room:room-runtime:aar:2.2.5", - "androidx.sqlite:sqlite-framework:aar:2.1.0" - ], - "file": "v1/https/maven.google.com/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0.aar", - "https://repo1.maven.org/maven2/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0.aar", - "https://maven.fabric.io/public/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0.aar", - "https://maven.google.com/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0.aar", - "https://repo1.maven.org/maven2/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0.aar" - ], - "sha256": "7801441cb973fb007ef311d3db35c3b3c9d011cef890357e7ca33890833354e5", - "url": "https://maven.google.com/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0.aar" - }, - { - "coord": "androidx.work:work-runtime:aar:sources:2.4.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.room:room-common:jar:sources:2.2.5", - "androidx.core:core:aar:sources:1.3.1", - "androidx.room:room-runtime:aar:sources:2.2.5", - "androidx.sqlite:sqlite-framework:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.sqlite:sqlite:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-service:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava" - ], - "directDependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.room:room-runtime:aar:sources:2.2.5", - "androidx.sqlite:sqlite-framework:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.sqlite:sqlite:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-service:aar:sources:2.2.0", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava" - ], - "file": "v1/https/maven.google.com/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0-sources.jar", - "https://maven.fabric.io/public/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0-sources.jar", - "https://maven.google.com/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0-sources.jar" - ], - "sha256": "7312584b39b43499968297c6bedb2d4759844539ce3c9a0ad178184f75663fff", - "url": "https://maven.google.com/androidx/work/work-runtime/2.4.0/work-runtime-2.4.0-sources.jar" - }, - { - "coord": "androidx.work:work-testing:2.4.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0", - "androidx.work:work-runtime-ktx:aar:2.4.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.room:room-common:2.2.5", - "androidx.sqlite:sqlite:aar:2.1.0", - "androidx.room:room-runtime:aar:2.2.5", - "androidx.sqlite:sqlite-framework:aar:2.1.0", - "androidx.arch.core:core-runtime:aar:2.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", - "androidx.room:room-runtime:aar:2.2.5", - "androidx.work:work-runtime-ktx:aar:2.4.0" - ], - "file": "v1/https/maven.google.com/androidx/work/work-testing/2.4.0/work-testing-2.4.0.aar", - "mirror_urls": [ - "https://maven.google.com/androidx/work/work-testing/2.4.0/work-testing-2.4.0.aar", - "https://repo1.maven.org/maven2/androidx/work/work-testing/2.4.0/work-testing-2.4.0.aar", - "https://maven.fabric.io/public/androidx/work/work-testing/2.4.0/work-testing-2.4.0.aar", - "https://maven.google.com/androidx/work/work-testing/2.4.0/work-testing-2.4.0.aar", - "https://repo1.maven.org/maven2/androidx/work/work-testing/2.4.0/work-testing-2.4.0.aar" - ], - "sha256": "dc1d9f743c59ee08c605aa924fc20819b6a0b734338e0a95af1943c3cd806e23", - "url": "https://maven.google.com/androidx/work/work-testing/2.4.0/work-testing-2.4.0.aar" - }, - { - "coord": "androidx.work:work-testing:jar:sources:2.4.0", - "dependencies": [ - "androidx.arch.core:core-runtime:aar:sources:2.1.0", - "androidx.room:room-common:jar:sources:2.2.5", - "androidx.room:room-runtime:aar:sources:2.2.5", - "androidx.sqlite:sqlite-framework:aar:sources:2.1.0", - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.work:work-runtime-ktx:aar:sources:2.4.0", - "androidx.sqlite:sqlite:aar:sources:2.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", - "androidx.room:room-runtime:aar:sources:2.2.5", - "androidx.work:work-runtime-ktx:aar:sources:2.4.0" - ], - "file": "v1/https/maven.google.com/androidx/work/work-testing/2.4.0/work-testing-2.4.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/androidx/work/work-testing/2.4.0/work-testing-2.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/work/work-testing/2.4.0/work-testing-2.4.0-sources.jar", - "https://maven.fabric.io/public/androidx/work/work-testing/2.4.0/work-testing-2.4.0-sources.jar", - "https://maven.google.com/androidx/work/work-testing/2.4.0/work-testing-2.4.0-sources.jar", - "https://repo1.maven.org/maven2/androidx/work/work-testing/2.4.0/work-testing-2.4.0-sources.jar" - ], - "sha256": "238556cb095dbfffc6a2f376630410cfd0eddb1aaa3f6976476f1152e9615570", - "url": "https://maven.google.com/androidx/work/work-testing/2.4.0/work-testing-2.4.0-sources.jar" - }, - { - "coord": "com.almworks.sqlite4java:sqlite4java:1.0.392", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar", - "mirror_urls": [ - "https://maven.google.com/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar", - "https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar", - "https://maven.fabric.io/public/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar", - "https://maven.google.com/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar", - "https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar" - ], - "sha256": "243a64470fda0e86a6fddeb0af4c7aa9426ce84e68cbfe18d75ee5da4b7e0b92", - "url": "https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar" - }, - { - "coord": "com.almworks.sqlite4java:sqlite4java:jar:sources:1.0.392", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392-sources.jar", - "https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392-sources.jar", - "https://maven.fabric.io/public/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392-sources.jar", - "https://maven.google.com/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392-sources.jar", - "https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392-sources.jar" - ], - "sha256": "778b2c2c6f7e0fb5d9b4a5c7ccea3836c2c172e581bfa3121514b8de628b3180", - "url": "https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392-sources.jar" - }, - { - "coord": "com.android.databinding:baseLibrary:3.4.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2.jar", - "https://repo1.maven.org/maven2/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2.jar", - "https://maven.fabric.io/public/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2.jar", - "https://maven.google.com/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2.jar", - "https://repo1.maven.org/maven2/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2.jar" - ], - "sha256": "5e4f3b90995be63f3c8eeecce120c588a98c6aad3b54f60ad4c80b5418c4b012", - "url": "https://maven.google.com/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2.jar" - }, - { - "coord": "com.android.databinding:baseLibrary:jar:sources:3.4.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2-sources.jar", - "https://maven.fabric.io/public/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2-sources.jar", - "https://maven.google.com/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2-sources.jar", - "https://repo1.maven.org/maven2/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2-sources.jar" - ], - "sha256": "26c82ea4632135e7ab806c27862055d32b05aec4cc54b4fedbb2f529e6764276", - "url": "https://maven.google.com/com/android/databinding/baseLibrary/3.4.2/baseLibrary-3.4.2-sources.jar" - }, - { - "coord": "com.android.support:support-annotations:28.0.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.jar", - "https://repo1.maven.org/maven2/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.jar", - "https://maven.fabric.io/public/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.jar", - "https://maven.google.com/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.jar", - "https://repo1.maven.org/maven2/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.jar" - ], - "sha256": "5d5b9414f02d3fa0ee7526b8d5ddae0da67c8ecc8c4d63ffa6cf91488a93b927", - "url": "https://maven.google.com/com/android/support/support-annotations/28.0.0/support-annotations-28.0.0.jar" - }, - { - "coord": "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta04", - "dependencies": [ - "com.google.code.gson:gson:2.8.5", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "com.google.code.gson:gson:2.8.5", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04.jar", - "https://repo1.maven.org/maven2/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04.jar", - "https://maven.fabric.io/public/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04.jar", - "https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04.jar", - "https://repo1.maven.org/maven2/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04.jar" - ], - "sha256": "c9f8b016144cfb31c5aee92d47f34de23289167cac5e8ef68365b2dd05766f11", - "url": "https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04.jar" - }, - { - "coord": "com.android.tools.build.jetifier:jetifier-core:jar:sources:1.0.0-beta04", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "com.google.code.gson:gson:jar:sources:2.8.5" - ], - "directDependencies": [ - "com.google.code.gson:gson:jar:sources:2.8.5", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04-sources.jar", - "https://repo1.maven.org/maven2/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04-sources.jar", - "https://maven.fabric.io/public/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04-sources.jar", - "https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04-sources.jar", - "https://repo1.maven.org/maven2/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04-sources.jar" - ], - "sha256": "b1293035a1cb88d25e3eb481b66813cb2e04fe2b3a82daca523ef1e0cded1409", - "url": "https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta04/jetifier-core-1.0.0-beta04-sources.jar" - }, - { - "coord": "com.android.tools.build:aapt2-proto:7.3.1-8691043", - "dependencies": [ - "com.google.protobuf:protobuf-java:3.17.3" - ], - "directDependencies": [ - "com.google.protobuf:protobuf-java:3.17.3" - ], - "file": "v1/https/maven.google.com/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043.jar", - "https://repo1.maven.org/maven2/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043.jar", - "https://maven.fabric.io/public/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043.jar", - "https://maven.google.com/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043.jar", - "https://repo1.maven.org/maven2/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043.jar" - ], - "sha256": "d5e2f3e1e1eb06224b6875f5e513c72a65182342745718160caf191d46a96664", - "url": "https://maven.google.com/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043.jar" - }, - { - "coord": "com.android.tools.build:aapt2-proto:jar:sources:7.3.1-8691043", - "dependencies": [ - "com.google.protobuf:protobuf-java:jar:sources:3.17.3" - ], - "directDependencies": [ - "com.google.protobuf:protobuf-java:jar:sources:3.17.3" - ], - "file": "v1/https/maven.google.com/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043-sources.jar", - "https://repo1.maven.org/maven2/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043-sources.jar", - "https://maven.fabric.io/public/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043-sources.jar", - "https://maven.google.com/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043-sources.jar", - "https://repo1.maven.org/maven2/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043-sources.jar" - ], - "sha256": "9887a82631d64be27278ea588bfa69ebc6a8f73564e222abab950a406653114c", - "url": "https://maven.google.com/com/android/tools/build/aapt2-proto/7.3.1-8691043/aapt2-proto-7.3.1-8691043-sources.jar" - }, - { - "coord": "com.android.tools:annotations:26.4.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/com/android/tools/annotations/26.4.2/annotations-26.4.2.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/tools/annotations/26.4.2/annotations-26.4.2.jar", - "https://repo1.maven.org/maven2/com/android/tools/annotations/26.4.2/annotations-26.4.2.jar", - "https://maven.fabric.io/public/com/android/tools/annotations/26.4.2/annotations-26.4.2.jar", - "https://maven.google.com/com/android/tools/annotations/26.4.2/annotations-26.4.2.jar", - "https://repo1.maven.org/maven2/com/android/tools/annotations/26.4.2/annotations-26.4.2.jar" - ], - "sha256": "1877849936f48cd65857bf448743f9a0bf93ed47fe57527d9ad8af875024888d", - "url": "https://maven.google.com/com/android/tools/annotations/26.4.2/annotations-26.4.2.jar" - }, - { - "coord": "com.android.tools:annotations:jar:sources:26.4.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/com/android/tools/annotations/26.4.2/annotations-26.4.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/android/tools/annotations/26.4.2/annotations-26.4.2-sources.jar", - "https://repo1.maven.org/maven2/com/android/tools/annotations/26.4.2/annotations-26.4.2-sources.jar", - "https://maven.fabric.io/public/com/android/tools/annotations/26.4.2/annotations-26.4.2-sources.jar", - "https://maven.google.com/com/android/tools/annotations/26.4.2/annotations-26.4.2-sources.jar", - "https://repo1.maven.org/maven2/com/android/tools/annotations/26.4.2/annotations-26.4.2-sources.jar" - ], - "sha256": "f4d3a5813226ec6a0767e811576834254c2daea1d95a7ff1c18e8e50f214c882", - "url": "https://maven.google.com/com/android/tools/annotations/26.4.2/annotations-26.4.2-sources.jar" - }, - { - "coord": "com.crashlytics.sdk.android:answers:aar:1.4.6", - "dependencies": [ - "io.fabric.sdk.android:fabric:aar:1.4.7" - ], - "directDependencies": [ - "io.fabric.sdk.android:fabric:aar:1.4.7" - ], - "file": "v1/https/maven.google.com/com/crashlytics/sdk/android/answers/1.4.6/answers-1.4.6.aar", - "mirror_urls": [ - "https://maven.google.com/com/crashlytics/sdk/android/answers/1.4.6/answers-1.4.6.aar", - "https://repo1.maven.org/maven2/com/crashlytics/sdk/android/answers/1.4.6/answers-1.4.6.aar", - "https://maven.fabric.io/public/com/crashlytics/sdk/android/answers/1.4.6/answers-1.4.6.aar", - "https://maven.google.com/com/crashlytics/sdk/android/answers/1.4.6/answers-1.4.6.aar", - "https://repo1.maven.org/maven2/com/crashlytics/sdk/android/answers/1.4.6/answers-1.4.6.aar" - ], - "sha256": "5a05ddeda9f421b73727f4287a5d89e981a45e3feb7fac458cfddf29b97e3df8", - "url": "https://maven.google.com/com/crashlytics/sdk/android/answers/1.4.6/answers-1.4.6.aar" - }, - { - "coord": "com.crashlytics.sdk.android:beta:aar:1.2.10", - "dependencies": [], - "directDependencies": [], - "exclusions": [ - "io.fabric.sdk.android:fabric", - "com.crashlytics.sdk.android:answers", - "com.crashlytics.sdk.android:crashlytics" - ], - "file": "v1/https/maven.google.com/com/crashlytics/sdk/android/beta/1.2.10/beta-1.2.10.aar", - "mirror_urls": [ - "https://maven.google.com/com/crashlytics/sdk/android/beta/1.2.10/beta-1.2.10.aar", - "https://repo1.maven.org/maven2/com/crashlytics/sdk/android/beta/1.2.10/beta-1.2.10.aar", - "https://maven.fabric.io/public/com/crashlytics/sdk/android/beta/1.2.10/beta-1.2.10.aar", - "https://maven.google.com/com/crashlytics/sdk/android/beta/1.2.10/beta-1.2.10.aar", - "https://repo1.maven.org/maven2/com/crashlytics/sdk/android/beta/1.2.10/beta-1.2.10.aar" - ], - "sha256": "2a6b77374ebe6168588bd9116cdd66f60f7c151bd931b9a0f8b2012c06b1cd4d", - "url": "https://maven.google.com/com/crashlytics/sdk/android/beta/1.2.10/beta-1.2.10.aar" - }, - { - "coord": "com.crashlytics.sdk.android:crashlytics-core:aar:2.6.7", - "dependencies": [ - "com.crashlytics.sdk.android:answers:aar:1.4.6", - "io.fabric.sdk.android:fabric:aar:1.4.7" - ], - "directDependencies": [ - "com.crashlytics.sdk.android:answers:aar:1.4.6", - "io.fabric.sdk.android:fabric:aar:1.4.7" - ], - "file": "v1/https/maven.google.com/com/crashlytics/sdk/android/crashlytics-core/2.6.7/crashlytics-core-2.6.7.aar", - "mirror_urls": [ - "https://maven.google.com/com/crashlytics/sdk/android/crashlytics-core/2.6.7/crashlytics-core-2.6.7.aar", - "https://repo1.maven.org/maven2/com/crashlytics/sdk/android/crashlytics-core/2.6.7/crashlytics-core-2.6.7.aar", - "https://maven.fabric.io/public/com/crashlytics/sdk/android/crashlytics-core/2.6.7/crashlytics-core-2.6.7.aar", - "https://maven.google.com/com/crashlytics/sdk/android/crashlytics-core/2.6.7/crashlytics-core-2.6.7.aar", - "https://repo1.maven.org/maven2/com/crashlytics/sdk/android/crashlytics-core/2.6.7/crashlytics-core-2.6.7.aar" - ], - "sha256": "4c055e1ad07fbe65a3e315bd27712be715962fb3c065d286a1d19f4f5db6768a", - "url": "https://maven.google.com/com/crashlytics/sdk/android/crashlytics-core/2.6.7/crashlytics-core-2.6.7.aar" - }, - { - "coord": "com.crashlytics.sdk.android:crashlytics:2.9.8", - "dependencies": [ - "com.crashlytics.sdk.android:beta:aar:1.2.10", - "com.crashlytics.sdk.android:answers:aar:1.4.6", - "com.crashlytics.sdk.android:crashlytics-core:aar:2.6.7", - "io.fabric.sdk.android:fabric:aar:1.4.7" - ], - "directDependencies": [ - "com.crashlytics.sdk.android:answers:aar:1.4.6", - "com.crashlytics.sdk.android:beta:aar:1.2.10", - "com.crashlytics.sdk.android:crashlytics-core:aar:2.6.7", - "io.fabric.sdk.android:fabric:aar:1.4.7" - ], - "file": "v1/https/maven.google.com/com/crashlytics/sdk/android/crashlytics/2.9.8/crashlytics-2.9.8.aar", - "mirror_urls": [ - "https://maven.google.com/com/crashlytics/sdk/android/crashlytics/2.9.8/crashlytics-2.9.8.aar", - "https://repo1.maven.org/maven2/com/crashlytics/sdk/android/crashlytics/2.9.8/crashlytics-2.9.8.aar", - "https://maven.fabric.io/public/com/crashlytics/sdk/android/crashlytics/2.9.8/crashlytics-2.9.8.aar", - "https://maven.google.com/com/crashlytics/sdk/android/crashlytics/2.9.8/crashlytics-2.9.8.aar", - "https://repo1.maven.org/maven2/com/crashlytics/sdk/android/crashlytics/2.9.8/crashlytics-2.9.8.aar" - ], - "sha256": "06d90c9d6693f302deae19f4cba67d724b44e8efcfc3c57308a78eead874dfeb", - "url": "https://maven.google.com/com/crashlytics/sdk/android/crashlytics/2.9.8/crashlytics-2.9.8.aar" - }, - { - "coord": "com.github.bumptech.glide:annotations:4.11.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0.jar", - "https://maven.google.com/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0.jar" - ], - "sha256": "d219d238006d824962176229d4708abcdddcfe342c6a18a5d0fa48d6f0479b3e", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0.jar" - }, - { - "coord": "com.github.bumptech.glide:annotations:jar:sources:4.11.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0-sources.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0-sources.jar", - "https://maven.google.com/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0-sources.jar" - ], - "sha256": "79e5ce46aa6004289f1f55b5a8b9f56be55c0518f98dfb8e158160a1cf24d8cc", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/annotations/4.11.0/annotations-4.11.0-sources.jar" - }, - { - "coord": "com.github.bumptech.glide:compiler:4.11.0", - "dependencies": [ - "com.github.bumptech.glide:annotations:4.11.0" - ], - "directDependencies": [ - "com.github.bumptech.glide:annotations:4.11.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0.jar", - "https://maven.google.com/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0.jar" - ], - "sha256": "a98cdf265c36261b1d523448b05c322ec290afa865946425eded6361980e8770", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0.jar" - }, - { - "coord": "com.github.bumptech.glide:compiler:jar:sources:4.11.0", - "dependencies": [ - "com.github.bumptech.glide:annotations:jar:sources:4.11.0" - ], - "directDependencies": [ - "com.github.bumptech.glide:annotations:jar:sources:4.11.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0-sources.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0-sources.jar", - "https://maven.google.com/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0-sources.jar" - ], - "sha256": "9920cfa9ffc052253d7bfe0601867c83c0ad5669055383fbc6fc909e6c717aaf", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/compiler/4.11.0/compiler-4.11.0-sources.jar" - }, - { - "coord": "com.github.bumptech.glide:disklrucache:4.11.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0.jar", - "https://maven.google.com/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0.jar" - ], - "sha256": "d06775a5171b777aa3db031eb0dd4a1dbe3f00dda35b5574dfd953f6b0d5ef18", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0.jar" - }, - { - "coord": "com.github.bumptech.glide:disklrucache:jar:sources:4.11.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0-sources.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0-sources.jar", - "https://maven.google.com/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0-sources.jar" - ], - "sha256": "af83281627baee37032545b99b40acee237b057227dca1bac5b7ad62b392b16b", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/disklrucache/4.11.0/disklrucache-4.11.0-sources.jar" - }, - { - "coord": "com.github.bumptech.glide:gifdecoder:4.11.0", - "dependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0.aar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0.aar", - "https://maven.fabric.io/public/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0.aar", - "https://maven.google.com/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0.aar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0.aar" - ], - "sha256": "197a1cd5b76855aa02b230c13974e293229b901dc2b96fab4315201e78baa804", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0.aar" - }, - { - "coord": "com.github.bumptech.glide:gifdecoder:jar:sources:4.11.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0-sources.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0-sources.jar", - "https://maven.google.com/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0-sources.jar" - ], - "sha256": "73e2de3c596295f4ce53185544329dfd628edb687edf61af4c8baa53cb19fced", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/gifdecoder/4.11.0/gifdecoder-4.11.0-sources.jar" - }, - { - "coord": "com.github.bumptech.glide:glide:4.11.0", - "dependencies": [ - "com.github.bumptech.glide:annotations:4.11.0", - "androidx.interpolator:interpolator:aar:1.0.0", - "androidx.annotation:annotation:1.1.0", - "com.github.bumptech.glide:disklrucache:4.11.0", - "androidx.vectordrawable:vectordrawable-animated:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.slidingpanelayout:slidingpanelayout:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0", - "androidx.cursoradapter:cursoradapter:aar:1.0.0", - "androidx.drawerlayout:drawerlayout:aar:1.1.0", - "androidx.core:core:aar:1.3.1", - "com.github.bumptech.glide:gifdecoder:4.11.0", - "androidx.coordinatorlayout:coordinatorlayout:aar:1.1.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.viewpager:viewpager:aar:1.0.0", - "androidx.asynclayoutinflater:asynclayoutinflater:aar:1.0.0", - "androidx.legacy:legacy-support-core-ui:aar:1.0.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.exifinterface:exifinterface:1.0.0", - "androidx.fragment:fragment:1.2.0", - "androidx.swiperefreshlayout:swiperefreshlayout:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0", - "androidx.customview:customview:aar:1.1.0" - ], - "directDependencies": [ - "com.github.bumptech.glide:annotations:4.11.0", - "com.github.bumptech.glide:disklrucache:4.11.0", - "androidx.vectordrawable:vectordrawable-animated:1.1.0", - "com.github.bumptech.glide:gifdecoder:4.11.0", - "androidx.exifinterface:exifinterface:1.0.0", - "androidx.fragment:fragment:1.2.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0.aar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0.aar", - "https://maven.fabric.io/public/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0.aar", - "https://maven.google.com/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0.aar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0.aar" - ], - "sha256": "5c294e6a5f0f812cef876b8412954c1822da184af38e082a5b766e3c4f4fcd95", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0.aar" - }, - { - "coord": "com.github.bumptech.glide:glide:jar:sources:4.11.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.swiperefreshlayout:swiperefreshlayout:aar:sources:1.0.0", - "androidx.exifinterface:exifinterface:jar:sources:1.0.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "com.github.bumptech.glide:gifdecoder:jar:sources:4.11.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.coordinatorlayout:coordinatorlayout:aar:sources:1.1.0", - "androidx.drawerlayout:drawerlayout:aar:sources:1.1.0", - "androidx.fragment:fragment:jar:sources:1.2.0", - "androidx.viewpager:viewpager:aar:sources:1.0.0", - "androidx.asynclayoutinflater:asynclayoutinflater:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-ui:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.cursoradapter:cursoradapter:aar:sources:1.0.0", - "com.github.bumptech.glide:annotations:jar:sources:4.11.0", - "com.github.bumptech.glide:disklrucache:jar:sources:4.11.0", - "androidx.vectordrawable:vectordrawable-animated:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.slidingpanelayout:slidingpanelayout:aar:sources:1.0.0", - "androidx.customview:customview:aar:sources:1.1.0", - "androidx.loader:loader:aar:sources:1.0.0", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.exifinterface:exifinterface:jar:sources:1.0.0", - "com.github.bumptech.glide:gifdecoder:jar:sources:4.11.0", - "androidx.fragment:fragment:jar:sources:1.2.0", - "com.github.bumptech.glide:annotations:jar:sources:4.11.0", - "com.github.bumptech.glide:disklrucache:jar:sources:4.11.0", - "androidx.vectordrawable:vectordrawable-animated:jar:sources:1.1.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0-sources.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0-sources.jar", - "https://maven.google.com/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0-sources.jar" - ], - "sha256": "82684421d237c8da5c1cd3f7549b672b91c93fb5d64032af637ab28345960945", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/glide/4.11.0/glide-4.11.0-sources.jar" - }, - { - "coord": "com.github.bumptech.glide:mocks:4.11.0", - "dependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "com.github.bumptech.glide:annotations:4.11.0", - "androidx.interpolator:interpolator:aar:1.0.0", - "org.codehaus.mojo:animal-sniffer-annotations:1.18", - "androidx.annotation:annotation:1.1.0", - "com.github.bumptech.glide:disklrucache:4.11.0", - "com.google.j2objc:j2objc-annotations:1.3", - "com.google.code.findbugs:jsr305:3.0.2", - "androidx.vectordrawable:vectordrawable-animated:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.guava:guava:30.1.1-android", - "androidx.slidingpanelayout:slidingpanelayout:aar:1.0.0", - "com.google.errorprone:error_prone_annotations:2.7.1", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0", - "androidx.cursoradapter:cursoradapter:aar:1.0.0", - "androidx.drawerlayout:drawerlayout:aar:1.1.0", - "androidx.core:core:aar:1.3.1", - "com.github.bumptech.glide:gifdecoder:4.11.0", - "androidx.coordinatorlayout:coordinatorlayout:aar:1.1.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "com.google.guava:failureaccess:1.0.1", - "androidx.viewpager:viewpager:aar:1.0.0", - "androidx.asynclayoutinflater:asynclayoutinflater:aar:1.0.0", - "androidx.legacy:legacy-support-core-ui:aar:1.0.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.exifinterface:exifinterface:1.0.0", - "androidx.fragment:fragment:1.2.0", - "com.github.bumptech.glide:glide:4.11.0", - "androidx.swiperefreshlayout:swiperefreshlayout:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0", - "androidx.customview:customview:aar:1.1.0", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "com.github.bumptech.glide:glide:4.11.0", - "com.google.guava:guava:30.1.1-android" - ], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0.aar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0.aar", - "https://maven.fabric.io/public/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0.aar", - "https://maven.google.com/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0.aar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0.aar" - ], - "sha256": "cf58b7972da6695ace6296fb3746535d30d41b422711a897c270d8480e3b055a", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0.aar" - }, - { - "coord": "com.github.bumptech.glide:mocks:jar:sources:4.11.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.codehaus.mojo:animal-sniffer-annotations:jar:sources:1.18", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.swiperefreshlayout:swiperefreshlayout:aar:sources:1.0.0", - "androidx.exifinterface:exifinterface:jar:sources:1.0.0", - "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "com.github.bumptech.glide:gifdecoder:jar:sources:4.11.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.coordinatorlayout:coordinatorlayout:aar:sources:1.1.0", - "androidx.drawerlayout:drawerlayout:aar:sources:1.1.0", - "androidx.fragment:fragment:jar:sources:1.2.0", - "androidx.viewpager:viewpager:aar:sources:1.0.0", - "androidx.asynclayoutinflater:asynclayoutinflater:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-ui:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "com.github.bumptech.glide:glide:jar:sources:4.11.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.cursoradapter:cursoradapter:aar:sources:1.0.0", - "com.github.bumptech.glide:annotations:jar:sources:4.11.0", - "com.github.bumptech.glide:disklrucache:jar:sources:4.11.0", - "androidx.vectordrawable:vectordrawable-animated:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.slidingpanelayout:slidingpanelayout:aar:sources:1.0.0", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "androidx.customview:customview:aar:sources:1.1.0", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.errorprone:error_prone_annotations:jar:sources:2.7.1", - "androidx.loader:loader:aar:sources:1.0.0", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.github.bumptech.glide:glide:jar:sources:4.11.0", - "com.google.guava:guava:jar:sources:30.1.1-android" - ], - "file": "v1/https/repo1.maven.org/maven2/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0-sources.jar", - "https://maven.fabric.io/public/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0-sources.jar", - "https://maven.google.com/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0-sources.jar" - ], - "sha256": "f20b6851e4acf0a3c7bc233a4123f1983c8047e7c63fd7dc9021d76533a8dfcd", - "url": "https://repo1.maven.org/maven2/com/github/bumptech/glide/mocks/4.11.0/mocks-4.11.0-sources.jar" - }, - { - "coord": "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0", - "dependencies": [ - "org.hamcrest:hamcrest-core:1.3" - ], - "directDependencies": [ - "org.hamcrest:hamcrest-core:1.3" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0.jar", - "https://repo1.maven.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0.jar", - "https://maven.fabric.io/public/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0.jar", - "https://maven.google.com/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0.jar", - "https://repo1.maven.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0.jar" - ], - "sha256": "cdf16ef8f5b8023d003ce3cc1b0d51bda737762e2dab2fedf43d1c4292353f7f", - "url": "https://repo1.maven.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0.jar" - }, - { - "coord": "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources:2.0", - "dependencies": [ - "org.hamcrest:hamcrest-core:jar:sources:1.3" - ], - "directDependencies": [ - "org.hamcrest:hamcrest-core:jar:sources:1.3" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0-sources.jar", - "https://maven.fabric.io/public/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0-sources.jar", - "https://maven.google.com/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0-sources.jar" - ], - "sha256": "e15536e0c7ed75e8d7fddc23a41c427850939a06552ce4d74eaee31acda0059e", - "url": "https://repo1.maven.org/maven2/com/google/android/apps/common/testing/accessibility/framework/accessibility-test-framework/2.0/accessibility-test-framework-2.0-sources.jar" - }, - { - "coord": "com.google.android.datatransport:transport-api:aar:2.2.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/com/google/android/datatransport/transport-api/2.2.0/transport-api-2.2.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/datatransport/transport-api/2.2.0/transport-api-2.2.0.aar", - "https://repo1.maven.org/maven2/com/google/android/datatransport/transport-api/2.2.0/transport-api-2.2.0.aar", - "https://maven.fabric.io/public/com/google/android/datatransport/transport-api/2.2.0/transport-api-2.2.0.aar", - "https://maven.google.com/com/google/android/datatransport/transport-api/2.2.0/transport-api-2.2.0.aar", - "https://repo1.maven.org/maven2/com/google/android/datatransport/transport-api/2.2.0/transport-api-2.2.0.aar" - ], - "sha256": "576514f8b75d8ae32897f1b9b031f88b00465bf6e0996e227d09af688195f71e", - "url": "https://maven.google.com/com/google/android/datatransport/transport-api/2.2.0/transport-api-2.2.0.aar" - }, - { - "coord": "com.google.android.datatransport:transport-backend-cct:aar:2.3.0", - "dependencies": [ - "com.google.android.datatransport:transport-api:aar:2.2.0", - "com.google.dagger:dagger:jar:2.28.1", - "com.google.firebase:firebase-encoders-json:aar:16.1.0", - "androidx.annotation:annotation:jar:1.1.0", - "com.google.android.datatransport:transport-runtime:aar:2.2.3" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:1.1.0", - "com.google.android.datatransport:transport-api:aar:2.2.0", - "com.google.android.datatransport:transport-runtime:aar:2.2.3", - "com.google.firebase:firebase-encoders-json:aar:16.1.0" - ], - "file": "v1/https/maven.google.com/com/google/android/datatransport/transport-backend-cct/2.3.0/transport-backend-cct-2.3.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/datatransport/transport-backend-cct/2.3.0/transport-backend-cct-2.3.0.aar", - "https://repo1.maven.org/maven2/com/google/android/datatransport/transport-backend-cct/2.3.0/transport-backend-cct-2.3.0.aar", - "https://maven.fabric.io/public/com/google/android/datatransport/transport-backend-cct/2.3.0/transport-backend-cct-2.3.0.aar", - "https://maven.google.com/com/google/android/datatransport/transport-backend-cct/2.3.0/transport-backend-cct-2.3.0.aar", - "https://repo1.maven.org/maven2/com/google/android/datatransport/transport-backend-cct/2.3.0/transport-backend-cct-2.3.0.aar" - ], - "sha256": "6a2d99756c1fa634d3f14b4479257ac83d5d0fbf7fe5aa1db0a014df95ae217f", - "url": "https://maven.google.com/com/google/android/datatransport/transport-backend-cct/2.3.0/transport-backend-cct-2.3.0.aar" - }, - { - "coord": "com.google.android.datatransport:transport-runtime:aar:2.2.3", - "dependencies": [ - "com.google.android.datatransport:transport-api:aar:2.2.0", - "androidx.annotation:annotation:jar:1.1.0", - "com.google.dagger:dagger:jar:2.28.1" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:1.1.0", - "com.google.android.datatransport:transport-api:aar:2.2.0", - "com.google.dagger:dagger:jar:2.28.1" - ], - "file": "v1/https/maven.google.com/com/google/android/datatransport/transport-runtime/2.2.3/transport-runtime-2.2.3.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/datatransport/transport-runtime/2.2.3/transport-runtime-2.2.3.aar", - "https://repo1.maven.org/maven2/com/google/android/datatransport/transport-runtime/2.2.3/transport-runtime-2.2.3.aar", - "https://maven.fabric.io/public/com/google/android/datatransport/transport-runtime/2.2.3/transport-runtime-2.2.3.aar", - "https://maven.google.com/com/google/android/datatransport/transport-runtime/2.2.3/transport-runtime-2.2.3.aar", - "https://repo1.maven.org/maven2/com/google/android/datatransport/transport-runtime/2.2.3/transport-runtime-2.2.3.aar" - ], - "sha256": "5e219672fe5a03f5b80c4d2211f39c2b0ceeb3988bfe1e8f1e033579dee20414", - "url": "https://maven.google.com/com/google/android/datatransport/transport-runtime/2.2.3/transport-runtime-2.2.3.aar" - }, - { - "coord": "com.google.android.flexbox:flexbox:3.0.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/maven.google.com/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0.aar", - "https://maven.fabric.io/public/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0.aar", - "https://maven.google.com/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0.aar" - ], - "sha256": "5e19500486fd7c8e2e8c7aad6bbba9c8d0ada7057c6b32b9b5c61439814e7574", - "url": "https://maven.google.com/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0.aar" - }, - { - "coord": "com.google.android.flexbox:flexbox:jar:sources:3.0.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/maven.google.com/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0-sources.jar", - "https://maven.fabric.io/public/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0-sources.jar", - "https://maven.google.com/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0-sources.jar" - ], - "sha256": "6084ded8a7a6de74d6887bcb8293816dc051a5d822b6fa74a0e4f9005ae0a5b8", - "url": "https://maven.google.com/com/google/android/flexbox/flexbox/3.0.0/flexbox-3.0.0-sources.jar" - }, - { - "coord": "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "dependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0", - "androidx.collection:collection:jar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.fragment:fragment:aar:1.2.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-ads-identifier/17.0.0/play-services-ads-identifier-17.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-ads-identifier/17.0.0/play-services-ads-identifier-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-ads-identifier/17.0.0/play-services-ads-identifier-17.0.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-ads-identifier/17.0.0/play-services-ads-identifier-17.0.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-ads-identifier/17.0.0/play-services-ads-identifier-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-ads-identifier/17.0.0/play-services-ads-identifier-17.0.0.aar" - ], - "sha256": "b01c408c265b3aa171d19be86d7b8d4f3454f3085169a775690a6a85f57abb73", - "url": "https://maven.google.com/com/google/android/gms/play-services-ads-identifier/17.0.0/play-services-ads-identifier-17.0.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-base:aar:17.0.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-base/17.0.0/play-services-base-17.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-base/17.0.0/play-services-base-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-base/17.0.0/play-services-base-17.0.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-base/17.0.0/play-services-base-17.0.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-base/17.0.0/play-services-base-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-base/17.0.0/play-services-base-17.0.0.aar" - ], - "sha256": "dd0980edf729e0d346e2b58e70801dc237c1aed0c7ab274fa3f1c8c8efc64cc7", - "url": "https://maven.google.com/com/google/android/gms/play-services-base/17.0.0/play-services-base-17.0.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-basement:aar:17.0.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.fragment:fragment:aar:1.2.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.fragment:fragment:aar:1.2.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-basement/17.0.0/play-services-basement-17.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-basement/17.0.0/play-services-basement-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-basement/17.0.0/play-services-basement-17.0.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-basement/17.0.0/play-services-basement-17.0.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-basement/17.0.0/play-services-basement-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-basement/17.0.0/play-services-basement-17.0.0.aar" - ], - "sha256": "d324a1785bbc48bfe3639fc847cfd3cf43d49e967b5caf2794240a854557a39c", - "url": "https://maven.google.com/com/google/android/gms/play-services-basement/17.0.0/play-services-basement-17.0.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-measurement-api:aar:17.5.0", - "dependencies": [ - "com.google.firebase:firebase-measurement-connector:aar:18.0.0", - "com.google.firebase:firebase-installations:aar:16.3.2", - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.annotation:annotation:1.1.0", - "com.google.firebase:firebase-common:aar:19.3.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-measurement-sdk-api:aar:17.5.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "com.google.android.gms:play-services-measurement-impl:aar:17.5.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.annotation:annotation:jar:1.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:1.8.1", - "com.google.firebase:firebase-installations-interop:aar:16.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "com.google.firebase:firebase-measurement-connector:aar:18.0.0", - "com.google.firebase:firebase-installations:aar:16.3.2", - "com.google.firebase:firebase-common:aar:19.3.0", - "com.google.android.gms:play-services-measurement-sdk-api:aar:17.5.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "com.google.android.gms:play-services-measurement-impl:aar:17.5.0", - "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:16.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-measurement-api/17.5.0/play-services-measurement-api-17.5.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-measurement-api/17.5.0/play-services-measurement-api-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-api/17.5.0/play-services-measurement-api-17.5.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-measurement-api/17.5.0/play-services-measurement-api-17.5.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-measurement-api/17.5.0/play-services-measurement-api-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-api/17.5.0/play-services-measurement-api-17.5.0.aar" - ], - "sha256": "fde4cb8493409aa5130de84775eba9f967aaaf916512362987e1bd61b60babfc", - "url": "https://maven.google.com/com/google/android/gms/play-services-measurement-api/17.5.0/play-services-measurement-api-17.5.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-measurement-base:aar:17.5.0", - "dependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0", - "androidx.collection:collection:jar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.fragment:fragment:aar:1.2.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-measurement-base/17.5.0/play-services-measurement-base-17.5.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-measurement-base/17.5.0/play-services-measurement-base-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-base/17.5.0/play-services-measurement-base-17.5.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-measurement-base/17.5.0/play-services-measurement-base-17.5.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-measurement-base/17.5.0/play-services-measurement-base-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-base/17.5.0/play-services-measurement-base-17.5.0.aar" - ], - "sha256": "39fd34e7da8e822a93b64c66134e2479075c298588018d4f379c53b9eea1cf1e", - "url": "https://maven.google.com/com/google/android/gms/play-services-measurement-base/17.5.0/play-services-measurement-base-17.5.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-measurement-impl:aar:17.5.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-measurement-impl/17.5.0/play-services-measurement-impl-17.5.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-measurement-impl/17.5.0/play-services-measurement-impl-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-impl/17.5.0/play-services-measurement-impl-17.5.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-measurement-impl/17.5.0/play-services-measurement-impl-17.5.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-measurement-impl/17.5.0/play-services-measurement-impl-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-impl/17.5.0/play-services-measurement-impl-17.5.0.aar" - ], - "sha256": "d143f6d909619a0aa597ccc127713cd5e4b2eea38477521de739331bb791f3ec", - "url": "https://maven.google.com/com/google/android/gms/play-services-measurement-impl/17.5.0/play-services-measurement-impl-17.5.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-measurement-sdk-api:aar:17.5.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-measurement-sdk-api/17.5.0/play-services-measurement-sdk-api-17.5.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-measurement-sdk-api/17.5.0/play-services-measurement-sdk-api-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-sdk-api/17.5.0/play-services-measurement-sdk-api-17.5.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-measurement-sdk-api/17.5.0/play-services-measurement-sdk-api-17.5.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-measurement-sdk-api/17.5.0/play-services-measurement-sdk-api-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-sdk-api/17.5.0/play-services-measurement-sdk-api-17.5.0.aar" - ], - "sha256": "afff4861d76bc1f6c7527ae9c4c58c50d6d9e4668a3dc58b03cd77e508e305b3", - "url": "https://maven.google.com/com/google/android/gms/play-services-measurement-sdk-api/17.5.0/play-services-measurement-sdk-api-17.5.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-measurement-sdk:aar:17.5.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-measurement-impl:aar:17.5.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0", - "com.google.android.gms:play-services-measurement-impl:aar:17.5.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-measurement-sdk/17.5.0/play-services-measurement-sdk-17.5.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-measurement-sdk/17.5.0/play-services-measurement-sdk-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-sdk/17.5.0/play-services-measurement-sdk-17.5.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-measurement-sdk/17.5.0/play-services-measurement-sdk-17.5.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-measurement-sdk/17.5.0/play-services-measurement-sdk-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement-sdk/17.5.0/play-services-measurement-sdk-17.5.0.aar" - ], - "sha256": "24c3c4085609a85debabc43718ac3049583b5452e4d34b2e8c9e620542631b30", - "url": "https://maven.google.com/com/google/android/gms/play-services-measurement-sdk/17.5.0/play-services-measurement-sdk-17.5.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-measurement:aar:17.5.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-measurement-impl:aar:17.5.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-measurement-impl:aar:17.5.0", - "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-measurement/17.5.0/play-services-measurement-17.5.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-measurement/17.5.0/play-services-measurement-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement/17.5.0/play-services-measurement-17.5.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-measurement/17.5.0/play-services-measurement-17.5.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-measurement/17.5.0/play-services-measurement-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-measurement/17.5.0/play-services-measurement-17.5.0.aar" - ], - "sha256": "553f0b6fc6e44eed81bb5b7b4cb80719c05a244a394eb38ae91271871dcddf07", - "url": "https://maven.google.com/com/google/android/gms/play-services-measurement/17.5.0/play-services-measurement-17.5.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-stats:aar:17.0.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "androidx.annotation:annotation:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.aar" - ], - "sha256": "e8ae5b40512b71e2258bfacd8cd3da398733aa4cde3b32d056093f832b83a6fe", - "url": "https://maven.google.com/com/google/android/gms/play-services-stats/17.0.0/play-services-stats-17.0.0.aar" - }, - { - "coord": "com.google.android.gms:play-services-tasks:aar:17.0.0", - "dependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0", - "androidx.collection:collection:jar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.fragment:fragment:aar:1.2.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.aar", - "https://maven.fabric.io/public/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.aar", - "https://maven.google.com/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.aar" - ], - "sha256": "2e6d1738b73647f3fe7a038b9780b97717b3746eae258009197e36e7bf3112a5", - "url": "https://maven.google.com/com/google/android/gms/play-services-tasks/17.0.0/play-services-tasks-17.0.0.aar" - }, - { - "coord": "com.google.android.gms:strict-version-matcher-plugin:1.2.1", - "dependencies": [ - "com.google.guava:guava:30.1.1-android", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "com.google.code.findbugs:jsr305:3.0.2" - ], - "directDependencies": [ - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.guava:guava:30.1.1-android", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10" - ], - "file": "v1/https/maven.google.com/com/google/android/gms/strict-version-matcher-plugin/1.2.1/strict-version-matcher-plugin-1.2.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/gms/strict-version-matcher-plugin/1.2.1/strict-version-matcher-plugin-1.2.1.jar", - "https://repo1.maven.org/maven2/com/google/android/gms/strict-version-matcher-plugin/1.2.1/strict-version-matcher-plugin-1.2.1.jar", - "https://maven.fabric.io/public/com/google/android/gms/strict-version-matcher-plugin/1.2.1/strict-version-matcher-plugin-1.2.1.jar", - "https://maven.google.com/com/google/android/gms/strict-version-matcher-plugin/1.2.1/strict-version-matcher-plugin-1.2.1.jar", - "https://repo1.maven.org/maven2/com/google/android/gms/strict-version-matcher-plugin/1.2.1/strict-version-matcher-plugin-1.2.1.jar" - ], - "sha256": "0c1027a51198190386eae3f90adee9a30687e76da7589f06c79269fea4c7a4c0", - "url": "https://maven.google.com/com/google/android/gms/strict-version-matcher-plugin/1.2.1/strict-version-matcher-plugin-1.2.1.jar" - }, - { - "coord": "com.google.android.material:material:1.3.0", - "dependencies": [ - "androidx.constraintlayout:constraintlayout:2.0.1", - "androidx.constraintlayout:constraintlayout-solver:2.0.1", - "androidx.dynamicanimation:dynamicanimation:1.0.0", - "androidx.interpolator:interpolator:aar:1.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.vectordrawable:vectordrawable:1.1.0", - "androidx.collection:collection:1.1.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "androidx.slidingpanelayout:slidingpanelayout:aar:1.0.0", - "androidx.cardview:cardview:1.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.vectordrawable:vectordrawable:aar:1.1.0", - "androidx.recyclerview:recyclerview:aar:1.1.0", - "androidx.cursoradapter:cursoradapter:aar:1.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.drawerlayout:drawerlayout:aar:1.1.0", - "androidx.appcompat:appcompat-resources:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.annotation:annotation-experimental:1.0.0", - "androidx.lifecycle:lifecycle-runtime:2.2.0", - "androidx.core:core:1.3.1", - "androidx.recyclerview:recyclerview:1.1.0", - "androidx.coordinatorlayout:coordinatorlayout:aar:1.1.0", - "androidx.coordinatorlayout:coordinatorlayout:1.1.0", - "androidx.print:print:aar:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.lifecycle:lifecycle-runtime:aar:2.2.0", - "androidx.vectordrawable:vectordrawable-animated:aar:1.1.0", - "androidx.versionedparcelable:versionedparcelable:aar:1.1.0", - "androidx.viewpager:viewpager:aar:1.0.0", - "androidx.asynclayoutinflater:asynclayoutinflater:aar:1.0.0", - "androidx.legacy:legacy-support-core-ui:aar:1.0.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "androidx.viewpager2:viewpager2:1.0.0", - "androidx.fragment:fragment:1.2.0", - "androidx.appcompat:appcompat:1.2.0", - "androidx.swiperefreshlayout:swiperefreshlayout:aar:1.0.0", - "androidx.loader:loader:aar:1.0.0", - "androidx.transition:transition:1.2.0", - "androidx.customview:customview:aar:1.1.0" - ], - "directDependencies": [ - "androidx.constraintlayout:constraintlayout:2.0.1", - "androidx.dynamicanimation:dynamicanimation:1.0.0", - "androidx.annotation:annotation:1.1.0", - "androidx.vectordrawable:vectordrawable:1.1.0", - "androidx.cardview:cardview:1.0.0", - "androidx.annotation:annotation-experimental:1.0.0", - "androidx.lifecycle:lifecycle-runtime:2.2.0", - "androidx.core:core:1.3.1", - "androidx.recyclerview:recyclerview:1.1.0", - "androidx.coordinatorlayout:coordinatorlayout:1.1.0", - "androidx.viewpager2:viewpager2:1.0.0", - "androidx.fragment:fragment:1.2.0", - "androidx.appcompat:appcompat:1.2.0", - "androidx.transition:transition:1.2.0" - ], - "file": "v1/https/maven.google.com/com/google/android/material/material/1.3.0/material-1.3.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/material/material/1.3.0/material-1.3.0.aar", - "https://repo1.maven.org/maven2/com/google/android/material/material/1.3.0/material-1.3.0.aar", - "https://maven.fabric.io/public/com/google/android/material/material/1.3.0/material-1.3.0.aar", - "https://maven.google.com/com/google/android/material/material/1.3.0/material-1.3.0.aar", - "https://repo1.maven.org/maven2/com/google/android/material/material/1.3.0/material-1.3.0.aar" - ], - "sha256": "cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a", - "url": "https://maven.google.com/com/google/android/material/material/1.3.0/material-1.3.0.aar" - }, - { - "coord": "com.google.android.material:material:jar:sources:1.3.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.recyclerview:recyclerview:jar:sources:1.1.0", - "androidx.vectordrawable:vectordrawable-animated:aar:sources:1.1.0", - "androidx.cardview:cardview:jar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.swiperefreshlayout:swiperefreshlayout:aar:sources:1.0.0", - "androidx.transition:transition:jar:sources:1.2.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.dynamicanimation:dynamicanimation:jar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.coordinatorlayout:coordinatorlayout:aar:sources:1.1.0", - "androidx.core:core:jar:sources:1.3.1", - "androidx.drawerlayout:drawerlayout:aar:sources:1.1.0", - "androidx.coordinatorlayout:coordinatorlayout:jar:sources:1.1.0", - "androidx.fragment:fragment:jar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation-experimental:jar:sources:1.0.0", - "androidx.viewpager:viewpager:aar:sources:1.0.0", - "androidx.asynclayoutinflater:asynclayoutinflater:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-ui:aar:sources:1.0.0", - "androidx.recyclerview:recyclerview:aar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.cursoradapter:cursoradapter:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.slidingpanelayout:slidingpanelayout:aar:sources:1.0.0", - "androidx.appcompat:appcompat-resources:aar:sources:1.2.0", - "androidx.customview:customview:aar:sources:1.1.0", - "androidx.constraintlayout:constraintlayout:jar:sources:2.0.1", - "androidx.lifecycle:lifecycle-runtime:jar:sources:2.2.0", - "androidx.loader:loader:aar:sources:1.0.0", - "androidx.viewpager2:viewpager2:jar:sources:1.0.0", - "androidx.appcompat:appcompat:jar:sources:1.2.0", - "androidx.constraintlayout:constraintlayout-solver:jar:sources:2.0.1", - "androidx.vectordrawable:vectordrawable:jar:sources:1.1.0", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.recyclerview:recyclerview:jar:sources:1.1.0", - "androidx.cardview:cardview:jar:sources:1.0.0", - "androidx.transition:transition:jar:sources:1.2.0", - "androidx.dynamicanimation:dynamicanimation:jar:sources:1.0.0", - "androidx.core:core:jar:sources:1.3.1", - "androidx.coordinatorlayout:coordinatorlayout:jar:sources:1.1.0", - "androidx.fragment:fragment:jar:sources:1.2.0", - "androidx.annotation:annotation-experimental:jar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.constraintlayout:constraintlayout:jar:sources:2.0.1", - "androidx.lifecycle:lifecycle-runtime:jar:sources:2.2.0", - "androidx.viewpager2:viewpager2:jar:sources:1.0.0", - "androidx.appcompat:appcompat:jar:sources:1.2.0", - "androidx.vectordrawable:vectordrawable:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/com/google/android/material/material/1.3.0/material-1.3.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/android/material/material/1.3.0/material-1.3.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/android/material/material/1.3.0/material-1.3.0-sources.jar", - "https://maven.fabric.io/public/com/google/android/material/material/1.3.0/material-1.3.0-sources.jar", - "https://maven.google.com/com/google/android/material/material/1.3.0/material-1.3.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/android/material/material/1.3.0/material-1.3.0-sources.jar" - ], - "sha256": "1d9fe3a4512512a311889be798e4a0f9cf9fbccddea50a7ca330b1b99ee92993", - "url": "https://maven.google.com/com/google/android/material/material/1.3.0/material-1.3.0-sources.jar" - }, - { - "coord": "com.google.auto.service:auto-service-annotations:1.0-rc7", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7.jar", - "https://repo1.maven.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7.jar", - "https://maven.fabric.io/public/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7.jar", - "https://maven.google.com/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7.jar", - "https://repo1.maven.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7.jar" - ], - "sha256": "986dc826fa0a43bf9f04194c1a8667774f4f44190ec816b08554b47891ba5459", - "url": "https://repo1.maven.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7.jar" - }, - { - "coord": "com.google.auto.service:auto-service-annotations:jar:sources:1.0-rc7", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7-sources.jar", - "https://repo1.maven.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7-sources.jar", - "https://maven.fabric.io/public/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7-sources.jar", - "https://maven.google.com/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7-sources.jar", - "https://repo1.maven.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7-sources.jar" - ], - "sha256": "0cb604b1ddea687434e7b3908079ad9e261adaeff398e4374f81b6f06cceee58", - "url": "https://repo1.maven.org/maven2/com/google/auto/service/auto-service-annotations/1.0-rc7/auto-service-annotations-1.0-rc7-sources.jar" - }, - { - "coord": "com.google.auto.value:auto-value-annotations:1.8.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar", - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar", - "https://maven.fabric.io/public/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar", - "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar", - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar" - ], - "sha256": "37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852", - "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar" - }, - { - "coord": "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1-sources.jar", - "https://maven.fabric.io/public/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1-sources.jar", - "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1-sources.jar" - ], - "sha256": "0fc83f827602d4378b97a8dec07ce22e364e4b8bb352db213801a6a8c654a330", - "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1-sources.jar" - }, - { - "coord": "com.google.code.findbugs:jsr305:3.0.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "https://maven.fabric.io/public/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" - ], - "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", - "url": "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" - }, - { - "coord": "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", - "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", - "https://maven.fabric.io/public/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", - "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar", - "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar" - ], - "sha256": "1c9e85e272d0708c6a591dc74828c71603053b48cc75ae83cce56912a2aa063b", - "url": "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2-sources.jar" - }, - { - "coord": "com.google.code.gson:gson:2.8.5", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar", - "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar", - "https://maven.fabric.io/public/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar", - "https://maven.google.com/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar", - "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar" - ], - "sha256": "233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81", - "url": "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar" - }, - { - "coord": "com.google.code.gson:gson:jar:sources:2.8.5", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/code/gson/gson/2.8.5/gson-2.8.5-sources.jar", - "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5-sources.jar", - "https://maven.fabric.io/public/com/google/code/gson/gson/2.8.5/gson-2.8.5-sources.jar", - "https://maven.google.com/com/google/code/gson/gson/2.8.5/gson-2.8.5-sources.jar", - "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5-sources.jar" - ], - "sha256": "512b4bf6927f4864acc419b8c5109c23361c30ed1f5798170248d33040de068e", - "url": "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.5/gson-2.8.5-sources.jar" - }, - { - "coord": "com.google.dagger:dagger-compiler:2.28.1", - "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.1.0", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.guava:guava:30.1.1-android", - "net.ltgt.gradle.incap:incap:0.3", - "com.google.errorprone:javac-shaded:9-dev-r4023-3", - "com.google.dagger:dagger-spi:2.28.1", - "com.squareup:javapoet:1.11.1", - "com.google.dagger:dagger-producers:2.28.1", - "com.google.guava:failureaccess:1.0.1", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "javax.inject:javax.inject:1", - "com.google.dagger:dagger:2.28.1", - "javax.annotation:jsr250-api:1.0", - "com.google.googlejavaformat:google-java-format:1.5", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "directDependencies": [ - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.1.0", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.guava:guava:30.1.1-android", - "net.ltgt.gradle.incap:incap:0.3", - "com.google.dagger:dagger-spi:2.28.1", - "com.squareup:javapoet:1.11.1", - "com.google.dagger:dagger-producers:2.28.1", - "com.google.guava:failureaccess:1.0.1", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "javax.inject:javax.inject:1", - "com.google.dagger:dagger:2.28.1", - "javax.annotation:jsr250-api:1.0", - "com.google.googlejavaformat:google-java-format:1.5", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1.jar", - "https://maven.fabric.io/public/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1.jar", - "https://maven.google.com/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1.jar" - ], - "sha256": "379d4fce6d11234c3814aca1676aa34f5dd0f0ec5155c44de2d5e49cacee573c", - "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1.jar" - }, - { - "coord": "com.google.dagger:dagger-compiler:jar:sources:2.28.1", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources:0.1.0", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.errorprone:javac-shaded:jar:sources:9-dev-r4023-3", - "com.google.googlejavaformat:google-java-format:jar:sources:1.5", - "com.google.dagger:dagger:jar:sources:2.28.1", - "javax.inject:javax.inject:jar:sources:1", - "com.squareup:javapoet:jar:sources:1.11.1", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.dagger:dagger-spi:jar:sources:2.28.1", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.dagger:dagger-producers:jar:sources:2.28.1", - "net.ltgt.gradle.incap:incap:jar:sources:0.3", - "javax.annotation:jsr250-api:jar:sources:1.0" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources:0.1.0", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.googlejavaformat:google-java-format:jar:sources:1.5", - "com.google.dagger:dagger:jar:sources:2.28.1", - "javax.inject:javax.inject:jar:sources:1", - "com.squareup:javapoet:jar:sources:1.11.1", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.dagger:dagger-spi:jar:sources:2.28.1", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.dagger:dagger-producers:jar:sources:2.28.1", - "net.ltgt.gradle.incap:incap:jar:sources:0.3", - "javax.annotation:jsr250-api:jar:sources:1.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1-sources.jar", - "https://maven.fabric.io/public/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1-sources.jar", - "https://maven.google.com/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1-sources.jar" - ], - "sha256": "af48aca813093236f5fdbf90bb6ba566c51e323283e1666aef29432e14265651", - "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger-compiler/2.28.1/dagger-compiler-2.28.1-sources.jar" - }, - { - "coord": "com.google.dagger:dagger-producers:2.28.1", - "dependencies": [ - "com.google.guava:guava:30.1.1-android", - "com.google.guava:failureaccess:1.0.1", - "javax.inject:javax.inject:1", - "com.google.dagger:dagger:2.28.1", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "directDependencies": [ - "com.google.guava:guava:30.1.1-android", - "com.google.guava:failureaccess:1.0.1", - "javax.inject:javax.inject:1", - "com.google.dagger:dagger:2.28.1", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1.jar", - "https://maven.fabric.io/public/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1.jar", - "https://maven.google.com/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1.jar" - ], - "sha256": "7c44499d5717cf6fdc3d026e5440c6bac9cabc98226d28715ca0eda90e68f7b2", - "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1.jar" - }, - { - "coord": "com.google.dagger:dagger-producers:jar:sources:2.28.1", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.google.dagger:dagger:jar:sources:2.28.1", - "javax.inject:javax.inject:jar:sources:1", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:failureaccess:jar:sources:1.0.1" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.google.dagger:dagger:jar:sources:2.28.1", - "javax.inject:javax.inject:jar:sources:1", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:failureaccess:jar:sources:1.0.1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1-sources.jar", - "https://maven.fabric.io/public/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1-sources.jar", - "https://maven.google.com/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1-sources.jar" - ], - "sha256": "eae1e6a10f61270251e634b63886246a4500cb16a254309d86f696604ce2ff03", - "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger-producers/2.28.1/dagger-producers-2.28.1-sources.jar" - }, - { - "coord": "com.google.dagger:dagger-spi:2.28.1", - "dependencies": [ - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.guava:guava:30.1.1-android", - "com.squareup:javapoet:1.11.1", - "com.google.dagger:dagger-producers:2.28.1", - "com.google.guava:failureaccess:1.0.1", - "javax.inject:javax.inject:1", - "com.google.dagger:dagger:2.28.1", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "directDependencies": [ - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.guava:guava:30.1.1-android", - "com.squareup:javapoet:1.11.1", - "com.google.dagger:dagger-producers:2.28.1", - "com.google.guava:failureaccess:1.0.1", - "javax.inject:javax.inject:1", - "com.google.dagger:dagger:2.28.1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1.jar", - "https://maven.fabric.io/public/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1.jar", - "https://maven.google.com/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1.jar" - ], - "sha256": "aae2a23d0bce8bae6d6c0e302b048c389d0f2354adc14fd80366c2913e3c5f07", - "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1.jar" - }, - { - "coord": "com.google.dagger:dagger-spi:jar:sources:2.28.1", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.dagger:dagger:jar:sources:2.28.1", - "javax.inject:javax.inject:jar:sources:1", - "com.squareup:javapoet:jar:sources:1.11.1", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.dagger:dagger-producers:jar:sources:2.28.1" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.dagger:dagger:jar:sources:2.28.1", - "javax.inject:javax.inject:jar:sources:1", - "com.squareup:javapoet:jar:sources:1.11.1", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.dagger:dagger-producers:jar:sources:2.28.1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1-sources.jar", - "https://maven.fabric.io/public/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1-sources.jar", - "https://maven.google.com/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1-sources.jar" - ], - "sha256": "da97df1daa28befc4f721df7cd925429b08bc7a766596ff28d21b646097e08cc", - "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger-spi/2.28.1/dagger-spi-2.28.1-sources.jar" - }, - { - "coord": "com.google.dagger:dagger:2.28.1", - "dependencies": [ - "javax.inject:javax.inject:1" - ], - "directDependencies": [ - "javax.inject:javax.inject:1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger/2.28.1/dagger-2.28.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/dagger/dagger/2.28.1/dagger-2.28.1.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.28.1/dagger-2.28.1.jar", - "https://maven.fabric.io/public/com/google/dagger/dagger/2.28.1/dagger-2.28.1.jar", - "https://maven.google.com/com/google/dagger/dagger/2.28.1/dagger-2.28.1.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.28.1/dagger-2.28.1.jar" - ], - "sha256": "c2a09540677b6ffeeb5911c5d8e69738718004e875a10c176e84ed8c997739a7", - "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.28.1/dagger-2.28.1.jar" - }, - { - "coord": "com.google.dagger:dagger:jar:sources:2.28.1", - "dependencies": [ - "javax.inject:javax.inject:jar:sources:1" - ], - "directDependencies": [ - "javax.inject:javax.inject:jar:sources:1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger/2.28.1/dagger-2.28.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/dagger/dagger/2.28.1/dagger-2.28.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.28.1/dagger-2.28.1-sources.jar", - "https://maven.fabric.io/public/com/google/dagger/dagger/2.28.1/dagger-2.28.1-sources.jar", - "https://maven.google.com/com/google/dagger/dagger/2.28.1/dagger-2.28.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.28.1/dagger-2.28.1-sources.jar" - ], - "sha256": "bd27a8952be63263a86c3dad1ee175eb02a66cdf9956d041a3985b50a1979b3a", - "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.28.1/dagger-2.28.1-sources.jar" - }, - { - "coord": "com.google.errorprone:error_prone_annotations:2.7.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar", - "https://maven.fabric.io/public/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar" - ], - "sha256": "cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3", - "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1.jar" - }, - { - "coord": "com.google.errorprone:error_prone_annotations:jar:sources:2.7.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1-sources.jar", - "https://maven.fabric.io/public/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1-sources.jar", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1-sources.jar" - ], - "sha256": "e38921f918b8ad8eabd12bc61de426fa96c72de077054e9147d2f9fe7c648923", - "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.7.1/error_prone_annotations-2.7.1-sources.jar" - }, - { - "coord": "com.google.errorprone:javac-shaded:9-dev-r4023-3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar", - "https://maven.fabric.io/public/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar", - "https://maven.google.com/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar" - ], - "sha256": "65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30", - "url": "https://repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3.jar" - }, - { - "coord": "com.google.errorprone:javac-shaded:jar:sources:9-dev-r4023-3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3-sources.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3-sources.jar", - "https://maven.fabric.io/public/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3-sources.jar", - "https://maven.google.com/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3-sources.jar", - "https://repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3-sources.jar" - ], - "sha256": "cf0fde1aad77ac6e0e2d36a9f9179193ae1707088ba00ffa91fcfb5269304a6a", - "url": "https://repo1.maven.org/maven2/com/google/errorprone/javac-shaded/9-dev-r4023-3/javac-shaded-9-dev-r4023-3-sources.jar" - }, - { - "coord": "com.google.firebase:firebase-analytics:17.5.0", - "dependencies": [ - "com.google.firebase:firebase-measurement-connector:aar:18.0.0", - "com.google.firebase:firebase-installations:aar:16.3.2", - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.annotation:annotation:1.1.0", - "com.google.firebase:firebase-common:aar:19.3.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-measurement-sdk-api:aar:17.5.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "com.google.android.gms:play-services-measurement-impl:aar:17.5.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "com.google.android.gms:play-services-measurement:aar:17.5.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-ads-identifier:aar:17.0.0", - "com.google.android.gms:play-services-measurement-api:aar:17.5.0", - "com.google.android.gms:play-services-measurement-sdk:aar:17.5.0", - "androidx.print:print:aar:1.0.0", - "androidx.annotation:annotation:jar:1.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:1.8.1", - "com.google.firebase:firebase-installations-interop:aar:16.0.0", - "com.google.android.gms:play-services-measurement-base:aar:17.5.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-measurement:aar:17.5.0", - "com.google.android.gms:play-services-measurement-api:aar:17.5.0", - "com.google.android.gms:play-services-measurement-sdk:aar:17.5.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-analytics/17.5.0/firebase-analytics-17.5.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-analytics/17.5.0/firebase-analytics-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-analytics/17.5.0/firebase-analytics-17.5.0.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-analytics/17.5.0/firebase-analytics-17.5.0.aar", - "https://maven.google.com/com/google/firebase/firebase-analytics/17.5.0/firebase-analytics-17.5.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-analytics/17.5.0/firebase-analytics-17.5.0.aar" - ], - "sha256": "5c36ae943a719de1c598287370cb3ee1d27fd2dc9d0ada650de2b7f9a1dcac54", - "url": "https://maven.google.com/com/google/firebase/firebase-analytics/17.5.0/firebase-analytics-17.5.0.aar" - }, - { - "coord": "com.google.firebase:firebase-common:19.3.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.annotation:annotation:jar:1.1.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:1.8.1" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:1.8.1", - "com.google.firebase:firebase-components:aar:16.0.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0.aar", - "https://maven.google.com/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0.aar" - ], - "sha256": "7bd7971470ff943e3c3abb1d7809ef5cb4b81f1996be0867714372b3efa7405a", - "url": "https://maven.google.com/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0.aar" - }, - { - "coord": "com.google.firebase:firebase-common:aar:sources:19.3.0", - "dependencies": [ - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "com.google.firebase:firebase-components:aar:sources:16.0.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0-sources.jar", - "https://maven.fabric.io/public/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0-sources.jar", - "https://maven.google.com/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0-sources.jar" - ], - "sha256": "1a3f326b3992552200c91db1132c81ec5f6143bc6dd9af8f6f3b66388707c62b", - "url": "https://maven.google.com/com/google/firebase/firebase-common/19.3.0/firebase-common-19.3.0-sources.jar" - }, - { - "coord": "com.google.firebase:firebase-components:aar:16.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:1.1.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0.aar", - "https://maven.google.com/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0.aar" - ], - "sha256": "8ef43b412de4ec3e36a87c66d8a0a14a3de0a2e8566946da6a0e799b7fdd8ec9", - "url": "https://maven.google.com/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0.aar" - }, - { - "coord": "com.google.firebase:firebase-components:aar:sources:16.0.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0-sources.jar", - "https://maven.fabric.io/public/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0-sources.jar", - "https://maven.google.com/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0-sources.jar" - ], - "sha256": "8c541d1b27245aff00937b08131cb41c99b4a6dcb5b5a7440283018d13fe9747", - "url": "https://maven.google.com/com/google/firebase/firebase-components/16.0.0/firebase-components-16.0.0-sources.jar" - }, - { - "coord": "com.google.firebase:firebase-crashlytics:17.1.1", - "dependencies": [ - "com.google.firebase:firebase-measurement-connector:aar:18.0.0", - "com.google.firebase:firebase-installations:aar:16.3.2", - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.annotation:annotation:1.1.0", - "com.google.android.gms:play-services-base:aar:17.0.0", - "com.google.firebase:firebase-iid:aar:20.1.5", - "com.google.firebase:firebase-common:aar:19.3.0", - "com.google.android.datatransport:transport-backend-cct:aar:2.3.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.android.datatransport:transport-api:aar:2.2.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.dagger:dagger:jar:2.28.1", - "com.google.firebase:firebase-encoders-json:aar:16.1.0", - "com.squareup.okhttp3:okhttp:jar:4.7.2", - "androidx.print:print:aar:1.0.0", - "androidx.annotation:annotation:jar:1.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.firebase:firebase-iid-interop:aar:17.0.0", - "com.google.android.datatransport:transport-runtime:aar:2.2.3", - "com.google.auto.value:auto-value-annotations:jar:1.8.1", - "com.google.firebase:firebase-installations-interop:aar:16.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "com.google.firebase:firebase-measurement-connector:aar:18.0.0", - "com.google.firebase:firebase-iid:aar:20.1.5", - "com.google.firebase:firebase-common:aar:19.3.0", - "com.google.android.datatransport:transport-backend-cct:aar:2.3.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.android.datatransport:transport-api:aar:2.2.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "com.google.firebase:firebase-encoders-json:aar:16.1.0", - "com.squareup.okhttp3:okhttp:jar:4.7.2", - "com.google.firebase:firebase-iid-interop:aar:17.0.0", - "com.google.android.datatransport:transport-runtime:aar:2.2.3" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-crashlytics/17.1.1/firebase-crashlytics-17.1.1.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-crashlytics/17.1.1/firebase-crashlytics-17.1.1.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-crashlytics/17.1.1/firebase-crashlytics-17.1.1.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-crashlytics/17.1.1/firebase-crashlytics-17.1.1.aar", - "https://maven.google.com/com/google/firebase/firebase-crashlytics/17.1.1/firebase-crashlytics-17.1.1.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-crashlytics/17.1.1/firebase-crashlytics-17.1.1.aar" - ], - "sha256": "635953640e1bbb277affadbc3e59b43f1c4dd07de79c8973b6341a756ad8b74b", - "url": "https://maven.google.com/com/google/firebase/firebase-crashlytics/17.1.1/firebase-crashlytics-17.1.1.aar" - }, - { - "coord": "com.google.firebase:firebase-encoders-json:aar:16.1.0", - "dependencies": [ - "androidx.annotation:annotation:jar:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:1.1.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0.aar", - "https://maven.google.com/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0.aar" - ], - "sha256": "24ce7c1cfda1d526b76b16437a2e7d0920d7176a377e0e30b2a7381341f22ea1", - "url": "https://maven.google.com/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0.aar" - }, - { - "coord": "com.google.firebase:firebase-encoders-json:aar:sources:16.1.0", - "dependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0-sources.jar", - "https://maven.fabric.io/public/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0-sources.jar", - "https://maven.google.com/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0-sources.jar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0-sources.jar" - ], - "sha256": "791b1521a8f5eda7ded50ccdf3afa7632a1198964e3c60e93e7ae602d54ca314", - "url": "https://maven.google.com/com/google/firebase/firebase-encoders-json/16.1.0/firebase-encoders-json-16.1.0-sources.jar" - }, - { - "coord": "com.google.firebase:firebase-iid-interop:aar:17.0.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-base:aar:17.0.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-base:aar:17.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-iid-interop/17.0.0/firebase-iid-interop-17.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-iid-interop/17.0.0/firebase-iid-interop-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-iid-interop/17.0.0/firebase-iid-interop-17.0.0.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-iid-interop/17.0.0/firebase-iid-interop-17.0.0.aar", - "https://maven.google.com/com/google/firebase/firebase-iid-interop/17.0.0/firebase-iid-interop-17.0.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-iid-interop/17.0.0/firebase-iid-interop-17.0.0.aar" - ], - "sha256": "b6f4ad581eb489370be3bf38a4bdabfc6ea3d4e716234c625a0f42516c53523c", - "url": "https://maven.google.com/com/google/firebase/firebase-iid-interop/17.0.0/firebase-iid-interop-17.0.0.aar" - }, - { - "coord": "com.google.firebase:firebase-iid:aar:20.1.5", - "dependencies": [ - "com.google.firebase:firebase-installations:aar:16.3.2", - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "androidx.annotation:annotation:1.1.0", - "com.google.android.gms:play-services-base:aar:17.0.0", - "com.google.firebase:firebase-common:aar:19.3.0", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.print:print:aar:1.0.0", - "androidx.annotation:annotation:jar:1.1.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0", - "androidx.documentfile:documentfile:aar:1.0.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.firebase:firebase-iid-interop:aar:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:1.8.1", - "com.google.firebase:firebase-installations-interop:aar:16.0.0", - "androidx.loader:loader:aar:1.0.0" - ], - "directDependencies": [ - "com.google.firebase:firebase-installations:aar:16.3.2", - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-stats:aar:17.0.0", - "com.google.firebase:firebase-common:aar:19.3.0", - "androidx.legacy:legacy-support-core-utils:aar:1.0.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.firebase:firebase-iid-interop:aar:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:16.0.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-iid/20.1.5/firebase-iid-20.1.5.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-iid/20.1.5/firebase-iid-20.1.5.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-iid/20.1.5/firebase-iid-20.1.5.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-iid/20.1.5/firebase-iid-20.1.5.aar", - "https://maven.google.com/com/google/firebase/firebase-iid/20.1.5/firebase-iid-20.1.5.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-iid/20.1.5/firebase-iid-20.1.5.aar" - ], - "sha256": "f1c174e75a24f298fbc0ed93dde29c997f29ca511d7e8a18dec068203553cf6b", - "url": "https://maven.google.com/com/google/firebase/firebase-iid/20.1.5/firebase-iid-20.1.5.aar" - }, - { - "coord": "com.google.firebase:firebase-installations-interop:aar:16.0.0", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-tasks:aar:17.0.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-installations-interop/16.0.0/firebase-installations-interop-16.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-installations-interop/16.0.0/firebase-installations-interop-16.0.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-installations-interop/16.0.0/firebase-installations-interop-16.0.0.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-installations-interop/16.0.0/firebase-installations-interop-16.0.0.aar", - "https://maven.google.com/com/google/firebase/firebase-installations-interop/16.0.0/firebase-installations-interop-16.0.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-installations-interop/16.0.0/firebase-installations-interop-16.0.0.aar" - ], - "sha256": "d498fe20e7d2c65fc8f7124f1c1791d2828bebdf6bf06ab4cdee13e7fe9ccaa2", - "url": "https://maven.google.com/com/google/firebase/firebase-installations-interop/16.0.0/firebase-installations-interop-16.0.0.aar" - }, - { - "coord": "com.google.firebase:firebase-installations:aar:16.3.2", - "dependencies": [ - "androidx.collection:collection:jar:1.1.0", - "com.google.firebase:firebase-common:aar:19.3.0", - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "androidx.fragment:fragment:aar:1.2.0", - "androidx.core:core:aar:1.3.1", - "androidx.annotation:annotation:jar:1.1.0", - "com.google.android.gms:play-services-basement:aar:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:1.8.1", - "com.google.firebase:firebase-installations-interop:aar:16.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-tasks:aar:17.0.0", - "com.google.firebase:firebase-common:aar:19.3.0", - "com.google.firebase:firebase-components:aar:16.0.0", - "com.google.firebase:firebase-installations-interop:aar:16.0.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-installations/16.3.2/firebase-installations-16.3.2.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-installations/16.3.2/firebase-installations-16.3.2.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-installations/16.3.2/firebase-installations-16.3.2.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-installations/16.3.2/firebase-installations-16.3.2.aar", - "https://maven.google.com/com/google/firebase/firebase-installations/16.3.2/firebase-installations-16.3.2.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-installations/16.3.2/firebase-installations-16.3.2.aar" - ], - "sha256": "0d0f88b3c3789d5fe1aa9a69bd5ab6c0e92036fcf34520775a0091e37268dd3f", - "url": "https://maven.google.com/com/google/firebase/firebase-installations/16.3.2/firebase-installations-16.3.2.aar" - }, - { - "coord": "com.google.firebase:firebase-measurement-connector:aar:18.0.0", - "dependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0", - "androidx.collection:collection:jar:1.1.0", - "androidx.core:core:aar:1.3.1", - "androidx.fragment:fragment:aar:1.2.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:17.0.0" - ], - "file": "v1/https/maven.google.com/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.aar", - "mirror_urls": [ - "https://maven.google.com/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.aar", - "https://maven.fabric.io/public/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.aar", - "https://maven.google.com/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.aar", - "https://repo1.maven.org/maven2/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.aar" - ], - "sha256": "17e8b9b60ac0a79fcbed754d03d4b966cc5bb8837e79c2308bf2970f1d05700c", - "url": "https://maven.google.com/com/google/firebase/firebase-measurement-connector/18.0.0/firebase-measurement-connector-18.0.0.aar" - }, - { - "coord": "com.google.gms:google-services:4.3.3", - "dependencies": [ - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.guava:guava:30.1.1-android", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "com.google.code.gson:gson:2.8.5", - "com.google.android.gms:strict-version-matcher-plugin:1.2.1" - ], - "directDependencies": [ - "com.google.android.gms:strict-version-matcher-plugin:1.2.1", - "com.google.code.gson:gson:2.8.5", - "com.google.guava:guava:30.1.1-android" - ], - "file": "v1/https/maven.google.com/com/google/gms/google-services/4.3.3/google-services-4.3.3.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/gms/google-services/4.3.3/google-services-4.3.3.jar", - "https://repo1.maven.org/maven2/com/google/gms/google-services/4.3.3/google-services-4.3.3.jar", - "https://maven.fabric.io/public/com/google/gms/google-services/4.3.3/google-services-4.3.3.jar", - "https://maven.google.com/com/google/gms/google-services/4.3.3/google-services-4.3.3.jar", - "https://repo1.maven.org/maven2/com/google/gms/google-services/4.3.3/google-services-4.3.3.jar" - ], - "sha256": "d9668002ef7032deddf7dbf853b47e10e6722bbce1b318fe7d6a297e28a8dcae", - "url": "https://maven.google.com/com/google/gms/google-services/4.3.3/google-services-4.3.3.jar" - }, - { - "coord": "com.google.gms:google-services:jar:sources:4.3.3", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "com.google.code.gson:gson:jar:sources:2.8.5", - "com.google.android.gms:strict-version-matcher-plugin:jar:sources:1.2.1" - ], - "directDependencies": [ - "com.google.android.gms:strict-version-matcher-plugin:jar:sources:1.2.1", - "com.google.code.gson:gson:jar:sources:2.8.5", - "com.google.guava:guava:jar:sources:30.1.1-android" - ], - "file": "v1/https/maven.google.com/com/google/gms/google-services/4.3.3/google-services-4.3.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/gms/google-services/4.3.3/google-services-4.3.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/gms/google-services/4.3.3/google-services-4.3.3-sources.jar", - "https://maven.fabric.io/public/com/google/gms/google-services/4.3.3/google-services-4.3.3-sources.jar", - "https://maven.google.com/com/google/gms/google-services/4.3.3/google-services-4.3.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/gms/google-services/4.3.3/google-services-4.3.3-sources.jar" - ], - "sha256": "453def3af6897f944b3175ce0538c3ca1536583ace3b3b3a15aca1c2e2be6bb0", - "url": "https://maven.google.com/com/google/gms/google-services/4.3.3/google-services-4.3.3-sources.jar" - }, - { - "coord": "com.google.googlejavaformat:google-java-format:1.5", - "dependencies": [ - "com.google.guava:guava:30.1.1-android", - "com.google.errorprone:javac-shaded:9-dev-r4023-3" - ], - "directDependencies": [ - "com.google.errorprone:javac-shaded:9-dev-r4023-3", - "com.google.guava:guava:30.1.1-android" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar", - "https://repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar", - "https://maven.fabric.io/public/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar", - "https://maven.google.com/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar", - "https://repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar" - ], - "sha256": "aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e", - "url": "https://repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5.jar" - }, - { - "coord": "com.google.googlejavaformat:google-java-format:jar:sources:1.5", - "dependencies": [ - "com.google.errorprone:javac-shaded:jar:sources:9-dev-r4023-3", - "com.google.guava:guava:jar:sources:30.1.1-android" - ], - "directDependencies": [ - "com.google.errorprone:javac-shaded:jar:sources:9-dev-r4023-3", - "com.google.guava:guava:jar:sources:30.1.1-android" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5-sources.jar", - "https://repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5-sources.jar", - "https://maven.fabric.io/public/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5-sources.jar", - "https://maven.google.com/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5-sources.jar", - "https://repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5-sources.jar" - ], - "sha256": "c204b15b3834128d335f17213f7e621ddb2cc5bfff5b8dd035cd1f2affb7fa8f", - "url": "https://repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.5/google-java-format-1.5-sources.jar" - }, - { - "coord": "com.google.guava:failureaccess:1.0.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "https://maven.fabric.io/public/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" - ], - "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26", - "url": "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" - }, - { - "coord": "com.google.guava:failureaccess:jar:sources:1.0.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", - "https://maven.fabric.io/public/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", - "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar", - "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar" - ], - "sha256": "092346eebbb1657b51aa7485a246bf602bb464cc0b0e2e1c7e7201fadce1e98f", - "url": "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1-sources.jar" - }, - { - "coord": "com.google.guava:guava:30.1.1-android", - "dependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.j2objc:j2objc-annotations:1.3", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.errorprone:error_prone_annotations:2.7.1", - "com.google.guava:failureaccess:1.0.1", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "directDependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.j2objc:j2objc-annotations:1.3", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.errorprone:error_prone_annotations:2.7.1", - "com.google.guava:failureaccess:1.0.1", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/30.1.1-android/guava-30.1.1-android.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/guava/guava/30.1.1-android/guava-30.1.1-android.jar", - "https://repo1.maven.org/maven2/com/google/guava/guava/30.1.1-android/guava-30.1.1-android.jar", - "https://maven.fabric.io/public/com/google/guava/guava/30.1.1-android/guava-30.1.1-android.jar", - "https://maven.google.com/com/google/guava/guava/30.1.1-android/guava-30.1.1-android.jar", - "https://repo1.maven.org/maven2/com/google/guava/guava/30.1.1-android/guava-30.1.1-android.jar" - ], - "sha256": "355f79352f8c252f2bdaa06c687c4836a38016caccfc4c28d16ae77ecfdffa2f", - "url": "https://repo1.maven.org/maven2/com/google/guava/guava/30.1.1-android/guava-30.1.1-android.jar" - }, - { - "coord": "com.google.guava:guava:jar:sources:30.1.1-android", - "dependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.errorprone:error_prone_annotations:jar:sources:2.7.1" - ], - "directDependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.errorprone:error_prone_annotations:jar:sources:2.7.1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/30.1.1-android/guava-30.1.1-android-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/guava/guava/30.1.1-android/guava-30.1.1-android-sources.jar", - "https://repo1.maven.org/maven2/com/google/guava/guava/30.1.1-android/guava-30.1.1-android-sources.jar", - "https://maven.fabric.io/public/com/google/guava/guava/30.1.1-android/guava-30.1.1-android-sources.jar", - "https://maven.google.com/com/google/guava/guava/30.1.1-android/guava-30.1.1-android-sources.jar", - "https://repo1.maven.org/maven2/com/google/guava/guava/30.1.1-android/guava-30.1.1-android-sources.jar" - ], - "sha256": "dac52416371d86baea1ffe6ef7b54b2730b52fcea19091ae32942cb5cd9f868c", - "url": "https://repo1.maven.org/maven2/com/google/guava/guava/30.1.1-android/guava-30.1.1-android-sources.jar" - }, - { - "coord": "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", - "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", - "https://maven.fabric.io/public/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", - "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar", - "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" - ], - "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", - "url": "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" - }, - { - "coord": "com.google.j2objc:j2objc-annotations:1.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://maven.fabric.io/public/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" - ], - "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", - "url": "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" - }, - { - "coord": "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", - "https://maven.fabric.io/public/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" - ], - "sha256": "ba4df669fec153fa4cd0ef8d02c6d3ef0702b7ac4cabe080facf3b6e490bb972", - "url": "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3-sources.jar" - }, - { - "coord": "com.google.protobuf:protobuf-java:3.17.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3.jar", - "https://maven.fabric.io/public/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3.jar" - ], - "sha256": "4ac549b192694141958049f060a1c826a33342f619e108ced8c17d9877f5e3ed", - "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3.jar" - }, - { - "coord": "com.google.protobuf:protobuf-java:jar:sources:3.17.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3-sources.jar", - "https://maven.fabric.io/public/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3-sources.jar", - "https://maven.google.com/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3-sources.jar" - ], - "sha256": "204bad0a36827296ed0b6fdbdf1a17028f3e3d289dd20042980331b8f0ef646e", - "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.17.3/protobuf-java-3.17.3-sources.jar" - }, - { - "coord": "com.google.protobuf:protobuf-javalite:3.17.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3.jar", - "https://maven.fabric.io/public/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3.jar", - "https://maven.google.com/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3.jar" - ], - "sha256": "dc643901cc9d95998a1e45ab11e75d4237a7e1947bcbca0b7eca569aaf5e714d", - "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3.jar" - }, - { - "coord": "com.google.protobuf:protobuf-javalite:jar:sources:3.17.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3-sources.jar", - "https://maven.fabric.io/public/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3-sources.jar", - "https://maven.google.com/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3-sources.jar" - ], - "sha256": "b7bc7b41c266f59c921bf094b4325fb9bcdd0a8d95d742db8cca3a1c76503f9b", - "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-javalite/3.17.3/protobuf-javalite-3.17.3-sources.jar" - }, - { - "coord": "com.google.truth.extensions:truth-liteproto-extension:1.1.3", - "dependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.j2objc:j2objc-annotations:1.3", - "com.google.truth:truth:1.1.3", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.guava:guava:30.1.1-android", - "com.google.errorprone:error_prone_annotations:2.7.1", - "org.hamcrest:hamcrest-core:1.3", - "org.checkerframework:checker-qual:3.13.0", - "com.google.auto.value:auto-value-annotations:1.8.1", - "com.google.guava:failureaccess:1.0.1", - "org.ow2.asm:asm:9.1", - "junit:junit:4.13.2", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "directDependencies": [ - "com.google.truth:truth:1.1.3", - "com.google.guava:guava:30.1.1-android", - "com.google.errorprone:error_prone_annotations:2.7.1", - "org.checkerframework:checker-qual:3.13.0", - "com.google.auto.value:auto-value-annotations:1.8.1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3.jar", - "https://repo1.maven.org/maven2/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3.jar", - "https://maven.fabric.io/public/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3.jar", - "https://maven.google.com/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3.jar", - "https://repo1.maven.org/maven2/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3.jar" - ], - "sha256": "71cce6284554e546d1b5ba48e310ee4b4050676f09fb0eced136d779284ff78d", - "url": "https://repo1.maven.org/maven2/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3.jar" - }, - { - "coord": "com.google.truth.extensions:truth-liteproto-extension:jar:sources:1.1.3", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "org.ow2.asm:asm:jar:sources:9.1", - "org.checkerframework:checker-qual:jar:sources:3.13.0", - "junit:junit:jar:sources:4.13.2", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "com.google.truth:truth:jar:sources:1.1.3", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.errorprone:error_prone_annotations:jar:sources:2.7.1", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.checkerframework:checker-qual:jar:sources:3.13.0", - "com.google.truth:truth:jar:sources:1.1.3", - "com.google.errorprone:error_prone_annotations:jar:sources:2.7.1", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3-sources.jar", - "https://maven.fabric.io/public/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3-sources.jar", - "https://maven.google.com/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3-sources.jar" - ], - "sha256": "fd3c26b2232966a3ff25e5b9c642f9ae9f19c86b29dfeb6e72aeb67e45e36130", - "url": "https://repo1.maven.org/maven2/com/google/truth/extensions/truth-liteproto-extension/1.1.3/truth-liteproto-extension-1.1.3-sources.jar" - }, - { - "coord": "com.google.truth:truth:1.1.3", - "dependencies": [ - "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.j2objc:j2objc-annotations:1.3", - "com.google.code.findbugs:jsr305:3.0.2", - "com.google.guava:guava:30.1.1-android", - "com.google.errorprone:error_prone_annotations:2.7.1", - "org.hamcrest:hamcrest-core:1.3", - "org.checkerframework:checker-qual:3.13.0", - "com.google.auto.value:auto-value-annotations:1.8.1", - "com.google.guava:failureaccess:1.0.1", - "org.ow2.asm:asm:9.1", - "junit:junit:4.13.2", - "org.checkerframework:checker-compat-qual:2.5.5" - ], - "directDependencies": [ - "com.google.guava:guava:30.1.1-android", - "com.google.errorprone:error_prone_annotations:2.7.1", - "org.checkerframework:checker-qual:3.13.0", - "com.google.auto.value:auto-value-annotations:1.8.1", - "org.ow2.asm:asm:9.1", - "junit:junit:4.13.2" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/truth/truth/1.1.3/truth-1.1.3.jar", - "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3.jar", - "https://maven.fabric.io/public/com/google/truth/truth/1.1.3/truth-1.1.3.jar", - "https://maven.google.com/com/google/truth/truth/1.1.3/truth-1.1.3.jar", - "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3.jar" - ], - "sha256": "fc0b67782289a2aabfddfdf99eff1dcd5edc890d49143fcd489214b107b8f4f3", - "url": "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3.jar" - }, - { - "coord": "com.google.truth:truth:jar:sources:1.1.3", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.j2objc:j2objc-annotations:jar:sources:1.3", - "org.ow2.asm:asm:jar:sources:9.1", - "org.checkerframework:checker-qual:jar:sources:3.13.0", - "junit:junit:jar:sources:4.13.2", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "com.google.guava:failureaccess:jar:sources:1.0.1", - "com.google.errorprone:error_prone_annotations:jar:sources:2.7.1", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.ow2.asm:asm:jar:sources:9.1", - "org.checkerframework:checker-qual:jar:sources:3.13.0", - "junit:junit:jar:sources:4.13.2", - "com.google.errorprone:error_prone_annotations:jar:sources:2.7.1", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1" - ], - "file": "v1/https/repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/google/truth/truth/1.1.3/truth-1.1.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3-sources.jar", - "https://maven.fabric.io/public/com/google/truth/truth/1.1.3/truth-1.1.3-sources.jar", - "https://maven.google.com/com/google/truth/truth/1.1.3/truth-1.1.3-sources.jar", - "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3-sources.jar" - ], - "sha256": "6c35e3d7087cd222938b41bbdb54041239b79dda07cf96c4027c118d566df545", - "url": "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3-sources.jar" - }, - { - "coord": "com.googlecode.juniversalchardet:juniversalchardet:1.0.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar", - "mirror_urls": [ - "https://maven.google.com/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar", - "https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar", - "https://maven.fabric.io/public/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar", - "https://maven.google.com/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar", - "https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar" - ], - "sha256": "757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76", - "url": "https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar" - }, - { - "coord": "com.googlecode.juniversalchardet:juniversalchardet:jar:sources:1.0.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3-sources.jar", - "https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3-sources.jar", - "https://maven.fabric.io/public/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3-sources.jar", - "https://maven.google.com/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3-sources.jar", - "https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3-sources.jar" - ], - "sha256": "3d1cb067f5cfe3cc19b77c837156f22368462af9acac5dd878e785966758fc27", - "url": "https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3-sources.jar" - }, - { - "coord": "com.ibm.icu:icu4j:53.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar", - "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar", - "https://maven.fabric.io/public/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar", - "https://maven.google.com/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar", - "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar" - ], - "sha256": "e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab", - "url": "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1.jar" - }, - { - "coord": "com.ibm.icu:icu4j:jar:sources:53.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/ibm/icu/icu4j/53.1/icu4j-53.1-sources.jar", - "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1-sources.jar", - "https://maven.fabric.io/public/com/ibm/icu/icu4j/53.1/icu4j-53.1-sources.jar", - "https://maven.google.com/com/ibm/icu/icu4j/53.1/icu4j-53.1-sources.jar", - "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1-sources.jar" - ], - "sha256": "610f0f35cd11415effe23b248ab129a316e7f73994c20ac1ebe7e092629eb994", - "url": "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/53.1/icu4j-53.1-sources.jar" - }, - { - "coord": "com.squareup.moshi:moshi-kotlin-codegen:1.11.0", - "dependencies": [ - "com.squareup:kotlinpoet:1.6.0", - "com.squareup.moshi:moshi:1.11.0", - "com.google.auto.service:auto-service-annotations:1.0-rc7", - "net.ltgt.gradle.incap:incap:0.3", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "com.squareup.okio:okio:2.6.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.ow2.asm:asm:9.1", - "org.jetbrains.kotlin:kotlin-reflect:1.5.0" - ], - "directDependencies": [ - "com.squareup:kotlinpoet:1.6.0", - "com.squareup.moshi:moshi:1.11.0", - "com.google.auto.service:auto-service-annotations:1.0-rc7", - "net.ltgt.gradle.incap:incap:0.3", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "org.ow2.asm:asm:9.1", - "org.jetbrains.kotlin:kotlin-reflect:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0.jar", - "https://maven.fabric.io/public/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0.jar", - "https://maven.google.com/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0.jar" - ], - "sha256": "e5d8e5cba11d8aca0261649c362fdee718e16ccc647124e55ee2e2c328be4c82", - "url": "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0.jar" - }, - { - "coord": "com.squareup.moshi:moshi-kotlin-codegen:jar:sources:1.11.0", - "dependencies": [ - "com.google.auto.service:auto-service-annotations:jar:sources:1.0-rc7", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.ow2.asm:asm:jar:sources:9.1", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.4.10", - "com.squareup:kotlinpoet:jar:sources:1.6.0", - "com.squareup.moshi:moshi:jar:sources:1.11.0", - "com.squareup.okio:okio:jar:sources:2.6.0", - "net.ltgt.gradle.incap:incap:jar:sources:0.3" - ], - "directDependencies": [ - "com.google.auto.service:auto-service-annotations:jar:sources:1.0-rc7", - "org.ow2.asm:asm:jar:sources:9.1", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "com.squareup:kotlinpoet:jar:sources:1.6.0", - "com.squareup.moshi:moshi:jar:sources:1.11.0", - "net.ltgt.gradle.incap:incap:jar:sources:0.3" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0-sources.jar", - "https://maven.fabric.io/public/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0-sources.jar", - "https://maven.google.com/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0-sources.jar" - ], - "sha256": "c77fe938333fd96539aee34cdb8e923591f145ad727a2fb9ab250f527d85859c", - "url": "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin-codegen/1.11.0/moshi-kotlin-codegen-1.11.0-sources.jar" - }, - { - "coord": "com.squareup.moshi:moshi-kotlin:1.11.0", - "dependencies": [ - "com.squareup.moshi:moshi:1.11.0", - "com.squareup.okio:okio:2.6.0", - "org.jetbrains.kotlin:kotlin-reflect:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "com.squareup.moshi:moshi:1.11.0", - "org.jetbrains.kotlin:kotlin-reflect:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0.jar", - "https://maven.fabric.io/public/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0.jar", - "https://maven.google.com/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0.jar" - ], - "sha256": "220f3b85d99ea40ff65609813f3624fb4313de3634a747adb04040cf7cb486bc", - "url": "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0.jar" - }, - { - "coord": "com.squareup.moshi:moshi-kotlin:jar:sources:1.11.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "com.squareup.moshi:moshi:jar:sources:1.11.0", - "com.squareup.okio:okio:jar:sources:2.6.0", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0" - ], - "directDependencies": [ - "com.squareup.moshi:moshi:jar:sources:1.11.0", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0-sources.jar", - "https://maven.fabric.io/public/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0-sources.jar", - "https://maven.google.com/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0-sources.jar" - ], - "sha256": "8ff200ab30a6d222281eb3db17d6c8f1854d4bc9e2d5ccf1d237029cb448dbb2", - "url": "https://repo1.maven.org/maven2/com/squareup/moshi/moshi-kotlin/1.11.0/moshi-kotlin-1.11.0-sources.jar" - }, - { - "coord": "com.squareup.moshi:moshi:1.11.0", - "dependencies": [ - "com.squareup.okio:okio:2.6.0" - ], - "directDependencies": [ - "com.squareup.okio:okio:2.6.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0.jar", - "https://maven.fabric.io/public/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0.jar", - "https://maven.google.com/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0.jar" - ], - "sha256": "b6ee64fb84a7486aa9983e20c75259d4931bd597c169e1e67c3bc0521fd03b27", - "url": "https://repo1.maven.org/maven2/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0.jar" - }, - { - "coord": "com.squareup.moshi:moshi:jar:sources:1.11.0", - "dependencies": [ - "com.squareup.okio:okio:jar:sources:2.6.0" - ], - "directDependencies": [ - "com.squareup.okio:okio:jar:sources:2.6.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0-sources.jar", - "https://maven.fabric.io/public/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0-sources.jar", - "https://maven.google.com/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0-sources.jar" - ], - "sha256": "ca8cbe76fb144ea7f274f914adfa51b932f390a67a16bf1f71f9b254303d4729", - "url": "https://repo1.maven.org/maven2/com/squareup/moshi/moshi/1.11.0/moshi-1.11.0-sources.jar" - }, - { - "coord": "com.squareup.okhttp3:mockwebserver:4.7.2", - "dependencies": [ - "org.hamcrest:hamcrest-core:1.3", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "com.squareup.okio:okio:2.6.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "junit:junit:4.13.2", - "com.squareup.okhttp3:okhttp:4.7.2" - ], - "directDependencies": [ - "com.squareup.okhttp3:okhttp:4.7.2", - "junit:junit:4.13.2" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2.jar", - "https://repo1.maven.org/maven2/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2.jar", - "https://maven.fabric.io/public/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2.jar", - "https://maven.google.com/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2.jar", - "https://repo1.maven.org/maven2/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2.jar" - ], - "sha256": "d7d08b5096336d5b5a27d0e91bb2ebfa7dd54e48c3bb1e3cba15cc9bf16526b7", - "url": "https://repo1.maven.org/maven2/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2.jar" - }, - { - "coord": "com.squareup.okhttp3:mockwebserver:jar:sources:4.7.2", - "dependencies": [ - "com.squareup.okhttp3:okhttp:jar:sources:4.7.2", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0", - "junit:junit:jar:sources:4.13.2", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "com.squareup.okio:okio:jar:sources:2.6.0" - ], - "directDependencies": [ - "com.squareup.okhttp3:okhttp:jar:sources:4.7.2", - "junit:junit:jar:sources:4.13.2" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2-sources.jar", - "https://maven.fabric.io/public/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2-sources.jar", - "https://maven.google.com/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2-sources.jar" - ], - "sha256": "c5bc89a4ba5429b68713443e0dc625e0bd073e2c4b06a7b6c6c643d4ce29e32b", - "url": "https://repo1.maven.org/maven2/com/squareup/okhttp3/mockwebserver/4.7.2/mockwebserver-4.7.2-sources.jar" - }, - { - "coord": "com.squareup.okhttp3:okhttp:4.7.2", - "dependencies": [ - "com.squareup.okio:okio:2.6.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "com.squareup.okio:okio:2.6.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2.jar", - "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2.jar", - "https://maven.fabric.io/public/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2.jar", - "https://maven.google.com/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2.jar", - "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2.jar" - ], - "sha256": "6b64ca1d2069751242984537d5de2cbe627ae000430f5117c47d8cb3d272facd", - "url": "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2.jar" - }, - { - "coord": "com.squareup.okhttp3:okhttp:jar:sources:4.7.2", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "com.squareup.okio:okio:jar:sources:2.6.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "com.squareup.okio:okio:jar:sources:2.6.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2-sources.jar", - "https://maven.fabric.io/public/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2-sources.jar", - "https://maven.google.com/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2-sources.jar" - ], - "sha256": "88348cf944f841a7a8f5f38960474592e0c1ed8a53349cabe05b22d255479772", - "url": "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/4.7.2/okhttp-4.7.2-sources.jar" - }, - { - "coord": "com.squareup.okio:okio:2.6.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/2.6.0/okio-2.6.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/okio/okio/2.6.0/okio-2.6.0.jar", - "https://repo1.maven.org/maven2/com/squareup/okio/okio/2.6.0/okio-2.6.0.jar", - "https://maven.fabric.io/public/com/squareup/okio/okio/2.6.0/okio-2.6.0.jar", - "https://maven.google.com/com/squareup/okio/okio/2.6.0/okio-2.6.0.jar", - "https://repo1.maven.org/maven2/com/squareup/okio/okio/2.6.0/okio-2.6.0.jar" - ], - "sha256": "4d84ef686277b58eb05691ac19cd3befa3429a27274982ee65ea0f07044bcc00", - "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/2.6.0/okio-2.6.0.jar" - }, - { - "coord": "com.squareup.okio:okio:jar:sources:2.6.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/okio/okio/2.6.0/okio-2.6.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/okio/okio/2.6.0/okio-2.6.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/okio/okio/2.6.0/okio-2.6.0-sources.jar", - "https://maven.fabric.io/public/com/squareup/okio/okio/2.6.0/okio-2.6.0-sources.jar", - "https://maven.google.com/com/squareup/okio/okio/2.6.0/okio-2.6.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/okio/okio/2.6.0/okio-2.6.0-sources.jar" - ], - "sha256": "bffda723f6706a29a0406993bd5262ecc4459460baa1b248147e03a3c55b62b4", - "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/2.6.0/okio-2.6.0-sources.jar" - }, - { - "coord": "com.squareup.retrofit2:converter-moshi:2.5.0", - "dependencies": [ - "com.squareup.retrofit2:retrofit:2.9.0", - "com.squareup.moshi:moshi:1.11.0" - ], - "directDependencies": [ - "com.squareup.moshi:moshi:1.11.0", - "com.squareup.retrofit2:retrofit:2.9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0.jar", - "https://maven.fabric.io/public/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0.jar", - "https://maven.google.com/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0.jar" - ], - "sha256": "6bade0b754a7b8b7551e2208cb8227e697c2db553b8f12df6f1aa70c6f058600", - "url": "https://repo1.maven.org/maven2/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0.jar" - }, - { - "coord": "com.squareup.retrofit2:converter-moshi:jar:sources:2.5.0", - "dependencies": [ - "com.squareup.retrofit2:retrofit:jar:sources:2.9.0", - "com.squareup.moshi:moshi:jar:sources:1.11.0" - ], - "directDependencies": [ - "com.squareup.moshi:moshi:jar:sources:1.11.0", - "com.squareup.retrofit2:retrofit:jar:sources:2.9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-sources.jar", - "https://maven.fabric.io/public/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-sources.jar", - "https://maven.google.com/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-sources.jar" - ], - "sha256": "d36be44932f400577eccd3c060543e74c8be651b245ad9d5c96fbb79a5ecbf03", - "url": "https://repo1.maven.org/maven2/com/squareup/retrofit2/converter-moshi/2.5.0/converter-moshi-2.5.0-sources.jar" - }, - { - "coord": "com.squareup.retrofit2:retrofit-mock:2.5.0", - "dependencies": [ - "com.squareup.retrofit2:retrofit:2.9.0" - ], - "directDependencies": [ - "com.squareup.retrofit2:retrofit:2.9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0.jar", - "https://maven.fabric.io/public/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0.jar", - "https://maven.google.com/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0.jar" - ], - "sha256": "00692755410b4367c7c12e6e4aadd3b1a28b5169e8961d94bc27ab36ece9bf29", - "url": "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0.jar" - }, - { - "coord": "com.squareup.retrofit2:retrofit-mock:jar:sources:2.5.0", - "dependencies": [ - "com.squareup.retrofit2:retrofit:jar:sources:2.9.0" - ], - "directDependencies": [ - "com.squareup.retrofit2:retrofit:jar:sources:2.9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0-sources.jar", - "https://maven.fabric.io/public/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0-sources.jar", - "https://maven.google.com/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0-sources.jar" - ], - "sha256": "e0423bab50f7097f02e5a9e874a630d3b31e49bba559c6e526e443cfeae5ad92", - "url": "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit-mock/2.5.0/retrofit-mock-2.5.0-sources.jar" - }, - { - "coord": "com.squareup.retrofit2:retrofit:2.9.0", - "dependencies": [ - "com.squareup.okhttp3:okhttp:4.7.2" - ], - "directDependencies": [ - "com.squareup.okhttp3:okhttp:4.7.2" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar", - "https://maven.fabric.io/public/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar", - "https://maven.google.com/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar" - ], - "sha256": "e6ea1929c46852f5bec66ab3357da383476cef4e8d1deefdbf195b79cc4d6581", - "url": "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0.jar" - }, - { - "coord": "com.squareup.retrofit2:retrofit:jar:sources:2.9.0", - "dependencies": [ - "com.squareup.okhttp3:okhttp:jar:sources:4.7.2" - ], - "directDependencies": [ - "com.squareup.okhttp3:okhttp:jar:sources:4.7.2" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0-sources.jar", - "https://maven.fabric.io/public/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0-sources.jar", - "https://maven.google.com/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0-sources.jar" - ], - "sha256": "64dab37d8cdca9846df237e766a48251287c188e4ff0ac488d1664e7a6644f7a", - "url": "https://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.9.0/retrofit-2.9.0-sources.jar" - }, - { - "coord": "com.squareup:javapoet:1.11.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar", - "https://repo1.maven.org/maven2/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar", - "https://maven.fabric.io/public/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar", - "https://maven.google.com/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar", - "https://repo1.maven.org/maven2/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar" - ], - "sha256": "9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90", - "url": "https://repo1.maven.org/maven2/com/squareup/javapoet/1.11.1/javapoet-1.11.1.jar" - }, - { - "coord": "com.squareup:javapoet:jar:sources:1.11.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/javapoet/1.11.1/javapoet-1.11.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/javapoet/1.11.1/javapoet-1.11.1-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/javapoet/1.11.1/javapoet-1.11.1-sources.jar", - "https://maven.fabric.io/public/com/squareup/javapoet/1.11.1/javapoet-1.11.1-sources.jar", - "https://maven.google.com/com/squareup/javapoet/1.11.1/javapoet-1.11.1-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/javapoet/1.11.1/javapoet-1.11.1-sources.jar" - ], - "sha256": "63d3187d924582b1afe9eb171e725d27a7e15603513890de0f8804a7fc07e9ac", - "url": "https://repo1.maven.org/maven2/com/squareup/javapoet/1.11.1/javapoet-1.11.1-sources.jar" - }, - { - "coord": "com.squareup:javawriter:2.1.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/javawriter/2.1.1/javawriter-2.1.1.jar", - "https://repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1.jar", - "https://maven.fabric.io/public/com/squareup/javawriter/2.1.1/javawriter-2.1.1.jar", - "https://maven.google.com/com/squareup/javawriter/2.1.1/javawriter-2.1.1.jar", - "https://repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1.jar" - ], - "sha256": "f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e", - "url": "https://repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1.jar" - }, - { - "coord": "com.squareup:javawriter:jar:sources:2.1.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/javawriter/2.1.1/javawriter-2.1.1-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1-sources.jar", - "https://maven.fabric.io/public/com/squareup/javawriter/2.1.1/javawriter-2.1.1-sources.jar", - "https://maven.google.com/com/squareup/javawriter/2.1.1/javawriter-2.1.1-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1-sources.jar" - ], - "sha256": "f57646206c5908c69342022c7b5ccbc15dbf605ce80421da3b96af9f86331e28", - "url": "https://repo1.maven.org/maven2/com/squareup/javawriter/2.1.1/javawriter-2.1.1-sources.jar" - }, - { - "coord": "com.squareup:kotlinpoet:1.6.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "org.jetbrains.kotlin:kotlin-reflect:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-reflect:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0.jar", - "https://repo1.maven.org/maven2/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0.jar", - "https://maven.fabric.io/public/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0.jar", - "https://maven.google.com/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0.jar", - "https://repo1.maven.org/maven2/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0.jar" - ], - "sha256": "8085eb4c8b1ece4f32259b22f26bf880bc47b74f548e29010b0146aa6b38f24b", - "url": "https://repo1.maven.org/maven2/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0.jar" - }, - { - "coord": "com.squareup:kotlinpoet:jar:sources:1.6.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.4.10", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10" - ], - "file": "v1/https/repo1.maven.org/maven2/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0-sources.jar", - "https://maven.fabric.io/public/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0-sources.jar", - "https://maven.google.com/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0-sources.jar", - "https://repo1.maven.org/maven2/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0-sources.jar" - ], - "sha256": "cca9ad8636922585e3f116a885c580890d6be1a19655b0916a54c1928a7f0840", - "url": "https://repo1.maven.org/maven2/com/squareup/kotlinpoet/1.6.0/kotlinpoet-1.6.0-sources.jar" - }, - { - "coord": "commons-codec:commons-codec:1.10", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10.jar", - "mirror_urls": [ - "https://maven.google.com/commons-codec/commons-codec/1.10/commons-codec-1.10.jar", - "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10.jar", - "https://maven.fabric.io/public/commons-codec/commons-codec/1.10/commons-codec-1.10.jar", - "https://maven.google.com/commons-codec/commons-codec/1.10/commons-codec-1.10.jar", - "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10.jar" - ], - "sha256": "4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569", - "url": "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10.jar" - }, - { - "coord": "commons-codec:commons-codec:jar:sources:1.10", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10-sources.jar", - "mirror_urls": [ - "https://maven.google.com/commons-codec/commons-codec/1.10/commons-codec-1.10-sources.jar", - "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10-sources.jar", - "https://maven.fabric.io/public/commons-codec/commons-codec/1.10/commons-codec-1.10-sources.jar", - "https://maven.google.com/commons-codec/commons-codec/1.10/commons-codec-1.10-sources.jar", - "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10-sources.jar" - ], - "sha256": "dfae68268ce86f1a18fc45b99317c13d6c9d252f001d37961e79a51076808986", - "url": "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10-sources.jar" - }, - { - "coord": "commons-io:commons-io:2.4", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar", - "mirror_urls": [ - "https://maven.google.com/commons-io/commons-io/2.4/commons-io-2.4.jar", - "https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar", - "https://maven.fabric.io/public/commons-io/commons-io/2.4/commons-io-2.4.jar", - "https://maven.google.com/commons-io/commons-io/2.4/commons-io-2.4.jar", - "https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar" - ], - "sha256": "cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581", - "url": "https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar" - }, - { - "coord": "commons-io:commons-io:jar:sources:2.4", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4-sources.jar", - "mirror_urls": [ - "https://maven.google.com/commons-io/commons-io/2.4/commons-io-2.4-sources.jar", - "https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4-sources.jar", - "https://maven.fabric.io/public/commons-io/commons-io/2.4/commons-io-2.4-sources.jar", - "https://maven.google.com/commons-io/commons-io/2.4/commons-io-2.4-sources.jar", - "https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4-sources.jar" - ], - "sha256": "d4635b348bbbf3f166d972b052bc4cac5b326c133beed7b8a1cab7ea22b61e01", - "url": "https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4-sources.jar" - }, - { - "coord": "de.hdodenhof:circleimageview:3.0.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1.aar", - "mirror_urls": [ - "https://maven.google.com/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1.aar", - "https://repo1.maven.org/maven2/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1.aar", - "https://maven.fabric.io/public/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1.aar", - "https://maven.google.com/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1.aar", - "https://repo1.maven.org/maven2/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1.aar" - ], - "sha256": "7b0f088436ad4dcbb36d779fd09bf2192d9cc1e1a734bb6337904a7648f97617", - "url": "https://repo1.maven.org/maven2/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1.aar" - }, - { - "coord": "de.hdodenhof:circleimageview:jar:sources:3.0.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1-sources.jar", - "https://repo1.maven.org/maven2/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1-sources.jar", - "https://maven.fabric.io/public/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1-sources.jar", - "https://maven.google.com/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1-sources.jar", - "https://repo1.maven.org/maven2/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1-sources.jar" - ], - "sha256": "41ac0df4f7bab17c56b075a0c802a6f0b6d9013831d409556fdcd56bdb8a460b", - "url": "https://repo1.maven.org/maven2/de/hdodenhof/circleimageview/3.0.1/circleimageview-3.0.1-sources.jar" - }, - { - "coord": "io.fabric.sdk.android:fabric:1.4.7", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/maven.google.com/io/fabric/sdk/android/fabric/1.4.7/fabric-1.4.7.aar", - "mirror_urls": [ - "https://maven.google.com/io/fabric/sdk/android/fabric/1.4.7/fabric-1.4.7.aar", - "https://repo1.maven.org/maven2/io/fabric/sdk/android/fabric/1.4.7/fabric-1.4.7.aar", - "https://maven.fabric.io/public/io/fabric/sdk/android/fabric/1.4.7/fabric-1.4.7.aar", - "https://maven.google.com/io/fabric/sdk/android/fabric/1.4.7/fabric-1.4.7.aar", - "https://repo1.maven.org/maven2/io/fabric/sdk/android/fabric/1.4.7/fabric-1.4.7.aar" - ], - "sha256": "36df4b321ec95e31226ff5abaae73e66f3a99dedddbc2d03054c4e141c8aaa5c", - "url": "https://maven.google.com/io/fabric/sdk/android/fabric/1.4.7/fabric-1.4.7.aar" - }, - { - "coord": "javax.annotation:javax.annotation-api:1.3.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", - "mirror_urls": [ - "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", - "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", - "https://maven.fabric.io/public/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", - "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", - "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" - ], - "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b", - "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar" - }, - { - "coord": "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", - "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", - "https://maven.fabric.io/public/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", - "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", - "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar" - ], - "sha256": "128971e52e0d84a66e3b6e049dab8ad7b2c58b7e1ad37fa2debd3d40c2947b95", - "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar" - }, - { - "coord": "javax.annotation:jsr250-api:1.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", - "mirror_urls": [ - "https://maven.google.com/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", - "https://repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", - "https://maven.fabric.io/public/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", - "https://maven.google.com/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar", - "https://repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar" - ], - "sha256": "a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f", - "url": "https://repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar" - }, - { - "coord": "javax.annotation:jsr250-api:jar:sources:1.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-sources.jar", - "https://repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-sources.jar", - "https://maven.fabric.io/public/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-sources.jar", - "https://maven.google.com/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-sources.jar", - "https://repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-sources.jar" - ], - "sha256": "025c47d76c60199381be07012a0c5f9e74661aac5bd67f5aec847741c5b7f838", - "url": "https://repo1.maven.org/maven2/javax/annotation/jsr250-api/1.0/jsr250-api-1.0-sources.jar" - }, - { - "coord": "javax.inject:javax.inject:1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar", - "mirror_urls": [ - "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1.jar", - "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar", - "https://maven.fabric.io/public/javax/inject/javax.inject/1/javax.inject-1.jar", - "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1.jar", - "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar" - ], - "sha256": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff", - "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar" - }, - { - "coord": "javax.inject:javax.inject:jar:sources:1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", - "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar", - "https://maven.fabric.io/public/javax/inject/javax.inject/1/javax.inject-1-sources.jar", - "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1-sources.jar", - "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar" - ], - "sha256": "c4b87ee2911c139c3daf498a781967f1eb2e75bc1a8529a2e7b328a15d0e433e", - "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar" - }, - { - "coord": "junit:junit:4.13.2", - "dependencies": [ - "org.hamcrest:hamcrest-core:1.3" - ], - "directDependencies": [ - "org.hamcrest:hamcrest-core:1.3" - ], - "file": "v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar", - "mirror_urls": [ - "https://maven.google.com/junit/junit/4.13.2/junit-4.13.2.jar", - "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar", - "https://maven.fabric.io/public/junit/junit/4.13.2/junit-4.13.2.jar", - "https://maven.google.com/junit/junit/4.13.2/junit-4.13.2.jar", - "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar" - ], - "sha256": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3", - "url": "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar" - }, - { - "coord": "junit:junit:jar:sources:4.13.2", - "dependencies": [ - "org.hamcrest:hamcrest-core:jar:sources:1.3" - ], - "directDependencies": [ - "org.hamcrest:hamcrest-core:jar:sources:1.3" - ], - "file": "v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/junit/junit/4.13.2/junit-4.13.2-sources.jar", - "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2-sources.jar", - "https://maven.fabric.io/public/junit/junit/4.13.2/junit-4.13.2-sources.jar", - "https://maven.google.com/junit/junit/4.13.2/junit-4.13.2-sources.jar", - "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2-sources.jar" - ], - "sha256": "34181df6482d40ea4c046b063cb53c7ffae94bdf1b1d62695bdf3adf9dea7e3a", - "url": "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2-sources.jar" - }, - { - "coord": "net.bytebuddy:byte-buddy-agent:1.10.20", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20.jar", - "mirror_urls": [ - "https://maven.google.com/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20.jar", - "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20.jar", - "https://maven.fabric.io/public/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20.jar", - "https://maven.google.com/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20.jar", - "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20.jar" - ], - "sha256": "b592a6c43e752bf41659717956c57fbb790394d2ee5f8941876659f9c5c0e7e8", - "url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20.jar" - }, - { - "coord": "net.bytebuddy:byte-buddy-agent:jar:sources:1.10.20", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20-sources.jar", - "mirror_urls": [ - "https://maven.google.com/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20-sources.jar", - "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20-sources.jar", - "https://maven.fabric.io/public/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20-sources.jar", - "https://maven.google.com/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20-sources.jar", - "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20-sources.jar" - ], - "sha256": "1c86f2ad5d84a8640292a84af3e8245851bab08a9136dbe4c084e50585bf9c8a", - "url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.10.20/byte-buddy-agent-1.10.20-sources.jar" - }, - { - "coord": "net.bytebuddy:byte-buddy:1.10.20", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20.jar", - "mirror_urls": [ - "https://maven.google.com/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20.jar", - "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20.jar", - "https://maven.fabric.io/public/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20.jar", - "https://maven.google.com/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20.jar", - "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20.jar" - ], - "sha256": "5fcad05da791e9a22811c255a4a74b7ea094b7243d9dbf3e6fc578c8c94290ac", - "url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20.jar" - }, - { - "coord": "net.bytebuddy:byte-buddy:jar:sources:1.10.20", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20-sources.jar", - "mirror_urls": [ - "https://maven.google.com/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20-sources.jar", - "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20-sources.jar", - "https://maven.fabric.io/public/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20-sources.jar", - "https://maven.google.com/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20-sources.jar", - "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20-sources.jar" - ], - "sha256": "50334bed7d0c05a7e02224105ff33267c9d2acb1a07ec3a532bac28e38abdd0e", - "url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.10.20/byte-buddy-1.10.20-sources.jar" - }, - { - "coord": "net.ltgt.gradle.incap:incap:0.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/net/ltgt/gradle/incap/incap/0.3/incap-0.3.jar", - "mirror_urls": [ - "https://maven.google.com/net/ltgt/gradle/incap/incap/0.3/incap-0.3.jar", - "https://repo1.maven.org/maven2/net/ltgt/gradle/incap/incap/0.3/incap-0.3.jar", - "https://maven.fabric.io/public/net/ltgt/gradle/incap/incap/0.3/incap-0.3.jar", - "https://maven.google.com/net/ltgt/gradle/incap/incap/0.3/incap-0.3.jar", - "https://repo1.maven.org/maven2/net/ltgt/gradle/incap/incap/0.3/incap-0.3.jar" - ], - "sha256": "1d3ebe10d6059a26438dd183ab5a823cf8cd8081bc0d4cf997ad80e9ab9607d8", - "url": "https://repo1.maven.org/maven2/net/ltgt/gradle/incap/incap/0.3/incap-0.3.jar" - }, - { - "coord": "net.ltgt.gradle.incap:incap:jar:sources:0.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/net/ltgt/gradle/incap/incap/0.3/incap-0.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/net/ltgt/gradle/incap/incap/0.3/incap-0.3-sources.jar", - "https://repo1.maven.org/maven2/net/ltgt/gradle/incap/incap/0.3/incap-0.3-sources.jar", - "https://maven.fabric.io/public/net/ltgt/gradle/incap/incap/0.3/incap-0.3-sources.jar", - "https://maven.google.com/net/ltgt/gradle/incap/incap/0.3/incap-0.3-sources.jar", - "https://repo1.maven.org/maven2/net/ltgt/gradle/incap/incap/0.3/incap-0.3-sources.jar" - ], - "sha256": "e78a7277cb9ce4980fba22d809352821848581df0a6b545fa22aa7400a05db43", - "url": "https://repo1.maven.org/maven2/net/ltgt/gradle/incap/incap/0.3/incap-0.3-sources.jar" - }, - { - "coord": "net.sf.kxml:kxml2:2.3.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar", - "mirror_urls": [ - "https://maven.google.com/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar", - "https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar", - "https://maven.fabric.io/public/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar", - "https://maven.google.com/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar", - "https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar" - ], - "sha256": "f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2", - "url": "https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar" - }, - { - "coord": "net.sf.kxml:kxml2:jar:sources:2.3.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar", - "https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar", - "https://maven.fabric.io/public/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar", - "https://maven.google.com/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar", - "https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar" - ], - "sha256": "85495366666158b58961e8911ced0f6f3bc92f1ebee865518b493fdb90760250", - "url": "https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar" - }, - { - "coord": "nl.dionsegijn:konfetti:1.2.5", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5.aar", - "mirror_urls": [ - "https://maven.google.com/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5.aar", - "https://repo1.maven.org/maven2/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5.aar", - "https://maven.fabric.io/public/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5.aar", - "https://maven.google.com/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5.aar", - "https://repo1.maven.org/maven2/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5.aar" - ], - "sha256": "a9beb9371e9c06c39eeff1ed052142a6ed6f0b28e3408230d8771867f9d817ba", - "url": "https://repo1.maven.org/maven2/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5.aar" - }, - { - "coord": "nl.dionsegijn:konfetti:jar:sources:1.2.5", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5-sources.jar", - "https://repo1.maven.org/maven2/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5-sources.jar", - "https://maven.fabric.io/public/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5-sources.jar", - "https://maven.google.com/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5-sources.jar", - "https://repo1.maven.org/maven2/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5-sources.jar" - ], - "sha256": "2943d6e48ac1c23d977b059f11ebf47015bccc6649d3dd09bbcb1c19e474dcb5", - "url": "https://repo1.maven.org/maven2/nl/dionsegijn/konfetti/1.2.5/konfetti-1.2.5-sources.jar" - }, - { - "coord": "org.antlr:antlr4:4.5.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar", - "mirror_urls": [ - "https://maven.google.com/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar", - "https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar", - "https://maven.fabric.io/public/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar", - "https://maven.google.com/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar", - "https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar" - ], - "sha256": "a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4", - "url": "https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar" - }, - { - "coord": "org.antlr:antlr4:jar:sources:4.5.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/antlr/antlr4/4.5.3/antlr4-4.5.3-sources.jar", - "https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3-sources.jar", - "https://maven.fabric.io/public/org/antlr/antlr4/4.5.3/antlr4-4.5.3-sources.jar", - "https://maven.google.com/org/antlr/antlr4/4.5.3/antlr4-4.5.3-sources.jar", - "https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3-sources.jar" - ], - "sha256": "c31df8fc18dd75dbf7820b36ce57aa85c00616e4fd89daf415163fa3432f623d", - "url": "https://repo1.maven.org/maven2/org/antlr/antlr4/4.5.3/antlr4-4.5.3-sources.jar" - }, - { - "coord": "org.bouncycastle:bcprov-jdk15on:1.65", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65.jar", - "mirror_urls": [ - "https://maven.google.com/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65.jar", - "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65.jar", - "https://maven.fabric.io/public/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65.jar", - "https://maven.google.com/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65.jar", - "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65.jar" - ], - "sha256": "e78f96eb59066c94c94fb2d6b5eb80f52feac6f5f9776898634f8addec6e2137", - "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65.jar" - }, - { - "coord": "org.bouncycastle:bcprov-jdk15on:jar:sources:1.65", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65-sources.jar", - "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65-sources.jar", - "https://maven.fabric.io/public/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65-sources.jar", - "https://maven.google.com/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65-sources.jar", - "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65-sources.jar" - ], - "sha256": "12f179dee8bb7113f3d187319b260f3210d1ca7fbf403cd70385d339eacaeb4b", - "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.65/bcprov-jdk15on-1.65-sources.jar" - }, - { - "coord": "org.checkerframework:checker-compat-qual:2.5.5", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", - "https://maven.fabric.io/public/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", - "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" - ], - "sha256": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a", - "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" - }, - { - "coord": "org.checkerframework:checker-compat-qual:jar:sources:2.5.5", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", - "https://maven.fabric.io/public/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", - "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar" - ], - "sha256": "7c63a4a46b2ef903f941aeac63da87dd345be3243b472796aa945fa715bf3ca9", - "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5-sources.jar" - }, - { - "coord": "org.checkerframework:checker-qual:3.13.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar", - "https://maven.fabric.io/public/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar", - "https://maven.google.com/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar" - ], - "sha256": "3ea0dcd73b4d6cb2fb34bd7ed4dad6db327a01ebad7db05eb7894076b3d64491", - "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar" - }, - { - "coord": "org.checkerframework:checker-qual:jar:sources:3.13.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0-sources.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0-sources.jar", - "https://maven.fabric.io/public/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0-sources.jar", - "https://maven.google.com/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0-sources.jar", - "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0-sources.jar" - ], - "sha256": "52fd5b908ed38b2c543fac371c2192ff2896fec0f3ddea29f23b5db117a7ea6e", - "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0-sources.jar" - }, - { - "coord": "org.hamcrest:hamcrest-core:1.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar", - "mirror_urls": [ - "https://maven.google.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar", - "https://maven.fabric.io/public/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar", - "https://maven.google.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar" - ], - "sha256": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", - "url": "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar" - }, - { - "coord": "org.hamcrest:hamcrest-core:jar:sources:1.3", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar", - "https://maven.fabric.io/public/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar", - "https://maven.google.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar" - ], - "sha256": "e223d2d8fbafd66057a8848cc94222d63c3cedd652cc48eddc0ab5c39c0f84df", - "url": "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar" - }, - { - "coord": "org.hamcrest:hamcrest-integration:1.3", - "dependencies": [ - "org.hamcrest:hamcrest-core:1.3", - "org.hamcrest:hamcrest-library:1.3" - ], - "directDependencies": [ - "org.hamcrest:hamcrest-library:1.3" - ], - "file": "v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3.jar", - "mirror_urls": [ - "https://maven.google.com/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3.jar", - "https://maven.fabric.io/public/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3.jar", - "https://maven.google.com/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3.jar" - ], - "sha256": "70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2", - "url": "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3.jar" - }, - { - "coord": "org.hamcrest:hamcrest-integration:jar:sources:1.3", - "dependencies": [ - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "org.hamcrest:hamcrest-library:jar:sources:1.3" - ], - "directDependencies": [ - "org.hamcrest:hamcrest-library:jar:sources:1.3" - ], - "file": "v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3-sources.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3-sources.jar", - "https://maven.fabric.io/public/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3-sources.jar", - "https://maven.google.com/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3-sources.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3-sources.jar" - ], - "sha256": "0827a37533a135bfab9c27e0f4b6d6fb1394856e842ef20a1693d3bfeb061365", - "url": "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-integration/1.3/hamcrest-integration-1.3-sources.jar" - }, - { - "coord": "org.hamcrest:hamcrest-library:1.3", - "dependencies": [ - "org.hamcrest:hamcrest-core:1.3" - ], - "directDependencies": [ - "org.hamcrest:hamcrest-core:1.3" - ], - "file": "v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar", - "mirror_urls": [ - "https://maven.google.com/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar", - "https://maven.fabric.io/public/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar", - "https://maven.google.com/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar" - ], - "sha256": "711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c", - "url": "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar" - }, - { - "coord": "org.hamcrest:hamcrest-library:jar:sources:1.3", - "dependencies": [ - "org.hamcrest:hamcrest-core:jar:sources:1.3" - ], - "directDependencies": [ - "org.hamcrest:hamcrest-core:jar:sources:1.3" - ], - "file": "v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar", - "https://maven.fabric.io/public/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar", - "https://maven.google.com/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar", - "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar" - ], - "sha256": "1c0ff84455f539eb3c29a8c430de1f6f6f1ba4b9ab39ca19b195f33203cd539c", - "url": "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar" - }, - { - "coord": "org.jetbrains.intellij.deps:trove4j:1.0.20181211", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.jar", - "https://repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.jar", - "https://maven.fabric.io/public/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.jar", - "https://maven.google.com/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.jar", - "https://repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.jar" - ], - "sha256": "affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601", - "url": "https://repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211.jar" - }, - { - "coord": "org.jetbrains.intellij.deps:trove4j:jar:sources:1.0.20181211", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211-sources.jar", - "https://maven.google.com/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211-sources.jar" - ], - "sha256": "6a37f965621293e9f23eb2053040d31e5231596a068ee581410d6047e958a695", - "url": "https://repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20181211/trove4j-1.0.20181211-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-compiler-embeddable:1.5.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-script-runtime:1.5.0", - "org.jetbrains.kotlin:kotlin-daemon-embeddable:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.intellij.deps:trove4j:1.0.20181211", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains:annotations:13.0", - "org.jetbrains.kotlin:kotlin-reflect:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-script-runtime:1.5.0", - "org.jetbrains.kotlin:kotlin-daemon-embeddable:1.5.0", - "org.jetbrains.intellij.deps:trove4j:1.0.20181211", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlin:kotlin-reflect:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0.jar" - ], - "sha256": "d7b85448039e468daf3b9462a172244477fa3eb890f199ec77703992f36ade44", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:sources:1.5.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains:annotations:jar:sources:13.0", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0", - "org.jetbrains.intellij.deps:trove4j:jar:sources:1.0.20181211", - "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0", - "org.jetbrains.intellij.deps:trove4j:jar:sources:1.0.20181211", - "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0-sources.jar" - ], - "sha256": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.5.0/kotlin-compiler-embeddable-1.5.0-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-daemon-embeddable:1.5.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0.jar" - ], - "sha256": "bf32071706cf3c20580516b04d25a733c7a21db9cd9d04fc7060c00720bc91bc", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources:1.5.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0-sources.jar" - ], - "sha256": "f431a1129d6ea1cadb1a69885c3935e6e03deee4b12d924ff8e3cd068ae1cebb", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-daemon-embeddable/1.5.0/kotlin-daemon-embeddable-1.5.0-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-reflect:1.5.0", - "dependencies": [ - "org.jetbrains:annotations:13.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0.jar" - ], - "sha256": "e30acc4ff74534177d1657feafb57327ede838ae17763aeaae182a9109d26157", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-reflect:jar:sources:1.5.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains:annotations:jar:sources:13.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0-sources.jar" - ], - "sha256": "7c0d0b477b2d077d785d3c5439346622731d903c7f9e21f87c709e9f7a9a9e65", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.5.0/kotlin-reflect-1.5.0-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-script-runtime:1.5.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0.jar" - ], - "sha256": "f2d45a350628bdfea25570c4c3f29198087e0f8cf53d87d928fb0da8a30c8fb7", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources:1.5.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0-sources.jar" - ], - "sha256": "13db4d1b3123ae2fefccbc07ae0d8de07406f604fd518eb03195208531345a0c", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-script-runtime/1.5.0/kotlin-script-runtime-1.5.0-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0.jar" - ], - "sha256": "c14ce6720a487b5e238f1b0c30ac3ad73e45b90a40731ca0b1cfddec1a37682f", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0-sources.jar" - ], - "sha256": "7a79a086fe7ae85675f9f81a9d12645fbcfd7abf03e1b36873253634a193477a", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.0/kotlin-stdlib-common-1.5.0-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.jar" - ], - "sha256": "f9566380c08722c780ce33ceee23e98ddf765ca98fabd3e2fabae7975c8d232b", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.4.10", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10-sources.jar" - ], - "sha256": "447c623d66e5ba7f79cf2171f79540e6f3e04c4e683cbae8317bb6a2fcfd80bd", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.4.10/kotlin-stdlib-jdk7-1.4.10-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.jar" - ], - "sha256": "39b7a9442d7a3865e0f4a732c56c1d5da0e11ffb3bb82a461d32deb0c0ca7673", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.4.10" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources:1.4.10" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10-sources.jar" - ], - "sha256": "9c3e3f939fc57fb82c0675c99e60ecd80e6cec96c15c13dc0f16a19721c4ae72", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.4.10/kotlin-stdlib-jdk8-1.4.10-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "dependencies": [ - "org.jetbrains:annotations:13.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - ], - "directDependencies": [ - "org.jetbrains:annotations:13.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0.jar" - ], - "sha256": "52283996fe4067cd7330288b96ae67ecd463614dc741172c54d9d349ab6a9cd7", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "dependencies": [ - "org.jetbrains:annotations:jar:sources:13.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains:annotations:jar:sources:13.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0-sources.jar" - ], - "sha256": "b163dff413167ec95d0c620b985f6b59965ebbd947ac5878904dd18ab8915166", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.5.0/kotlin-stdlib-1.5.0-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.72", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72.jar" - ], - "sha256": "cadb25f8660392c1fbc7f9b2b1b9daa36469587b97bd30ba718d3bbaea71dfb3", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources:1.3.72", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72-sources.jar" - ], - "sha256": "6b122ec23e06fe2e3b66a58a179470f6f109011ddaf5168020a33a0c53ff1630", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-annotations-common/1.3.72/kotlin-test-annotations-common-1.3.72-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-test-common:1.3.72", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72.jar" - ], - "sha256": "6b4abd7d7d1c07ab72c2318afec2f9b627b9e99a39767f597ac40cf7b1955b8a", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-test-common:jar:sources:1.3.72", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72-sources.jar" - ], - "sha256": "81a826f1c61c0d403483235e5db1c2e63f7a7d17fcacc8611f769221ba33f120", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-common/1.3.72/kotlin-test-common-1.3.72-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-test-junit:1.3.72", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-test:1.3.72", - "org.hamcrest:hamcrest-core:1.3", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.kotlin:kotlin-test-common:1.3.72", - "org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.72", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "junit:junit:4.13.2" - ], - "directDependencies": [ - "junit:junit:4.13.2", - "org.jetbrains.kotlin:kotlin-test:1.3.72", - "org.jetbrains.kotlin:kotlin-test-annotations-common:1.3.72" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72.jar" - ], - "sha256": "d8266ebb919568ddc15c98d2790017f31240ac51936445fd8b27231d60fe4566", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-test-junit:jar:sources:1.3.72", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0", - "junit:junit:jar:sources:4.13.2", - "org.hamcrest:hamcrest-core:jar:sources:1.3", - "org.jetbrains.kotlin:kotlin-test:jar:sources:1.3.72", - "org.jetbrains.kotlin:kotlin-test-common:jar:sources:1.3.72", - "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources:1.3.72" - ], - "directDependencies": [ - "junit:junit:jar:sources:4.13.2", - "org.jetbrains.kotlin:kotlin-test:jar:sources:1.3.72", - "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources:1.3.72" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72-sources.jar" - ], - "sha256": "a8ab7ee99074595f118e0aff19ceee43c8c2538e4420bb2342035015025d2c31", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test-junit/1.3.72/kotlin-test-junit-1.3.72-sources.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-test:1.3.72", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlin:kotlin-test-common:1.3.72" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlin:kotlin-test-common:1.3.72" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72.jar" - ], - "sha256": "1794237a1fc908d37adb2fa3d9739b883124571720ad285cfa81e74190e87ba9", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72.jar" - }, - { - "coord": "org.jetbrains.kotlin:kotlin-test:jar:sources:1.3.72", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-test-common:jar:sources:1.3.72", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-test-common:jar:sources:1.3.72" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72-sources.jar", - "https://maven.google.com/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72-sources.jar" - ], - "sha256": "06689d90dedff6cb9d9bea762bb19ce7882d1e12f495158a760bfbc2ff1ac1a4", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-test/1.3.72/kotlin-test-1.3.72-sources.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1", - "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1.jar" - ], - "sha256": "d4cadb673b2101f1ee5fbc147956ac78b1cfd9cc255fb53d3aeb88dff11d99ca", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources:1.4.1", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar" - ], - "sha256": "b2370993da3e0a183109d58004d7fde48af9dbba93c6774299fda9069ebb5eeb", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar" - ], - "sha256": "6d2f87764b6638f27aff12ed380db4b63c9d46ba55dc32683a650598fa5a3e22", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar" - ], - "sha256": "bb339efebc2d9141401f1aa43a035abe929210e362cfff13d03c6b7b11dc0469", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-debug:1.2.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2.jar" - ], - "sha256": "6a92f46fe713e9cade9cf55489844b0acf38596a070c1c85f0580e8107ae485e", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources:1.2.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2-sources.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2-sources.jar" - ], - "sha256": "264927d634bc72c1995011ecaa7bc91085b0b880fef3c752a523f86b6e4cb94e", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-debug/1.2.2/kotlinx-coroutines-debug-1.2.2-sources.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.2.2", - "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:1.2.2", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:1.2.2" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2.jar" - ], - "sha256": "31e03c48a2f63ee11ee4d1eed4c1a19f561531e838525c67346f4bacdd422444", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:sources:1.2.2", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources:1.2.2" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources:1.2.2" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2-sources.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2-sources.jar" - ], - "sha256": "6eb4b2095410fd4a2896b137799e586765c8dec2a35103d58e7155227bbfcd73", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2-sources.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.1.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar" - ], - "sha256": "9753bb39efef35957c5c15df9a3cb769aabf2cdfa74b47afcb7760e5146be3b5", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0.jar" - }, - { - "coord": "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources:0.1.0", - "dependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "directDependencies": [ - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0-sources.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0-sources.jar" - ], - "sha256": "a2cdb2a6a90a199addb8f312e3d5ab12b4626573f22b076176cc1d09999d6e78", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.1.0/kotlinx-metadata-jvm-0.1.0-sources.jar" - }, - { - "coord": "org.jetbrains:annotations:13.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar", - "https://maven.fabric.io/public/org/jetbrains/annotations/13.0/annotations-13.0.jar", - "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0.jar", - "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar" - ], - "sha256": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478", - "url": "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar" - }, - { - "coord": "org.jetbrains:annotations:jar:sources:13.0", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", - "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" - ], - "sha256": "42a5e144b8e81d50d6913d1007b695e62e614705268d8cf9f13dbdc478c2c68e", - "url": "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar" - }, - { - "coord": "org.mockito.kotlin:mockito-kotlin:3.2.0", - "dependencies": [ - "net.bytebuddy:byte-buddy:1.10.20", - "net.bytebuddy:byte-buddy-agent:1.10.20", - "org.objenesis:objenesis:3.2", - "org.mockito:mockito-core:3.9.0" - ], - "directDependencies": [ - "org.mockito:mockito-core:3.9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0.jar", - "https://repo1.maven.org/maven2/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0.jar", - "https://maven.fabric.io/public/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0.jar", - "https://maven.google.com/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0.jar", - "https://repo1.maven.org/maven2/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0.jar" - ], - "sha256": "12995c7fdb8de84cf58fca31f1cd8810eeaa39e63c00e61ffcb2b49a4305f21f", - "url": "https://repo1.maven.org/maven2/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0.jar" - }, - { - "coord": "org.mockito.kotlin:mockito-kotlin:jar:sources:3.2.0", - "dependencies": [ - "org.mockito:mockito-core:jar:sources:3.9.0", - "net.bytebuddy:byte-buddy-agent:jar:sources:1.10.20", - "net.bytebuddy:byte-buddy:jar:sources:1.10.20", - "org.objenesis:objenesis:jar:sources:3.2" - ], - "directDependencies": [ - "org.mockito:mockito-core:jar:sources:3.9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0-sources.jar", - "https://repo1.maven.org/maven2/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0-sources.jar", - "https://maven.fabric.io/public/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0-sources.jar", - "https://maven.google.com/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0-sources.jar", - "https://repo1.maven.org/maven2/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0-sources.jar" - ], - "sha256": "50bae6ff5fb02d2c211479df3e55799190df77d60f3e3f0be669a68ccde1e10b", - "url": "https://repo1.maven.org/maven2/org/mockito/kotlin/mockito-kotlin/3.2.0/mockito-kotlin-3.2.0-sources.jar" - }, - { - "coord": "org.mockito:mockito-core:3.9.0", - "dependencies": [ - "net.bytebuddy:byte-buddy:1.10.20", - "net.bytebuddy:byte-buddy-agent:1.10.20", - "org.objenesis:objenesis:3.2" - ], - "directDependencies": [ - "net.bytebuddy:byte-buddy:1.10.20", - "net.bytebuddy:byte-buddy-agent:1.10.20", - "org.objenesis:objenesis:3.2" - ], - "file": "v1/https/repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0.jar", - "https://repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0.jar", - "https://maven.fabric.io/public/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0.jar", - "https://maven.google.com/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0.jar", - "https://repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0.jar" - ], - "sha256": "a1f64211407b8dc4cf80b16e07cc11aa9e5228d53dc4a5357326d66825f6a4ac", - "url": "https://repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0.jar" - }, - { - "coord": "org.mockito:mockito-core:jar:sources:3.9.0", - "dependencies": [ - "net.bytebuddy:byte-buddy-agent:jar:sources:1.10.20", - "net.bytebuddy:byte-buddy:jar:sources:1.10.20", - "org.objenesis:objenesis:jar:sources:3.2" - ], - "directDependencies": [ - "net.bytebuddy:byte-buddy:jar:sources:1.10.20", - "net.bytebuddy:byte-buddy-agent:jar:sources:1.10.20", - "org.objenesis:objenesis:jar:sources:3.2" - ], - "file": "v1/https/repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-sources.jar", - "https://repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-sources.jar", - "https://maven.fabric.io/public/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-sources.jar", - "https://maven.google.com/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-sources.jar", - "https://repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-sources.jar" - ], - "sha256": "6457852efe7e4ba539e5816d069401c9f2a39abc8cea43d0039174ac112a6ac3", - "url": "https://repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-sources.jar" - }, - { - "coord": "org.objenesis:objenesis:3.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2.jar", - "mirror_urls": [ - "https://maven.google.com/org/objenesis/objenesis/3.2/objenesis-3.2.jar", - "https://repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2.jar", - "https://maven.fabric.io/public/org/objenesis/objenesis/3.2/objenesis-3.2.jar", - "https://maven.google.com/org/objenesis/objenesis/3.2/objenesis-3.2.jar", - "https://repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2.jar" - ], - "sha256": "03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3", - "url": "https://repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2.jar" - }, - { - "coord": "org.objenesis:objenesis:jar:sources:3.2", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/objenesis/objenesis/3.2/objenesis-3.2-sources.jar", - "https://repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2-sources.jar", - "https://maven.fabric.io/public/org/objenesis/objenesis/3.2/objenesis-3.2-sources.jar", - "https://maven.google.com/org/objenesis/objenesis/3.2/objenesis-3.2-sources.jar", - "https://repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2-sources.jar" - ], - "sha256": "56a7987f5746bd809c363e29055c41f5472a086b0e0e32248693e064d10bc306", - "url": "https://repo1.maven.org/maven2/org/objenesis/objenesis/3.2/objenesis-3.2-sources.jar" - }, - { - "coord": "org.ow2.asm:asm-analysis:9.0", - "dependencies": [ - "org.ow2.asm:asm-tree:9.0", - "org.ow2.asm:asm:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm-tree:9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0.jar", - "https://maven.google.com/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0.jar" - ], - "sha256": "2d46de6df856a4daac9aa534459ab7287eb80584e9109850405e5b302dc9c2a6", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0.jar" - }, - { - "coord": "org.ow2.asm:asm-analysis:jar:sources:9.0", - "dependencies": [ - "org.ow2.asm:asm-tree:jar:sources:9.0", - "org.ow2.asm:asm:jar:sources:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm-tree:jar:sources:9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0-sources.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0-sources.jar", - "https://maven.google.com/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0-sources.jar" - ], - "sha256": "a34153ef6bac79a2a0535f62590671fe7c632ade294aa74938ee79da14707521", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.0/asm-analysis-9.0-sources.jar" - }, - { - "coord": "org.ow2.asm:asm-commons:9.0", - "dependencies": [ - "org.ow2.asm:asm-tree:9.0", - "org.ow2.asm:asm-analysis:9.0", - "org.ow2.asm:asm:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm:9.1", - "org.ow2.asm:asm-analysis:9.0", - "org.ow2.asm:asm-tree:9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.0/asm-commons-9.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm-commons/9.0/asm-commons-9.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.0/asm-commons-9.0.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm-commons/9.0/asm-commons-9.0.jar", - "https://maven.google.com/org/ow2/asm/asm-commons/9.0/asm-commons-9.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.0/asm-commons-9.0.jar" - ], - "sha256": "1b9090acb7e67bd4ed2f2cfb002063316d79cecace237bd07cc4f7f1b302092f", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.0/asm-commons-9.0.jar" - }, - { - "coord": "org.ow2.asm:asm-commons:jar:sources:9.0", - "dependencies": [ - "org.ow2.asm:asm-tree:jar:sources:9.0", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "org.ow2.asm:asm:jar:sources:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm:jar:sources:9.1", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "org.ow2.asm:asm-tree:jar:sources:9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.0/asm-commons-9.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm-commons/9.0/asm-commons-9.0-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.0/asm-commons-9.0-sources.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm-commons/9.0/asm-commons-9.0-sources.jar", - "https://maven.google.com/org/ow2/asm/asm-commons/9.0/asm-commons-9.0-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.0/asm-commons-9.0-sources.jar" - ], - "sha256": "7ced1227cc5e9d9762a930e19f8708591c5ef458bcdebdebd7e934fbb1b1adf3", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.0/asm-commons-9.0-sources.jar" - }, - { - "coord": "org.ow2.asm:asm-tree:9.0", - "dependencies": [ - "org.ow2.asm:asm:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm:9.1" - ], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.0/asm-tree-9.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm-tree/9.0/asm-tree-9.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.0/asm-tree-9.0.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm-tree/9.0/asm-tree-9.0.jar", - "https://maven.google.com/org/ow2/asm/asm-tree/9.0/asm-tree-9.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.0/asm-tree-9.0.jar" - ], - "sha256": "e2c25f332eb95861883a8568e45aac5e77d140d0fe961ae8eb9a474ec876e00d", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.0/asm-tree-9.0.jar" - }, - { - "coord": "org.ow2.asm:asm-tree:jar:sources:9.0", - "dependencies": [ - "org.ow2.asm:asm:jar:sources:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm:jar:sources:9.1" - ], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.0/asm-tree-9.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm-tree/9.0/asm-tree-9.0-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.0/asm-tree-9.0-sources.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm-tree/9.0/asm-tree-9.0-sources.jar", - "https://maven.google.com/org/ow2/asm/asm-tree/9.0/asm-tree-9.0-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.0/asm-tree-9.0-sources.jar" - ], - "sha256": "e75b132b75a861dcbb8aa75b98783b863310fb2e3e3d28394c22063db5ec7432", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.0/asm-tree-9.0-sources.jar" - }, - { - "coord": "org.ow2.asm:asm-util:9.0", - "dependencies": [ - "org.ow2.asm:asm-tree:9.0", - "org.ow2.asm:asm-analysis:9.0", - "org.ow2.asm:asm:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm:9.1", - "org.ow2.asm:asm-analysis:9.0", - "org.ow2.asm:asm-tree:9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-util/9.0/asm-util-9.0.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm-util/9.0/asm-util-9.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.0/asm-util-9.0.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm-util/9.0/asm-util-9.0.jar", - "https://maven.google.com/org/ow2/asm/asm-util/9.0/asm-util-9.0.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.0/asm-util-9.0.jar" - ], - "sha256": "2af6e7d01e0862e75193f3c01a06a689b0a245947e29f38eb683633391519bb6", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.0/asm-util-9.0.jar" - }, - { - "coord": "org.ow2.asm:asm-util:jar:sources:9.0", - "dependencies": [ - "org.ow2.asm:asm-tree:jar:sources:9.0", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "org.ow2.asm:asm:jar:sources:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm:jar:sources:9.1", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "org.ow2.asm:asm-tree:jar:sources:9.0" - ], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-util/9.0/asm-util-9.0-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm-util/9.0/asm-util-9.0-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.0/asm-util-9.0-sources.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm-util/9.0/asm-util-9.0-sources.jar", - "https://maven.google.com/org/ow2/asm/asm-util/9.0/asm-util-9.0-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.0/asm-util-9.0-sources.jar" - ], - "sha256": "cdc52c849b9af5d157df3919621d484697ed35c755292c682704227c0e012710", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.0/asm-util-9.0-sources.jar" - }, - { - "coord": "org.ow2.asm:asm:9.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm/9.1/asm-9.1.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm/9.1/asm-9.1.jar", - "https://maven.google.com/org/ow2/asm/asm/9.1/asm-9.1.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1.jar" - ], - "sha256": "cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1.jar" - }, - { - "coord": "org.ow2.asm:asm:jar:sources:9.1", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/ow2/asm/asm/9.1/asm-9.1-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1-sources.jar", - "https://maven.fabric.io/public/org/ow2/asm/asm/9.1/asm-9.1-sources.jar", - "https://maven.google.com/org/ow2/asm/asm/9.1/asm-9.1-sources.jar", - "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1-sources.jar" - ], - "sha256": "64a1059b152dee08e203b4e1117b7979fff1578c545573f05329fb6d9090bb41", - "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1-sources.jar" - }, - { - "coord": "org.robolectric:annotations:4.5", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/annotations/4.5/annotations-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/annotations/4.5/annotations-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/annotations/4.5/annotations-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/annotations/4.5/annotations-4.5.jar", - "https://maven.google.com/org/robolectric/annotations/4.5/annotations-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/annotations/4.5/annotations-4.5.jar" - ], - "sha256": "76b5bf55bb0d98e3b72fee1e015dea04c3a5a907aff02b9b405cebd50a19e1ab", - "url": "https://repo1.maven.org/maven2/org/robolectric/annotations/4.5/annotations-4.5.jar" - }, - { - "coord": "org.robolectric:annotations:jar:sources:4.5", - "dependencies": [], - "directDependencies": [], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/annotations/4.5/annotations-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/annotations/4.5/annotations-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/annotations/4.5/annotations-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/annotations/4.5/annotations-4.5-sources.jar", - "https://maven.google.com/org/robolectric/annotations/4.5/annotations-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/annotations/4.5/annotations-4.5-sources.jar" - ], - "sha256": "32eccf8cbb11da68ffbe0fc14278150dc4236f77de26af1d1727e6acd61a086b", - "url": "https://repo1.maven.org/maven2/org/robolectric/annotations/4.5/annotations-4.5-sources.jar" - }, - { - "coord": "org.robolectric:junit:4.5", - "dependencies": [ - "org.ow2.asm:asm-analysis:9.0", - "org.robolectric:pluginapi:4.5", - "org.robolectric:utils:4.5", - "com.google.guava:guava:30.1.1-android", - "org.ow2.asm:asm-commons:9.0", - "org.ow2.asm:asm-tree:9.0", - "org.ow2.asm:asm-util:9.0", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:utils-reflector:4.5", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1", - "org.ow2.asm:asm:9.1", - "org.robolectric:shadowapi:4.5", - "org.robolectric:sandbox:4.5" - ], - "directDependencies": [ - "org.robolectric:pluginapi:4.5", - "org.robolectric:utils-reflector:4.5", - "org.robolectric:annotations:4.5", - "org.robolectric:shadowapi:4.5", - "org.robolectric:sandbox:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/junit/4.5/junit-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/junit/4.5/junit-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/junit/4.5/junit-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/junit/4.5/junit-4.5.jar", - "https://maven.google.com/org/robolectric/junit/4.5/junit-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/junit/4.5/junit-4.5.jar" - ], - "sha256": "c9eec2e87d53fc7a4af3c0c1c4b722963f2dc7d0a01b90568a6c83ca6d751c4a", - "url": "https://repo1.maven.org/maven2/org/robolectric/junit/4.5/junit-4.5.jar" - }, - { - "coord": "org.robolectric:junit:jar:sources:4.5", - "dependencies": [ - "org.ow2.asm:asm-commons:jar:sources:9.0", - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.ow2.asm:asm:jar:sources:9.1", - "org.ow2.asm:asm-tree:jar:sources:9.0", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:shadowapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "org.ow2.asm:asm-util:jar:sources:9.0", - "org.robolectric:sandbox:jar:sources:4.5", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "org.robolectric:utils-reflector:jar:sources:4.5" - ], - "directDependencies": [ - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:shadowapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "org.robolectric:sandbox:jar:sources:4.5", - "org.robolectric:utils-reflector:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/junit/4.5/junit-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/junit/4.5/junit-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/junit/4.5/junit-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/junit/4.5/junit-4.5-sources.jar", - "https://maven.google.com/org/robolectric/junit/4.5/junit-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/junit/4.5/junit-4.5-sources.jar" - ], - "sha256": "6e631445ffcb2ecefb4ba4e170ae31e39f281244a3ce68b444f8d8fe1944782f", - "url": "https://repo1.maven.org/maven2/org/robolectric/junit/4.5/junit-4.5-sources.jar" - }, - { - "coord": "org.robolectric:pluginapi:4.5", - "dependencies": [ - "org.robolectric:annotations:4.5" - ], - "directDependencies": [ - "org.robolectric:annotations:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/pluginapi/4.5/pluginapi-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/pluginapi/4.5/pluginapi-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/pluginapi/4.5/pluginapi-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/pluginapi/4.5/pluginapi-4.5.jar", - "https://maven.google.com/org/robolectric/pluginapi/4.5/pluginapi-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/pluginapi/4.5/pluginapi-4.5.jar" - ], - "sha256": "9292f4a65d546b27b000112f1daeea8228c039ba9eb790d122ee99a4b04d8c43", - "url": "https://repo1.maven.org/maven2/org/robolectric/pluginapi/4.5/pluginapi-4.5.jar" - }, - { - "coord": "org.robolectric:pluginapi:jar:sources:4.5", - "dependencies": [ - "org.robolectric:annotations:jar:sources:4.5" - ], - "directDependencies": [ - "org.robolectric:annotations:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/pluginapi/4.5/pluginapi-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/pluginapi/4.5/pluginapi-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/pluginapi/4.5/pluginapi-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/pluginapi/4.5/pluginapi-4.5-sources.jar", - "https://maven.google.com/org/robolectric/pluginapi/4.5/pluginapi-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/pluginapi/4.5/pluginapi-4.5-sources.jar" - ], - "sha256": "c90002bd085a03daf77b51ed4e0867cff898adaa754023aea21f4bcb84567127", - "url": "https://repo1.maven.org/maven2/org/robolectric/pluginapi/4.5/pluginapi-4.5-sources.jar" - }, - { - "coord": "org.robolectric:plugins-maven-dependency-resolver:4.5", - "dependencies": [ - "org.robolectric:pluginapi:4.5", - "org.robolectric:utils:4.5", - "com.google.guava:guava:30.1.1-android", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1" - ], - "directDependencies": [ - "com.google.guava:guava:30.1.1-android", - "org.robolectric:pluginapi:4.5", - "org.robolectric:utils:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5.jar", - "https://maven.google.com/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5.jar" - ], - "sha256": "e6c381016e2da09c3f3a7859075042d3457d0dc0a6ba088b8d969b9d3a525cfa", - "url": "https://repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5.jar" - }, - { - "coord": "org.robolectric:plugins-maven-dependency-resolver:jar:sources:4.5", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:utils:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5-sources.jar", - "https://maven.google.com/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5-sources.jar" - ], - "sha256": "628689f56c37d669a60d5aa669e59acb0d64001f6b2533174ed5ddee4871d7bb", - "url": "https://repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.5/plugins-maven-dependency-resolver-4.5-sources.jar" - }, - { - "coord": "org.robolectric:resources:4.5", - "dependencies": [ - "org.robolectric:pluginapi:4.5", - "org.robolectric:utils:4.5", - "com.google.guava:guava:30.1.1-android", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1" - ], - "directDependencies": [ - "com.google.guava:guava:30.1.1-android", - "org.robolectric:annotations:4.5", - "org.robolectric:pluginapi:4.5", - "org.robolectric:utils:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/resources/4.5/resources-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/resources/4.5/resources-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/resources/4.5/resources-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/resources/4.5/resources-4.5.jar", - "https://maven.google.com/org/robolectric/resources/4.5/resources-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/resources/4.5/resources-4.5.jar" - ], - "sha256": "21b60d114670827bf80b7815faa16da02eeda2fcd01cba088dfb630fa9721eb3", - "url": "https://repo1.maven.org/maven2/org/robolectric/resources/4.5/resources-4.5.jar" - }, - { - "coord": "org.robolectric:resources:jar:sources:4.5", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.robolectric:annotations:jar:sources:4.5", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:utils:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/resources/4.5/resources-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/resources/4.5/resources-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/resources/4.5/resources-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/resources/4.5/resources-4.5-sources.jar", - "https://maven.google.com/org/robolectric/resources/4.5/resources-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/resources/4.5/resources-4.5-sources.jar" - ], - "sha256": "d5baa25e556e4fc67d3dc6bdf0bf32d29df4439856fc054112f81596a1fe1574", - "url": "https://repo1.maven.org/maven2/org/robolectric/resources/4.5/resources-4.5-sources.jar" - }, - { - "coord": "org.robolectric:robolectric:4.5", - "dependencies": [ - "org.robolectric:shadows-framework:4.5", - "org.ow2.asm:asm-analysis:9.0", - "androidx.annotation:annotation:1.1.0", - "org.robolectric:pluginapi:4.5", - "androidx.test:monitor:1.4.0", - "org.robolectric:plugins-maven-dependency-resolver:4.5", - "org.robolectric:resources:4.5", - "org.robolectric:junit:4.5", - "org.robolectric:utils:4.5", - "com.google.guava:guava:30.1.1-android", - "org.ow2.asm:asm-commons:9.0", - "androidx.test:monitor:aar:1.4.0", - "com.google.auto.value:auto-value-annotations:1.8.1", - "com.almworks.sqlite4java:sqlite4java:1.0.392", - "org.ow2.asm:asm-tree:9.0", - "org.bouncycastle:bcprov-jdk15on:1.65", - "org.ow2.asm:asm-util:9.0", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:utils-reflector:4.5", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1", - "org.ow2.asm:asm:9.1", - "com.ibm.icu:icu4j:53.1", - "org.robolectric:shadowapi:4.5", - "org.robolectric:sandbox:4.5" - ], - "directDependencies": [ - "org.robolectric:shadows-framework:4.5", - "org.robolectric:pluginapi:4.5", - "androidx.test:monitor:1.4.0", - "org.robolectric:plugins-maven-dependency-resolver:4.5", - "org.robolectric:resources:4.5", - "org.robolectric:junit:4.5", - "org.robolectric:utils:4.5", - "org.bouncycastle:bcprov-jdk15on:1.65", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:utils-reflector:4.5", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1", - "org.robolectric:sandbox:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/robolectric/4.5/robolectric-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/robolectric/4.5/robolectric-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/robolectric/4.5/robolectric-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/robolectric/4.5/robolectric-4.5.jar", - "https://maven.google.com/org/robolectric/robolectric/4.5/robolectric-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/robolectric/4.5/robolectric-4.5.jar" - ], - "sha256": "ba9f8130c11d5b34dfe61990d2e9adfbcf5a945476309c3dcb48fce547331c27", - "url": "https://repo1.maven.org/maven2/org/robolectric/robolectric/4.5/robolectric-4.5.jar" - }, - { - "coord": "org.robolectric:robolectric:jar:sources:4.5", - "dependencies": [ - "org.ow2.asm:asm-commons:jar:sources:9.0", - "com.google.guava:guava:jar:sources:30.1.1-android", - "androidx.test:monitor:jar:sources:1.4.0", - "org.robolectric:resources:jar:sources:4.5", - "org.ow2.asm:asm:jar:sources:9.1", - "androidx.test:monitor:aar:sources:1.4.0", - "org.ow2.asm:asm-tree:jar:sources:9.0", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "com.almworks.sqlite4java:sqlite4java:jar:sources:1.0.392", - "org.robolectric:shadows-framework:jar:sources:4.5", - "org.robolectric:shadowapi:jar:sources:4.5", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.ibm.icu:icu4j:jar:sources:53.1", - "org.bouncycastle:bcprov-jdk15on:jar:sources:1.65", - "org.robolectric:annotations:jar:sources:4.5", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "org.robolectric:plugins-maven-dependency-resolver:jar:sources:4.5", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "org.ow2.asm:asm-util:jar:sources:9.0", - "org.robolectric:sandbox:jar:sources:4.5", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "org.robolectric:junit:jar:sources:4.5", - "org.robolectric:utils-reflector:jar:sources:4.5" - ], - "directDependencies": [ - "androidx.test:monitor:jar:sources:1.4.0", - "org.robolectric:resources:jar:sources:4.5", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:shadows-framework:jar:sources:4.5", - "org.bouncycastle:bcprov-jdk15on:jar:sources:1.65", - "org.robolectric:annotations:jar:sources:4.5", - "org.robolectric:plugins-maven-dependency-resolver:jar:sources:4.5", - "org.robolectric:sandbox:jar:sources:4.5", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "org.robolectric:junit:jar:sources:4.5", - "org.robolectric:utils-reflector:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/robolectric/4.5/robolectric-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/robolectric/4.5/robolectric-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/robolectric/4.5/robolectric-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/robolectric/4.5/robolectric-4.5-sources.jar", - "https://maven.google.com/org/robolectric/robolectric/4.5/robolectric-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/robolectric/4.5/robolectric-4.5-sources.jar" - ], - "sha256": "54293237f2b9f48f1609935bffc37b353b3e981962fb578da64bae1a82c6c25d", - "url": "https://repo1.maven.org/maven2/org/robolectric/robolectric/4.5/robolectric-4.5-sources.jar" - }, - { - "coord": "org.robolectric:sandbox:4.5", - "dependencies": [ - "org.ow2.asm:asm-analysis:9.0", - "org.robolectric:pluginapi:4.5", - "org.robolectric:utils:4.5", - "com.google.guava:guava:30.1.1-android", - "org.ow2.asm:asm-commons:9.0", - "org.ow2.asm:asm-tree:9.0", - "org.ow2.asm:asm-util:9.0", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:utils-reflector:4.5", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1", - "org.ow2.asm:asm:9.1", - "org.robolectric:shadowapi:4.5" - ], - "directDependencies": [ - "org.robolectric:utils:4.5", - "com.google.guava:guava:30.1.1-android", - "org.ow2.asm:asm-commons:9.0", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:utils-reflector:4.5", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1", - "org.ow2.asm:asm:9.1", - "org.robolectric:shadowapi:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/sandbox/4.5/sandbox-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/sandbox/4.5/sandbox-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/sandbox/4.5/sandbox-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/sandbox/4.5/sandbox-4.5.jar", - "https://maven.google.com/org/robolectric/sandbox/4.5/sandbox-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/sandbox/4.5/sandbox-4.5.jar" - ], - "sha256": "cf18639f2991893122f88df87bf83eb325b3ca1031c9a730acead5acdc7e275c", - "url": "https://repo1.maven.org/maven2/org/robolectric/sandbox/4.5/sandbox-4.5.jar" - }, - { - "coord": "org.robolectric:sandbox:jar:sources:4.5", - "dependencies": [ - "org.ow2.asm:asm-commons:jar:sources:9.0", - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.ow2.asm:asm:jar:sources:9.1", - "org.ow2.asm:asm-tree:jar:sources:9.0", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:shadowapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "org.ow2.asm:asm-util:jar:sources:9.0", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "org.robolectric:utils-reflector:jar:sources:4.5" - ], - "directDependencies": [ - "org.ow2.asm:asm-commons:jar:sources:9.0", - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.ow2.asm:asm:jar:sources:9.1", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:shadowapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "org.robolectric:utils-reflector:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/sandbox/4.5/sandbox-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/sandbox/4.5/sandbox-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/sandbox/4.5/sandbox-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/sandbox/4.5/sandbox-4.5-sources.jar", - "https://maven.google.com/org/robolectric/sandbox/4.5/sandbox-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/sandbox/4.5/sandbox-4.5-sources.jar" - ], - "sha256": "e9c61c173f65a73f4ae415cc0095c8570ed199d8247b4421032b82cc2aca3571", - "url": "https://repo1.maven.org/maven2/org/robolectric/sandbox/4.5/sandbox-4.5-sources.jar" - }, - { - "coord": "org.robolectric:shadowapi:4.5", - "dependencies": [ - "org.robolectric:annotations:4.5" - ], - "directDependencies": [ - "org.robolectric:annotations:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/shadowapi/4.5/shadowapi-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/shadowapi/4.5/shadowapi-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/shadowapi/4.5/shadowapi-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/shadowapi/4.5/shadowapi-4.5.jar", - "https://maven.google.com/org/robolectric/shadowapi/4.5/shadowapi-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/shadowapi/4.5/shadowapi-4.5.jar" - ], - "sha256": "a158c49d0274a1412fb909d6b2e52a06b230a2b80ad8657c072c7474f0e69c1f", - "url": "https://repo1.maven.org/maven2/org/robolectric/shadowapi/4.5/shadowapi-4.5.jar" - }, - { - "coord": "org.robolectric:shadowapi:jar:sources:4.5", - "dependencies": [ - "org.robolectric:annotations:jar:sources:4.5" - ], - "directDependencies": [ - "org.robolectric:annotations:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/shadowapi/4.5/shadowapi-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/shadowapi/4.5/shadowapi-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/shadowapi/4.5/shadowapi-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/shadowapi/4.5/shadowapi-4.5-sources.jar", - "https://maven.google.com/org/robolectric/shadowapi/4.5/shadowapi-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/shadowapi/4.5/shadowapi-4.5-sources.jar" - ], - "sha256": "4a220cfd840b1aec509512825a6b332dbe8889f988f25d60369ceb599396ac9e", - "url": "https://repo1.maven.org/maven2/org/robolectric/shadowapi/4.5/shadowapi-4.5-sources.jar" - }, - { - "coord": "org.robolectric:shadows-framework:4.5", - "dependencies": [ - "org.ow2.asm:asm-analysis:9.0", - "androidx.annotation:annotation:1.1.0", - "org.robolectric:pluginapi:4.5", - "org.robolectric:resources:4.5", - "org.robolectric:utils:4.5", - "com.google.guava:guava:30.1.1-android", - "org.ow2.asm:asm-commons:9.0", - "androidx.test:monitor:aar:1.4.0", - "com.google.auto.value:auto-value-annotations:1.8.1", - "com.almworks.sqlite4java:sqlite4java:1.0.392", - "org.ow2.asm:asm-tree:9.0", - "org.ow2.asm:asm-util:9.0", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:utils-reflector:4.5", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1", - "org.ow2.asm:asm:9.1", - "com.ibm.icu:icu4j:53.1", - "org.robolectric:shadowapi:4.5" - ], - "directDependencies": [ - "androidx.annotation:annotation:1.1.0", - "org.robolectric:pluginapi:4.5", - "org.robolectric:resources:4.5", - "org.robolectric:utils:4.5", - "androidx.test:monitor:aar:1.4.0", - "com.google.auto.value:auto-value-annotations:1.8.1", - "com.almworks.sqlite4java:sqlite4java:1.0.392", - "org.robolectric:utils-reflector:4.5", - "org.robolectric:annotations:4.5", - "com.ibm.icu:icu4j:53.1", - "org.robolectric:shadowapi:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/shadows-framework/4.5/shadows-framework-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/shadows-framework/4.5/shadows-framework-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/shadows-framework/4.5/shadows-framework-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/shadows-framework/4.5/shadows-framework-4.5.jar", - "https://maven.google.com/org/robolectric/shadows-framework/4.5/shadows-framework-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/shadows-framework/4.5/shadows-framework-4.5.jar" - ], - "sha256": "3be4c7d01ee2fb5cff4cb90a65af26831199baac3e92311dd2d5f42cadb50723", - "url": "https://repo1.maven.org/maven2/org/robolectric/shadows-framework/4.5/shadows-framework-4.5.jar" - }, - { - "coord": "org.robolectric:shadows-framework:jar:sources:4.5", - "dependencies": [ - "org.ow2.asm:asm-commons:jar:sources:9.0", - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.robolectric:resources:jar:sources:4.5", - "org.ow2.asm:asm:jar:sources:9.1", - "androidx.test:monitor:aar:sources:1.4.0", - "org.ow2.asm:asm-tree:jar:sources:9.0", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "com.almworks.sqlite4java:sqlite4java:jar:sources:1.0.392", - "org.robolectric:shadowapi:jar:sources:4.5", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.ibm.icu:icu4j:jar:sources:53.1", - "org.robolectric:annotations:jar:sources:4.5", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "org.ow2.asm:asm-util:jar:sources:9.0", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2", - "org.robolectric:utils-reflector:jar:sources:4.5" - ], - "directDependencies": [ - "org.robolectric:resources:jar:sources:4.5", - "androidx.test:monitor:aar:sources:1.4.0", - "org.robolectric:utils:jar:sources:4.5", - "org.robolectric:pluginapi:jar:sources:4.5", - "com.almworks.sqlite4java:sqlite4java:jar:sources:1.0.392", - "org.robolectric:shadowapi:jar:sources:4.5", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.ibm.icu:icu4j:jar:sources:53.1", - "org.robolectric:annotations:jar:sources:4.5", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "org.robolectric:utils-reflector:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/shadows-framework/4.5/shadows-framework-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/shadows-framework/4.5/shadows-framework-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/shadows-framework/4.5/shadows-framework-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/shadows-framework/4.5/shadows-framework-4.5-sources.jar", - "https://maven.google.com/org/robolectric/shadows-framework/4.5/shadows-framework-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/shadows-framework/4.5/shadows-framework-4.5-sources.jar" - ], - "sha256": "879288cd58699b4a75ebda38bb0905f359a258575f18ff0e7b861d18a8595231", - "url": "https://repo1.maven.org/maven2/org/robolectric/shadows-framework/4.5/shadows-framework-4.5-sources.jar" - }, - { - "coord": "org.robolectric:utils-reflector:4.5", - "dependencies": [ - "org.ow2.asm:asm-analysis:9.0", - "org.robolectric:pluginapi:4.5", - "org.robolectric:utils:4.5", - "com.google.guava:guava:30.1.1-android", - "org.ow2.asm:asm-commons:9.0", - "org.ow2.asm:asm-tree:9.0", - "org.ow2.asm:asm-util:9.0", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1", - "org.ow2.asm:asm:9.1" - ], - "directDependencies": [ - "org.ow2.asm:asm:9.1", - "org.ow2.asm:asm-commons:9.0", - "org.ow2.asm:asm-util:9.0", - "org.robolectric:utils:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/utils-reflector/4.5/utils-reflector-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/utils-reflector/4.5/utils-reflector-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/utils-reflector/4.5/utils-reflector-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/utils-reflector/4.5/utils-reflector-4.5.jar", - "https://maven.google.com/org/robolectric/utils-reflector/4.5/utils-reflector-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/utils-reflector/4.5/utils-reflector-4.5.jar" - ], - "sha256": "91f9e5f9eacd6a2f308473b39d473f3edd205365fe3c4188f8c4c11191c6d914", - "url": "https://repo1.maven.org/maven2/org/robolectric/utils-reflector/4.5/utils-reflector-4.5.jar" - }, - { - "coord": "org.robolectric:utils-reflector:jar:sources:4.5", - "dependencies": [ - "org.ow2.asm:asm-commons:jar:sources:9.0", - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.ow2.asm:asm:jar:sources:9.1", - "org.ow2.asm:asm-tree:jar:sources:9.0", - "org.robolectric:utils:jar:sources:4.5", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "org.ow2.asm:asm-analysis:jar:sources:9.0", - "org.ow2.asm:asm-util:jar:sources:9.0", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2" - ], - "directDependencies": [ - "org.ow2.asm:asm:jar:sources:9.1", - "org.ow2.asm:asm-commons:jar:sources:9.0", - "org.ow2.asm:asm-util:jar:sources:9.0", - "org.robolectric:utils:jar:sources:4.5" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/utils-reflector/4.5/utils-reflector-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/utils-reflector/4.5/utils-reflector-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/utils-reflector/4.5/utils-reflector-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/utils-reflector/4.5/utils-reflector-4.5-sources.jar", - "https://maven.google.com/org/robolectric/utils-reflector/4.5/utils-reflector-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/utils-reflector/4.5/utils-reflector-4.5-sources.jar" - ], - "sha256": "a8f9c774036f4ed79a1c08cd876a4ec0e8eac311875c0a3e9df7de8ab0e5e003", - "url": "https://repo1.maven.org/maven2/org/robolectric/utils-reflector/4.5/utils-reflector-4.5-sources.jar" - }, - { - "coord": "org.robolectric:utils:4.5", - "dependencies": [ - "org.robolectric:pluginapi:4.5", - "com.google.guava:guava:30.1.1-android", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1" - ], - "directDependencies": [ - "org.robolectric:pluginapi:4.5", - "com.google.guava:guava:30.1.1-android", - "javax.annotation:javax.annotation-api:1.3.2", - "org.robolectric:annotations:4.5", - "javax.inject:javax.inject:1" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/utils/4.5/utils-4.5.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/utils/4.5/utils-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/utils/4.5/utils-4.5.jar", - "https://maven.fabric.io/public/org/robolectric/utils/4.5/utils-4.5.jar", - "https://maven.google.com/org/robolectric/utils/4.5/utils-4.5.jar", - "https://repo1.maven.org/maven2/org/robolectric/utils/4.5/utils-4.5.jar" - ], - "sha256": "b0982a413c4bd874a8099b97a22cdcd4826cf62178f17dbca67d814627124de1", - "url": "https://repo1.maven.org/maven2/org/robolectric/utils/4.5/utils-4.5.jar" - }, - { - "coord": "org.robolectric:utils:jar:sources:4.5", - "dependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2" - ], - "directDependencies": [ - "com.google.guava:guava:jar:sources:30.1.1-android", - "javax.inject:javax.inject:jar:sources:1", - "org.robolectric:pluginapi:jar:sources:4.5", - "org.robolectric:annotations:jar:sources:4.5", - "javax.annotation:javax.annotation-api:jar:sources:1.3.2" - ], - "file": "v1/https/repo1.maven.org/maven2/org/robolectric/utils/4.5/utils-4.5-sources.jar", - "mirror_urls": [ - "https://maven.google.com/org/robolectric/utils/4.5/utils-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/utils/4.5/utils-4.5-sources.jar", - "https://maven.fabric.io/public/org/robolectric/utils/4.5/utils-4.5-sources.jar", - "https://maven.google.com/org/robolectric/utils/4.5/utils-4.5-sources.jar", - "https://repo1.maven.org/maven2/org/robolectric/utils/4.5/utils-4.5-sources.jar" - ], - "sha256": "f8b7e1a3ed9916c1d2529ede178af4bd6dc3b2f41fc9be57c22476f3e91ffdb4", - "url": "https://repo1.maven.org/maven2/org/robolectric/utils/4.5/utils-4.5-sources.jar" - }, - { - "coord": "androidx.constraintlayout:constraintlayout-solver:jar:sources:2.0.1", - "dependencies": [], - "directDependencies": [], - "file": null - }, - { - "coord": "androidx.constraintlayout:constraintlayout:jar:sources:2.0.1", - "dependencies": [ - "androidx.versionedparcelable:versionedparcelable:aar:sources:1.1.0", - "androidx.vectordrawable:vectordrawable-animated:aar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.lifecycle:lifecycle-runtime:aar:sources:2.2.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.core:core:jar:sources:1.3.1", - "androidx.drawerlayout:drawerlayout:aar:sources:1.1.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.interpolator:interpolator:aar:sources:1.0.0", - "androidx.cursoradapter:cursoradapter:aar:sources:1.0.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.appcompat:appcompat-resources:aar:sources:1.2.0", - "androidx.appcompat:appcompat:jar:sources:1.2.0", - "androidx.constraintlayout:constraintlayout-solver:jar:sources:2.0.1", - "androidx.vectordrawable:vectordrawable:aar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.appcompat:appcompat:jar:sources:1.2.0", - "androidx.constraintlayout:constraintlayout-solver:jar:sources:2.0.1", - "androidx.core:core:jar:sources:1.3.1" - ], - "file": null - }, - { - "coord": "androidx.multidex:multidex-instrumentation:jar:sources:2.0.0", - "dependencies": [ - "androidx.multidex:multidex:jar:sources:2.0.1" - ], - "directDependencies": [ - "androidx.multidex:multidex:jar:sources:2.0.1" - ], - "file": null - }, - { - "coord": "com.android.support:support-annotations:jar:sources:28.0.0", - "dependencies": [], - "directDependencies": [], - "file": null - }, - { - "coord": "com.crashlytics.sdk.android:answers:aar:sources:1.4.6", - "dependencies": [ - "io.fabric.sdk.android:fabric:aar:sources:1.4.7" - ], - "directDependencies": [ - "io.fabric.sdk.android:fabric:aar:sources:1.4.7" - ], - "file": null - }, - { - "coord": "com.crashlytics.sdk.android:beta:aar:sources:1.2.10", - "dependencies": [], - "directDependencies": [], - "exclusions": [ - "io.fabric.sdk.android:fabric", - "com.crashlytics.sdk.android:answers", - "com.crashlytics.sdk.android:crashlytics" - ], - "file": null - }, - { - "coord": "com.crashlytics.sdk.android:crashlytics-core:aar:sources:2.6.7", - "dependencies": [ - "com.crashlytics.sdk.android:answers:aar:sources:1.4.6", - "io.fabric.sdk.android:fabric:aar:sources:1.4.7" - ], - "directDependencies": [ - "com.crashlytics.sdk.android:answers:aar:sources:1.4.6", - "io.fabric.sdk.android:fabric:aar:sources:1.4.7" - ], - "file": null - }, - { - "coord": "com.crashlytics.sdk.android:crashlytics:jar:sources:2.9.8", - "dependencies": [ - "com.crashlytics.sdk.android:beta:aar:sources:1.2.10", - "com.crashlytics.sdk.android:answers:aar:sources:1.4.6", - "io.fabric.sdk.android:fabric:aar:sources:1.4.7", - "com.crashlytics.sdk.android:crashlytics-core:aar:sources:2.6.7" - ], - "directDependencies": [ - "com.crashlytics.sdk.android:answers:aar:sources:1.4.6", - "com.crashlytics.sdk.android:beta:aar:sources:1.2.10", - "com.crashlytics.sdk.android:crashlytics-core:aar:sources:2.6.7", - "io.fabric.sdk.android:fabric:aar:sources:1.4.7" - ], - "file": null - }, - { - "coord": "com.google.android.datatransport:transport-api:aar:sources:2.2.0", - "dependencies": [], - "directDependencies": [], - "file": null - }, - { - "coord": "com.google.android.datatransport:transport-backend-cct:aar:sources:2.3.0", - "dependencies": [ - "com.google.android.datatransport:transport-runtime:aar:sources:2.2.3", - "com.google.dagger:dagger:jar:sources:2.28.1", - "com.google.android.datatransport:transport-api:aar:sources:2.2.0", - "com.google.firebase:firebase-encoders-json:aar:sources:16.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.android.datatransport:transport-api:aar:sources:2.2.0", - "com.google.android.datatransport:transport-runtime:aar:sources:2.2.3", - "com.google.firebase:firebase-encoders-json:aar:sources:16.1.0" - ], - "file": null - }, - { - "coord": "com.google.android.datatransport:transport-runtime:aar:sources:2.2.3", - "dependencies": [ - "com.google.android.datatransport:transport-api:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.dagger:dagger:jar:sources:2.28.1" - ], - "directDependencies": [ - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.android.datatransport:transport-api:aar:sources:2.2.0", - "com.google.dagger:dagger:jar:sources:2.28.1" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "dependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.fragment:fragment:aar:sources:1.2.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-base:aar:sources:17.0.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "directDependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.fragment:fragment:aar:sources:1.2.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-measurement-api:aar:sources:17.5.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "com.google.firebase:firebase-measurement-connector:aar:sources:18.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "com.google.android.gms:play-services-measurement-sdk-api:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.android.gms:play-services-measurement-impl:aar:sources:17.5.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.firebase:firebase-installations:aar:sources:16.3.2", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0" - ], - "directDependencies": [ - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "com.google.firebase:firebase-measurement-connector:aar:sources:18.0.0", - "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "com.google.android.gms:play-services-measurement-sdk-api:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-impl:aar:sources:17.5.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.firebase:firebase-installations:aar:sources:16.3.2", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "dependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.fragment:fragment:aar:sources:1.2.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-measurement-impl:aar:sources:17.5.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0" - ], - "directDependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-measurement-sdk-api:aar:sources:17.5.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-measurement-sdk:aar:sources:17.5.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.android.gms:play-services-measurement-impl:aar:sources:17.5.0", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0" - ], - "directDependencies": [ - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-impl:aar:sources:17.5.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-measurement:aar:sources:17.5.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.android.gms:play-services-measurement-impl:aar:sources:17.5.0", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0" - ], - "directDependencies": [ - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-impl:aar:sources:17.5.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-stats:aar:sources:17.0.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "directDependencies": [ - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "dependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.fragment:fragment:aar:sources:1.2.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.android.gms:strict-version-matcher-plugin:jar:sources:1.2.1", - "dependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10", - "com.google.guava:guava:jar:sources:30.1.1-android" - ], - "directDependencies": [ - "com.google.code.findbugs:jsr305:jar:sources:3.0.2", - "com.google.guava:guava:jar:sources:30.1.1-android", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources:1.4.10" - ], - "file": null - }, - { - "coord": "com.google.firebase:firebase-analytics:jar:sources:17.5.0", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "androidx.print:print:aar:sources:1.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "com.google.firebase:firebase-measurement-connector:aar:sources:18.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-ads-identifier:aar:sources:17.0.0", - "com.google.android.gms:play-services-measurement-api:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-sdk:aar:sources:17.5.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "com.google.android.gms:play-services-measurement-sdk-api:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-base:aar:sources:17.5.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.android.gms:play-services-measurement-impl:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement:aar:sources:17.5.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.firebase:firebase-installations:aar:sources:16.3.2", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-measurement:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-api:aar:sources:17.5.0", - "com.google.android.gms:play-services-measurement-sdk:aar:sources:17.5.0" - ], - "file": null - }, - { - "coord": "com.google.firebase:firebase-crashlytics:jar:sources:17.1.1", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "com.google.android.datatransport:transport-runtime:aar:sources:2.2.3", - "com.squareup.okhttp3:okhttp:jar:sources:4.7.2", - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "androidx.print:print:aar:sources:1.0.0", - "com.google.android.gms:play-services-base:aar:sources:17.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "com.google.firebase:firebase-iid:aar:sources:20.1.5", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "com.google.firebase:firebase-measurement-connector:aar:sources:18.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.dagger:dagger:jar:sources:2.28.1", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "com.google.android.datatransport:transport-api:aar:sources:2.2.0", - "com.google.android.datatransport:transport-backend-cct:aar:sources:2.3.0", - "com.google.firebase:firebase-encoders-json:aar:sources:16.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.firebase:firebase-installations:aar:sources:16.3.2", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.firebase:firebase-iid-interop:aar:sources:17.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0" - ], - "directDependencies": [ - "com.google.android.datatransport:transport-runtime:aar:sources:2.2.3", - "com.squareup.okhttp3:okhttp:jar:sources:4.7.2", - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "com.google.firebase:firebase-iid:aar:sources:20.1.5", - "com.google.firebase:firebase-measurement-connector:aar:sources:18.0.0", - "com.google.android.datatransport:transport-api:aar:sources:2.2.0", - "com.google.android.datatransport:transport-backend-cct:aar:sources:2.3.0", - "com.google.firebase:firebase-encoders-json:aar:sources:16.1.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.firebase:firebase-iid-interop:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.firebase:firebase-iid-interop:aar:sources:17.0.0", - "dependencies": [ - "com.google.android.gms:play-services-base:aar:sources:17.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-base:aar:sources:17.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.firebase:firebase-iid:aar:sources:20.1.5", - "dependencies": [ - "androidx.documentfile:documentfile:aar:sources:1.0.0", - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "androidx.print:print:aar:sources:1.0.0", - "com.google.android.gms:play-services-base:aar:sources:17.0.0", - "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:sources:1.0.0", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.firebase:firebase-installations:aar:sources:16.3.2", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "androidx.loader:loader:aar:sources:1.0.0", - "com.google.firebase:firebase-iid-interop:aar:sources:17.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0" - ], - "directDependencies": [ - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.legacy:legacy-support-core-utils:aar:sources:1.0.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.firebase:firebase-installations:aar:sources:16.3.2", - "com.google.firebase:firebase-iid-interop:aar:sources:17.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.android.gms:play-services-stats:aar:sources:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0" - ], - "file": null - }, - { - "coord": "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0", - "dependencies": [ - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.firebase:firebase-installations:aar:sources:16.3.2", - "dependencies": [ - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.fragment:fragment:aar:sources:1.2.0", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.annotation:annotation:jar:sources:1.1.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.auto.value:auto-value-annotations:jar:sources:1.8.1", - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-tasks:aar:sources:17.0.0", - "com.google.firebase:firebase-common:aar:sources:19.3.0", - "com.google.firebase:firebase-components:aar:sources:16.0.0", - "com.google.firebase:firebase-installations-interop:aar:sources:16.0.0" - ], - "file": null - }, - { - "coord": "com.google.firebase:firebase-measurement-connector:aar:sources:18.0.0", - "dependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0", - "androidx.core:core:aar:sources:1.3.1", - "androidx.collection:collection:jar:sources:1.1.0", - "androidx.fragment:fragment:aar:sources:1.2.0" - ], - "directDependencies": [ - "com.google.android.gms:play-services-basement:aar:sources:17.0.0" - ], - "file": null - }, - { - "coord": "com.google.guava:listenablefuture:jar:sources:9999.0-empty-to-avoid-conflict-with-guava", - "dependencies": [], - "directDependencies": [], - "file": null - }, - { - "coord": "io.fabric.sdk.android:fabric:aar:sources:1.4.7", - "dependencies": [], - "directDependencies": [], - "file": null - }, - { - "coord": "io.fabric.sdk.android:fabric:jar:sources:1.4.7", - "dependencies": [], - "directDependencies": [], - "file": null - } - ], - "version": "0.1.0" + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", + "__INPUT_ARTIFACTS_HASH": 1616765369, + "__RESOLVED_ARTIFACTS_HASH": 740282478, + "conflict_resolution": { + "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", + "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", + "androidx.recyclerview:recyclerview:1.0.0": "androidx.recyclerview:recyclerview:1.1.0", + "androidx.test:core:1.0.0": "androidx.test:core:1.4.0", + "com.google.guava:guava:28.1-android": "com.google.guava:guava:30.1.1-android", + "com.google.truth:truth:0.43": "com.google.truth:truth:1.1.3", + "junit:junit:4.12": "junit:junit:4.13.2", + "org.jetbrains.kotlin:kotlin-reflect:1.3.41": "org.jetbrains.kotlin:kotlin-reflect:1.5.0", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", + "org.mockito:mockito-core:2.19.0": "org.mockito:mockito-core:3.9.0" + }, + "artifacts": { + "android.arch.core:common": { + "shasums": { + "jar": "3a616a32f433e9e23f556b38575c31b013613d3ae85206263b7625fe1f4c151a", + "javadoc": null, + "sources": "a92362968c7894fafedddbd1092aa7f775cb9a955aa794ab4c89e5bd386aec0c" + }, + "version": "1.1.1" + }, + "android.arch.core:core-testing": { + "shasums": { + "javadoc": null, + "sources": "9b15768758ff58fd31be63cc5dd5932805676e52c1147b897cc46302976126b3" + }, + "version": "1.1.1" + }, + "android.arch.core:core-testing:aar": { + "shasums": { + "jar": "150a6f028af6c57ca6de66cb185a135cdcf737f597443acc4cf8aeeec064fff3" + }, + "version": "1.1.1" + }, + "android.arch.core:runtime": { + "shasums": { + "sources": "2819725bae3f0eac99197f810824a084d45d3b63922a87ace3329a64d0fb2420" + }, + "version": "1.1.1" + }, + "android.arch.core:runtime:aar": { + "shasums": { + "jar": "c3215aa5873311b3f88a6f4e4a3c25ad89971bc127de8c3e1291c57f93a05c39", + "javadoc": null + }, + "version": "1.1.1" + }, + "androidx.activity:activity": { + "shasums": { + "sources": "1a17836d7c91c4e3f983bba1072fa972bde277b57a718292f7c6d22659bb1f7e" + }, + "version": "1.1.0" + }, + "androidx.activity:activity:aar": { + "shasums": { + "jar": "4f2b35916768032f7d0c20e250e28b29037ed4ce9ebf3da4fcd51bcb0c6067ef", + "javadoc": null + }, + "version": "1.1.0" + }, + "androidx.annotation:annotation": { + "shasums": { + "jar": "d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692", + "javadoc": "64433da867505447aafaaab12182cc33b5afbdf32d183cfa07fa067168b06528", + "sources": "92bcd2773b5624fd88b7ee21d5685145d7cafed59316c4ce83de33a7b2dd8c02" + }, + "version": "1.1.0" + }, + "androidx.annotation:annotation-experimental": { + "shasums": { + "javadoc": null, + "sources": "66bf83ada560031d10f6ec01e9f0e92aface467ab532db6e67f12703f50b6776" + }, + "version": "1.0.0" + }, + "androidx.annotation:annotation-experimental:aar": { + "shasums": { + "jar": "b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11" + }, + "version": "1.0.0" + }, + "androidx.appcompat:appcompat": { + "shasums": { + "javadoc": null, + "sources": "5c7408a4894d4d6c713c18bf53e724091d46e44a22ed9ea6275c8bb97f6dc9f3" + }, + "version": "1.2.0" + }, + "androidx.appcompat:appcompat-resources": { + "shasums": { + "sources": "2deb19e61f184904d1880f67a355da562516b5e5251dc55156eab94039244f09" + }, + "version": "1.2.0" + }, + "androidx.appcompat:appcompat-resources:aar": { + "shasums": { + "jar": "c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5", + "javadoc": null + }, + "version": "1.2.0" + }, + "androidx.appcompat:appcompat:aar": { + "shasums": { + "jar": "3d2131a55a61a777322e2126e0018011efa6339e53b44153eb651b16020cca70" + }, + "version": "1.2.0" + }, + "androidx.arch.core:core-common": { + "shasums": { + "jar": "fe1237bf029d063e7f29fe39aeaf73ef74c8b0a3658486fc29d3c54326653889", + "javadoc": null, + "sources": "01ef2736c9b688658d7446e8396099ff0c598d9a7e753131d566f953270c5878" + }, + "version": "2.1.0" + }, + "androidx.arch.core:core-runtime": { + "shasums": { + "sources": "913acdee357814e814745466a46a793e8ad7410086ba4548458b83cd6a98424b" + }, + "version": "2.1.0" + }, + "androidx.arch.core:core-runtime:aar": { + "shasums": { + "jar": "dd77615bd3dd275afb11b62df25bae46b10b4a117cd37943af45bdcbf8755852", + "javadoc": null + }, + "version": "2.1.0" + }, + "androidx.arch.core:core-testing": { + "shasums": { + "javadoc": null, + "sources": "68ef3af5efcd66013bbaf53c8a927354a142ddb16db804a0a83cf70176efabdc" + }, + "version": "2.1.0" + }, + "androidx.arch.core:core-testing:aar": { + "shasums": { + "jar": "c57ffade2a9a844bd62b4f4c3916fad5e09e9f24cceba27e932c25bb7a6d1d8f" + }, + "version": "2.1.0" + }, + "androidx.cardview:cardview": { + "shasums": { + "javadoc": null, + "sources": "ad7a28e7768893f8b33a8b7b275a92e33c125243ca4a9130a984c40e578e19b4" + }, + "version": "1.0.0" + }, + "androidx.cardview:cardview:aar": { + "shasums": { + "jar": "1193c04c22a3d6b5946dae9f4e8c59d6adde6a71b6bd5d87fb99d82dda1afec7" + }, + "version": "1.0.0" + }, + "androidx.collection:collection": { + "shasums": { + "jar": "632a0e5407461de774409352940e292a291037724207a787820c77daf7d33b72", + "javadoc": null, + "sources": "158ae7efee9c7394a241139ebf220751f8b812eda40269a38ef725dbe784b98d" + }, + "version": "1.1.0" + }, + "androidx.constraintlayout:constraintlayout": { + "shasums": { + "javadoc": null, + "sources": null + }, + "version": "2.0.1" + }, + "androidx.constraintlayout:constraintlayout-solver": { + "shasums": { + "jar": "b23732edbb3511d937fea1ffef047b0e6c001b50c1921f0d959fc384d706ec6a", + "javadoc": null, + "sources": null + }, + "version": "2.0.1" + }, + "androidx.constraintlayout:constraintlayout:aar": { + "shasums": { + "jar": "ec15b5d4a2eff07888bc1499ce2e2c6efe24c0ed60cc57b08c9dc4b6fd3c2189" + }, + "version": "2.0.1" + }, + "androidx.coordinatorlayout:coordinatorlayout": { + "shasums": { + "javadoc": null, + "sources": "c8904cffcfb757cf14d8c0cf7563274edc3a8bc883ca9203b4b98e9823f7b22b" + }, + "version": "1.1.0" + }, + "androidx.coordinatorlayout:coordinatorlayout:aar": { + "shasums": { + "jar": "44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb" + }, + "version": "1.1.0" + }, + "androidx.core:core": { + "shasums": { + "javadoc": null, + "sources": "ae0e7ef2b5be9a59ef6d8c831090ba3e4407f9ae21e453c1df9f6b82cb46be28" + }, + "version": "1.3.1" + }, + "androidx.core:core-ktx": { + "shasums": { + "javadoc": null, + "sources": "a477aafb6356210d5d6a64f0d5e57e5500e1906ba1a3f49d449081589e785626" + }, + "version": "1.0.1" + }, + "androidx.core:core-ktx:aar": { + "shasums": { + "jar": "a151b7e21acc3d272e1d397a2084e76ccce88e8542adcc4e0cf1e0655063255f" + }, + "version": "1.0.1" + }, + "androidx.core:core:aar": { + "shasums": { + "jar": "e92ea65a37d589943d405a6a54d1be9d12a225948f26c4e41e511dd55e81efb6", + "javadoc": null + }, + "version": "1.3.1" + }, + "androidx.cursoradapter:cursoradapter": { + "shasums": { + "sources": "99b72a3aec8c9edfd9de20f5913ce4c413bca2f0cf9877b504e26aa03ef50323" + }, + "version": "1.0.0" + }, + "androidx.cursoradapter:cursoradapter:aar": { + "shasums": { + "jar": "a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.customview:customview": { + "shasums": { + "sources": "0f119c77c7613881901cbcd149e718409480c08c39661737750a35f5d6b5dfd2" + }, + "version": "1.1.0" + }, + "androidx.customview:customview:aar": { + "shasums": { + "jar": "01f76ab043770a97b054046f9815717b82ce0355c02967d16c61981359dc189a", + "javadoc": null + }, + "version": "1.1.0" + }, + "androidx.databinding:databinding-adapters": { + "shasums": { + "javadoc": null, + "sources": "201336b6c7563cf4bf7481dc24bf8cf81944d1ff0dde75e66f989fbf599c2ac5" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-adapters:aar": { + "shasums": { + "jar": "840a66744866185b6a74fd99e6596bf1eb0720837c3ae470c25212bccc563939" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-common": { + "shasums": { + "jar": "52886c0ef6cfa492d07b40c3952201d6d2f0cfc680144fbefc69d2d5cb786c25", + "javadoc": "eeb6b61b31a9561e073a15e8f050de8f8fb663103be3ec390b61c6f19a821ca5", + "sources": "c06f772438c32b6cb47b4bfe44129b77c9c9470a7f9c69af1383a31f8d050eef" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-compiler": { + "shasums": { + "jar": "07a9fb44f43048b18f149add7835e1239e92057e6748affde2d2bccf330c4242", + "javadoc": "8550379b595c934f4bbea2d34749506587763b58890a35088a04a7c546ba044d", + "sources": "55abb3bae194f31d0823807fd798b95447fb988f7f1291195e040b281f258464" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-compiler-common": { + "shasums": { + "jar": "770b6a82da0684f93d037ed5d241248cb25862ed14ecd7d9ec8c756153266051", + "javadoc": "91d74586e54c510cc46a8e2a8f3d9e21538d2c7e07ec38e0b3205d3828dfc47a", + "sources": "7a4baf3d6a0c08e9221e2059c505714c1ba3bb2be20ff7f0ee24210a5dbc51ba" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-runtime": { + "shasums": { + "javadoc": null, + "sources": "5d9c949b8d3f14102a1aa85a036057bb32c715a414438c76af06c772f935bf91" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-runtime:aar": { + "shasums": { + "jar": "80d966bf58b971334d65b213b2ab16fe827bbb95389a9c6a52b141853f529b30" + }, + "version": "3.4.2" + }, + "androidx.documentfile:documentfile": { + "shasums": { + "sources": "79c2424477565d0500b47c8288fb8e6dd9c8306984e8dbd38d576f013873b410" + }, + "version": "1.0.0" + }, + "androidx.documentfile:documentfile:aar": { + "shasums": { + "jar": "865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.drawerlayout:drawerlayout": { + "shasums": { + "javadoc": null, + "sources": "2273fcbb290a092634b90e0556dfb1ae978d9ed011be5692bd9e6659633b6850" + }, + "version": "1.1.0" + }, + "androidx.drawerlayout:drawerlayout:aar": { + "shasums": { + "jar": "9d79030ad4f93b1c6296f7a8391710f9e9e3228a3b10964c4bb0a042fd6257b8", + "javadoc": null + }, + "version": "1.1.0" + }, + "androidx.dynamicanimation:dynamicanimation": { + "shasums": { + "javadoc": null, + "sources": "7ddbf0b830e295b8013a41c2c6771416118bcc8d61328a881daae657c1429196" + }, + "version": "1.0.0" + }, + "androidx.dynamicanimation:dynamicanimation:aar": { + "shasums": { + "jar": "ce005162c229bf308d2d5b12fb6cad0874069cbbeaccee63a8193bd08d40de04" + }, + "version": "1.0.0" + }, + "androidx.exifinterface:exifinterface": { + "shasums": { + "javadoc": null, + "sources": "b9404066c090ba7ee2980698448ecc4a0d9280e4916be3b9d6d6b1cdc90e4a4c" + }, + "version": "1.0.0" + }, + "androidx.exifinterface:exifinterface:aar": { + "shasums": { + "jar": "ee48be10aab8f54efff4c14b77d11e10b9eeee4379d5ef6bf297a2923c55cc11" + }, + "version": "1.0.0" + }, + "androidx.fragment:fragment": { + "shasums": { + "javadoc": null, + "sources": "45606d34c38e29cf9ccf4bbec79c87836e7cc53bd300031792e589df16967cbb" + }, + "version": "1.2.0" + }, + "androidx.fragment:fragment:aar": { + "shasums": { + "jar": "fdd0eac80c6b26c79093a63fc699303f928cc1fa73ca7196d5590a77eb6d6873", + "javadoc": null + }, + "version": "1.2.0" + }, + "androidx.interpolator:interpolator": { + "shasums": { + "sources": "fa13ada71fe7bd9461f622f418e7c16a18e85da7708fb505c75229a9b8830345" + }, + "version": "1.0.0" + }, + "androidx.interpolator:interpolator:aar": { + "shasums": { + "jar": "33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.legacy:legacy-support-core-utils": { + "shasums": { + "javadoc": null, + "sources": "dff5a95a7a706957b16edbf5b36c619fc869742bdf18845520d0cf71748c8070" + }, + "version": "1.0.0" + }, + "androidx.legacy:legacy-support-core-utils:aar": { + "shasums": { + "jar": "a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.lifecycle:lifecycle-common": { + "shasums": { + "jar": "63898dabf7cfe5ec5d7ed8b8c2564c1427be876e1496ead95c2703cf59d3734b", + "javadoc": null, + "sources": "faa1efdbf3fb66de1cd40132c9ae0f642e7ffb922d21fb3acf171903aeb8e872" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-extensions": { + "shasums": { + "javadoc": null, + "sources": "3cc0bd51ff16c978cc4000a10e6df339febd97a0aed6aa301454b70798155cc4" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-extensions:aar": { + "shasums": { + "jar": "648c8de1d10b025d524a2e46ac994fc3f6bf186826c09ec1a62d250bf1b877ae" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata": { + "shasums": { + "sources": "f774d6018dbc7f56c278130122e608d96304f8bd78e4778d44855a01f5982d13" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata-core": { + "shasums": { + "javadoc": null, + "sources": "80de3a26fdd5857fea39d339a4d11e19c151a45ae52a16a4e237e0b4a50e10c4" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata-core-ktx": { + "shasums": { + "sources": "d962111f3f83b59b90c7fee2f1c47a6532629cebc01c407be39adf34e4d0d09c" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar": { + "shasums": { + "jar": "5951f882e95b7e05ceb9adfca0fa2ebd511d63ea5a00da4eae6c6d0c1903da18", + "javadoc": null + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata-core:aar": { + "shasums": { + "jar": "556c1f3af90aa9d7d0d330565adbf6da71b2429148bac91e07c485f4f9abf614", + "javadoc": null + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata-ktx": { + "shasums": { + "javadoc": null, + "sources": "3b1a5683ffecf2f5ec7879db1b7debf03d94b49db0bc4e2cf49d340e194fa437" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata-ktx:aar": { + "shasums": { + "jar": "69c3532a70d39adfa13458c9e06d7adcd88a2259f5e9ea517cc7eed26c5fc491" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata:aar": { + "shasums": { + "jar": "d83af94860aa9f64cbdc51f40796a7cf55b116f0e6efd752e845c0104c8b16f6", + "javadoc": null + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-process": { + "shasums": { + "sources": "2a1f34b433f339ea4f93da82bf511deb4baaabca417271a55578b3c86e1373b1" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-process:aar": { + "shasums": { + "jar": "3a977e7778fc8418742d388409daaba7ea8fea8823d21ffb96e4c4236f715070", + "javadoc": null + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-runtime": { + "shasums": { + "javadoc": null, + "sources": "3b7867671a7875525358a71e81adf66ba4d2a45cf2b53ffe5ad0350e3ea06362" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-runtime:aar": { + "shasums": { + "jar": "2f866c07a1f33a8c9bb69a9545d4f20b4f0628cd0a155432386d7cb081e1e0bc", + "javadoc": null + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-service": { + "shasums": { + "sources": "672b07e4607fc897672d2794af751724306d418e7892b636002be8e3b78fc08c" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-service:aar": { + "shasums": { + "jar": "ca2801ffc069555afed8eddd2292130f436956452bc8bbad30fb56f8e4e382a0", + "javadoc": null + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-viewmodel": { + "shasums": { + "sources": "e0eae37c00d8cb41817ed95712083c75e3a4e3f7815de04519a8200ec155ec3c" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-viewmodel-ktx": { + "shasums": { + "javadoc": null, + "sources": "9cab05f9a642bdcb8628d4e353efa1dc2784cdc5c337687470edd0c2cd2071a3" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-viewmodel-ktx:aar": { + "shasums": { + "jar": "f791001f2211947e56ad3d96d12c9ae93fc5589b88f08603f69a2265c9a7d702" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-viewmodel-savedstate": { + "shasums": { + "sources": "4f49bba528977fd1873796623dc5f6669a6e72a5b3b624c7cea2d9285b995dd9" + }, + "version": "1.0.0" + }, + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar": { + "shasums": { + "jar": "f4cceafbf86acfc7f3ba6a61d6dc6842a6738c1274610767d3ab8f8a114cba97", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.lifecycle:lifecycle-viewmodel:aar": { + "shasums": { + "jar": "967efab24d6c49dd414a8c0ac4a1cd09b018f0b8bb43b739ad360c4158ebde27", + "javadoc": null + }, + "version": "2.2.0" + }, + "androidx.loader:loader": { + "shasums": { + "sources": "efcbafaac8fc06bd5b162b57ac1e146d11919b79dea2202339470c931cecdc67" + }, + "version": "1.0.0" + }, + "androidx.loader:loader:aar": { + "shasums": { + "jar": "11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.localbroadcastmanager:localbroadcastmanager": { + "shasums": { + "sources": "952b8567a76d6484aa96f9712b9dc90f21b83a73e2496daf243e2e1adfb65dd4" + }, + "version": "1.0.0" + }, + "androidx.localbroadcastmanager:localbroadcastmanager:aar": { + "shasums": { + "jar": "e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.multidex:multidex": { + "shasums": { + "javadoc": null, + "sources": "b0d707d4074dd1996d0780e0b84478d4ca54515de38fe8df542fbafc44ba2b20" + }, + "version": "2.0.1" + }, + "androidx.multidex:multidex-instrumentation": { + "shasums": { + "javadoc": null, + "sources": null + }, + "version": "2.0.0" + }, + "androidx.multidex:multidex-instrumentation:aar": { + "shasums": { + "jar": "fb8115694b1731c23c1bbb628f5baaee37a8f3b50d69a7733b55278e101e1488" + }, + "version": "2.0.0" + }, + "androidx.multidex:multidex:aar": { + "shasums": { + "jar": "42dd32ff9f97f85771b82a20003a8d70f68ab7b4ba328964312ce0732693db09" + }, + "version": "2.0.1" + }, + "androidx.navigation:navigation-common": { + "shasums": { + "sources": "f183a513b99f071dafa39d59fc474f11c8e8012f62f250d4d8d5463f259bc495" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-common-ktx": { + "shasums": { + "sources": "5c5c19c604b95ef8e2a37e3c56817c605eeaa687e48924bbb6a07641c504ae6a" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-common-ktx:aar": { + "shasums": { + "jar": "ed00b6f73d8acc7e06729f5f19cdeb410ca1d0e45afbcf6ff435a1091c3a3d57", + "javadoc": null + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-common:aar": { + "shasums": { + "jar": "542ec6f993b6d3bfafe2e53e0f250b8685331e2a0258f9313af9ee3376f93959", + "javadoc": null + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-fragment": { + "shasums": { + "javadoc": null, + "sources": "bc3a5b4153f886f11c5e0ab5fcba2f329beaeb5c2fa00c9b7f176884a20c0ece" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-fragment-ktx": { + "shasums": { + "javadoc": null, + "sources": "482878c8b556ee07e9fd13fe9feee654fcbc984aa5224bfe7a5119796000020f" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-fragment-ktx:aar": { + "shasums": { + "jar": "8ad7b7ed765009271cc0fe97ea925b3fbd90a9bc80aeefb2708a554d7330b8d3" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-fragment:aar": { + "shasums": { + "jar": "38ddf1afc99a0585904f2121eee7131fef13595e64c9bb6b22f68dd66b8d1f9c", + "javadoc": null + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-runtime": { + "shasums": { + "sources": "266f7224c7d769f356cd03aa47c248eea61d3e1fb62ff75215657b2b7ee917a5" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-runtime-ktx": { + "shasums": { + "sources": "7d82617dd32bfc2354d568826a465fd40aaf7eb38efd1fbc126703e86f534613" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-runtime-ktx:aar": { + "shasums": { + "jar": "41f1145f9aca5a7d97567dfe08924ec1cebcc72cb2c5d6d1a1cd31a780669358", + "javadoc": null + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-runtime:aar": { + "shasums": { + "jar": "903cd93d3424300ff048a92086d773cfc5e23f928063d4493a45b4b042f2a550", + "javadoc": null + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-ui": { + "shasums": { + "javadoc": null, + "sources": "60565a3ce3a9aed5a85ab4bcc1c60a516d026ad09ad26e2ecfd3899f0bd8740c" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-ui-ktx": { + "shasums": { + "javadoc": null, + "sources": "a6bd9b53e81130e6ee53294df495c114ef136517c330c7aac19ed979087815a3" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-ui-ktx:aar": { + "shasums": { + "jar": "fb28826b4eb20a53e9398576bb9e7a3215cf970e99a05d7ccc0422d5978fa915" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-ui:aar": { + "shasums": { + "jar": "d6edc08d69268967d11336bd8c2dce1f154f0ae8117be9874895f6974123ed20", + "javadoc": null + }, + "version": "2.0.0" + }, + "androidx.print:print": { + "shasums": { + "sources": "659b6e2047484dbae409b9b49c19f9ebd9540bb7ef3610438e2c2b15064fc217" + }, + "version": "1.0.0" + }, + "androidx.print:print:aar": { + "shasums": { + "jar": "1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.recyclerview:recyclerview": { + "shasums": { + "javadoc": null, + "sources": "7552c8b621d59b68d2dc962d3bbeee8ccaea5b54cf0085adc85059d37584d93c" + }, + "version": "1.1.0" + }, + "androidx.recyclerview:recyclerview:aar": { + "shasums": { + "jar": "f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f", + "javadoc": null + }, + "version": "1.1.0" + }, + "androidx.room:room-common": { + "shasums": { + "jar": "2b130dd4a1d3d91b6701ed33096d389f01c4fc1197a7acd6b91724ddc5acfc06", + "javadoc": null, + "sources": "c78682d9435986ceec6a3349d22474f13e1aa3ec62d5aea01aacb5018c2fc2d2" + }, + "version": "2.2.5" + }, + "androidx.room:room-runtime": { + "shasums": { + "javadoc": null, + "sources": "d7b194ff380442603a99761f283f607083aff7e4bee541aef98b27211b8fa4ce" + }, + "version": "2.2.5" + }, + "androidx.room:room-runtime:aar": { + "shasums": { + "jar": "24a5549b796e43e337513d2908adac67f45350d9a90bca7e2e6120692140bb14", + "javadoc": null + }, + "version": "2.2.5" + }, + "androidx.savedstate:savedstate": { + "shasums": { + "sources": "d6e27205d673e6a89a7ed0513d65376d2a6a00a951f60485659b25d946e8c743" + }, + "version": "1.0.0" + }, + "androidx.savedstate:savedstate:aar": { + "shasums": { + "jar": "2510a5619c37579c9ce1a04574faaf323cd0ffe2fc4e20fa8f8f01e5bb402e83", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.sqlite:sqlite": { + "shasums": { + "sources": "db06b388994733ed3a678819fc91b572a92abdd7277fbb856a48969f6df6ecf1" + }, + "version": "2.1.0" + }, + "androidx.sqlite:sqlite-framework": { + "shasums": { + "sources": "5998669629684144592b0c6981c3f5e7935faaeeaa32c691ae58da3c54fb85a9" + }, + "version": "2.1.0" + }, + "androidx.sqlite:sqlite-framework:aar": { + "shasums": { + "jar": "8673737fdb2efbad91aeaeed1927ebb29212d36a867d93b9639c8069019f8a1e", + "javadoc": null + }, + "version": "2.1.0" + }, + "androidx.sqlite:sqlite:aar": { + "shasums": { + "jar": "8341ff092d6060d62a07227f29237155fff36fb16f96c95fbd9a884e375db912", + "javadoc": null + }, + "version": "2.1.0" + }, + "androidx.test.espresso:espresso-accessibility": { + "shasums": { + "javadoc": "37891fcbfec8fa57ae477c0c20548a4f398856edbb094a37363b32e86af77118", + "sources": "8cbe8f83d472d324ac45372ba71b2004c66e81f8cdab1e1b3202020cfc958c11" + }, + "version": "3.1.0" + }, + "androidx.test.espresso:espresso-accessibility:aar": { + "shasums": { + "jar": "e2ee8b50081c0b578521d112808321f737f3bf1acce035fe7be0e26ef00b491f" + }, + "version": "3.1.0" + }, + "androidx.test.espresso:espresso-contrib": { + "shasums": { + "javadoc": "20bea11b66080bb827616ac0fce9c32d515993385e03a8e65d2c01f923b3fdf5", + "sources": "a64d9cc5469b32a4f65e5b14021cfa27d9ba04733f7ca04aef644207c1d399b9" + }, + "version": "3.1.0" + }, + "androidx.test.espresso:espresso-contrib:aar": { + "shasums": { + "jar": "277c292f02816b5e49051485b11e612c0ba7d36fc76b7dac955fe37766ec2832" + }, + "version": "3.1.0" + }, + "androidx.test.espresso:espresso-core": { + "shasums": { + "javadoc": "d3f96a3c1419783c93da125ef42218870a06d83b200caf6d85afb48f91bc5574", + "sources": "08d443f440e8b4fdd5eb4dbc5447264d79350fa7fbc256762b86f1c9fabb6b07" + }, + "version": "3.2.0" + }, + "androidx.test.espresso:espresso-core:aar": { + "shasums": { + "jar": "beb4712c2520c1da30ac1f25506871f16ea5b83ee686ece5a258769df1a01e15" + }, + "version": "3.2.0" + }, + "androidx.test.espresso:espresso-idling-resource": { + "shasums": { + "javadoc": "02201274466dc2a9396fdf5d642e63ed08d73cc4e88cc942b2b9608b49465cc6", + "sources": "38935cd32b5c0a868eb3a3cda9465004867d08e631bf872ffa8bbb158b3d32fc" + }, + "version": "3.2.0" + }, + "androidx.test.espresso:espresso-idling-resource:aar": { + "shasums": { + "jar": "c1a0454fe95788122ba652c3ecff7ec538c7e27de206aed970f2809fb8090d09" + }, + "version": "3.2.0" + }, + "androidx.test.espresso:espresso-intents": { + "shasums": { + "javadoc": "d5baf1ba5aacf13a3cc1ddb5022ce6041c48f257d31cd11312bd47bfc493e3e0", + "sources": "133aa31a977ff67ce17b27d9d10cc2d3ca339e1fd538488feee6150f1b6552d7" + }, + "version": "3.1.0" + }, + "androidx.test.espresso:espresso-intents:aar": { + "shasums": { + "jar": "6c252ea1221a7973301b62d1695d4d73cb1b7c0853ee2ffdb8274886148f0af6" + }, + "version": "3.1.0" + }, + "androidx.test.ext:junit": { + "shasums": { + "javadoc": "2759ef1503ca60c267c519251803f8beb0d033faea685ab7b656713deb0cfb15", + "sources": "e8abb0752a123d337be4cced50298067a8340135e64f0a24ff52345ed20cd292" + }, + "version": "1.1.1" + }, + "androidx.test.ext:junit:aar": { + "shasums": { + "jar": "449df418d2916a0f86fe7dafb1edb09480fafb6e995d5c751c7d0d1970d4ae72" + }, + "version": "1.1.1" + }, + "androidx.test.ext:truth": { + "shasums": { + "javadoc": "5d7a9b2ce35d8b59d96f59d7277adaa576f1717556a012f770d6440a361d288d", + "sources": "7c7d5f0b67046f2da28ad2b99e6af9fe7b228a4420dc5863e7428be3b8f928df" + }, + "version": "1.4.0" + }, + "androidx.test.ext:truth:aar": { + "shasums": { + "jar": "d067a9bdd009b08d4230f8283cb4579a1183ef45bbfa169fd6d0f112d6c324f6" + }, + "version": "1.4.0" + }, + "androidx.test.uiautomator:uiautomator": { + "shasums": { + "javadoc": "d6ce5ab3d9d32aeb5c73022d36209147b463e9a6a8951b79c4010232c50e416e", + "sources": "e1f438106ac0d26b80ecf4fd6ffe6d36f60e12bdcd6316903f802ed24d00be99" + }, + "version": "2.2.0" + }, + "androidx.test.uiautomator:uiautomator:aar": { + "shasums": { + "jar": "2838e9d961dbffefbbd229a2bd4f6f82ac4fb2462975862a9e75e9ed325a3197" + }, + "version": "2.2.0" + }, + "androidx.test:core": { + "shasums": { + "javadoc": "8972e2aa593da387257614e45fcc3492725c6528df9ce07fc39e495d1311c4a6", + "sources": "b3125d546acfea278b82250344c83826e872e3f461109daf0948806382603b30" + }, + "version": "1.4.0" + }, + "androidx.test:core:aar": { + "shasums": { + "jar": "671284e62e393f16ceae1a99a3a9a07bf1aacda29f8fe7b6b884355ef34c09cf" + }, + "version": "1.4.0" + }, + "androidx.test:monitor": { + "shasums": { + "javadoc": "9672dbb39e76e7ff1c1a35b04652e24cb0b40cb0353d064de7a3ab683ad9bf11", + "sources": "a03ea6019c1ee7cc285afdbee98137ec463b891e6fc9176c121c5a70ec727f48" + }, + "version": "1.4.0" + }, + "androidx.test:monitor:aar": { + "shasums": { + "jar": "46a912a1e175f27a97521af3f50e5af87c22c49275dd2c57c043740012806325" + }, + "version": "1.4.0" + }, + "androidx.test:rules": { + "shasums": { + "javadoc": "f3af3597242684cbec5f69a5045a67c649094fc8d04c5af1c8e124b6f9464bbd", + "sources": "644ab3c4a55fea00bc36c814ca52abf8d0aacc43a685ff80ae033c534ec18dcb" + }, + "version": "1.1.0" + }, + "androidx.test:rules:aar": { + "shasums": { + "jar": "0c5c87df67b358c1a17765357138ea1d4bb58c61159ae635b4cb4dcaa3bb5986" + }, + "version": "1.1.0" + }, + "androidx.test:runner": { + "shasums": { + "javadoc": "baec1bfd44e3065191f0d87aa3fa8e6f0e3b83701a6c0eb0cbd27929a2ee61be", + "sources": "ec71974ddd8245a85ca856577c70972fd4c484f715df0a26271f0c28f8a58739" + }, + "version": "1.2.0" + }, + "androidx.test:runner:aar": { + "shasums": { + "jar": "5387e011167a3c8da08d99b5d59248c0e2da839317b48ebf202e31dc1f791ec1" + }, + "version": "1.2.0" + }, + "androidx.transition:transition": { + "shasums": { + "javadoc": null, + "sources": "86febeb3fbb96b93a355ada8a97e5c17355cf709e1bab178d5c4bc73c67c9887" + }, + "version": "1.2.0" + }, + "androidx.transition:transition:aar": { + "shasums": { + "jar": "a1e059b3bc0b43a58dec0efecdcaa89c82d2bca552ea5bacf6656c46e853157e" + }, + "version": "1.2.0" + }, + "androidx.vectordrawable:vectordrawable": { + "shasums": { + "javadoc": null, + "sources": "a1ae4fccc4ab76a734c10f79adf39262517658a79084bad467c4c6f41c478187" + }, + "version": "1.1.0" + }, + "androidx.vectordrawable:vectordrawable-animated": { + "shasums": { + "javadoc": null, + "sources": "a3880c595965c55fd1bdee0554b99c66e9c28d3311b7ce6242189fc1f554fcf1" + }, + "version": "1.1.0" + }, + "androidx.vectordrawable:vectordrawable-animated:aar": { + "shasums": { + "jar": "76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8", + "javadoc": null + }, + "version": "1.1.0" + }, + "androidx.vectordrawable:vectordrawable:aar": { + "shasums": { + "jar": "46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26", + "javadoc": null + }, + "version": "1.1.0" + }, + "androidx.versionedparcelable:versionedparcelable": { + "shasums": { + "sources": "135016af471acf4cd9583d36ceb779710c6b46812ccaaef7c526d5d60eae6b0b" + }, + "version": "1.1.0" + }, + "androidx.versionedparcelable:versionedparcelable:aar": { + "shasums": { + "jar": "9a1d77140ac222b7866b5054ee7d159bc1800987ed2d46dd6afdd145abb710c1", + "javadoc": null + }, + "version": "1.1.0" + }, + "androidx.viewpager2:viewpager2": { + "shasums": { + "javadoc": null, + "sources": "b091618751f3ee04176d8f976077c353d7c902c4aeafc134d18aee3b771f19a1" + }, + "version": "1.0.0" + }, + "androidx.viewpager2:viewpager2:aar": { + "shasums": { + "jar": "e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af" + }, + "version": "1.0.0" + }, + "androidx.viewpager:viewpager": { + "shasums": { + "javadoc": null, + "sources": "d4f9a044ab8c23392b12a3f2930d5fd6b5982421a746f2f2a812e9619431fbfd" + }, + "version": "1.0.0" + }, + "androidx.viewpager:viewpager:aar": { + "shasums": { + "jar": "147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682", + "javadoc": null + }, + "version": "1.0.0" + }, + "androidx.work:work-runtime": { + "shasums": { + "javadoc": null, + "sources": "7312584b39b43499968297c6bedb2d4759844539ce3c9a0ad178184f75663fff" + }, + "version": "2.4.0" + }, + "androidx.work:work-runtime-ktx": { + "shasums": { + "javadoc": null, + "sources": "f2815313e99aff830108784a855c6112e6161b451f28b5ea8345936470e4422f" + }, + "version": "2.4.0" + }, + "androidx.work:work-runtime-ktx:aar": { + "shasums": { + "jar": "290d2e9c1a22388b3f0c3dbc204a6176f8c49174126de884820befa83899f129", + "javadoc": null + }, + "version": "2.4.0" + }, + "androidx.work:work-runtime:aar": { + "shasums": { + "jar": "7801441cb973fb007ef311d3db35c3b3c9d011cef890357e7ca33890833354e5", + "javadoc": null + }, + "version": "2.4.0" + }, + "androidx.work:work-testing": { + "shasums": { + "javadoc": null, + "sources": "238556cb095dbfffc6a2f376630410cfd0eddb1aaa3f6976476f1152e9615570" + }, + "version": "2.4.0" + }, + "androidx.work:work-testing:aar": { + "shasums": { + "jar": "dc1d9f743c59ee08c605aa924fc20819b6a0b734338e0a95af1943c3cd806e23" + }, + "version": "2.4.0" + }, + "com.almworks.sqlite4java:sqlite4java": { + "shasums": { + "jar": "243a64470fda0e86a6fddeb0af4c7aa9426ce84e68cbfe18d75ee5da4b7e0b92", + "javadoc": "ca8b2face1fc29691a5f13c1df01055382fd2291b7fc8211231ed225feed359f", + "sources": "778b2c2c6f7e0fb5d9b4a5c7ccea3836c2c172e581bfa3121514b8de628b3180" + }, + "version": "1.0.392" + }, + "com.android.databinding:baseLibrary": { + "shasums": { + "jar": "5e4f3b90995be63f3c8eeecce120c588a98c6aad3b54f60ad4c80b5418c4b012", + "javadoc": "086fbefbb6bc12f3a57a278aa2b813e07595bc8be69e8e498312c2a138ec27cc", + "sources": "26c82ea4632135e7ab806c27862055d32b05aec4cc54b4fedbb2f529e6764276" + }, + "version": "3.4.2" + }, + "com.android.support:support-annotations": { + "shasums": { + "jar": "5d5b9414f02d3fa0ee7526b8d5ddae0da67c8ecc8c4d63ffa6cf91488a93b927", + "javadoc": null, + "sources": null + }, + "version": "28.0.0" + }, + "com.android.tools.build.jetifier:jetifier-core": { + "shasums": { + "jar": "c9f8b016144cfb31c5aee92d47f34de23289167cac5e8ef68365b2dd05766f11", + "javadoc": null, + "sources": "b1293035a1cb88d25e3eb481b66813cb2e04fe2b3a82daca523ef1e0cded1409" + }, + "version": "1.0.0-beta04" + }, + "com.android.tools.build:aapt2-proto": { + "shasums": { + "jar": "d5e2f3e1e1eb06224b6875f5e513c72a65182342745718160caf191d46a96664", + "javadoc": "8ba7e35b05c714b1110a37f758de2806afe20a1e19d2b77d91ea03ddf4f4b919", + "sources": "9887a82631d64be27278ea588bfa69ebc6a8f73564e222abab950a406653114c" + }, + "version": "7.3.1-8691043" + }, + "com.android.tools:annotations": { + "shasums": { + "jar": "1877849936f48cd65857bf448743f9a0bf93ed47fe57527d9ad8af875024888d", + "javadoc": "45402160e5368929730e2e8f6caf2c2c8d9568e5c788445e671cb85abf568d5a", + "sources": "f4d3a5813226ec6a0767e811576834254c2daea1d95a7ff1c18e8e50f214c882" + }, + "version": "26.4.2" + }, + "com.crashlytics.sdk.android:answers:aar": { + "shasums": { + "jar": "5a05ddeda9f421b73727f4287a5d89e981a45e3feb7fac458cfddf29b97e3df8", + "javadoc": null, + "sources": null + }, + "version": "1.4.6" + }, + "com.crashlytics.sdk.android:beta:aar": { + "shasums": { + "jar": "2a6b77374ebe6168588bd9116cdd66f60f7c151bd931b9a0f8b2012c06b1cd4d", + "javadoc": null, + "sources": null + }, + "version": "1.2.10" + }, + "com.crashlytics.sdk.android:crashlytics": { + "shasums": { + "javadoc": null, + "sources": null + }, + "version": "2.9.8" + }, + "com.crashlytics.sdk.android:crashlytics-core:aar": { + "shasums": { + "jar": "4c055e1ad07fbe65a3e315bd27712be715962fb3c065d286a1d19f4f5db6768a", + "javadoc": null, + "sources": null + }, + "version": "2.6.7" + }, + "com.crashlytics.sdk.android:crashlytics:aar": { + "shasums": { + "jar": "06d90c9d6693f302deae19f4cba67d724b44e8efcfc3c57308a78eead874dfeb" + }, + "version": "2.9.8" + }, + "com.github.bumptech.glide:annotations": { + "shasums": { + "jar": "d219d238006d824962176229d4708abcdddcfe342c6a18a5d0fa48d6f0479b3e", + "javadoc": "68f38b5cbbc0433316f36b54bd8051211ed4b198c118c4e29a620f3fc8f974d1", + "sources": "79e5ce46aa6004289f1f55b5a8b9f56be55c0518f98dfb8e158160a1cf24d8cc" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:compiler": { + "shasums": { + "jar": "a98cdf265c36261b1d523448b05c322ec290afa865946425eded6361980e8770", + "javadoc": "137824d00981dc6ad7ecf9ac512a8880e29e2a7f47e03a4394d8542fda5b410a", + "sources": "9920cfa9ffc052253d7bfe0601867c83c0ad5669055383fbc6fc909e6c717aaf" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:disklrucache": { + "shasums": { + "jar": "d06775a5171b777aa3db031eb0dd4a1dbe3f00dda35b5574dfd953f6b0d5ef18", + "javadoc": "12d97082772cb757eb51863456d1881e0618e0b39e6373473c5a45d35b0c09ea", + "sources": "af83281627baee37032545b99b40acee237b057227dca1bac5b7ad62b392b16b" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:gifdecoder": { + "shasums": { + "javadoc": "5a7756e186482956a041c792793e1e23f799f89b70a373da47df5dc1bd101267", + "sources": "73e2de3c596295f4ce53185544329dfd628edb687edf61af4c8baa53cb19fced" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:gifdecoder:aar": { + "shasums": { + "jar": "197a1cd5b76855aa02b230c13974e293229b901dc2b96fab4315201e78baa804" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:glide": { + "shasums": { + "javadoc": "1b715180d88923e2a62149e4f425c8b928ea1db80cb940388aa5d06a7781afe5", + "sources": "82684421d237c8da5c1cd3f7549b672b91c93fb5d64032af637ab28345960945" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:glide:aar": { + "shasums": { + "jar": "5c294e6a5f0f812cef876b8412954c1822da184af38e082a5b766e3c4f4fcd95" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:mocks": { + "shasums": { + "javadoc": "69afdb0f622213e11355f014c7c8a2d7ab6eb01babbdb59f024c44be50d7c1fb", + "sources": "f20b6851e4acf0a3c7bc233a4123f1983c8047e7c63fd7dc9021d76533a8dfcd" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:mocks:aar": { + "shasums": { + "jar": "cf58b7972da6695ace6296fb3746535d30d41b422711a897c270d8480e3b055a" + }, + "version": "4.11.0" + }, + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework": { + "shasums": { + "jar": "cdf16ef8f5b8023d003ce3cc1b0d51bda737762e2dab2fedf43d1c4292353f7f", + "javadoc": "48df4594d9e4ab860b06f2c5c4317f03dbe918345187479a790c0ec328dae423", + "sources": "e15536e0c7ed75e8d7fddc23a41c427850939a06552ce4d74eaee31acda0059e" + }, + "version": "2.0" + }, + "com.google.android.datatransport:transport-api": { + "shasums": { + "javadoc": "974431863d29a64066b63fd144a01f84abb3cb0579d139dd15a14ac238aa7967" + }, + "version": "2.2.0" + }, + "com.google.android.datatransport:transport-api:aar": { + "shasums": { + "jar": "576514f8b75d8ae32897f1b9b031f88b00465bf6e0996e227d09af688195f71e", + "sources": null + }, + "version": "2.2.0" + }, + "com.google.android.datatransport:transport-backend-cct": { + "shasums": { + "javadoc": "41297c7f4be39517c743ae145483a8772f2d5983befb07bf74348a933c77c8cb" + }, + "version": "2.3.0" + }, + "com.google.android.datatransport:transport-backend-cct:aar": { + "shasums": { + "jar": "6a2d99756c1fa634d3f14b4479257ac83d5d0fbf7fe5aa1db0a014df95ae217f", + "sources": null + }, + "version": "2.3.0" + }, + "com.google.android.datatransport:transport-runtime": { + "shasums": { + "javadoc": "a7da57d4af9c4e527760ee2ed818758b351ad78193bfe56022cb3affa7ea6a66" + }, + "version": "2.2.3" + }, + "com.google.android.datatransport:transport-runtime:aar": { + "shasums": { + "jar": "5e219672fe5a03f5b80c4d2211f39c2b0ceeb3988bfe1e8f1e033579dee20414", + "sources": null + }, + "version": "2.2.3" + }, + "com.google.android.flexbox:flexbox": { + "shasums": { + "javadoc": null, + "sources": "6084ded8a7a6de74d6887bcb8293816dc051a5d822b6fa74a0e4f9005ae0a5b8" + }, + "version": "3.0.0" + }, + "com.google.android.flexbox:flexbox:aar": { + "shasums": { + "jar": "5e19500486fd7c8e2e8c7aad6bbba9c8d0ada7057c6b32b9b5c61439814e7574" + }, + "version": "3.0.0" + }, + "com.google.android.gms:play-services-ads-identifier:aar": { + "shasums": { + "jar": "b01c408c265b3aa171d19be86d7b8d4f3454f3085169a775690a6a85f57abb73", + "javadoc": null, + "sources": null + }, + "version": "17.0.0" + }, + "com.google.android.gms:play-services-base": { + "shasums": { + "javadoc": "e1da44cd2b03220bfd7db759a813392b2d6b5080649beae1ee1857a2f69d63c2" + }, + "version": "17.0.0" + }, + "com.google.android.gms:play-services-base:aar": { + "shasums": { + "jar": "dd0980edf729e0d346e2b58e70801dc237c1aed0c7ab274fa3f1c8c8efc64cc7", + "sources": null + }, + "version": "17.0.0" + }, + "com.google.android.gms:play-services-basement": { + "shasums": { + "javadoc": "79dfa254f02fcaa72a6a9436eeec419cf13f589e12d2d21d42205b7f1b96dfe4" + }, + "version": "17.0.0" + }, + "com.google.android.gms:play-services-basement:aar": { + "shasums": { + "jar": "d324a1785bbc48bfe3639fc847cfd3cf43d49e967b5caf2794240a854557a39c", + "sources": null + }, + "version": "17.0.0" + }, + "com.google.android.gms:play-services-measurement": { + "shasums": { + "javadoc": "18cfddfc1b58823b31f6aaddec428639ecd24cd43b81a01e4adf634a603950ef" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-api": { + "shasums": { + "javadoc": "3b2e8ecb44cbdb854c82f4284bec715e818170be792bd987b6416559270ebe72" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-api:aar": { + "shasums": { + "jar": "fde4cb8493409aa5130de84775eba9f967aaaf916512362987e1bd61b60babfc", + "sources": null + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-base": { + "shasums": { + "javadoc": "79885f21418842f9f98f1bbd0e109742a73b08bfbca6412285d02d1f813b0719" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-base:aar": { + "shasums": { + "jar": "39fd34e7da8e822a93b64c66134e2479075c298588018d4f379c53b9eea1cf1e", + "sources": null + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-impl": { + "shasums": { + "javadoc": "919d22db0a3e0baec2f5e1185ca85f554943c58047e6be9bd7b77a601c9da4d1" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-impl:aar": { + "shasums": { + "jar": "d143f6d909619a0aa597ccc127713cd5e4b2eea38477521de739331bb791f3ec", + "sources": null + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-sdk": { + "shasums": { + "javadoc": "79885f21418842f9f98f1bbd0e109742a73b08bfbca6412285d02d1f813b0719" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-sdk-api": { + "shasums": { + "javadoc": "79885f21418842f9f98f1bbd0e109742a73b08bfbca6412285d02d1f813b0719" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-sdk-api:aar": { + "shasums": { + "jar": "afff4861d76bc1f6c7527ae9c4c58c50d6d9e4668a3dc58b03cd77e508e305b3", + "sources": null + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-sdk:aar": { + "shasums": { + "jar": "24c3c4085609a85debabc43718ac3049583b5452e4d34b2e8c9e620542631b30", + "sources": null + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement:aar": { + "shasums": { + "jar": "553f0b6fc6e44eed81bb5b7b4cb80719c05a244a394eb38ae91271871dcddf07", + "sources": null + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-stats:aar": { + "shasums": { + "jar": "e8ae5b40512b71e2258bfacd8cd3da398733aa4cde3b32d056093f832b83a6fe", + "javadoc": null, + "sources": null + }, + "version": "17.0.0" + }, + "com.google.android.gms:play-services-tasks:aar": { + "shasums": { + "jar": "2e6d1738b73647f3fe7a038b9780b97717b3746eae258009197e36e7bf3112a5", + "javadoc": null, + "sources": null + }, + "version": "17.0.0" + }, + "com.google.android.gms:strict-version-matcher-plugin": { + "shasums": { + "jar": "0c1027a51198190386eae3f90adee9a30687e76da7589f06c79269fea4c7a4c0", + "javadoc": null, + "sources": null + }, + "version": "1.2.1" + }, + "com.google.android.material:material": { + "shasums": { + "javadoc": null, + "sources": "1d9fe3a4512512a311889be798e4a0f9cf9fbccddea50a7ca330b1b99ee92993" + }, + "version": "1.3.0" + }, + "com.google.android.material:material:aar": { + "shasums": { + "jar": "cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a" + }, + "version": "1.3.0" + }, + "com.google.auto.service:auto-service-annotations": { + "shasums": { + "jar": "986dc826fa0a43bf9f04194c1a8667774f4f44190ec816b08554b47891ba5459", + "javadoc": "a94ebf1c368b5c962583a44a2af7b0841cee582a6bd2b750453dd245e307f7ec", + "sources": "0cb604b1ddea687434e7b3908079ad9e261adaeff398e4374f81b6f06cceee58" + }, + "version": "1.0-rc7" + }, + "com.google.auto.value:auto-value-annotations": { + "shasums": { + "jar": "37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852", + "javadoc": "750d76457ac497f41dbece710c0cfdd7aef0263fd343221eb4d63d3c4305ee6c", + "sources": "0fc83f827602d4378b97a8dec07ce22e364e4b8bb352db213801a6a8c654a330" + }, + "version": "1.8.1" + }, + "com.google.code.findbugs:jsr305": { + "shasums": { + "jar": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", + "javadoc": "3791d601c8757344a5b9714a1122e2f852743114a9d55c1b1fed64b13116c353", + "sources": "1c9e85e272d0708c6a591dc74828c71603053b48cc75ae83cce56912a2aa063b" + }, + "version": "3.0.2" + }, + "com.google.code.gson:gson": { + "shasums": { + "jar": "233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81", + "javadoc": "c32e90ccb6cadc8c4162bf807a4f1df630a7c907186337dcd06cf982ede71284", + "sources": "512b4bf6927f4864acc419b8c5109c23361c30ed1f5798170248d33040de068e" + }, + "version": "2.8.5" + }, + "com.google.dagger:dagger": { + "shasums": { + "jar": "c2a09540677b6ffeeb5911c5d8e69738718004e875a10c176e84ed8c997739a7", + "javadoc": "9d13760fa15cd7bf4fe0a03d63c5cc5aad2bb412df72bfdea7873d90a0525c62", + "sources": "bd27a8952be63263a86c3dad1ee175eb02a66cdf9956d041a3985b50a1979b3a" + }, + "version": "2.28.1" + }, + "com.google.dagger:dagger-compiler": { + "shasums": { + "jar": "379d4fce6d11234c3814aca1676aa34f5dd0f0ec5155c44de2d5e49cacee573c", + "javadoc": "bbfe777fa0db3087c03748dc829819b650a084e860493d7a6adc92724c731c2c", + "sources": "af48aca813093236f5fdbf90bb6ba566c51e323283e1666aef29432e14265651" + }, + "version": "2.28.1" + }, + "com.google.dagger:dagger-producers": { + "shasums": { + "jar": "7c44499d5717cf6fdc3d026e5440c6bac9cabc98226d28715ca0eda90e68f7b2", + "javadoc": "73b5217b40aaf3c8d000a5ed744e291ea7c519595e21f25d76ffebef0e37389b", + "sources": "eae1e6a10f61270251e634b63886246a4500cb16a254309d86f696604ce2ff03" + }, + "version": "2.28.1" + }, + "com.google.dagger:dagger-spi": { + "shasums": { + "jar": "aae2a23d0bce8bae6d6c0e302b048c389d0f2354adc14fd80366c2913e3c5f07", + "javadoc": "e0a3ca154b3fe86f90424f676df3c689532b2221dbcd010400a5bd0726d12bb9", + "sources": "da97df1daa28befc4f721df7cd925429b08bc7a766596ff28d21b646097e08cc" + }, + "version": "2.28.1" + }, + "com.google.errorprone:error_prone_annotations": { + "shasums": { + "jar": "cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3", + "javadoc": "075f00902f2694aa9f2390dcba0b9e272aea0079281d5db86a6d13695fe1ce6c", + "sources": "e38921f918b8ad8eabd12bc61de426fa96c72de077054e9147d2f9fe7c648923" + }, + "version": "2.7.1" + }, + "com.google.errorprone:javac-shaded": { + "shasums": { + "jar": "65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30", + "javadoc": "02e74bd2468ed5be0f49b32fa4d7f35aa7c542c2d3fd486e1883e4d8b9fa6f6a", + "sources": "cf0fde1aad77ac6e0e2d36a9f9179193ae1707088ba00ffa91fcfb5269304a6a" + }, + "version": "9-dev-r4023-3" + }, + "com.google.firebase:firebase-analytics": { + "shasums": { + "javadoc": "79885f21418842f9f98f1bbd0e109742a73b08bfbca6412285d02d1f813b0719", + "sources": null + }, + "version": "17.5.0" + }, + "com.google.firebase:firebase-analytics:aar": { + "shasums": { + "jar": "5c36ae943a719de1c598287370cb3ee1d27fd2dc9d0ada650de2b7f9a1dcac54" + }, + "version": "17.5.0" + }, + "com.google.firebase:firebase-common": { + "shasums": { + "javadoc": "54495b003c6a7e3556598b28458924786b64523aed4b0e41facacbf311c52578", + "sources": "1a3f326b3992552200c91db1132c81ec5f6143bc6dd9af8f6f3b66388707c62b" + }, + "version": "19.3.0" + }, + "com.google.firebase:firebase-common:aar": { + "shasums": { + "jar": "7bd7971470ff943e3c3abb1d7809ef5cb4b81f1996be0867714372b3efa7405a" + }, + "version": "19.3.0" + }, + "com.google.firebase:firebase-components": { + "shasums": { + "javadoc": "dff8676a3a0702b1115c7427dbbced106d3b15a82106805db7dd79252023d2b5", + "sources": "8c541d1b27245aff00937b08131cb41c99b4a6dcb5b5a7440283018d13fe9747" + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-components:aar": { + "shasums": { + "jar": "8ef43b412de4ec3e36a87c66d8a0a14a3de0a2e8566946da6a0e799b7fdd8ec9" + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-crashlytics": { + "shasums": { + "javadoc": "62234f33ea18163c7c6c47d9a703d6fa0a6b44d40037bad74297acac444c3742", + "sources": null + }, + "version": "17.1.1" + }, + "com.google.firebase:firebase-crashlytics:aar": { + "shasums": { + "jar": "635953640e1bbb277affadbc3e59b43f1c4dd07de79c8973b6341a756ad8b74b" + }, + "version": "17.1.1" + }, + "com.google.firebase:firebase-encoders-json": { + "shasums": { + "javadoc": "550ff7a066b67ce6730c2b5e5b6d0d1247198d19546ff4451a05ec15779fc080", + "sources": "791b1521a8f5eda7ded50ccdf3afa7632a1198964e3c60e93e7ae602d54ca314" + }, + "version": "16.1.0" + }, + "com.google.firebase:firebase-encoders-json:aar": { + "shasums": { + "jar": "24ce7c1cfda1d526b76b16437a2e7d0920d7176a377e0e30b2a7381341f22ea1" + }, + "version": "16.1.0" + }, + "com.google.firebase:firebase-iid": { + "shasums": { + "javadoc": "710dd4f9a00b1fde98c0e5f5d42cf4c173ad484c5b2683dccb30d97826072119" + }, + "version": "20.1.5" + }, + "com.google.firebase:firebase-iid-interop:aar": { + "shasums": { + "jar": "b6f4ad581eb489370be3bf38a4bdabfc6ea3d4e716234c625a0f42516c53523c", + "javadoc": null, + "sources": null + }, + "version": "17.0.0" + }, + "com.google.firebase:firebase-iid:aar": { + "shasums": { + "jar": "f1c174e75a24f298fbc0ed93dde29c997f29ca511d7e8a18dec068203553cf6b", + "sources": null + }, + "version": "20.1.5" + }, + "com.google.firebase:firebase-installations": { + "shasums": { + "javadoc": "42c17879e63b6a85e1cca77e717259100f618f5c6bfd18ce56bd7338769ac775" + }, + "version": "16.3.2" + }, + "com.google.firebase:firebase-installations-interop": { + "shasums": { + "javadoc": "a8b05b82b7866ed44cb2624e4908dec78f9d61a6e4e46a16bf06a40ee2490b2b" + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-installations-interop:aar": { + "shasums": { + "jar": "d498fe20e7d2c65fc8f7124f1c1791d2828bebdf6bf06ab4cdee13e7fe9ccaa2", + "sources": null + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-installations:aar": { + "shasums": { + "jar": "0d0f88b3c3789d5fe1aa9a69bd5ab6c0e92036fcf34520775a0091e37268dd3f", + "sources": null + }, + "version": "16.3.2" + }, + "com.google.firebase:firebase-measurement-connector:aar": { + "shasums": { + "jar": "17e8b9b60ac0a79fcbed754d03d4b966cc5bb8837e79c2308bf2970f1d05700c", + "javadoc": null, + "sources": null + }, + "version": "18.0.0" + }, + "com.google.gms:google-services": { + "shasums": { + "jar": "d9668002ef7032deddf7dbf853b47e10e6722bbce1b318fe7d6a297e28a8dcae", + "javadoc": "936c70c14961b0d083b2b31787105e1da14beed3f5650d7b5b674ad15c9cffbe", + "sources": "453def3af6897f944b3175ce0538c3ca1536583ace3b3b3a15aca1c2e2be6bb0" + }, + "version": "4.3.3" + }, + "com.google.googlejavaformat:google-java-format": { + "shasums": { + "jar": "aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e", + "javadoc": "b440f115df006988b5122b1cef06f8692aea307a016b0d70415004f41a85e963", + "sources": "c204b15b3834128d335f17213f7e621ddb2cc5bfff5b8dd035cd1f2affb7fa8f" + }, + "version": "1.5" + }, + "com.google.guava:failureaccess": { + "shasums": { + "jar": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26", + "javadoc": "93ac95225225e06945575f64f6ebb615bf799dad6aa7d26fe51927a5a080967b", + "sources": "092346eebbb1657b51aa7485a246bf602bb464cc0b0e2e1c7e7201fadce1e98f" + }, + "version": "1.0.1" + }, + "com.google.guava:guava": { + "shasums": { + "jar": "355f79352f8c252f2bdaa06c687c4836a38016caccfc4c28d16ae77ecfdffa2f", + "javadoc": "f2f9b6e1110a6c49d04338964456fed3fbaa4a64859d6e6c623faef3e6252204", + "sources": "dac52416371d86baea1ffe6ef7b54b2730b52fcea19091ae32942cb5cd9f868c" + }, + "version": "30.1.1-android" + }, + "com.google.guava:listenablefuture": { + "shasums": { + "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", + "javadoc": null, + "sources": null + }, + "version": "9999.0-empty-to-avoid-conflict-with-guava" + }, + "com.google.j2objc:j2objc-annotations": { + "shasums": { + "jar": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", + "javadoc": "c77d07b37c01e36d154b13ea0ef9c4a130bf44b06484487d38f9e67491dd1c91", + "sources": "ba4df669fec153fa4cd0ef8d02c6d3ef0702b7ac4cabe080facf3b6e490bb972" + }, + "version": "1.3" + }, + "com.google.protobuf:protobuf-java": { + "shasums": { + "jar": "4ac549b192694141958049f060a1c826a33342f619e108ced8c17d9877f5e3ed", + "javadoc": "64b50edd7d0017d04302ca4cfaf3508726411636d3fc62bf8c1db827e5c4b2fc", + "sources": "204bad0a36827296ed0b6fdbdf1a17028f3e3d289dd20042980331b8f0ef646e" + }, + "version": "3.17.3" + }, + "com.google.protobuf:protobuf-javalite": { + "shasums": { + "jar": "dc643901cc9d95998a1e45ab11e75d4237a7e1947bcbca0b7eca569aaf5e714d", + "javadoc": "90da18bc4800a877bd2c1a958a081d0b84a33e57dc6acc39d25b424dd6a7c425", + "sources": "b7bc7b41c266f59c921bf094b4325fb9bcdd0a8d95d742db8cca3a1c76503f9b" + }, + "version": "3.17.3" + }, + "com.google.truth.extensions:truth-liteproto-extension": { + "shasums": { + "jar": "71cce6284554e546d1b5ba48e310ee4b4050676f09fb0eced136d779284ff78d", + "javadoc": "0cbbfe60ab9a24dd97fd1687c24957cf68bda2d001469c27bd7814c02aab4b4e", + "sources": "fd3c26b2232966a3ff25e5b9c642f9ae9f19c86b29dfeb6e72aeb67e45e36130" + }, + "version": "1.1.3" + }, + "com.google.truth:truth": { + "shasums": { + "jar": "fc0b67782289a2aabfddfdf99eff1dcd5edc890d49143fcd489214b107b8f4f3", + "javadoc": "f18e3d4f565b5d6674ac7259e3115b8cb6701ab3bb154f554a2788abf0aaa6ed", + "sources": "6c35e3d7087cd222938b41bbdb54041239b79dda07cf96c4027c118d566df545" + }, + "version": "1.1.3" + }, + "com.googlecode.juniversalchardet:juniversalchardet": { + "shasums": { + "jar": "757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76", + "javadoc": "7cbe0e01929e6d2f80fda6c4153933877c4929262187b5b781ff99bdd7f9a472", + "sources": "3d1cb067f5cfe3cc19b77c837156f22368462af9acac5dd878e785966758fc27" + }, + "version": "1.0.3" + }, + "com.ibm.icu:icu4j": { + "shasums": { + "jar": "e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab", + "javadoc": "5d858aabc259220f93a8ab0d4edaa45fc4d93e67722031641af6c2b5342a7067", + "sources": "610f0f35cd11415effe23b248ab129a316e7f73994c20ac1ebe7e092629eb994" + }, + "version": "53.1" + }, + "com.squareup.moshi:moshi": { + "shasums": { + "jar": "b6ee64fb84a7486aa9983e20c75259d4931bd597c169e1e67c3bc0521fd03b27", + "javadoc": "2a8213686a82a12400d6409503547de0e08ea20deb81328c7ade037b74acdad6", + "sources": "ca8cbe76fb144ea7f274f914adfa51b932f390a67a16bf1f71f9b254303d4729" + }, + "version": "1.11.0" + }, + "com.squareup.moshi:moshi-kotlin": { + "shasums": { + "jar": "220f3b85d99ea40ff65609813f3624fb4313de3634a747adb04040cf7cb486bc", + "javadoc": "3f48d8ddcc079d0218cfa1d5651a24c165a5c771bf575b39daaa1d58cb9e71e6", + "sources": "8ff200ab30a6d222281eb3db17d6c8f1854d4bc9e2d5ccf1d237029cb448dbb2" + }, + "version": "1.11.0" + }, + "com.squareup.moshi:moshi-kotlin-codegen": { + "shasums": { + "jar": "e5d8e5cba11d8aca0261649c362fdee718e16ccc647124e55ee2e2c328be4c82", + "javadoc": "a175aeb55a2828ac8f288418239963fb6a81b6e40baaa73a2dfde678ebc2ccb7", + "sources": "c77fe938333fd96539aee34cdb8e923591f145ad727a2fb9ab250f527d85859c" + }, + "version": "1.11.0" + }, + "com.squareup.okhttp3:mockwebserver": { + "shasums": { + "jar": "d7d08b5096336d5b5a27d0e91bb2ebfa7dd54e48c3bb1e3cba15cc9bf16526b7", + "javadoc": "6c548d8f404c5f1d6a685dfa87ac5f896ec41ad5d174ca2d43839205eabda351", + "sources": "c5bc89a4ba5429b68713443e0dc625e0bd073e2c4b06a7b6c6c643d4ce29e32b" + }, + "version": "4.7.2" + }, + "com.squareup.okhttp3:okhttp": { + "shasums": { + "jar": "6b64ca1d2069751242984537d5de2cbe627ae000430f5117c47d8cb3d272facd", + "javadoc": "daea5d4fbe521965fced59c40333d5f90025073b040566c4b1661ea98b9e177f", + "sources": "88348cf944f841a7a8f5f38960474592e0c1ed8a53349cabe05b22d255479772" + }, + "version": "4.7.2" + }, + "com.squareup.okio:okio": { + "shasums": { + "jar": "4d84ef686277b58eb05691ac19cd3befa3429a27274982ee65ea0f07044bcc00", + "javadoc": "65c7a3fb6e4ff094f8b34e0bdfa9705b644f6598cc23bbc024944e40e3ea00b0", + "sources": "bffda723f6706a29a0406993bd5262ecc4459460baa1b248147e03a3c55b62b4" + }, + "version": "2.6.0" + }, + "com.squareup.retrofit2:converter-moshi": { + "shasums": { + "jar": "6bade0b754a7b8b7551e2208cb8227e697c2db553b8f12df6f1aa70c6f058600", + "javadoc": "f03e10386344e9b69499d4d53e465780da3a02fb839efd73760173aa2a795cb4", + "sources": "d36be44932f400577eccd3c060543e74c8be651b245ad9d5c96fbb79a5ecbf03" + }, + "version": "2.5.0" + }, + "com.squareup.retrofit2:retrofit": { + "shasums": { + "jar": "e6ea1929c46852f5bec66ab3357da383476cef4e8d1deefdbf195b79cc4d6581", + "javadoc": "3beb28517a651c96f26e257fa526a13b1fb524327e1f3c4fe131273e54929697", + "sources": "64dab37d8cdca9846df237e766a48251287c188e4ff0ac488d1664e7a6644f7a" + }, + "version": "2.9.0" + }, + "com.squareup.retrofit2:retrofit-mock": { + "shasums": { + "jar": "00692755410b4367c7c12e6e4aadd3b1a28b5169e8961d94bc27ab36ece9bf29", + "javadoc": "2e0f93ae493e34973069cdacf493b6b5ccfa89db4f64b0afed3cf7d9644dbd8d", + "sources": "e0423bab50f7097f02e5a9e874a630d3b31e49bba559c6e526e443cfeae5ad92" + }, + "version": "2.5.0" + }, + "com.squareup:javapoet": { + "shasums": { + "jar": "9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90", + "javadoc": "5df4dedf43c0c0615698bb4477512799b8e99d1b1aa0f91a2b5e0cb571a283e3", + "sources": "63d3187d924582b1afe9eb171e725d27a7e15603513890de0f8804a7fc07e9ac" + }, + "version": "1.11.1" + }, + "com.squareup:javawriter": { + "shasums": { + "jar": "f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e", + "javadoc": "09ef551197bbc3da310470ca5a5a395ec0b81690b48ffd927089684946f0a891", + "sources": "f57646206c5908c69342022c7b5ccbc15dbf605ce80421da3b96af9f86331e28" + }, + "version": "2.1.1" + }, + "com.squareup:kotlinpoet": { + "shasums": { + "jar": "8085eb4c8b1ece4f32259b22f26bf880bc47b74f548e29010b0146aa6b38f24b", + "javadoc": "5d9fcbd093c7a721b02f96e07909e61bccabe632d4041a3bc3e48c8fc223e110", + "sources": "cca9ad8636922585e3f116a885c580890d6be1a19655b0916a54c1928a7f0840" + }, + "version": "1.6.0" + }, + "commons-codec:commons-codec": { + "shasums": { + "jar": "4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569", + "javadoc": "f6af892a0d6428336af6764adaa9bac90155a3a23cfbee3ba2d6a84e7b19a6a3", + "sources": "dfae68268ce86f1a18fc45b99317c13d6c9d252f001d37961e79a51076808986" + }, + "version": "1.10" + }, + "commons-io:commons-io": { + "shasums": { + "jar": "cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581", + "javadoc": "bb19c34db63f970845325fb8930e6805fa70c6ec9c8cdea96b0ac4664a7ea118", + "sources": "d4635b348bbbf3f166d972b052bc4cac5b326c133beed7b8a1cab7ea22b61e01" + }, + "version": "2.4" + }, + "de.hdodenhof:circleimageview": { + "shasums": { + "javadoc": "a00143daa4ee7a7690b062361adcd8f3e59dc20fcaae27195bba94601c65206a", + "sources": "41ac0df4f7bab17c56b075a0c802a6f0b6d9013831d409556fdcd56bdb8a460b" + }, + "version": "3.0.1" + }, + "de.hdodenhof:circleimageview:aar": { + "shasums": { + "jar": "7b0f088436ad4dcbb36d779fd09bf2192d9cc1e1a734bb6337904a7648f97617" + }, + "version": "3.0.1" + }, + "io.fabric.sdk.android:fabric": { + "shasums": { + "javadoc": null, + "sources": null + }, + "version": "1.4.7" + }, + "io.fabric.sdk.android:fabric:aar": { + "shasums": { + "jar": "36df4b321ec95e31226ff5abaae73e66f3a99dedddbc2d03054c4e141c8aaa5c", + "javadoc": null, + "sources": null + }, + "version": "1.4.7" + }, + "javax.annotation:javax.annotation-api": { + "shasums": { + "jar": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b", + "javadoc": "58b24f21a237175c1fa3063d5469bfddfcbb92154fdf73194b8b3c21a0535b1a", + "sources": "128971e52e0d84a66e3b6e049dab8ad7b2c58b7e1ad37fa2debd3d40c2947b95" + }, + "version": "1.3.2" + }, + "javax.annotation:jsr250-api": { + "shasums": { + "jar": "a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f", + "javadoc": null, + "sources": "025c47d76c60199381be07012a0c5f9e74661aac5bd67f5aec847741c5b7f838" + }, + "version": "1.0" + }, + "javax.inject:javax.inject": { + "shasums": { + "jar": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff", + "javadoc": "f938e8eb481314d7306ae16ad91998409c8c8056bf336bc0732b4a07ad4a4f44", + "sources": "c4b87ee2911c139c3daf498a781967f1eb2e75bc1a8529a2e7b328a15d0e433e" + }, + "version": "1" + }, + "junit:junit": { + "shasums": { + "jar": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3", + "javadoc": "9607be074b0200ce78f544a52ecae544b1ba559f430ba5b6c4ff110e30db0b8c", + "sources": "34181df6482d40ea4c046b063cb53c7ffae94bdf1b1d62695bdf3adf9dea7e3a" + }, + "version": "4.13.2" + }, + "net.bytebuddy:byte-buddy": { + "shasums": { + "jar": "5fcad05da791e9a22811c255a4a74b7ea094b7243d9dbf3e6fc578c8c94290ac", + "javadoc": "22dafd51c83ac203076c522856800cc563707eaa852862d08559f24dab25f58f", + "sources": "50334bed7d0c05a7e02224105ff33267c9d2acb1a07ec3a532bac28e38abdd0e" + }, + "version": "1.10.20" + }, + "net.bytebuddy:byte-buddy-agent": { + "shasums": { + "jar": "b592a6c43e752bf41659717956c57fbb790394d2ee5f8941876659f9c5c0e7e8", + "javadoc": "9cf30e91b619d7cf38d06fb1c55f3bf2d207f7dee6a024a4ca558435df73a427", + "sources": "1c86f2ad5d84a8640292a84af3e8245851bab08a9136dbe4c084e50585bf9c8a" + }, + "version": "1.10.20" + }, + "net.ltgt.gradle.incap:incap": { + "shasums": { + "jar": "1d3ebe10d6059a26438dd183ab5a823cf8cd8081bc0d4cf997ad80e9ab9607d8", + "javadoc": "0da714bf8cd33ac26788f0e5d6619a00d2048f358163bf6b802e2d71c64e3afc", + "sources": "e78a7277cb9ce4980fba22d809352821848581df0a6b545fa22aa7400a05db43" + }, + "version": "0.3" + }, + "net.sf.kxml:kxml2": { + "shasums": { + "jar": "f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2", + "javadoc": "32f5678eedbe61c060316dbb886405f08084c132b03cb091d6d168b62ad7292d", + "sources": "85495366666158b58961e8911ced0f6f3bc92f1ebee865518b493fdb90760250" + }, + "version": "2.3.0" + }, + "nl.dionsegijn:konfetti": { + "shasums": { + "javadoc": null, + "sources": "2943d6e48ac1c23d977b059f11ebf47015bccc6649d3dd09bbcb1c19e474dcb5" + }, + "version": "1.2.5" + }, + "nl.dionsegijn:konfetti:aar": { + "shasums": { + "jar": "a9beb9371e9c06c39eeff1ed052142a6ed6f0b28e3408230d8771867f9d817ba" + }, + "version": "1.2.5" + }, + "org.antlr:antlr4": { + "shasums": { + "jar": "a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4", + "javadoc": "b99717847bf6859863bd34fec6d1ab24ebc32f93eacab9e6bc7caeb3c3bfb1b0", + "sources": "c31df8fc18dd75dbf7820b36ce57aa85c00616e4fd89daf415163fa3432f623d" + }, + "version": "4.5.3" + }, + "org.bouncycastle:bcprov-jdk15on": { + "shasums": { + "jar": "e78f96eb59066c94c94fb2d6b5eb80f52feac6f5f9776898634f8addec6e2137", + "javadoc": "da9820f5151c2f7edfb6e7cc0380f54f0cef2b4d0d89a27479dca3452163f068", + "sources": "12f179dee8bb7113f3d187319b260f3210d1ca7fbf403cd70385d339eacaeb4b" + }, + "version": "1.65" + }, + "org.checkerframework:checker-compat-qual": { + "shasums": { + "jar": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a", + "javadoc": "ddd4cbd46607570ce8b1d6046bcad2ab6008e58e83c6030b32c4973b6248ffb4", + "sources": "7c63a4a46b2ef903f941aeac63da87dd345be3243b472796aa945fa715bf3ca9" + }, + "version": "2.5.5" + }, + "org.checkerframework:checker-qual": { + "shasums": { + "jar": "3ea0dcd73b4d6cb2fb34bd7ed4dad6db327a01ebad7db05eb7894076b3d64491", + "javadoc": "81472a63d13c651dbb69750d06316444829b3cc77166c649c388f3c09e1549f7", + "sources": "52fd5b908ed38b2c543fac371c2192ff2896fec0f3ddea29f23b5db117a7ea6e" + }, + "version": "3.13.0" + }, + "org.hamcrest:hamcrest-core": { + "shasums": { + "jar": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", + "javadoc": "27f7327aee87324952da2405b02094df40a4e772b48dae7e419d8b50067ca745", + "sources": "e223d2d8fbafd66057a8848cc94222d63c3cedd652cc48eddc0ab5c39c0f84df" + }, + "version": "1.3" + }, + "org.hamcrest:hamcrest-integration": { + "shasums": { + "jar": "70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2", + "javadoc": "f67bc93ff98fa007e683ae1f7263db8c9f814cce8048f527ab3b4de94c8974a0", + "sources": "0827a37533a135bfab9c27e0f4b6d6fb1394856e842ef20a1693d3bfeb061365" + }, + "version": "1.3" + }, + "org.hamcrest:hamcrest-library": { + "shasums": { + "jar": "711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c", + "javadoc": "1f72eb23230afdd4951758c623c8eefc742f4e79daf2318802425863fbf2886c", + "sources": "1c0ff84455f539eb3c29a8c430de1f6f6f1ba4b9ab39ca19b195f33203cd539c" + }, + "version": "1.3" + }, + "org.jetbrains.intellij.deps:trove4j": { + "shasums": { + "jar": "affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601", + "javadoc": "ffd424518ad331cfdf8c767aa35454552ea7d1d28c4660b4f76bc7292334ba1a", + "sources": "6a37f965621293e9f23eb2053040d31e5231596a068ee581410d6047e958a695" + }, + "version": "1.0.20181211" + }, + "org.jetbrains.kotlin:kotlin-compiler-embeddable": { + "shasums": { + "jar": "d7b85448039e468daf3b9462a172244477fa3eb890f199ec77703992f36ade44", + "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", + "sources": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53" + }, + "version": "1.5.0" + }, + "org.jetbrains.kotlin:kotlin-daemon-embeddable": { + "shasums": { + "jar": "bf32071706cf3c20580516b04d25a733c7a21db9cd9d04fc7060c00720bc91bc", + "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", + "sources": "f431a1129d6ea1cadb1a69885c3935e6e03deee4b12d924ff8e3cd068ae1cebb" + }, + "version": "1.5.0" + }, + "org.jetbrains.kotlin:kotlin-reflect": { + "shasums": { + "jar": "e30acc4ff74534177d1657feafb57327ede838ae17763aeaae182a9109d26157", + "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", + "sources": "7c0d0b477b2d077d785d3c5439346622731d903c7f9e21f87c709e9f7a9a9e65" + }, + "version": "1.5.0" + }, + "org.jetbrains.kotlin:kotlin-script-runtime": { + "shasums": { + "jar": "f2d45a350628bdfea25570c4c3f29198087e0f8cf53d87d928fb0da8a30c8fb7", + "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", + "sources": "13db4d1b3123ae2fefccbc07ae0d8de07406f604fd518eb03195208531345a0c" + }, + "version": "1.5.0" + }, + "org.jetbrains.kotlin:kotlin-stdlib": { + "shasums": { + "jar": "52283996fe4067cd7330288b96ae67ecd463614dc741172c54d9d349ab6a9cd7", + "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", + "sources": "b163dff413167ec95d0c620b985f6b59965ebbd947ac5878904dd18ab8915166" + }, + "version": "1.5.0" + }, + "org.jetbrains.kotlin:kotlin-stdlib-common": { + "shasums": { + "jar": "c14ce6720a487b5e238f1b0c30ac3ad73e45b90a40731ca0b1cfddec1a37682f", + "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", + "sources": "7a79a086fe7ae85675f9f81a9d12645fbcfd7abf03e1b36873253634a193477a" + }, + "version": "1.5.0" + }, + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": { + "shasums": { + "jar": "f9566380c08722c780ce33ceee23e98ddf765ca98fabd3e2fabae7975c8d232b", + "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", + "sources": "447c623d66e5ba7f79cf2171f79540e6f3e04c4e683cbae8317bb6a2fcfd80bd" + }, + "version": "1.4.10" + }, + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": { + "shasums": { + "jar": "39b7a9442d7a3865e0f4a732c56c1d5da0e11ffb3bb82a461d32deb0c0ca7673", + "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", + "sources": "9c3e3f939fc57fb82c0675c99e60ecd80e6cec96c15c13dc0f16a19721c4ae72" + }, + "version": "1.4.10" + }, + "org.jetbrains.kotlin:kotlin-test": { + "shasums": { + "jar": "1794237a1fc908d37adb2fa3d9739b883124571720ad285cfa81e74190e87ba9", + "javadoc": "ddbb961eb52a7d2c6669cefafd82ce97714f26ef4e5ca7721e9c58d47bd716d1", + "sources": "06689d90dedff6cb9d9bea762bb19ce7882d1e12f495158a760bfbc2ff1ac1a4" + }, + "version": "1.3.72" + }, + "org.jetbrains.kotlin:kotlin-test-annotations-common": { + "shasums": { + "jar": "cadb25f8660392c1fbc7f9b2b1b9daa36469587b97bd30ba718d3bbaea71dfb3", + "javadoc": "9f0e2b81c851f003887723cff18948cc553da0eb9885fcf478197b515908112a", + "sources": "6b122ec23e06fe2e3b66a58a179470f6f109011ddaf5168020a33a0c53ff1630" + }, + "version": "1.3.72" + }, + "org.jetbrains.kotlin:kotlin-test-common": { + "shasums": { + "jar": "6b4abd7d7d1c07ab72c2318afec2f9b627b9e99a39767f597ac40cf7b1955b8a", + "javadoc": "9f0e2b81c851f003887723cff18948cc553da0eb9885fcf478197b515908112a", + "sources": "81a826f1c61c0d403483235e5db1c2e63f7a7d17fcacc8611f769221ba33f120" + }, + "version": "1.3.72" + }, + "org.jetbrains.kotlin:kotlin-test-junit": { + "shasums": { + "jar": "d8266ebb919568ddc15c98d2790017f31240ac51936445fd8b27231d60fe4566", + "javadoc": "ddbb961eb52a7d2c6669cefafd82ce97714f26ef4e5ca7721e9c58d47bd716d1", + "sources": "a8ab7ee99074595f118e0aff19ceee43c8c2538e4420bb2342035015025d2c31" + }, + "version": "1.3.72" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-android": { + "shasums": { + "jar": "d4cadb673b2101f1ee5fbc147956ac78b1cfd9cc255fb53d3aeb88dff11d99ca", + "javadoc": "66b1dd0f86a6894f99992956da5ce6310739138da2bb519734225c44b9979e49", + "sources": "b2370993da3e0a183109d58004d7fde48af9dbba93c6774299fda9069ebb5eeb" + }, + "version": "1.4.1" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-core": { + "shasums": { + "jar": "6d2f87764b6638f27aff12ed380db4b63c9d46ba55dc32683a650598fa5a3e22", + "javadoc": "39c0c07744ac0d09d1b007250b5b2f46b33538faf42cbea37c5a013352276def", + "sources": "bb339efebc2d9141401f1aa43a035abe929210e362cfff13d03c6b7b11dc0469" + }, + "version": "1.4.1" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-debug": { + "shasums": { + "jar": "6a92f46fe713e9cade9cf55489844b0acf38596a070c1c85f0580e8107ae485e", + "javadoc": "76169a24017cc8cacf91abc0d0a8d1a47344fd480048d822ebfd6f65c17ef0a0", + "sources": "264927d634bc72c1995011ecaa7bc91085b0b880fef3c752a523f86b6e4cb94e" + }, + "version": "1.2.2" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-test": { + "shasums": { + "jar": "31e03c48a2f63ee11ee4d1eed4c1a19f561531e838525c67346f4bacdd422444", + "javadoc": "1e2ffc834330a05449650f5d039df39e522f30d524ae7ce4115370195aaca214", + "sources": "6eb4b2095410fd4a2896b137799e586765c8dec2a35103d58e7155227bbfcd73" + }, + "version": "1.2.2" + }, + "org.jetbrains.kotlinx:kotlinx-metadata-jvm": { + "shasums": { + "jar": "9753bb39efef35957c5c15df9a3cb769aabf2cdfa74b47afcb7760e5146be3b5", + "javadoc": "adbfb6241ef597b5b046c27d9337f71c7d9a3412134640c02b2985f9ff35ad9a", + "sources": "a2cdb2a6a90a199addb8f312e3d5ab12b4626573f22b076176cc1d09999d6e78" + }, + "version": "0.1.0" + }, + "org.jetbrains:annotations": { + "shasums": { + "jar": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478", + "javadoc": "189d6d7726b293869ae97bc35bdab234f46e735549516974260543ce26df1d47", + "sources": "42a5e144b8e81d50d6913d1007b695e62e614705268d8cf9f13dbdc478c2c68e" + }, + "version": "13.0" + }, + "org.mockito.kotlin:mockito-kotlin": { + "shasums": { + "jar": "12995c7fdb8de84cf58fca31f1cd8810eeaa39e63c00e61ffcb2b49a4305f21f", + "javadoc": "90e9236a1f5169ccd4bb03852a4c9c9dee7f22eeaa062b84b006887116baf2bd", + "sources": "50bae6ff5fb02d2c211479df3e55799190df77d60f3e3f0be669a68ccde1e10b" + }, + "version": "3.2.0" + }, + "org.mockito:mockito-core": { + "shasums": { + "jar": "a1f64211407b8dc4cf80b16e07cc11aa9e5228d53dc4a5357326d66825f6a4ac", + "javadoc": "db83f99deadf3a0854546f6281867e9dd62ad34ac21276532735cf07c3f74ad1", + "sources": "6457852efe7e4ba539e5816d069401c9f2a39abc8cea43d0039174ac112a6ac3" + }, + "version": "3.9.0" + }, + "org.objenesis:objenesis": { + "shasums": { + "jar": "03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3", + "javadoc": "dbfc5b05c607e0a08c2416fc77fd075dbd71d19f64735ec122ca5d6255f4b4ce", + "sources": "56a7987f5746bd809c363e29055c41f5472a086b0e0e32248693e064d10bc306" + }, + "version": "3.2" + }, + "org.ow2.asm:asm": { + "shasums": { + "jar": "cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2", + "javadoc": "8bad3921fed9a2c8d897db545da7db87c2aea0c6d33612f24c217937a2af139c", + "sources": "64a1059b152dee08e203b4e1117b7979fff1578c545573f05329fb6d9090bb41" + }, + "version": "9.1" + }, + "org.ow2.asm:asm-analysis": { + "shasums": { + "jar": "2d46de6df856a4daac9aa534459ab7287eb80584e9109850405e5b302dc9c2a6", + "javadoc": "7532547722c6be3ba7d079e213028ecd4ada7166c7f4cdf19ff8c2d59de35d97", + "sources": "a34153ef6bac79a2a0535f62590671fe7c632ade294aa74938ee79da14707521" + }, + "version": "9.0" + }, + "org.ow2.asm:asm-commons": { + "shasums": { + "jar": "1b9090acb7e67bd4ed2f2cfb002063316d79cecace237bd07cc4f7f1b302092f", + "javadoc": "b9f929932df93371bf048501d164ac2b4aa6f0d4cad7d28ca8299855d91ab0aa", + "sources": "7ced1227cc5e9d9762a930e19f8708591c5ef458bcdebdebd7e934fbb1b1adf3" + }, + "version": "9.0" + }, + "org.ow2.asm:asm-tree": { + "shasums": { + "jar": "e2c25f332eb95861883a8568e45aac5e77d140d0fe961ae8eb9a474ec876e00d", + "javadoc": "9a35ebbec75750cb8e7de8106ad06a71c380021a990525e2f315919115195129", + "sources": "e75b132b75a861dcbb8aa75b98783b863310fb2e3e3d28394c22063db5ec7432" + }, + "version": "9.0" + }, + "org.ow2.asm:asm-util": { + "shasums": { + "jar": "2af6e7d01e0862e75193f3c01a06a689b0a245947e29f38eb683633391519bb6", + "javadoc": "3cbd7d1b4f18a947cc9c7fb7288b98d1d1c8c401c86ee2de1d81c5ec207a5411", + "sources": "cdc52c849b9af5d157df3919621d484697ed35c755292c682704227c0e012710" + }, + "version": "9.0" + }, + "org.robolectric:annotations": { + "shasums": { + "jar": "76b5bf55bb0d98e3b72fee1e015dea04c3a5a907aff02b9b405cebd50a19e1ab", + "javadoc": "0aacace08db91457f12dc0ac82b4c931bd550f53ced74911b86e150e84b6f2fa", + "sources": "32eccf8cbb11da68ffbe0fc14278150dc4236f77de26af1d1727e6acd61a086b" + }, + "version": "4.5" + }, + "org.robolectric:junit": { + "shasums": { + "jar": "c9eec2e87d53fc7a4af3c0c1c4b722963f2dc7d0a01b90568a6c83ca6d751c4a", + "javadoc": "60fe133208cb0abbb6842c2bf7144351e6a5944cb3987a7a8fd4bcfb88fa1e47", + "sources": "6e631445ffcb2ecefb4ba4e170ae31e39f281244a3ce68b444f8d8fe1944782f" + }, + "version": "4.5" + }, + "org.robolectric:pluginapi": { + "shasums": { + "jar": "9292f4a65d546b27b000112f1daeea8228c039ba9eb790d122ee99a4b04d8c43", + "javadoc": "b0805f1670d05d7004834375fdb2a88dd560df5489bbf7e201fe5f931cb8b142", + "sources": "c90002bd085a03daf77b51ed4e0867cff898adaa754023aea21f4bcb84567127" + }, + "version": "4.5" + }, + "org.robolectric:plugins-maven-dependency-resolver": { + "shasums": { + "jar": "e6c381016e2da09c3f3a7859075042d3457d0dc0a6ba088b8d969b9d3a525cfa", + "javadoc": "997536de988ae0086235cf54e5ee81dad096896b58d637bf0c9d6e5cbc7988b4", + "sources": "628689f56c37d669a60d5aa669e59acb0d64001f6b2533174ed5ddee4871d7bb" + }, + "version": "4.5" + }, + "org.robolectric:resources": { + "shasums": { + "jar": "21b60d114670827bf80b7815faa16da02eeda2fcd01cba088dfb630fa9721eb3", + "javadoc": "b5b3139231aed8a1058b7bc6d63fee2f2e292112c61ae0d815f95eb8f6ddd7f5", + "sources": "d5baa25e556e4fc67d3dc6bdf0bf32d29df4439856fc054112f81596a1fe1574" + }, + "version": "4.5" + }, + "org.robolectric:robolectric": { + "shasums": { + "jar": "ba9f8130c11d5b34dfe61990d2e9adfbcf5a945476309c3dcb48fce547331c27", + "javadoc": "0b25f1b6866deb4089817faa2a1c45f045be5cb5323c2500186e1b35d94ca1d2", + "sources": "54293237f2b9f48f1609935bffc37b353b3e981962fb578da64bae1a82c6c25d" + }, + "version": "4.5" + }, + "org.robolectric:sandbox": { + "shasums": { + "jar": "cf18639f2991893122f88df87bf83eb325b3ca1031c9a730acead5acdc7e275c", + "javadoc": "5859b3a7807c3b2c050c54bb7733be979d5e3ecc2f2e333a6cb863f19a8fd9a6", + "sources": "e9c61c173f65a73f4ae415cc0095c8570ed199d8247b4421032b82cc2aca3571" + }, + "version": "4.5" + }, + "org.robolectric:shadowapi": { + "shasums": { + "jar": "a158c49d0274a1412fb909d6b2e52a06b230a2b80ad8657c072c7474f0e69c1f", + "javadoc": "687a26edb933561b57f73a86479e790bde0160dbc0e8759f9adfb315e0d29c95", + "sources": "4a220cfd840b1aec509512825a6b332dbe8889f988f25d60369ceb599396ac9e" + }, + "version": "4.5" + }, + "org.robolectric:shadows-framework": { + "shasums": { + "jar": "3be4c7d01ee2fb5cff4cb90a65af26831199baac3e92311dd2d5f42cadb50723", + "javadoc": "32ab2b084c605c673b0a45a785605b99bc9ef1d8fed5ea3794269059a9aee387", + "sources": "879288cd58699b4a75ebda38bb0905f359a258575f18ff0e7b861d18a8595231" + }, + "version": "4.5" + }, + "org.robolectric:utils": { + "shasums": { + "jar": "b0982a413c4bd874a8099b97a22cdcd4826cf62178f17dbca67d814627124de1", + "javadoc": "ed6b69a41d73bb5e96e059862dddfeac67387a3f544055de04ee731aecdcb3d4", + "sources": "f8b7e1a3ed9916c1d2529ede178af4bd6dc3b2f41fc9be57c22476f3e91ffdb4" + }, + "version": "4.5" + }, + "org.robolectric:utils-reflector": { + "shasums": { + "jar": "91f9e5f9eacd6a2f308473b39d473f3edd205365fe3c4188f8c4c11191c6d914", + "javadoc": "22ec55c4f3126796df44b2a7b68ab33980590861df06ee1486eecca934e9257d", + "sources": "a8f9c774036f4ed79a1c08cd876a4ec0e8eac311875c0a3e9df7de8ab0e5e003" + }, + "version": "4.5" } + }, + "dependencies": { + "android.arch.core:common": [ + "com.android.support:support-annotations" + ], + "android.arch.core:core-testing:aar": [ + "android.arch.core:runtime:aar", + "com.android.support:support-annotations", + "junit:junit", + "org.mockito:mockito-core" + ], + "android.arch.core:runtime:aar": [ + "android.arch.core:common", + "com.android.support:support-annotations" + ], + "androidx.activity:activity:aar": [ + "androidx.annotation:annotation", + "androidx.core:core:aar", + "androidx.lifecycle:lifecycle-runtime:aar", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.savedstate:savedstate:aar" + ], + "androidx.appcompat:appcompat-resources:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.vectordrawable:vectordrawable-animated:aar", + "androidx.vectordrawable:vectordrawable:aar" + ], + "androidx.appcompat:appcompat:aar": [ + "androidx.annotation:annotation", + "androidx.appcompat:appcompat-resources:aar", + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.cursoradapter:cursoradapter:aar", + "androidx.drawerlayout:drawerlayout:aar", + "androidx.fragment:fragment:aar" + ], + "androidx.arch.core:core-common": [ + "androidx.annotation:annotation" + ], + "androidx.arch.core:core-runtime:aar": [ + "androidx.annotation:annotation", + "androidx.arch.core:core-common" + ], + "androidx.arch.core:core-testing:aar": [ + "androidx.annotation:annotation", + "androidx.arch.core:core-runtime:aar", + "junit:junit", + "org.mockito:mockito-core" + ], + "androidx.cardview:cardview:aar": [ + "androidx.annotation:annotation" + ], + "androidx.collection:collection": [ + "androidx.annotation:annotation" + ], + "androidx.constraintlayout:constraintlayout:aar": [ + "androidx.appcompat:appcompat:aar", + "androidx.constraintlayout:constraintlayout-solver", + "androidx.core:core:aar" + ], + "androidx.coordinatorlayout:coordinatorlayout:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.customview:customview:aar" + ], + "androidx.core:core-ktx:aar": [ + "androidx.annotation:annotation", + "androidx.core:core:aar", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "androidx.core:core:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.lifecycle:lifecycle-runtime:aar", + "androidx.versionedparcelable:versionedparcelable:aar" + ], + "androidx.cursoradapter:cursoradapter:aar": [ + "androidx.annotation:annotation" + ], + "androidx.customview:customview:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.core:core:aar" + ], + "androidx.databinding:databinding-adapters:aar": [ + "androidx.databinding:databinding-common", + "androidx.databinding:databinding-runtime:aar" + ], + "androidx.databinding:databinding-compiler": [ + "androidx.databinding:databinding-common", + "androidx.databinding:databinding-compiler-common", + "com.googlecode.juniversalchardet:juniversalchardet", + "commons-codec:commons-codec", + "commons-io:commons-io", + "org.antlr:antlr4", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "androidx.databinding:databinding-compiler-common": [ + "androidx.databinding:databinding-common", + "com.android.databinding:baseLibrary", + "com.android.tools.build.jetifier:jetifier-core", + "com.android.tools:annotations", + "com.google.code.gson:gson", + "com.google.guava:guava", + "com.googlecode.juniversalchardet:juniversalchardet", + "com.squareup:javapoet", + "commons-io:commons-io", + "org.antlr:antlr4", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "androidx.databinding:databinding-runtime:aar": [ + "androidx.collection:collection", + "androidx.databinding:databinding-common", + "androidx.lifecycle:lifecycle-runtime:aar" + ], + "androidx.documentfile:documentfile:aar": [ + "androidx.annotation:annotation" + ], + "androidx.drawerlayout:drawerlayout:aar": [ + "androidx.annotation:annotation", + "androidx.core:core:aar", + "androidx.customview:customview:aar" + ], + "androidx.dynamicanimation:dynamicanimation:aar": [ + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.legacy:legacy-support-core-utils:aar" + ], + "androidx.exifinterface:exifinterface:aar": [ + "androidx.annotation:annotation" + ], + "androidx.fragment:fragment:aar": [ + "androidx.activity:activity:aar", + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.lifecycle:lifecycle-livedata-core:aar", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.loader:loader:aar", + "androidx.viewpager:viewpager:aar" + ], + "androidx.interpolator:interpolator:aar": [ + "androidx.annotation:annotation" + ], + "androidx.legacy:legacy-support-core-utils:aar": [ + "androidx.annotation:annotation", + "androidx.core:core:aar", + "androidx.documentfile:documentfile:aar", + "androidx.loader:loader:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "androidx.print:print:aar" + ], + "androidx.lifecycle:lifecycle-common": [ + "androidx.annotation:annotation" + ], + "androidx.lifecycle:lifecycle-extensions:aar": [ + "androidx.arch.core:core-common", + "androidx.arch.core:core-runtime:aar", + "androidx.fragment:fragment:aar", + "androidx.lifecycle:lifecycle-common", + "androidx.lifecycle:lifecycle-livedata:aar", + "androidx.lifecycle:lifecycle-process:aar", + "androidx.lifecycle:lifecycle-runtime:aar", + "androidx.lifecycle:lifecycle-service:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar" + ], + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar": [ + "androidx.lifecycle:lifecycle-livedata-core:aar", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "androidx.lifecycle:lifecycle-livedata-core:aar": [ + "androidx.arch.core:core-common", + "androidx.arch.core:core-runtime:aar", + "androidx.lifecycle:lifecycle-common" + ], + "androidx.lifecycle:lifecycle-livedata-ktx:aar": [ + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar", + "androidx.lifecycle:lifecycle-livedata:aar", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlinx:kotlinx-coroutines-core" + ], + "androidx.lifecycle:lifecycle-livedata:aar": [ + "androidx.arch.core:core-common", + "androidx.arch.core:core-runtime:aar", + "androidx.lifecycle:lifecycle-livedata-core:aar" + ], + "androidx.lifecycle:lifecycle-process:aar": [ + "androidx.lifecycle:lifecycle-runtime:aar" + ], + "androidx.lifecycle:lifecycle-runtime:aar": [ + "androidx.annotation:annotation", + "androidx.arch.core:core-common", + "androidx.lifecycle:lifecycle-common" + ], + "androidx.lifecycle:lifecycle-service:aar": [ + "androidx.lifecycle:lifecycle-runtime:aar" + ], + "androidx.lifecycle:lifecycle-viewmodel-ktx:aar": [ + "androidx.lifecycle:lifecycle-viewmodel:aar", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlinx:kotlinx-coroutines-android" + ], + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar": [ + "androidx.annotation:annotation", + "androidx.lifecycle:lifecycle-livedata-core:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.savedstate:savedstate:aar" + ], + "androidx.lifecycle:lifecycle-viewmodel:aar": [ + "androidx.annotation:annotation" + ], + "androidx.loader:loader:aar": [ + "androidx.annotation:annotation", + "androidx.core:core:aar", + "androidx.lifecycle:lifecycle-livedata:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar" + ], + "androidx.localbroadcastmanager:localbroadcastmanager:aar": [ + "androidx.annotation:annotation" + ], + "androidx.multidex:multidex-instrumentation:aar": [ + "androidx.multidex:multidex:aar" + ], + "androidx.navigation:navigation-common-ktx:aar": [ + "androidx.collection:collection", + "androidx.navigation:navigation-common:aar", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "androidx.navigation:navigation-common:aar": [ + "androidx.collection:collection", + "androidx.core:core:aar" + ], + "androidx.navigation:navigation-fragment-ktx:aar": [ + "androidx.navigation:navigation-fragment:aar", + "androidx.navigation:navigation-runtime-ktx:aar", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "androidx.navigation:navigation-fragment:aar": [ + "androidx.fragment:fragment:aar", + "androidx.navigation:navigation-runtime:aar" + ], + "androidx.navigation:navigation-runtime-ktx:aar": [ + "androidx.navigation:navigation-common-ktx:aar", + "androidx.navigation:navigation-runtime:aar", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "androidx.navigation:navigation-runtime:aar": [ + "androidx.legacy:legacy-support-core-utils:aar", + "androidx.navigation:navigation-common:aar" + ], + "androidx.navigation:navigation-ui-ktx:aar": [ + "androidx.navigation:navigation-runtime-ktx:aar", + "androidx.navigation:navigation-ui:aar", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "androidx.navigation:navigation-ui:aar": [ + "androidx.navigation:navigation-runtime:aar", + "com.google.android.material:material:aar" + ], + "androidx.print:print:aar": [ + "androidx.annotation:annotation" + ], + "androidx.recyclerview:recyclerview:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.customview:customview:aar" + ], + "androidx.room:room-common": [ + "androidx.annotation:annotation" + ], + "androidx.room:room-runtime:aar": [ + "androidx.arch.core:core-runtime:aar", + "androidx.room:room-common", + "androidx.sqlite:sqlite-framework:aar", + "androidx.sqlite:sqlite:aar" + ], + "androidx.savedstate:savedstate:aar": [ + "androidx.annotation:annotation", + "androidx.arch.core:core-common", + "androidx.lifecycle:lifecycle-common" + ], + "androidx.sqlite:sqlite-framework:aar": [ + "androidx.annotation:annotation", + "androidx.sqlite:sqlite:aar" + ], + "androidx.sqlite:sqlite:aar": [ + "androidx.annotation:annotation" + ], + "androidx.test.espresso:espresso-accessibility:aar": [ + "androidx.test.espresso:espresso-core:aar", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework" + ], + "androidx.test.espresso:espresso-contrib:aar": [ + "androidx.core:core:aar", + "androidx.legacy:legacy-support-core-utils:aar", + "androidx.recyclerview:recyclerview:aar", + "androidx.test.espresso:espresso-core:aar", + "androidx.test.espresso:espresso-idling-resource:aar", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework", + "com.google.android.material:material:aar" + ], + "androidx.test.espresso:espresso-core:aar": [ + "androidx.test.espresso:espresso-idling-resource:aar", + "androidx.test:runner:aar", + "com.google.code.findbugs:jsr305", + "com.squareup:javawriter", + "javax.inject:javax.inject", + "org.hamcrest:hamcrest-integration", + "org.hamcrest:hamcrest-library" + ], + "androidx.test.espresso:espresso-intents:aar": [ + "androidx.test.espresso:espresso-core:aar", + "androidx.test:rules:aar" + ], + "androidx.test.ext:junit:aar": [ + "androidx.annotation:annotation", + "androidx.test:core:aar", + "androidx.test:monitor:aar", + "junit:junit" + ], + "androidx.test.ext:truth:aar": [ + "androidx.annotation:annotation", + "androidx.test:core:aar", + "com.google.guava:guava", + "com.google.truth:truth" + ], + "androidx.test:core:aar": [ + "androidx.annotation:annotation", + "androidx.lifecycle:lifecycle-common", + "androidx.test:monitor:aar" + ], + "androidx.test:monitor:aar": [ + "androidx.annotation:annotation" + ], + "androidx.test:rules:aar": [ + "androidx.test:runner:aar" + ], + "androidx.test:runner:aar": [ + "androidx.annotation:annotation", + "androidx.test:monitor:aar", + "junit:junit", + "net.sf.kxml:kxml2" + ], + "androidx.transition:transition:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.core:core:aar" + ], + "androidx.vectordrawable:vectordrawable-animated:aar": [ + "androidx.collection:collection", + "androidx.interpolator:interpolator:aar", + "androidx.vectordrawable:vectordrawable:aar" + ], + "androidx.vectordrawable:vectordrawable:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.core:core:aar" + ], + "androidx.versionedparcelable:versionedparcelable:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection" + ], + "androidx.viewpager2:viewpager2:aar": [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.fragment:fragment:aar", + "androidx.recyclerview:recyclerview:aar" + ], + "androidx.viewpager:viewpager:aar": [ + "androidx.annotation:annotation", + "androidx.core:core:aar", + "androidx.customview:customview:aar" + ], + "androidx.work:work-runtime-ktx:aar": [ + "androidx.work:work-runtime:aar", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlinx:kotlinx-coroutines-android" + ], + "androidx.work:work-runtime:aar": [ + "androidx.core:core:aar", + "androidx.lifecycle:lifecycle-livedata:aar", + "androidx.lifecycle:lifecycle-service:aar", + "androidx.room:room-runtime:aar", + "androidx.sqlite:sqlite-framework:aar", + "androidx.sqlite:sqlite:aar", + "com.google.guava:listenablefuture" + ], + "androidx.work:work-testing:aar": [ + "androidx.lifecycle:lifecycle-livedata-core:aar", + "androidx.room:room-runtime:aar", + "androidx.work:work-runtime-ktx:aar" + ], + "com.android.tools.build.jetifier:jetifier-core": [ + "com.google.code.gson:gson", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "com.android.tools.build:aapt2-proto": [ + "com.google.protobuf:protobuf-java" + ], + "com.crashlytics.sdk.android:answers:aar": [ + "io.fabric.sdk.android:fabric:aar" + ], + "com.crashlytics.sdk.android:crashlytics-core:aar": [ + "com.crashlytics.sdk.android:answers:aar", + "io.fabric.sdk.android:fabric:aar" + ], + "com.crashlytics.sdk.android:crashlytics:aar": [ + "com.crashlytics.sdk.android:answers:aar", + "com.crashlytics.sdk.android:beta:aar", + "com.crashlytics.sdk.android:crashlytics-core:aar", + "io.fabric.sdk.android:fabric:aar" + ], + "com.github.bumptech.glide:compiler": [ + "com.github.bumptech.glide:annotations" + ], + "com.github.bumptech.glide:gifdecoder:aar": [ + "androidx.annotation:annotation" + ], + "com.github.bumptech.glide:glide:aar": [ + "androidx.exifinterface:exifinterface:aar", + "androidx.fragment:fragment:aar", + "androidx.vectordrawable:vectordrawable-animated:aar", + "com.github.bumptech.glide:annotations", + "com.github.bumptech.glide:disklrucache", + "com.github.bumptech.glide:gifdecoder:aar" + ], + "com.github.bumptech.glide:mocks:aar": [ + "androidx.annotation:annotation", + "com.github.bumptech.glide:glide:aar", + "com.google.guava:guava" + ], + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework": [ + "org.hamcrest:hamcrest-core" + ], + "com.google.android.datatransport:transport-backend-cct:aar": [ + "androidx.annotation:annotation", + "com.google.android.datatransport:transport-api:aar", + "com.google.android.datatransport:transport-runtime:aar", + "com.google.firebase:firebase-encoders-json:aar" + ], + "com.google.android.datatransport:transport-runtime:aar": [ + "androidx.annotation:annotation", + "com.google.android.datatransport:transport-api:aar", + "com.google.dagger:dagger" + ], + "com.google.android.flexbox:flexbox:aar": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "com.google.android.gms:play-services-ads-identifier:aar": [ + "com.google.android.gms:play-services-basement:aar" + ], + "com.google.android.gms:play-services-base:aar": [ + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.fragment:fragment:aar", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-tasks:aar" + ], + "com.google.android.gms:play-services-basement:aar": [ + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.fragment:fragment:aar" + ], + "com.google.android.gms:play-services-measurement-api:aar": [ + "com.google.android.gms:play-services-ads-identifier:aar", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-measurement-base:aar", + "com.google.android.gms:play-services-measurement-impl:aar", + "com.google.android.gms:play-services-measurement-sdk-api:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-installations-interop:aar", + "com.google.firebase:firebase-installations:aar", + "com.google.firebase:firebase-measurement-connector:aar" + ], + "com.google.android.gms:play-services-measurement-base:aar": [ + "com.google.android.gms:play-services-basement:aar" + ], + "com.google.android.gms:play-services-measurement-impl:aar": [ + "androidx.collection:collection", + "androidx.core:core:aar", + "com.google.android.gms:play-services-ads-identifier:aar", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-measurement-base:aar", + "com.google.android.gms:play-services-stats:aar" + ], + "com.google.android.gms:play-services-measurement-sdk-api:aar": [ + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-measurement-base:aar" + ], + "com.google.android.gms:play-services-measurement-sdk:aar": [ + "androidx.collection:collection", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-measurement-base:aar", + "com.google.android.gms:play-services-measurement-impl:aar" + ], + "com.google.android.gms:play-services-measurement:aar": [ + "androidx.collection:collection", + "androidx.legacy:legacy-support-core-utils:aar", + "com.google.android.gms:play-services-ads-identifier:aar", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-measurement-base:aar", + "com.google.android.gms:play-services-measurement-impl:aar", + "com.google.android.gms:play-services-stats:aar" + ], + "com.google.android.gms:play-services-stats:aar": [ + "androidx.legacy:legacy-support-core-utils:aar", + "com.google.android.gms:play-services-basement:aar" + ], + "com.google.android.gms:play-services-tasks:aar": [ + "com.google.android.gms:play-services-basement:aar" + ], + "com.google.android.gms:strict-version-matcher-plugin": [ + "com.google.code.findbugs:jsr305", + "com.google.guava:guava", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.google.android.material:material:aar": [ + "androidx.annotation:annotation", + "androidx.annotation:annotation-experimental:aar", + "androidx.appcompat:appcompat:aar", + "androidx.cardview:cardview:aar", + "androidx.constraintlayout:constraintlayout:aar", + "androidx.coordinatorlayout:coordinatorlayout:aar", + "androidx.core:core:aar", + "androidx.dynamicanimation:dynamicanimation:aar", + "androidx.fragment:fragment:aar", + "androidx.lifecycle:lifecycle-runtime:aar", + "androidx.recyclerview:recyclerview:aar", + "androidx.transition:transition:aar", + "androidx.vectordrawable:vectordrawable:aar", + "androidx.viewpager2:viewpager2:aar" + ], + "com.google.dagger:dagger": [ + "javax.inject:javax.inject" + ], + "com.google.dagger:dagger-compiler": [ + "com.google.code.findbugs:jsr305", + "com.google.dagger:dagger", + "com.google.dagger:dagger-producers", + "com.google.dagger:dagger-spi", + "com.google.googlejavaformat:google-java-format", + "com.google.guava:failureaccess", + "com.google.guava:guava", + "com.squareup:javapoet", + "javax.annotation:jsr250-api", + "javax.inject:javax.inject", + "net.ltgt.gradle.incap:incap", + "org.checkerframework:checker-compat-qual", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm" + ], + "com.google.dagger:dagger-producers": [ + "com.google.dagger:dagger", + "com.google.guava:failureaccess", + "com.google.guava:guava", + "javax.inject:javax.inject", + "org.checkerframework:checker-compat-qual" + ], + "com.google.dagger:dagger-spi": [ + "com.google.code.findbugs:jsr305", + "com.google.dagger:dagger", + "com.google.dagger:dagger-producers", + "com.google.guava:failureaccess", + "com.google.guava:guava", + "com.squareup:javapoet", + "javax.inject:javax.inject" + ], + "com.google.firebase:firebase-analytics:aar": [ + "com.google.android.gms:play-services-measurement-api:aar", + "com.google.android.gms:play-services-measurement-sdk:aar", + "com.google.android.gms:play-services-measurement:aar" + ], + "com.google.firebase:firebase-common:aar": [ + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.auto.value:auto-value-annotations", + "com.google.firebase:firebase-components:aar" + ], + "com.google.firebase:firebase-components:aar": [ + "androidx.annotation:annotation" + ], + "com.google.firebase:firebase-crashlytics:aar": [ + "com.google.android.datatransport:transport-api:aar", + "com.google.android.datatransport:transport-backend-cct:aar", + "com.google.android.datatransport:transport-runtime:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-encoders-json:aar", + "com.google.firebase:firebase-iid-interop:aar", + "com.google.firebase:firebase-iid:aar", + "com.google.firebase:firebase-measurement-connector:aar", + "com.squareup.okhttp3:okhttp" + ], + "com.google.firebase:firebase-encoders-json:aar": [ + "androidx.annotation:annotation" + ], + "com.google.firebase:firebase-iid-interop:aar": [ + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-basement:aar" + ], + "com.google.firebase:firebase-iid:aar": [ + "androidx.collection:collection", + "androidx.core:core:aar", + "androidx.legacy:legacy-support-core-utils:aar", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-stats:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-iid-interop:aar", + "com.google.firebase:firebase-installations-interop:aar", + "com.google.firebase:firebase-installations:aar" + ], + "com.google.firebase:firebase-installations-interop:aar": [ + "com.google.android.gms:play-services-tasks:aar" + ], + "com.google.firebase:firebase-installations:aar": [ + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-installations-interop:aar" + ], + "com.google.firebase:firebase-measurement-connector:aar": [ + "com.google.android.gms:play-services-basement:aar" + ], + "com.google.gms:google-services": [ + "com.google.android.gms:strict-version-matcher-plugin", + "com.google.code.gson:gson", + "com.google.guava:guava" + ], + "com.google.googlejavaformat:google-java-format": [ + "com.google.errorprone:javac-shaded", + "com.google.guava:guava" + ], + "com.google.guava:guava": [ + "com.google.code.findbugs:jsr305", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:failureaccess", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "org.checkerframework:checker-compat-qual" + ], + "com.google.truth.extensions:truth-liteproto-extension": [ + "com.google.auto.value:auto-value-annotations", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "com.google.truth:truth", + "org.checkerframework:checker-qual" + ], + "com.google.truth:truth": [ + "com.google.auto.value:auto-value-annotations", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "junit:junit", + "org.checkerframework:checker-qual", + "org.ow2.asm:asm" + ], + "com.squareup.moshi:moshi": [ + "com.squareup.okio:okio" + ], + "com.squareup.moshi:moshi-kotlin": [ + "com.squareup.moshi:moshi", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "com.squareup.moshi:moshi-kotlin-codegen": [ + "com.google.auto.service:auto-service-annotations", + "com.squareup.moshi:moshi", + "com.squareup:kotlinpoet", + "net.ltgt.gradle.incap:incap", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.ow2.asm:asm" + ], + "com.squareup.okhttp3:mockwebserver": [ + "com.squareup.okhttp3:okhttp", + "junit:junit" + ], + "com.squareup.okhttp3:okhttp": [ + "com.squareup.okio:okio", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "com.squareup.okio:okio": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common" + ], + "com.squareup.retrofit2:converter-moshi": [ + "com.squareup.moshi:moshi", + "com.squareup.retrofit2:retrofit" + ], + "com.squareup.retrofit2:retrofit": [ + "com.squareup.okhttp3:okhttp" + ], + "com.squareup.retrofit2:retrofit-mock": [ + "com.squareup.retrofit2:retrofit" + ], + "com.squareup:kotlinpoet": [ + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "junit:junit": [ + "org.hamcrest:hamcrest-core" + ], + "nl.dionsegijn:konfetti:aar": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "org.hamcrest:hamcrest-integration": [ + "org.hamcrest:hamcrest-library" + ], + "org.hamcrest:hamcrest-library": [ + "org.hamcrest:hamcrest-core" + ], + "org.jetbrains.kotlin:kotlin-compiler-embeddable": [ + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.kotlin:kotlin-daemon-embeddable", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-script-runtime", + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "org.jetbrains.kotlin:kotlin-reflect": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "org.jetbrains.kotlin:kotlin-stdlib": [ + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains:annotations" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7" + ], + "org.jetbrains.kotlin:kotlin-test": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-test-common" + ], + "org.jetbrains.kotlin:kotlin-test-annotations-common": [ + "org.jetbrains.kotlin:kotlin-stdlib-common" + ], + "org.jetbrains.kotlin:kotlin-test-common": [ + "org.jetbrains.kotlin:kotlin-stdlib-common" + ], + "org.jetbrains.kotlin:kotlin-test-junit": [ + "junit:junit", + "org.jetbrains.kotlin:kotlin-test", + "org.jetbrains.kotlin:kotlin-test-annotations-common" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-android": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlinx:kotlinx-coroutines-core" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-core": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-test": [ + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug" + ], + "org.jetbrains.kotlinx:kotlinx-metadata-jvm": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "org.mockito.kotlin:mockito-kotlin": [ + "org.mockito:mockito-core" + ], + "org.mockito:mockito-core": [ + "net.bytebuddy:byte-buddy", + "net.bytebuddy:byte-buddy-agent", + "org.objenesis:objenesis" + ], + "org.ow2.asm:asm-analysis": [ + "org.ow2.asm:asm-tree" + ], + "org.ow2.asm:asm-commons": [ + "org.ow2.asm:asm", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-tree" + ], + "org.ow2.asm:asm-tree": [ + "org.ow2.asm:asm" + ], + "org.ow2.asm:asm-util": [ + "org.ow2.asm:asm", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-tree" + ], + "org.robolectric:junit": [ + "org.robolectric:annotations", + "org.robolectric:pluginapi", + "org.robolectric:sandbox", + "org.robolectric:shadowapi", + "org.robolectric:utils-reflector" + ], + "org.robolectric:pluginapi": [ + "org.robolectric:annotations" + ], + "org.robolectric:plugins-maven-dependency-resolver": [ + "com.google.guava:guava", + "org.robolectric:pluginapi", + "org.robolectric:utils" + ], + "org.robolectric:resources": [ + "com.google.guava:guava", + "org.robolectric:annotations", + "org.robolectric:pluginapi", + "org.robolectric:utils" + ], + "org.robolectric:robolectric": [ + "androidx.test:monitor:aar", + "javax.annotation:javax.annotation-api", + "javax.inject:javax.inject", + "org.bouncycastle:bcprov-jdk15on", + "org.robolectric:annotations", + "org.robolectric:junit", + "org.robolectric:pluginapi", + "org.robolectric:plugins-maven-dependency-resolver", + "org.robolectric:resources", + "org.robolectric:sandbox", + "org.robolectric:shadows-framework", + "org.robolectric:utils", + "org.robolectric:utils-reflector" + ], + "org.robolectric:sandbox": [ + "com.google.guava:guava", + "javax.annotation:javax.annotation-api", + "javax.inject:javax.inject", + "org.ow2.asm:asm", + "org.ow2.asm:asm-commons", + "org.robolectric:annotations", + "org.robolectric:shadowapi", + "org.robolectric:utils", + "org.robolectric:utils-reflector" + ], + "org.robolectric:shadowapi": [ + "org.robolectric:annotations" + ], + "org.robolectric:shadows-framework": [ + "androidx.annotation:annotation", + "androidx.test:monitor:aar", + "com.almworks.sqlite4java:sqlite4java", + "com.google.auto.value:auto-value-annotations", + "com.ibm.icu:icu4j", + "org.robolectric:annotations", + "org.robolectric:pluginapi", + "org.robolectric:resources", + "org.robolectric:shadowapi", + "org.robolectric:utils", + "org.robolectric:utils-reflector" + ], + "org.robolectric:utils": [ + "com.google.guava:guava", + "javax.annotation:javax.annotation-api", + "javax.inject:javax.inject", + "org.robolectric:annotations", + "org.robolectric:pluginapi" + ], + "org.robolectric:utils-reflector": [ + "org.ow2.asm:asm", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util", + "org.robolectric:utils" + ] + }, + "skipped": [ + "android.arch.core:common:jar:javadoc", + "android.arch.core:core-testing:jar:javadoc", + "android.arch.core:runtime:aar:javadoc", + "androidx.activity:activity:aar:javadoc", + "androidx.annotation:annotation-experimental:jar:javadoc", + "androidx.appcompat:appcompat-resources:aar:javadoc", + "androidx.appcompat:appcompat:jar:javadoc", + "androidx.arch.core:core-common:jar:javadoc", + "androidx.arch.core:core-runtime:aar:javadoc", + "androidx.arch.core:core-testing:jar:javadoc", + "androidx.cardview:cardview:jar:javadoc", + "androidx.collection:collection:jar:javadoc", + "androidx.constraintlayout:constraintlayout-solver:jar:javadoc", + "androidx.constraintlayout:constraintlayout-solver:jar:sources", + "androidx.constraintlayout:constraintlayout:jar:javadoc", + "androidx.constraintlayout:constraintlayout:jar:sources", + "androidx.coordinatorlayout:coordinatorlayout:jar:javadoc", + "androidx.core:core-ktx:jar:javadoc", + "androidx.core:core:aar:javadoc", + "androidx.core:core:jar:javadoc", + "androidx.cursoradapter:cursoradapter:aar:javadoc", + "androidx.customview:customview:aar:javadoc", + "androidx.databinding:databinding-adapters:jar:javadoc", + "androidx.databinding:databinding-runtime:jar:javadoc", + "androidx.documentfile:documentfile:aar:javadoc", + "androidx.drawerlayout:drawerlayout:aar:javadoc", + "androidx.drawerlayout:drawerlayout:jar:javadoc", + "androidx.dynamicanimation:dynamicanimation:jar:javadoc", + "androidx.exifinterface:exifinterface:jar:javadoc", + "androidx.fragment:fragment:aar:javadoc", + "androidx.fragment:fragment:jar:javadoc", + "androidx.interpolator:interpolator:aar:javadoc", + "androidx.legacy:legacy-support-core-utils:aar:javadoc", + "androidx.legacy:legacy-support-core-utils:jar:javadoc", + "androidx.lifecycle:lifecycle-common:jar:javadoc", + "androidx.lifecycle:lifecycle-extensions:jar:javadoc", + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:javadoc", + "androidx.lifecycle:lifecycle-livedata-core:aar:javadoc", + "androidx.lifecycle:lifecycle-livedata-core:jar:javadoc", + "androidx.lifecycle:lifecycle-livedata-ktx:jar:javadoc", + "androidx.lifecycle:lifecycle-livedata:aar:javadoc", + "androidx.lifecycle:lifecycle-process:aar:javadoc", + "androidx.lifecycle:lifecycle-runtime:aar:javadoc", + "androidx.lifecycle:lifecycle-runtime:jar:javadoc", + "androidx.lifecycle:lifecycle-service:aar:javadoc", + "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:javadoc", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:javadoc", + "androidx.lifecycle:lifecycle-viewmodel:aar:javadoc", + "androidx.loader:loader:aar:javadoc", + "androidx.localbroadcastmanager:localbroadcastmanager:aar:javadoc", + "androidx.multidex:multidex-instrumentation:jar:javadoc", + "androidx.multidex:multidex-instrumentation:jar:sources", + "androidx.multidex:multidex:jar:javadoc", + "androidx.navigation:navigation-common-ktx:aar:javadoc", + "androidx.navigation:navigation-common:aar:javadoc", + "androidx.navigation:navigation-fragment-ktx:jar:javadoc", + "androidx.navigation:navigation-fragment:aar:javadoc", + "androidx.navigation:navigation-fragment:jar:javadoc", + "androidx.navigation:navigation-runtime-ktx:aar:javadoc", + "androidx.navigation:navigation-runtime:aar:javadoc", + "androidx.navigation:navigation-ui-ktx:jar:javadoc", + "androidx.navigation:navigation-ui:aar:javadoc", + "androidx.navigation:navigation-ui:jar:javadoc", + "androidx.print:print:aar:javadoc", + "androidx.recyclerview:recyclerview:aar:javadoc", + "androidx.recyclerview:recyclerview:jar:javadoc", + "androidx.room:room-common:jar:javadoc", + "androidx.room:room-runtime:aar:javadoc", + "androidx.room:room-runtime:jar:javadoc", + "androidx.savedstate:savedstate:aar:javadoc", + "androidx.sqlite:sqlite-framework:aar:javadoc", + "androidx.sqlite:sqlite:aar:javadoc", + "androidx.transition:transition:jar:javadoc", + "androidx.vectordrawable:vectordrawable-animated:aar:javadoc", + "androidx.vectordrawable:vectordrawable-animated:jar:javadoc", + "androidx.vectordrawable:vectordrawable:aar:javadoc", + "androidx.vectordrawable:vectordrawable:jar:javadoc", + "androidx.versionedparcelable:versionedparcelable:aar:javadoc", + "androidx.viewpager2:viewpager2:jar:javadoc", + "androidx.viewpager:viewpager:aar:javadoc", + "androidx.viewpager:viewpager:jar:javadoc", + "androidx.work:work-runtime-ktx:aar:javadoc", + "androidx.work:work-runtime-ktx:jar:javadoc", + "androidx.work:work-runtime:aar:javadoc", + "androidx.work:work-runtime:jar:javadoc", + "androidx.work:work-testing:jar:javadoc", + "com.android.support:support-annotations:jar:javadoc", + "com.android.support:support-annotations:jar:sources", + "com.android.tools.build.jetifier:jetifier-core:jar:javadoc", + "com.crashlytics.sdk.android:answers:aar:javadoc", + "com.crashlytics.sdk.android:answers:aar:sources", + "com.crashlytics.sdk.android:beta:aar:javadoc", + "com.crashlytics.sdk.android:beta:aar:sources", + "com.crashlytics.sdk.android:crashlytics-core:aar:javadoc", + "com.crashlytics.sdk.android:crashlytics-core:aar:sources", + "com.crashlytics.sdk.android:crashlytics:jar:javadoc", + "com.crashlytics.sdk.android:crashlytics:jar:sources", + "com.google.android.datatransport:transport-api:aar:sources", + "com.google.android.datatransport:transport-backend-cct:aar:sources", + "com.google.android.datatransport:transport-runtime:aar:sources", + "com.google.android.flexbox:flexbox:jar:javadoc", + "com.google.android.gms:play-services-ads-identifier:aar:javadoc", + "com.google.android.gms:play-services-ads-identifier:aar:sources", + "com.google.android.gms:play-services-base:aar:sources", + "com.google.android.gms:play-services-basement:aar:sources", + "com.google.android.gms:play-services-measurement-api:aar:sources", + "com.google.android.gms:play-services-measurement-base:aar:sources", + "com.google.android.gms:play-services-measurement-impl:aar:sources", + "com.google.android.gms:play-services-measurement-sdk-api:aar:sources", + "com.google.android.gms:play-services-measurement-sdk:aar:sources", + "com.google.android.gms:play-services-measurement:aar:sources", + "com.google.android.gms:play-services-stats:aar:javadoc", + "com.google.android.gms:play-services-stats:aar:sources", + "com.google.android.gms:play-services-tasks:aar:javadoc", + "com.google.android.gms:play-services-tasks:aar:sources", + "com.google.android.gms:strict-version-matcher-plugin:jar:javadoc", + "com.google.android.gms:strict-version-matcher-plugin:jar:sources", + "com.google.android.material:material:jar:javadoc", + "com.google.firebase:firebase-analytics:jar:sources", + "com.google.firebase:firebase-crashlytics:jar:sources", + "com.google.firebase:firebase-iid-interop:aar:javadoc", + "com.google.firebase:firebase-iid-interop:aar:sources", + "com.google.firebase:firebase-iid:aar:sources", + "com.google.firebase:firebase-installations-interop:aar:sources", + "com.google.firebase:firebase-installations:aar:sources", + "com.google.firebase:firebase-measurement-connector:aar:javadoc", + "com.google.firebase:firebase-measurement-connector:aar:sources", + "com.google.guava:listenablefuture:jar:javadoc", + "com.google.guava:listenablefuture:jar:sources", + "io.fabric.sdk.android:fabric:aar:javadoc", + "io.fabric.sdk.android:fabric:aar:sources", + "io.fabric.sdk.android:fabric:jar:javadoc", + "io.fabric.sdk.android:fabric:jar:sources", + "javax.annotation:jsr250-api:jar:javadoc", + "nl.dionsegijn:konfetti:jar:javadoc" + ], + "packages": { + "android.arch.core:common": [ + "android.arch.core.internal", + "android.arch.core.util" + ], + "androidx.annotation:annotation": [ + "androidx.annotation" + ], + "androidx.arch.core:core-common": [ + "androidx.arch.core.internal", + "androidx.arch.core.util" + ], + "androidx.collection:collection": [ + "androidx.collection" + ], + "androidx.constraintlayout:constraintlayout-solver": [ + "androidx.constraintlayout.solver", + "androidx.constraintlayout.solver.state", + "androidx.constraintlayout.solver.state.helpers", + "androidx.constraintlayout.solver.widgets", + "androidx.constraintlayout.solver.widgets.analyzer" + ], + "androidx.databinding:databinding-common": [ + "androidx.databinding" + ], + "androidx.databinding:databinding-compiler": [ + "android.databinding.annotationprocessor", + "android.databinding.tool", + "android.databinding.tool.expr", + "android.databinding.tool.reflection", + "android.databinding.tool.reflection.annotation", + "android.databinding.tool.solver", + "android.databinding.tool.store", + "android.databinding.tool.util", + "android.databinding.tool.writer" + ], + "androidx.databinding:databinding-compiler-common": [ + "android.databinding.parser", + "android.databinding.tool", + "android.databinding.tool.expr", + "android.databinding.tool.ext", + "android.databinding.tool.processing", + "android.databinding.tool.processing.scopes", + "android.databinding.tool.store", + "android.databinding.tool.util", + "android.databinding.tool.writer" + ], + "androidx.lifecycle:lifecycle-common": [ + "androidx.lifecycle" + ], + "androidx.room:room-common": [ + "androidx.room" + ], + "com.almworks.sqlite4java:sqlite4java": [ + "com.almworks.sqlite4java", + "javolution.util.stripped" + ], + "com.android.databinding:baseLibrary": [ + "android.databinding" + ], + "com.android.support:support-annotations": [ + "android.support.annotation" + ], + "com.android.tools.build.jetifier:jetifier-core": [ + "com.android.tools.build.jetifier.core", + "com.android.tools.build.jetifier.core.config", + "com.android.tools.build.jetifier.core.pom", + "com.android.tools.build.jetifier.core.proguard", + "com.android.tools.build.jetifier.core.rule", + "com.android.tools.build.jetifier.core.type", + "com.android.tools.build.jetifier.core.utils" + ], + "com.android.tools.build:aapt2-proto": [ + "android.aapt.pb.internal", + "com.android.aapt" + ], + "com.android.tools:annotations": [ + "com.android.annotations", + "com.android.annotations.concurrency" + ], + "com.github.bumptech.glide:annotations": [ + "com.bumptech.glide.annotation", + "com.bumptech.glide.annotation.compiler" + ], + "com.github.bumptech.glide:compiler": [ + "com.bumptech.glide.annotation.compiler", + "com.bumptech.glide.repackaged.com.google.common.base", + "com.bumptech.glide.repackaged.com.google.common.collect", + "com.bumptech.glide.repackaged.com.squareup.javapoet" + ], + "com.github.bumptech.glide:disklrucache": [ + "com.bumptech.glide.disklrucache" + ], + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework": [ + "com.google.android.apps.common.testing.accessibility.framework", + "com.google.android.apps.common.testing.accessibility.framework.integrations", + "com.google.android.apps.common.testing.accessibility.framework.integrations.espresso", + "com.googlecode.eyesfree.compat", + "com.googlecode.eyesfree.utils" + ], + "com.google.android.gms:strict-version-matcher-plugin": [ + "com.google.android.gms", + "com.google.android.gms.dependencies" + ], + "com.google.auto.service:auto-service-annotations": [ + "com.google.auto.service" + ], + "com.google.auto.value:auto-value-annotations": [ + "com.google.auto.value", + "com.google.auto.value.extension.memoized", + "com.google.auto.value.extension.serializable", + "com.google.auto.value.extension.toprettystring" + ], + "com.google.code.findbugs:jsr305": [ + "javax.annotation", + "javax.annotation.concurrent", + "javax.annotation.meta" + ], + "com.google.code.gson:gson": [ + "com.google.gson", + "com.google.gson.annotations", + "com.google.gson.internal", + "com.google.gson.internal.bind", + "com.google.gson.internal.bind.util", + "com.google.gson.internal.reflect", + "com.google.gson.reflect", + "com.google.gson.stream" + ], + "com.google.dagger:dagger": [ + "dagger", + "dagger.internal", + "dagger.multibindings" + ], + "com.google.dagger:dagger-compiler": [ + "dagger.internal.codegen", + "dagger.internal.codegen.base", + "dagger.internal.codegen.binding", + "dagger.internal.codegen.bindinggraphvalidation", + "dagger.internal.codegen.compileroption", + "dagger.internal.codegen.javapoet", + "dagger.internal.codegen.kotlin", + "dagger.internal.codegen.langmodel", + "dagger.internal.codegen.statistics", + "dagger.internal.codegen.validation", + "dagger.internal.codegen.writing", + "dagger.model", + "dagger.shaded.auto.common" + ], + "com.google.dagger:dagger-producers": [ + "dagger.producers", + "dagger.producers.internal", + "dagger.producers.monitoring", + "dagger.producers.monitoring.internal" + ], + "com.google.dagger:dagger-spi": [ + "dagger.internal.codegen.extension", + "dagger.model", + "dagger.shaded.auto.common", + "dagger.spi" + ], + "com.google.errorprone:error_prone_annotations": [ + "com.google.errorprone.annotations", + "com.google.errorprone.annotations.concurrent" + ], + "com.google.errorprone:javac-shaded": [ + "org.openjdk.javax.annotation.processing", + "org.openjdk.javax.lang.model", + "org.openjdk.javax.lang.model.element", + "org.openjdk.javax.lang.model.type", + "org.openjdk.javax.lang.model.util", + "org.openjdk.javax.tools", + "org.openjdk.source.doctree", + "org.openjdk.source.tree", + "org.openjdk.source.util", + "org.openjdk.tools.doclint", + "org.openjdk.tools.doclint.resources", + "org.openjdk.tools.javac", + "org.openjdk.tools.javac.api", + "org.openjdk.tools.javac.code", + "org.openjdk.tools.javac.comp", + "org.openjdk.tools.javac.file", + "org.openjdk.tools.javac.jvm", + "org.openjdk.tools.javac.main", + "org.openjdk.tools.javac.model", + "org.openjdk.tools.javac.parser", + "org.openjdk.tools.javac.platform", + "org.openjdk.tools.javac.processing", + "org.openjdk.tools.javac.resources", + "org.openjdk.tools.javac.tree", + "org.openjdk.tools.javac.util", + "org.openjdk.tools.javah", + "org.openjdk.tools.javah.resources", + "org.openjdk.tools.sjavac", + "org.openjdk.tools.sjavac.client", + "org.openjdk.tools.sjavac.comp", + "org.openjdk.tools.sjavac.comp.dependencies", + "org.openjdk.tools.sjavac.options", + "org.openjdk.tools.sjavac.pubapi", + "org.openjdk.tools.sjavac.server", + "org.openjdk.tools.sjavac.server.log" + ], + "com.google.gms:google-services": [ + "com.google.gms.googleservices" + ], + "com.google.googlejavaformat:google-java-format": [ + "com.google.googlejavaformat", + "com.google.googlejavaformat.java", + "com.google.googlejavaformat.java.filer", + "com.google.googlejavaformat.java.javadoc" + ], + "com.google.guava:failureaccess": [ + "com.google.common.util.concurrent.internal" + ], + "com.google.guava:guava": [ + "com.google.common.annotations", + "com.google.common.base", + "com.google.common.base.internal", + "com.google.common.cache", + "com.google.common.collect", + "com.google.common.escape", + "com.google.common.eventbus", + "com.google.common.graph", + "com.google.common.hash", + "com.google.common.html", + "com.google.common.io", + "com.google.common.math", + "com.google.common.net", + "com.google.common.primitives", + "com.google.common.reflect", + "com.google.common.util.concurrent", + "com.google.common.xml", + "com.google.thirdparty.publicsuffix" + ], + "com.google.j2objc:j2objc-annotations": [ + "com.google.j2objc.annotations" + ], + "com.google.protobuf:protobuf-java": [ + "com.google.protobuf", + "com.google.protobuf.compiler" + ], + "com.google.protobuf:protobuf-javalite": [ + "com.google.protobuf" + ], + "com.google.truth.extensions:truth-liteproto-extension": [ + "com.google.common.truth.extensions.proto" + ], + "com.google.truth:truth": [ + "com.google.common.truth" + ], + "com.googlecode.juniversalchardet:juniversalchardet": [ + "org.mozilla.universalchardet", + "org.mozilla.universalchardet.prober", + "org.mozilla.universalchardet.prober.contextanalysis", + "org.mozilla.universalchardet.prober.distributionanalysis", + "org.mozilla.universalchardet.prober.sequence", + "org.mozilla.universalchardet.prober.statemachine" + ], + "com.ibm.icu:icu4j": [ + "com.ibm.icu.impl", + "com.ibm.icu.impl.coll", + "com.ibm.icu.impl.data", + "com.ibm.icu.impl.duration", + "com.ibm.icu.impl.duration.impl", + "com.ibm.icu.impl.locale", + "com.ibm.icu.lang", + "com.ibm.icu.math", + "com.ibm.icu.text", + "com.ibm.icu.util" + ], + "com.squareup.moshi:moshi": [ + "com.squareup.moshi", + "com.squareup.moshi.internal" + ], + "com.squareup.moshi:moshi-kotlin": [ + "com.squareup.moshi", + "com.squareup.moshi.kotlin.reflect" + ], + "com.squareup.moshi:moshi-kotlin-codegen": [ + "com.squareup.moshi.kotlin.codegen", + "com.squareup.moshi.kotlin.codegen.api", + "com.squareup.moshi.kotlinpoet.classinspector.elements", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.auto.common", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.annotations", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.base", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.cache", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.collect", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.escape", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.eventbus", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.graph", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.hash", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.html", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.io", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.math", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.net", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.primitives", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.reflect", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.util.concurrent", + "com.squareup.moshi.kotlinpoet.classinspector.elements.shaded.com.google.common.xml", + "com.squareup.moshi.kotlinpoet.metadata", + "com.squareup.moshi.kotlinpoet.metadata.specs", + "com.squareup.moshi.kotlinpoet.metadata.specs.internal", + "com.squareup.moshi.kotlinx.metadata", + "com.squareup.moshi.kotlinx.metadata.impl", + "com.squareup.moshi.kotlinx.metadata.impl.extensions", + "com.squareup.moshi.kotlinx.metadata.internal.metadata", + "com.squareup.moshi.kotlinx.metadata.internal.metadata.builtins", + "com.squareup.moshi.kotlinx.metadata.internal.metadata.deserialization", + "com.squareup.moshi.kotlinx.metadata.internal.metadata.jvm", + "com.squareup.moshi.kotlinx.metadata.internal.metadata.jvm.deserialization", + "com.squareup.moshi.kotlinx.metadata.internal.metadata.jvm.serialization", + "com.squareup.moshi.kotlinx.metadata.internal.metadata.serialization", + "com.squareup.moshi.kotlinx.metadata.internal.protobuf", + "com.squareup.moshi.kotlinx.metadata.jvm", + "com.squareup.moshi.kotlinx.metadata.jvm.impl" + ], + "com.squareup.okhttp3:mockwebserver": [ + "okhttp3.internal.duplex", + "okhttp3.mockwebserver", + "okhttp3.mockwebserver.internal.duplex" + ], + "com.squareup.okhttp3:okhttp": [ + "okhttp3", + "okhttp3.internal", + "okhttp3.internal.authenticator", + "okhttp3.internal.cache", + "okhttp3.internal.cache2", + "okhttp3.internal.concurrent", + "okhttp3.internal.connection", + "okhttp3.internal.http", + "okhttp3.internal.http1", + "okhttp3.internal.http2", + "okhttp3.internal.io", + "okhttp3.internal.platform", + "okhttp3.internal.platform.android", + "okhttp3.internal.proxy", + "okhttp3.internal.publicsuffix", + "okhttp3.internal.tls", + "okhttp3.internal.ws" + ], + "com.squareup.okio:okio": [ + "okio", + "okio.internal" + ], + "com.squareup.retrofit2:converter-moshi": [ + "retrofit2.converter.moshi" + ], + "com.squareup.retrofit2:retrofit": [ + "retrofit2", + "retrofit2.http", + "retrofit2.internal" + ], + "com.squareup.retrofit2:retrofit-mock": [ + "retrofit2.mock" + ], + "com.squareup:javapoet": [ + "com.squareup.javapoet" + ], + "com.squareup:javawriter": [ + "com.squareup.javawriter" + ], + "com.squareup:kotlinpoet": [ + "com.squareup.kotlinpoet", + "com.squareup.kotlinpoet.jvm" + ], + "commons-codec:commons-codec": [ + "org.apache.commons.codec", + "org.apache.commons.codec.binary", + "org.apache.commons.codec.digest", + "org.apache.commons.codec.language", + "org.apache.commons.codec.language.bm", + "org.apache.commons.codec.net" + ], + "commons-io:commons-io": [ + "org.apache.commons.io", + "org.apache.commons.io.comparator", + "org.apache.commons.io.filefilter", + "org.apache.commons.io.input", + "org.apache.commons.io.monitor", + "org.apache.commons.io.output" + ], + "javax.annotation:javax.annotation-api": [ + "javax.annotation", + "javax.annotation.security", + "javax.annotation.sql" + ], + "javax.annotation:jsr250-api": [ + "javax.annotation", + "javax.annotation.security" + ], + "javax.inject:javax.inject": [ + "javax.inject" + ], + "junit:junit": [ + "junit.extensions", + "junit.framework", + "junit.runner", + "junit.textui", + "org.junit", + "org.junit.experimental", + "org.junit.experimental.categories", + "org.junit.experimental.max", + "org.junit.experimental.results", + "org.junit.experimental.runners", + "org.junit.experimental.theories", + "org.junit.experimental.theories.internal", + "org.junit.experimental.theories.suppliers", + "org.junit.function", + "org.junit.internal", + "org.junit.internal.builders", + "org.junit.internal.management", + "org.junit.internal.matchers", + "org.junit.internal.requests", + "org.junit.internal.runners", + "org.junit.internal.runners.model", + "org.junit.internal.runners.rules", + "org.junit.internal.runners.statements", + "org.junit.matchers", + "org.junit.rules", + "org.junit.runner", + "org.junit.runner.manipulation", + "org.junit.runner.notification", + "org.junit.runners", + "org.junit.runners.model", + "org.junit.runners.parameterized", + "org.junit.validator" + ], + "net.bytebuddy:byte-buddy": [ + "net.bytebuddy", + "net.bytebuddy.agent.builder", + "net.bytebuddy.asm", + "net.bytebuddy.build", + "net.bytebuddy.description", + "net.bytebuddy.description.annotation", + "net.bytebuddy.description.enumeration", + "net.bytebuddy.description.field", + "net.bytebuddy.description.method", + "net.bytebuddy.description.modifier", + "net.bytebuddy.description.type", + "net.bytebuddy.dynamic", + "net.bytebuddy.dynamic.loading", + "net.bytebuddy.dynamic.scaffold", + "net.bytebuddy.dynamic.scaffold.inline", + "net.bytebuddy.dynamic.scaffold.subclass", + "net.bytebuddy.implementation", + "net.bytebuddy.implementation.attribute", + "net.bytebuddy.implementation.auxiliary", + "net.bytebuddy.implementation.bind", + "net.bytebuddy.implementation.bind.annotation", + "net.bytebuddy.implementation.bytecode", + "net.bytebuddy.implementation.bytecode.assign", + "net.bytebuddy.implementation.bytecode.assign.primitive", + "net.bytebuddy.implementation.bytecode.assign.reference", + "net.bytebuddy.implementation.bytecode.collection", + "net.bytebuddy.implementation.bytecode.constant", + "net.bytebuddy.implementation.bytecode.member", + "net.bytebuddy.jar.asm", + "net.bytebuddy.jar.asm.commons", + "net.bytebuddy.jar.asm.signature", + "net.bytebuddy.matcher", + "net.bytebuddy.pool", + "net.bytebuddy.utility", + "net.bytebuddy.utility.privilege", + "net.bytebuddy.utility.visitor" + ], + "net.bytebuddy:byte-buddy-agent": [ + "net.bytebuddy.agent" + ], + "net.bytebuddy:byte-buddy:jar:sources": [ + "net.bytebuddy.build" + ], + "net.ltgt.gradle.incap:incap": [ + "net.ltgt.gradle.incap" + ], + "net.sf.kxml:kxml2": [ + "org.kxml2.io", + "org.kxml2.kdom", + "org.kxml2.wap", + "org.kxml2.wap.syncml", + "org.kxml2.wap.wml", + "org.kxml2.wap.wv", + "org.xmlpull.v1" + ], + "org.antlr:antlr4": [ + "org.abego.treelayout", + "org.abego.treelayout.internal.util", + "org.abego.treelayout.internal.util.java.lang", + "org.abego.treelayout.internal.util.java.lang.string", + "org.abego.treelayout.internal.util.java.util", + "org.abego.treelayout.util", + "org.antlr.runtime", + "org.antlr.runtime.debug", + "org.antlr.runtime.misc", + "org.antlr.runtime.tree", + "org.antlr.v4", + "org.antlr.v4.analysis", + "org.antlr.v4.automata", + "org.antlr.v4.codegen", + "org.antlr.v4.codegen.model", + "org.antlr.v4.codegen.model.chunk", + "org.antlr.v4.codegen.model.decl", + "org.antlr.v4.codegen.target", + "org.antlr.v4.gui", + "org.antlr.v4.misc", + "org.antlr.v4.parse", + "org.antlr.v4.runtime", + "org.antlr.v4.runtime.atn", + "org.antlr.v4.runtime.dfa", + "org.antlr.v4.runtime.misc", + "org.antlr.v4.runtime.tree", + "org.antlr.v4.runtime.tree.pattern", + "org.antlr.v4.runtime.tree.xpath", + "org.antlr.v4.semantics", + "org.antlr.v4.tool", + "org.antlr.v4.tool.ast", + "org.stringtemplate.v4", + "org.stringtemplate.v4.compiler", + "org.stringtemplate.v4.debug", + "org.stringtemplate.v4.gui", + "org.stringtemplate.v4.misc" + ], + "org.bouncycastle:bcprov-jdk15on": [ + "org.bouncycastle", + "org.bouncycastle.asn1", + "org.bouncycastle.asn1.anssi", + "org.bouncycastle.asn1.bc", + "org.bouncycastle.asn1.bsi", + "org.bouncycastle.asn1.cmc", + "org.bouncycastle.asn1.cmp", + "org.bouncycastle.asn1.cms", + "org.bouncycastle.asn1.cms.ecc", + "org.bouncycastle.asn1.crmf", + "org.bouncycastle.asn1.cryptlib", + "org.bouncycastle.asn1.cryptopro", + "org.bouncycastle.asn1.dvcs", + "org.bouncycastle.asn1.eac", + "org.bouncycastle.asn1.edec", + "org.bouncycastle.asn1.esf", + "org.bouncycastle.asn1.ess", + "org.bouncycastle.asn1.est", + "org.bouncycastle.asn1.gm", + "org.bouncycastle.asn1.gnu", + "org.bouncycastle.asn1.iana", + "org.bouncycastle.asn1.icao", + "org.bouncycastle.asn1.isara", + "org.bouncycastle.asn1.isismtt", + "org.bouncycastle.asn1.isismtt.ocsp", + "org.bouncycastle.asn1.isismtt.x509", + "org.bouncycastle.asn1.iso", + "org.bouncycastle.asn1.kisa", + "org.bouncycastle.asn1.microsoft", + "org.bouncycastle.asn1.misc", + "org.bouncycastle.asn1.mozilla", + "org.bouncycastle.asn1.nist", + "org.bouncycastle.asn1.nsri", + "org.bouncycastle.asn1.ntt", + "org.bouncycastle.asn1.ocsp", + "org.bouncycastle.asn1.oiw", + "org.bouncycastle.asn1.pkcs", + "org.bouncycastle.asn1.rosstandart", + "org.bouncycastle.asn1.sec", + "org.bouncycastle.asn1.smime", + "org.bouncycastle.asn1.teletrust", + "org.bouncycastle.asn1.tsp", + "org.bouncycastle.asn1.ua", + "org.bouncycastle.asn1.util", + "org.bouncycastle.asn1.x500", + "org.bouncycastle.asn1.x500.style", + "org.bouncycastle.asn1.x509", + "org.bouncycastle.asn1.x509.qualified", + "org.bouncycastle.asn1.x509.sigi", + "org.bouncycastle.asn1.x9", + "org.bouncycastle.crypto", + "org.bouncycastle.crypto.agreement", + "org.bouncycastle.crypto.agreement.jpake", + "org.bouncycastle.crypto.agreement.kdf", + "org.bouncycastle.crypto.agreement.srp", + "org.bouncycastle.crypto.commitments", + "org.bouncycastle.crypto.digests", + "org.bouncycastle.crypto.ec", + "org.bouncycastle.crypto.encodings", + "org.bouncycastle.crypto.engines", + "org.bouncycastle.crypto.examples", + "org.bouncycastle.crypto.generators", + "org.bouncycastle.crypto.io", + "org.bouncycastle.crypto.kems", + "org.bouncycastle.crypto.macs", + "org.bouncycastle.crypto.modes", + "org.bouncycastle.crypto.modes.gcm", + "org.bouncycastle.crypto.modes.kgcm", + "org.bouncycastle.crypto.paddings", + "org.bouncycastle.crypto.params", + "org.bouncycastle.crypto.parsers", + "org.bouncycastle.crypto.prng", + "org.bouncycastle.crypto.prng.drbg", + "org.bouncycastle.crypto.signers", + "org.bouncycastle.crypto.util", + "org.bouncycastle.i18n", + "org.bouncycastle.i18n.filter", + "org.bouncycastle.iana", + "org.bouncycastle.jcajce", + "org.bouncycastle.jcajce.interfaces", + "org.bouncycastle.jcajce.io", + "org.bouncycastle.jcajce.provider.asymmetric", + "org.bouncycastle.jcajce.provider.asymmetric.dh", + "org.bouncycastle.jcajce.provider.asymmetric.dsa", + "org.bouncycastle.jcajce.provider.asymmetric.dstu", + "org.bouncycastle.jcajce.provider.asymmetric.ec", + "org.bouncycastle.jcajce.provider.asymmetric.ecgost", + "org.bouncycastle.jcajce.provider.asymmetric.ecgost12", + "org.bouncycastle.jcajce.provider.asymmetric.edec", + "org.bouncycastle.jcajce.provider.asymmetric.elgamal", + "org.bouncycastle.jcajce.provider.asymmetric.gost", + "org.bouncycastle.jcajce.provider.asymmetric.ies", + "org.bouncycastle.jcajce.provider.asymmetric.rsa", + "org.bouncycastle.jcajce.provider.asymmetric.util", + "org.bouncycastle.jcajce.provider.asymmetric.x509", + "org.bouncycastle.jcajce.provider.config", + "org.bouncycastle.jcajce.provider.digest", + "org.bouncycastle.jcajce.provider.drbg", + "org.bouncycastle.jcajce.provider.keystore", + "org.bouncycastle.jcajce.provider.keystore.bc", + "org.bouncycastle.jcajce.provider.keystore.bcfks", + "org.bouncycastle.jcajce.provider.keystore.pkcs12", + "org.bouncycastle.jcajce.provider.symmetric", + "org.bouncycastle.jcajce.provider.symmetric.util", + "org.bouncycastle.jcajce.provider.util", + "org.bouncycastle.jcajce.spec", + "org.bouncycastle.jcajce.util", + "org.bouncycastle.jce", + "org.bouncycastle.jce.exception", + "org.bouncycastle.jce.interfaces", + "org.bouncycastle.jce.netscape", + "org.bouncycastle.jce.provider", + "org.bouncycastle.jce.spec", + "org.bouncycastle.math", + "org.bouncycastle.math.ec", + "org.bouncycastle.math.ec.custom.djb", + "org.bouncycastle.math.ec.custom.gm", + "org.bouncycastle.math.ec.custom.sec", + "org.bouncycastle.math.ec.endo", + "org.bouncycastle.math.ec.rfc7748", + "org.bouncycastle.math.ec.rfc8032", + "org.bouncycastle.math.ec.tools", + "org.bouncycastle.math.field", + "org.bouncycastle.math.raw", + "org.bouncycastle.pqc.asn1", + "org.bouncycastle.pqc.crypto", + "org.bouncycastle.pqc.crypto.gmss", + "org.bouncycastle.pqc.crypto.gmss.util", + "org.bouncycastle.pqc.crypto.lms", + "org.bouncycastle.pqc.crypto.mceliece", + "org.bouncycastle.pqc.crypto.newhope", + "org.bouncycastle.pqc.crypto.qtesla", + "org.bouncycastle.pqc.crypto.rainbow", + "org.bouncycastle.pqc.crypto.rainbow.util", + "org.bouncycastle.pqc.crypto.sphincs", + "org.bouncycastle.pqc.crypto.util", + "org.bouncycastle.pqc.crypto.xmss", + "org.bouncycastle.pqc.jcajce.interfaces", + "org.bouncycastle.pqc.jcajce.provider", + "org.bouncycastle.pqc.jcajce.provider.gmss", + "org.bouncycastle.pqc.jcajce.provider.lms", + "org.bouncycastle.pqc.jcajce.provider.mceliece", + "org.bouncycastle.pqc.jcajce.provider.newhope", + "org.bouncycastle.pqc.jcajce.provider.qtesla", + "org.bouncycastle.pqc.jcajce.provider.rainbow", + "org.bouncycastle.pqc.jcajce.provider.sphincs", + "org.bouncycastle.pqc.jcajce.provider.util", + "org.bouncycastle.pqc.jcajce.provider.xmss", + "org.bouncycastle.pqc.jcajce.spec", + "org.bouncycastle.pqc.math.linearalgebra", + "org.bouncycastle.util", + "org.bouncycastle.util.encoders", + "org.bouncycastle.util.io", + "org.bouncycastle.util.io.pem", + "org.bouncycastle.util.test", + "org.bouncycastle.x509", + "org.bouncycastle.x509.extension", + "org.bouncycastle.x509.util" + ], + "org.checkerframework:checker-compat-qual": [ + "org.checkerframework.checker.nullness.compatqual" + ], + "org.checkerframework:checker-qual": [ + "org.checkerframework.checker.builder.qual", + "org.checkerframework.checker.calledmethods.qual", + "org.checkerframework.checker.compilermsgs.qual", + "org.checkerframework.checker.fenum.qual", + "org.checkerframework.checker.formatter.qual", + "org.checkerframework.checker.guieffect.qual", + "org.checkerframework.checker.i18n.qual", + "org.checkerframework.checker.i18nformatter.qual", + "org.checkerframework.checker.index.qual", + "org.checkerframework.checker.initialization.qual", + "org.checkerframework.checker.interning.qual", + "org.checkerframework.checker.lock.qual", + "org.checkerframework.checker.nullness.qual", + "org.checkerframework.checker.optional.qual", + "org.checkerframework.checker.propkey.qual", + "org.checkerframework.checker.regex.qual", + "org.checkerframework.checker.signature.qual", + "org.checkerframework.checker.signedness.qual", + "org.checkerframework.checker.tainting.qual", + "org.checkerframework.checker.units.qual", + "org.checkerframework.common.aliasing.qual", + "org.checkerframework.common.initializedfields.qual", + "org.checkerframework.common.reflection.qual", + "org.checkerframework.common.returnsreceiver.qual", + "org.checkerframework.common.subtyping.qual", + "org.checkerframework.common.util.report.qual", + "org.checkerframework.common.value.qual", + "org.checkerframework.dataflow.qual", + "org.checkerframework.framework.qual" + ], + "org.hamcrest:hamcrest-core": [ + "org.hamcrest", + "org.hamcrest.core", + "org.hamcrest.internal" + ], + "org.hamcrest:hamcrest-integration": [ + "org.hamcrest", + "org.hamcrest.integration" + ], + "org.hamcrest:hamcrest-library": [ + "org.hamcrest", + "org.hamcrest.beans", + "org.hamcrest.collection", + "org.hamcrest.number", + "org.hamcrest.object", + "org.hamcrest.text", + "org.hamcrest.xml" + ], + "org.jetbrains.intellij.deps:trove4j": [ + "gnu.trove", + "gnu.trove.decorator" + ], + "org.jetbrains.kotlin:kotlin-compiler-embeddable": [ + "javaslang", + "javaslang.collection", + "javaslang.concurrent", + "javaslang.control", + "javaslang.match", + "javaslang.match.annotation", + "javaslang.match.generator", + "javaslang.match.model", + "org.jetbrains.concurrency", + "org.jetbrains.ide", + "org.jetbrains.jps.model.java.impl", + "org.jetbrains.kotlin", + "org.jetbrains.kotlin.analyzer", + "org.jetbrains.kotlin.analyzer.common", + "org.jetbrains.kotlin.asJava", + "org.jetbrains.kotlin.asJava.builder", + "org.jetbrains.kotlin.asJava.classes", + "org.jetbrains.kotlin.asJava.elements", + "org.jetbrains.kotlin.asJava.finder", + "org.jetbrains.kotlin.backend.common", + "org.jetbrains.kotlin.backend.common.bridges", + "org.jetbrains.kotlin.backend.common.descriptors", + "org.jetbrains.kotlin.backend.common.extensions", + "org.jetbrains.kotlin.backend.common.ir", + "org.jetbrains.kotlin.backend.common.lower", + "org.jetbrains.kotlin.backend.common.lower.inline", + "org.jetbrains.kotlin.backend.common.lower.loops", + "org.jetbrains.kotlin.backend.common.lower.loops.handlers", + "org.jetbrains.kotlin.backend.common.lower.matchers", + "org.jetbrains.kotlin.backend.common.lower.optimizations", + "org.jetbrains.kotlin.backend.common.output", + "org.jetbrains.kotlin.backend.common.overrides", + "org.jetbrains.kotlin.backend.common.phaser", + "org.jetbrains.kotlin.backend.common.serialization", + "org.jetbrains.kotlin.backend.common.serialization.encodings", + "org.jetbrains.kotlin.backend.common.serialization.mangle", + "org.jetbrains.kotlin.backend.common.serialization.mangle.descriptor", + "org.jetbrains.kotlin.backend.common.serialization.mangle.ir", + "org.jetbrains.kotlin.backend.common.serialization.metadata", + "org.jetbrains.kotlin.backend.common.serialization.metadata.impl", + "org.jetbrains.kotlin.backend.common.serialization.proto", + "org.jetbrains.kotlin.backend.common.serialization.signature", + "org.jetbrains.kotlin.backend.jvm", + "org.jetbrains.kotlin.backend.jvm.codegen", + "org.jetbrains.kotlin.backend.jvm.descriptors", + "org.jetbrains.kotlin.backend.jvm.intrinsics", + "org.jetbrains.kotlin.backend.jvm.ir", + "org.jetbrains.kotlin.backend.jvm.lower", + "org.jetbrains.kotlin.backend.jvm.lower.indy", + "org.jetbrains.kotlin.backend.jvm.lower.inlineclasses", + "org.jetbrains.kotlin.backend.jvm.serialization", + "org.jetbrains.kotlin.backend.wasm", + "org.jetbrains.kotlin.backend.wasm.ir2wasm", + "org.jetbrains.kotlin.backend.wasm.lower", + "org.jetbrains.kotlin.backend.wasm.utils", + "org.jetbrains.kotlin.build", + "org.jetbrains.kotlin.build.report", + "org.jetbrains.kotlin.build.report.metrics", + "org.jetbrains.kotlin.builtins", + "org.jetbrains.kotlin.builtins.functions", + "org.jetbrains.kotlin.builtins.jvm", + "org.jetbrains.kotlin.builtins.konan", + "org.jetbrains.kotlin.cfg", + "org.jetbrains.kotlin.cfg.pseudocode", + "org.jetbrains.kotlin.cfg.pseudocode.instructions", + "org.jetbrains.kotlin.cfg.pseudocode.instructions.eval", + "org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps", + "org.jetbrains.kotlin.cfg.pseudocode.instructions.special", + "org.jetbrains.kotlin.cfg.pseudocodeTraverser", + "org.jetbrains.kotlin.cfg.variable", + "org.jetbrains.kotlin.checkers", + "org.jetbrains.kotlin.checkers.diagnostics", + "org.jetbrains.kotlin.checkers.diagnostics.factories", + "org.jetbrains.kotlin.checkers.utils", + "org.jetbrains.kotlin.cli.common", + "org.jetbrains.kotlin.cli.common.arguments", + "org.jetbrains.kotlin.cli.common.config", + "org.jetbrains.kotlin.cli.common.environment", + "org.jetbrains.kotlin.cli.common.extensions", + "org.jetbrains.kotlin.cli.common.messages", + "org.jetbrains.kotlin.cli.common.modules", + "org.jetbrains.kotlin.cli.common.output", + "org.jetbrains.kotlin.cli.common.profiling", + "org.jetbrains.kotlin.cli.common.repl", + "org.jetbrains.kotlin.cli.js", + "org.jetbrains.kotlin.cli.js.dce", + "org.jetbrains.kotlin.cli.js.internal", + "org.jetbrains.kotlin.cli.jvm", + "org.jetbrains.kotlin.cli.jvm.compiler", + "org.jetbrains.kotlin.cli.jvm.config", + "org.jetbrains.kotlin.cli.jvm.index", + "org.jetbrains.kotlin.cli.jvm.javac", + "org.jetbrains.kotlin.cli.jvm.modules", + "org.jetbrains.kotlin.cli.jvm.plugins", + "org.jetbrains.kotlin.cli.metadata", + "org.jetbrains.kotlin.codegen", + "org.jetbrains.kotlin.codegen.binding", + "org.jetbrains.kotlin.codegen.context", + "org.jetbrains.kotlin.codegen.coroutines", + "org.jetbrains.kotlin.codegen.extensions", + "org.jetbrains.kotlin.codegen.inline", + "org.jetbrains.kotlin.codegen.inline.coroutines", + "org.jetbrains.kotlin.codegen.intrinsics", + "org.jetbrains.kotlin.codegen.optimization", + "org.jetbrains.kotlin.codegen.optimization.boxing", + "org.jetbrains.kotlin.codegen.optimization.common", + "org.jetbrains.kotlin.codegen.optimization.fixStack", + "org.jetbrains.kotlin.codegen.optimization.nullCheck", + "org.jetbrains.kotlin.codegen.optimization.transformer", + "org.jetbrains.kotlin.codegen.pseudoInsns", + "org.jetbrains.kotlin.codegen.range", + "org.jetbrains.kotlin.codegen.range.comparison", + "org.jetbrains.kotlin.codegen.range.forLoop", + "org.jetbrains.kotlin.codegen.range.inExpression", + "org.jetbrains.kotlin.codegen.serialization", + "org.jetbrains.kotlin.codegen.signature", + "org.jetbrains.kotlin.codegen.state", + "org.jetbrains.kotlin.codegen.when", + "org.jetbrains.kotlin.com.google.common.base", + "org.jetbrains.kotlin.com.google.common.collect", + "org.jetbrains.kotlin.com.google.common.graph", + "org.jetbrains.kotlin.com.google.common.hash", + "org.jetbrains.kotlin.com.google.common.math", + "org.jetbrains.kotlin.com.google.common.primitives", + "org.jetbrains.kotlin.com.google.common.util.concurrent", + "org.jetbrains.kotlin.com.google.gwt.dev.js", + "org.jetbrains.kotlin.com.google.gwt.dev.js.parserExceptions", + "org.jetbrains.kotlin.com.google.gwt.dev.js.rhino", + "org.jetbrains.kotlin.com.intellij", + "org.jetbrains.kotlin.com.intellij.codeInsight", + "org.jetbrains.kotlin.com.intellij.codeInsight.completion.scope", + "org.jetbrains.kotlin.com.intellij.codeInsight.daemon.impl.analysis", + "org.jetbrains.kotlin.com.intellij.codeInsight.folding", + "org.jetbrains.kotlin.com.intellij.codeInsight.folding.impl", + "org.jetbrains.kotlin.com.intellij.codeInsight.javadoc", + "org.jetbrains.kotlin.com.intellij.codeInsight.runner", + "org.jetbrains.kotlin.com.intellij.codeWithMe", + "org.jetbrains.kotlin.com.intellij.concurrency", + "org.jetbrains.kotlin.com.intellij.core", + "org.jetbrains.kotlin.com.intellij.diagnostic", + "org.jetbrains.kotlin.com.intellij.extapi.psi", + "org.jetbrains.kotlin.com.intellij.formatting", + "org.jetbrains.kotlin.com.intellij.icons", + "org.jetbrains.kotlin.com.intellij.ide", + "org.jetbrains.kotlin.com.intellij.ide.highlighter", + "org.jetbrains.kotlin.com.intellij.ide.plugins", + "org.jetbrains.kotlin.com.intellij.ide.util", + "org.jetbrains.kotlin.com.intellij.injected.editor", + "org.jetbrains.kotlin.com.intellij.jna", + "org.jetbrains.kotlin.com.intellij.lang", + "org.jetbrains.kotlin.com.intellij.lang.folding", + "org.jetbrains.kotlin.com.intellij.lang.impl", + "org.jetbrains.kotlin.com.intellij.lang.injection", + "org.jetbrains.kotlin.com.intellij.lang.java", + "org.jetbrains.kotlin.com.intellij.lang.java.beans", + "org.jetbrains.kotlin.com.intellij.lang.java.lexer", + "org.jetbrains.kotlin.com.intellij.lang.java.parser", + "org.jetbrains.kotlin.com.intellij.lang.jvm", + "org.jetbrains.kotlin.com.intellij.lang.jvm.annotation", + "org.jetbrains.kotlin.com.intellij.lang.jvm.facade", + "org.jetbrains.kotlin.com.intellij.lang.jvm.types", + "org.jetbrains.kotlin.com.intellij.lexer", + "org.jetbrains.kotlin.com.intellij.mock", + "org.jetbrains.kotlin.com.intellij.model", + "org.jetbrains.kotlin.com.intellij.model.psi", + "org.jetbrains.kotlin.com.intellij.navigation", + "org.jetbrains.kotlin.com.intellij.openapi", + "org.jetbrains.kotlin.com.intellij.openapi.application", + "org.jetbrains.kotlin.com.intellij.openapi.application.ex", + "org.jetbrains.kotlin.com.intellij.openapi.application.impl", + "org.jetbrains.kotlin.com.intellij.openapi.command", + "org.jetbrains.kotlin.com.intellij.openapi.command.impl", + "org.jetbrains.kotlin.com.intellij.openapi.command.undo", + "org.jetbrains.kotlin.com.intellij.openapi.components", + "org.jetbrains.kotlin.com.intellij.openapi.diagnostic", + "org.jetbrains.kotlin.com.intellij.openapi.editor", + "org.jetbrains.kotlin.com.intellij.openapi.editor.actionSystem", + "org.jetbrains.kotlin.com.intellij.openapi.editor.colors", + "org.jetbrains.kotlin.com.intellij.openapi.editor.event", + "org.jetbrains.kotlin.com.intellij.openapi.editor.ex", + "org.jetbrains.kotlin.com.intellij.openapi.editor.impl", + "org.jetbrains.kotlin.com.intellij.openapi.editor.impl.event", + "org.jetbrains.kotlin.com.intellij.openapi.editor.markup", + "org.jetbrains.kotlin.com.intellij.openapi.extensions", + "org.jetbrains.kotlin.com.intellij.openapi.extensions.impl", + "org.jetbrains.kotlin.com.intellij.openapi.fileEditor", + "org.jetbrains.kotlin.com.intellij.openapi.fileEditor.impl", + "org.jetbrains.kotlin.com.intellij.openapi.fileTypes", + "org.jetbrains.kotlin.com.intellij.openapi.module", + "org.jetbrains.kotlin.com.intellij.openapi.progress", + "org.jetbrains.kotlin.com.intellij.openapi.progress.impl", + "org.jetbrains.kotlin.com.intellij.openapi.progress.util", + "org.jetbrains.kotlin.com.intellij.openapi.project", + "org.jetbrains.kotlin.com.intellij.openapi.projectRoots", + "org.jetbrains.kotlin.com.intellij.openapi.roots", + "org.jetbrains.kotlin.com.intellij.openapi.roots.impl", + "org.jetbrains.kotlin.com.intellij.openapi.ui", + "org.jetbrains.kotlin.com.intellij.openapi.util", + "org.jetbrains.kotlin.com.intellij.openapi.util.io", + "org.jetbrains.kotlin.com.intellij.openapi.util.io.win32", + "org.jetbrains.kotlin.com.intellij.openapi.util.objectTree", + "org.jetbrains.kotlin.com.intellij.openapi.util.registry", + "org.jetbrains.kotlin.com.intellij.openapi.util.text", + "org.jetbrains.kotlin.com.intellij.openapi.vfs", + "org.jetbrains.kotlin.com.intellij.openapi.vfs.encoding", + "org.jetbrains.kotlin.com.intellij.openapi.vfs.ex", + "org.jetbrains.kotlin.com.intellij.openapi.vfs.impl", + "org.jetbrains.kotlin.com.intellij.openapi.vfs.impl.jar", + "org.jetbrains.kotlin.com.intellij.openapi.vfs.local", + "org.jetbrains.kotlin.com.intellij.openapi.vfs.newvfs", + "org.jetbrains.kotlin.com.intellij.openapi.vfs.newvfs.events", + "org.jetbrains.kotlin.com.intellij.openapi.vfs.pointers", + "org.jetbrains.kotlin.com.intellij.openapi.wm.ex", + "org.jetbrains.kotlin.com.intellij.patterns", + "org.jetbrains.kotlin.com.intellij.patterns.compiler", + "org.jetbrains.kotlin.com.intellij.pom", + "org.jetbrains.kotlin.com.intellij.pom.event", + "org.jetbrains.kotlin.com.intellij.pom.impl", + "org.jetbrains.kotlin.com.intellij.pom.java", + "org.jetbrains.kotlin.com.intellij.pom.tree", + "org.jetbrains.kotlin.com.intellij.pom.tree.events", + "org.jetbrains.kotlin.com.intellij.pom.tree.events.impl", + "org.jetbrains.kotlin.com.intellij.psi", + "org.jetbrains.kotlin.com.intellij.psi.augment", + "org.jetbrains.kotlin.com.intellij.psi.codeStyle", + "org.jetbrains.kotlin.com.intellij.psi.compiled", + "org.jetbrains.kotlin.com.intellij.psi.controlFlow", + "org.jetbrains.kotlin.com.intellij.psi.css", + "org.jetbrains.kotlin.com.intellij.psi.filters", + "org.jetbrains.kotlin.com.intellij.psi.filters.classes", + "org.jetbrains.kotlin.com.intellij.psi.filters.element", + "org.jetbrains.kotlin.com.intellij.psi.filters.position", + "org.jetbrains.kotlin.com.intellij.psi.impl", + "org.jetbrains.kotlin.com.intellij.psi.impl.cache", + "org.jetbrains.kotlin.com.intellij.psi.impl.compiled", + "org.jetbrains.kotlin.com.intellij.psi.impl.file", + "org.jetbrains.kotlin.com.intellij.psi.impl.file.impl", + "org.jetbrains.kotlin.com.intellij.psi.impl.java.stubs", + "org.jetbrains.kotlin.com.intellij.psi.impl.java.stubs.impl", + "org.jetbrains.kotlin.com.intellij.psi.impl.java.stubs.index", + "org.jetbrains.kotlin.com.intellij.psi.impl.light", + "org.jetbrains.kotlin.com.intellij.psi.impl.meta", + "org.jetbrains.kotlin.com.intellij.psi.impl.search", + "org.jetbrains.kotlin.com.intellij.psi.impl.smartPointers", + "org.jetbrains.kotlin.com.intellij.psi.impl.source", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.codeStyle", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.javadoc", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.resolve", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.resolve.graphInference", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.resolve.graphInference.constraints", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.resolve.reference", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.resolve.reference.impl", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.resolve.reference.impl.manipulators", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.resolve.reference.impl.providers", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.tree", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.injected", + "org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.java", + "org.jetbrains.kotlin.com.intellij.psi.infos", + "org.jetbrains.kotlin.com.intellij.psi.javadoc", + "org.jetbrains.kotlin.com.intellij.psi.meta", + "org.jetbrains.kotlin.com.intellij.psi.presentation.java", + "org.jetbrains.kotlin.com.intellij.psi.scope", + "org.jetbrains.kotlin.com.intellij.psi.scope.conflictResolvers", + "org.jetbrains.kotlin.com.intellij.psi.scope.processor", + "org.jetbrains.kotlin.com.intellij.psi.scope.util", + "org.jetbrains.kotlin.com.intellij.psi.search", + "org.jetbrains.kotlin.com.intellij.psi.search.searches", + "org.jetbrains.kotlin.com.intellij.psi.stub", + "org.jetbrains.kotlin.com.intellij.psi.stubs", + "org.jetbrains.kotlin.com.intellij.psi.targets", + "org.jetbrains.kotlin.com.intellij.psi.templateLanguages", + "org.jetbrains.kotlin.com.intellij.psi.text", + "org.jetbrains.kotlin.com.intellij.psi.tree", + "org.jetbrains.kotlin.com.intellij.psi.tree.java", + "org.jetbrains.kotlin.com.intellij.psi.util", + "org.jetbrains.kotlin.com.intellij.reference", + "org.jetbrains.kotlin.com.intellij.serialization", + "org.jetbrains.kotlin.com.intellij.serviceContainer", + "org.jetbrains.kotlin.com.intellij.testFramework", + "org.jetbrains.kotlin.com.intellij.ui", + "org.jetbrains.kotlin.com.intellij.ui.icons", + "org.jetbrains.kotlin.com.intellij.util", + "org.jetbrains.kotlin.com.intellij.util.cls", + "org.jetbrains.kotlin.com.intellij.util.codeInsight", + "org.jetbrains.kotlin.com.intellij.util.concurrency", + "org.jetbrains.kotlin.com.intellij.util.containers", + "org.jetbrains.kotlin.com.intellij.util.containers.hash", + "org.jetbrains.kotlin.com.intellij.util.diff", + "org.jetbrains.kotlin.com.intellij.util.exception", + "org.jetbrains.kotlin.com.intellij.util.execution", + "org.jetbrains.kotlin.com.intellij.util.graph", + "org.jetbrains.kotlin.com.intellij.util.graph.impl", + "org.jetbrains.kotlin.com.intellij.util.indexing", + "org.jetbrains.kotlin.com.intellij.util.io", + "org.jetbrains.kotlin.com.intellij.util.io.keyStorage", + "org.jetbrains.kotlin.com.intellij.util.keyFMap", + "org.jetbrains.kotlin.com.intellij.util.lang", + "org.jetbrains.kotlin.com.intellij.util.loader", + "org.jetbrains.kotlin.com.intellij.util.messages", + "org.jetbrains.kotlin.com.intellij.util.messages.impl", + "org.jetbrains.kotlin.com.intellij.util.pico", + "org.jetbrains.kotlin.com.intellij.util.ref", + "org.jetbrains.kotlin.com.intellij.util.text", + "org.jetbrains.kotlin.com.intellij.util.xmlb", + "org.jetbrains.kotlin.com.intellij.util.xmlb.annotations", + "org.jetbrains.kotlin.com.intellij.xml.util", + "org.jetbrains.kotlin.compiler.plugin", + "org.jetbrains.kotlin.compilerRunner", + "org.jetbrains.kotlin.config", + "org.jetbrains.kotlin.container", + "org.jetbrains.kotlin.context", + "org.jetbrains.kotlin.contracts", + "org.jetbrains.kotlin.contracts.description", + "org.jetbrains.kotlin.contracts.description.expressions", + "org.jetbrains.kotlin.contracts.interpretation", + "org.jetbrains.kotlin.contracts.model", + "org.jetbrains.kotlin.contracts.model.functors", + "org.jetbrains.kotlin.contracts.model.structure", + "org.jetbrains.kotlin.contracts.model.visitors", + "org.jetbrains.kotlin.contracts.parsing", + "org.jetbrains.kotlin.contracts.parsing.effects", + "org.jetbrains.kotlin.coroutines", + "org.jetbrains.kotlin.descriptors", + "org.jetbrains.kotlin.descriptors.annotations", + "org.jetbrains.kotlin.descriptors.deserialization", + "org.jetbrains.kotlin.descriptors.impl", + "org.jetbrains.kotlin.descriptors.java", + "org.jetbrains.kotlin.descriptors.konan", + "org.jetbrains.kotlin.descriptors.konan.impl", + "org.jetbrains.kotlin.descriptors.runtime.components", + "org.jetbrains.kotlin.descriptors.runtime.structure", + "org.jetbrains.kotlin.descriptors.synthetic", + "org.jetbrains.kotlin.diagnostics", + "org.jetbrains.kotlin.diagnostics.rendering", + "org.jetbrains.kotlin.extensions", + "org.jetbrains.kotlin.extensions.internal", + "org.jetbrains.kotlin.fileClasses", + "org.jetbrains.kotlin.fir", + "org.jetbrains.kotlin.fir.analysis", + "org.jetbrains.kotlin.fir.analysis.cfa", + "org.jetbrains.kotlin.fir.analysis.checkers", + "org.jetbrains.kotlin.fir.analysis.checkers.cfa", + "org.jetbrains.kotlin.fir.analysis.checkers.context", + "org.jetbrains.kotlin.fir.analysis.checkers.declaration", + "org.jetbrains.kotlin.fir.analysis.checkers.expression", + "org.jetbrains.kotlin.fir.analysis.checkers.extended", + "org.jetbrains.kotlin.fir.analysis.collectors", + "org.jetbrains.kotlin.fir.analysis.collectors.components", + "org.jetbrains.kotlin.fir.analysis.diagnostics", + "org.jetbrains.kotlin.fir.analysis.extensions", + "org.jetbrains.kotlin.fir.backend", + "org.jetbrains.kotlin.fir.backend.evaluate", + "org.jetbrains.kotlin.fir.backend.generators", + "org.jetbrains.kotlin.fir.backend.jvm", + "org.jetbrains.kotlin.fir.builder", + "org.jetbrains.kotlin.fir.caches", + "org.jetbrains.kotlin.fir.checkers", + "org.jetbrains.kotlin.fir.contracts", + "org.jetbrains.kotlin.fir.contracts.builder", + "org.jetbrains.kotlin.fir.contracts.description", + "org.jetbrains.kotlin.fir.contracts.impl", + "org.jetbrains.kotlin.fir.declarations", + "org.jetbrains.kotlin.fir.declarations.builder", + "org.jetbrains.kotlin.fir.declarations.impl", + "org.jetbrains.kotlin.fir.declarations.synthetic", + "org.jetbrains.kotlin.fir.descriptors", + "org.jetbrains.kotlin.fir.deserialization", + "org.jetbrains.kotlin.fir.diagnostics", + "org.jetbrains.kotlin.fir.expressions", + "org.jetbrains.kotlin.fir.expressions.builder", + "org.jetbrains.kotlin.fir.expressions.impl", + "org.jetbrains.kotlin.fir.extensions", + "org.jetbrains.kotlin.fir.extensions.predicate", + "org.jetbrains.kotlin.fir.impl", + "org.jetbrains.kotlin.fir.java", + "org.jetbrains.kotlin.fir.java.declarations", + "org.jetbrains.kotlin.fir.java.deserialization", + "org.jetbrains.kotlin.fir.java.enhancement", + "org.jetbrains.kotlin.fir.java.scopes", + "org.jetbrains.kotlin.fir.lazy", + "org.jetbrains.kotlin.fir.lightTree", + "org.jetbrains.kotlin.fir.lightTree.converter", + "org.jetbrains.kotlin.fir.lightTree.fir", + "org.jetbrains.kotlin.fir.lightTree.fir.modifier", + "org.jetbrains.kotlin.fir.references", + "org.jetbrains.kotlin.fir.references.builder", + "org.jetbrains.kotlin.fir.references.impl", + "org.jetbrains.kotlin.fir.resolve", + "org.jetbrains.kotlin.fir.resolve.calls", + "org.jetbrains.kotlin.fir.resolve.calls.jvm", + "org.jetbrains.kotlin.fir.resolve.calls.tower", + "org.jetbrains.kotlin.fir.resolve.dfa", + "org.jetbrains.kotlin.fir.resolve.dfa.cfg", + "org.jetbrains.kotlin.fir.resolve.dfa.contracts", + "org.jetbrains.kotlin.fir.resolve.diagnostics", + "org.jetbrains.kotlin.fir.resolve.inference", + "org.jetbrains.kotlin.fir.resolve.inference.model", + "org.jetbrains.kotlin.fir.resolve.providers", + "org.jetbrains.kotlin.fir.resolve.providers.impl", + "org.jetbrains.kotlin.fir.resolve.scopes", + "org.jetbrains.kotlin.fir.resolve.substitution", + "org.jetbrains.kotlin.fir.resolve.transformers", + "org.jetbrains.kotlin.fir.resolve.transformers.body.resolve", + "org.jetbrains.kotlin.fir.resolve.transformers.contracts", + "org.jetbrains.kotlin.fir.resolve.transformers.plugin", + "org.jetbrains.kotlin.fir.scopes", + "org.jetbrains.kotlin.fir.scopes.impl", + "org.jetbrains.kotlin.fir.scopes.jvm", + "org.jetbrains.kotlin.fir.serialization", + "org.jetbrains.kotlin.fir.serialization.constant", + "org.jetbrains.kotlin.fir.session", + "org.jetbrains.kotlin.fir.signaturer", + "org.jetbrains.kotlin.fir.symbols", + "org.jetbrains.kotlin.fir.symbols.impl", + "org.jetbrains.kotlin.fir.types", + "org.jetbrains.kotlin.fir.types.builder", + "org.jetbrains.kotlin.fir.types.impl", + "org.jetbrains.kotlin.fir.types.jvm", + "org.jetbrains.kotlin.fir.utils", + "org.jetbrains.kotlin.fir.visitors", + "org.jetbrains.kotlin.frontend.di", + "org.jetbrains.kotlin.frontend.java.di", + "org.jetbrains.kotlin.frontend.js.di", + "org.jetbrains.kotlin.idea", + "org.jetbrains.kotlin.incremental", + "org.jetbrains.kotlin.incremental.components", + "org.jetbrains.kotlin.incremental.js", + "org.jetbrains.kotlin.incremental.multiproject", + "org.jetbrains.kotlin.incremental.parsing", + "org.jetbrains.kotlin.incremental.snapshots", + "org.jetbrains.kotlin.incremental.storage", + "org.jetbrains.kotlin.incremental.util", + "org.jetbrains.kotlin.inline", + "org.jetbrains.kotlin.ir", + "org.jetbrains.kotlin.ir.backend.js", + "org.jetbrains.kotlin.ir.backend.js.export", + "org.jetbrains.kotlin.ir.backend.js.ir", + "org.jetbrains.kotlin.ir.backend.js.lower", + "org.jetbrains.kotlin.ir.backend.js.lower.calls", + "org.jetbrains.kotlin.ir.backend.js.lower.cleanup", + "org.jetbrains.kotlin.ir.backend.js.lower.coroutines", + "org.jetbrains.kotlin.ir.backend.js.lower.inline", + "org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir", + "org.jetbrains.kotlin.ir.backend.js.transformers.irToJs", + "org.jetbrains.kotlin.ir.backend.js.utils", + "org.jetbrains.kotlin.ir.backend.jvm", + "org.jetbrains.kotlin.ir.backend.jvm.serialization", + "org.jetbrains.kotlin.ir.builders", + "org.jetbrains.kotlin.ir.builders.declarations", + "org.jetbrains.kotlin.ir.declarations", + "org.jetbrains.kotlin.ir.declarations.impl", + "org.jetbrains.kotlin.ir.declarations.lazy", + "org.jetbrains.kotlin.ir.declarations.persistent", + "org.jetbrains.kotlin.ir.declarations.persistent.carriers", + "org.jetbrains.kotlin.ir.descriptors", + "org.jetbrains.kotlin.ir.expressions", + "org.jetbrains.kotlin.ir.expressions.impl", + "org.jetbrains.kotlin.ir.expressions.persistent", + "org.jetbrains.kotlin.ir.interpreter", + "org.jetbrains.kotlin.ir.interpreter.builtins", + "org.jetbrains.kotlin.ir.interpreter.exceptions", + "org.jetbrains.kotlin.ir.interpreter.intrinsics", + "org.jetbrains.kotlin.ir.interpreter.stack", + "org.jetbrains.kotlin.ir.interpreter.state", + "org.jetbrains.kotlin.ir.linkage", + "org.jetbrains.kotlin.ir.overrides", + "org.jetbrains.kotlin.ir.symbols", + "org.jetbrains.kotlin.ir.symbols.impl", + "org.jetbrains.kotlin.ir.types", + "org.jetbrains.kotlin.ir.types.impl", + "org.jetbrains.kotlin.ir.util", + "org.jetbrains.kotlin.ir.visitors", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.booleans", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.bytes", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.chars", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.doubles", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.floats", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.ints", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.longs", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.objects", + "org.jetbrains.kotlin.it.unimi.dsi.fastutil.shorts", + "org.jetbrains.kotlin.javac", + "org.jetbrains.kotlin.javac.components", + "org.jetbrains.kotlin.javac.resolve", + "org.jetbrains.kotlin.javac.wrappers.symbols", + "org.jetbrains.kotlin.javac.wrappers.trees", + "org.jetbrains.kotlin.javax.inject", + "org.jetbrains.kotlin.js", + "org.jetbrains.kotlin.js.analyze", + "org.jetbrains.kotlin.js.analyzer", + "org.jetbrains.kotlin.js.backend", + "org.jetbrains.kotlin.js.backend.ast", + "org.jetbrains.kotlin.js.backend.ast.metadata", + "org.jetbrains.kotlin.js.common", + "org.jetbrains.kotlin.js.config", + "org.jetbrains.kotlin.js.coroutine", + "org.jetbrains.kotlin.js.dce", + "org.jetbrains.kotlin.js.descriptorUtils", + "org.jetbrains.kotlin.js.facade", + "org.jetbrains.kotlin.js.facade.exceptions", + "org.jetbrains.kotlin.js.inline", + "org.jetbrains.kotlin.js.inline.clean", + "org.jetbrains.kotlin.js.inline.context", + "org.jetbrains.kotlin.js.inline.util", + "org.jetbrains.kotlin.js.inline.util.collectors", + "org.jetbrains.kotlin.js.inline.util.rewriters", + "org.jetbrains.kotlin.js.naming", + "org.jetbrains.kotlin.js.parser", + "org.jetbrains.kotlin.js.parser.sourcemaps", + "org.jetbrains.kotlin.js.patterns", + "org.jetbrains.kotlin.js.patterns.typePredicates", + "org.jetbrains.kotlin.js.resolve", + "org.jetbrains.kotlin.js.resolve.diagnostics", + "org.jetbrains.kotlin.js.sourceMap", + "org.jetbrains.kotlin.js.translate.callTranslator", + "org.jetbrains.kotlin.js.translate.context", + "org.jetbrains.kotlin.js.translate.context.generator", + "org.jetbrains.kotlin.js.translate.declaration", + "org.jetbrains.kotlin.js.translate.expression", + "org.jetbrains.kotlin.js.translate.extensions", + "org.jetbrains.kotlin.js.translate.general", + "org.jetbrains.kotlin.js.translate.initializer", + "org.jetbrains.kotlin.js.translate.intrinsic", + "org.jetbrains.kotlin.js.translate.intrinsic.functions", + "org.jetbrains.kotlin.js.translate.intrinsic.functions.basic", + "org.jetbrains.kotlin.js.translate.intrinsic.functions.factories", + "org.jetbrains.kotlin.js.translate.intrinsic.objects", + "org.jetbrains.kotlin.js.translate.intrinsic.operation", + "org.jetbrains.kotlin.js.translate.operation", + "org.jetbrains.kotlin.js.translate.reference", + "org.jetbrains.kotlin.js.translate.test", + "org.jetbrains.kotlin.js.translate.utils", + "org.jetbrains.kotlin.js.translate.utils.jsAstUtils", + "org.jetbrains.kotlin.js.translate.utils.mutator", + "org.jetbrains.kotlin.js.util", + "org.jetbrains.kotlin.kapt3.diagnostic", + "org.jetbrains.kotlin.kdoc.lexer", + "org.jetbrains.kotlin.kdoc.parser", + "org.jetbrains.kotlin.kdoc.psi.api", + "org.jetbrains.kotlin.kdoc.psi.impl", + "org.jetbrains.kotlin.konan", + "org.jetbrains.kotlin.konan.file", + "org.jetbrains.kotlin.konan.library", + "org.jetbrains.kotlin.konan.properties", + "org.jetbrains.kotlin.konan.target", + "org.jetbrains.kotlin.konan.util", + "org.jetbrains.kotlin.kotlinx.collections.immutable", + "org.jetbrains.kotlin.kotlinx.collections.immutable.implementations.immutableList", + "org.jetbrains.kotlin.kotlinx.collections.immutable.implementations.immutableMap", + "org.jetbrains.kotlin.kotlinx.collections.immutable.implementations.persistentOrderedMap", + "org.jetbrains.kotlin.kotlinx.collections.immutable.implementations.persistentOrderedSet", + "org.jetbrains.kotlin.kotlinx.collections.immutable.internal", + "org.jetbrains.kotlin.lexer", + "org.jetbrains.kotlin.library", + "org.jetbrains.kotlin.library.impl", + "org.jetbrains.kotlin.library.metadata", + "org.jetbrains.kotlin.library.resolver", + "org.jetbrains.kotlin.library.resolver.impl", + "org.jetbrains.kotlin.load.java", + "org.jetbrains.kotlin.load.java.components", + "org.jetbrains.kotlin.load.java.descriptors", + "org.jetbrains.kotlin.load.java.lazy", + "org.jetbrains.kotlin.load.java.lazy.descriptors", + "org.jetbrains.kotlin.load.java.lazy.types", + "org.jetbrains.kotlin.load.java.sam", + "org.jetbrains.kotlin.load.java.sources", + "org.jetbrains.kotlin.load.java.structure", + "org.jetbrains.kotlin.load.java.structure.impl", + "org.jetbrains.kotlin.load.java.structure.impl.classFiles", + "org.jetbrains.kotlin.load.java.typeEnhancement", + "org.jetbrains.kotlin.load.kotlin", + "org.jetbrains.kotlin.load.kotlin.header", + "org.jetbrains.kotlin.load.kotlin.incremental", + "org.jetbrains.kotlin.load.kotlin.incremental.components", + "org.jetbrains.kotlin.metadata", + "org.jetbrains.kotlin.metadata.builtins", + "org.jetbrains.kotlin.metadata.deserialization", + "org.jetbrains.kotlin.metadata.java", + "org.jetbrains.kotlin.metadata.js", + "org.jetbrains.kotlin.metadata.jvm", + "org.jetbrains.kotlin.metadata.jvm.deserialization", + "org.jetbrains.kotlin.metadata.jvm.serialization", + "org.jetbrains.kotlin.metadata.serialization", + "org.jetbrains.kotlin.modules", + "org.jetbrains.kotlin.name", + "org.jetbrains.kotlin.net.jpountz.lz4", + "org.jetbrains.kotlin.net.jpountz.util", + "org.jetbrains.kotlin.net.jpountz.xxhash", + "org.jetbrains.kotlin.one.util.streamex", + "org.jetbrains.kotlin.org.apache.log4j", + "org.jetbrains.kotlin.org.fusesource.hawtjni.runtime", + "org.jetbrains.kotlin.org.fusesource.jansi", + "org.jetbrains.kotlin.org.fusesource.jansi.internal", + "org.jetbrains.kotlin.org.jdom", + "org.jetbrains.kotlin.org.jdom.filter", + "org.jetbrains.kotlin.org.jdom.filter2", + "org.jetbrains.kotlin.org.jdom.internal", + "org.jetbrains.kotlin.org.jdom.output", + "org.jetbrains.kotlin.org.jdom.output.support", + "org.jetbrains.kotlin.org.jline.keymap", + "org.jetbrains.kotlin.org.jline.reader", + "org.jetbrains.kotlin.org.jline.reader.impl", + "org.jetbrains.kotlin.org.jline.reader.impl.history", + "org.jetbrains.kotlin.org.jline.terminal", + "org.jetbrains.kotlin.org.jline.terminal.impl", + "org.jetbrains.kotlin.org.jline.terminal.impl.jansi", + "org.jetbrains.kotlin.org.jline.terminal.impl.jansi.freebsd", + "org.jetbrains.kotlin.org.jline.terminal.impl.jansi.linux", + "org.jetbrains.kotlin.org.jline.terminal.impl.jansi.osx", + "org.jetbrains.kotlin.org.jline.terminal.impl.jansi.win", + "org.jetbrains.kotlin.org.jline.terminal.impl.jna", + "org.jetbrains.kotlin.org.jline.terminal.impl.jna.freebsd", + "org.jetbrains.kotlin.org.jline.terminal.impl.jna.linux", + "org.jetbrains.kotlin.org.jline.terminal.impl.jna.osx", + "org.jetbrains.kotlin.org.jline.terminal.impl.jna.solaris", + "org.jetbrains.kotlin.org.jline.terminal.impl.jna.win", + "org.jetbrains.kotlin.org.jline.terminal.spi", + "org.jetbrains.kotlin.org.jline.utils", + "org.jetbrains.kotlin.org.picocontainer", + "org.jetbrains.kotlin.org.picocontainer.defaults", + "org.jetbrains.kotlin.parsing", + "org.jetbrains.kotlin.platform", + "org.jetbrains.kotlin.platform.js", + "org.jetbrains.kotlin.platform.jvm", + "org.jetbrains.kotlin.platform.konan", + "org.jetbrains.kotlin.progress", + "org.jetbrains.kotlin.progress.experimental", + "org.jetbrains.kotlin.protobuf", + "org.jetbrains.kotlin.psi", + "org.jetbrains.kotlin.psi.addRemoveModifier", + "org.jetbrains.kotlin.psi.codeFragmentUtil", + "org.jetbrains.kotlin.psi.debugText", + "org.jetbrains.kotlin.psi.findDocComment", + "org.jetbrains.kotlin.psi.psiUtil", + "org.jetbrains.kotlin.psi.stubs", + "org.jetbrains.kotlin.psi.stubs.elements", + "org.jetbrains.kotlin.psi.stubs.impl", + "org.jetbrains.kotlin.psi.synthetics", + "org.jetbrains.kotlin.psi.typeRefHelpers", + "org.jetbrains.kotlin.psi2ir", + "org.jetbrains.kotlin.psi2ir.generators", + "org.jetbrains.kotlin.psi2ir.intermediate", + "org.jetbrains.kotlin.psi2ir.transformations", + "org.jetbrains.kotlin.renderer", + "org.jetbrains.kotlin.resolve", + "org.jetbrains.kotlin.resolve.annotations", + "org.jetbrains.kotlin.resolve.bindingContextUtil", + "org.jetbrains.kotlin.resolve.calls", + "org.jetbrains.kotlin.resolve.calls.callResolverUtil", + "org.jetbrains.kotlin.resolve.calls.callUtil", + "org.jetbrains.kotlin.resolve.calls.checkers", + "org.jetbrains.kotlin.resolve.calls.components", + "org.jetbrains.kotlin.resolve.calls.context", + "org.jetbrains.kotlin.resolve.calls.inference", + "org.jetbrains.kotlin.resolve.calls.inference.components", + "org.jetbrains.kotlin.resolve.calls.inference.constraintPosition", + "org.jetbrains.kotlin.resolve.calls.inference.model", + "org.jetbrains.kotlin.resolve.calls.model", + "org.jetbrains.kotlin.resolve.calls.resolvedCallUtil", + "org.jetbrains.kotlin.resolve.calls.results", + "org.jetbrains.kotlin.resolve.calls.smartcasts", + "org.jetbrains.kotlin.resolve.calls.tasks", + "org.jetbrains.kotlin.resolve.calls.tower", + "org.jetbrains.kotlin.resolve.calls.util", + "org.jetbrains.kotlin.resolve.checkers", + "org.jetbrains.kotlin.resolve.constants", + "org.jetbrains.kotlin.resolve.constants.evaluate", + "org.jetbrains.kotlin.resolve.deprecation", + "org.jetbrains.kotlin.resolve.descriptorUtil", + "org.jetbrains.kotlin.resolve.diagnostics", + "org.jetbrains.kotlin.resolve.extensions", + "org.jetbrains.kotlin.resolve.inline", + "org.jetbrains.kotlin.resolve.jvm", + "org.jetbrains.kotlin.resolve.jvm.annotations", + "org.jetbrains.kotlin.resolve.jvm.checkers", + "org.jetbrains.kotlin.resolve.jvm.diagnostics", + "org.jetbrains.kotlin.resolve.jvm.extensions", + "org.jetbrains.kotlin.resolve.jvm.jvmSignature", + "org.jetbrains.kotlin.resolve.jvm.kotlinSignature", + "org.jetbrains.kotlin.resolve.jvm.modules", + "org.jetbrains.kotlin.resolve.jvm.multiplatform", + "org.jetbrains.kotlin.resolve.jvm.platform", + "org.jetbrains.kotlin.resolve.konan.diagnostics", + "org.jetbrains.kotlin.resolve.konan.platform", + "org.jetbrains.kotlin.resolve.lazy", + "org.jetbrains.kotlin.resolve.lazy.data", + "org.jetbrains.kotlin.resolve.lazy.declarations", + "org.jetbrains.kotlin.resolve.lazy.descriptors", + "org.jetbrains.kotlin.resolve.multiplatform", + "org.jetbrains.kotlin.resolve.repl", + "org.jetbrains.kotlin.resolve.sam", + "org.jetbrains.kotlin.resolve.scopes", + "org.jetbrains.kotlin.resolve.scopes.receivers", + "org.jetbrains.kotlin.resolve.scopes.synthetic", + "org.jetbrains.kotlin.resolve.scopes.utils", + "org.jetbrains.kotlin.resolve.source", + "org.jetbrains.kotlin.resolve.typeBinding", + "org.jetbrains.kotlin.serialization", + "org.jetbrains.kotlin.serialization.builtins", + "org.jetbrains.kotlin.serialization.deserialization", + "org.jetbrains.kotlin.serialization.deserialization.builtins", + "org.jetbrains.kotlin.serialization.deserialization.descriptors", + "org.jetbrains.kotlin.serialization.js", + "org.jetbrains.kotlin.serialization.js.ast", + "org.jetbrains.kotlin.serialization.konan", + "org.jetbrains.kotlin.serialization.konan.impl", + "org.jetbrains.kotlin.storage", + "org.jetbrains.kotlin.synthetic", + "org.jetbrains.kotlin.type", + "org.jetbrains.kotlin.types", + "org.jetbrains.kotlin.types.checker", + "org.jetbrains.kotlin.types.error", + "org.jetbrains.kotlin.types.expressions", + "org.jetbrains.kotlin.types.expressions.typeInfoFactory", + "org.jetbrains.kotlin.types.expressions.unqualifiedSuper", + "org.jetbrains.kotlin.types.model", + "org.jetbrains.kotlin.types.refinement", + "org.jetbrains.kotlin.types.typeUtil", + "org.jetbrains.kotlin.types.typesApproximation", + "org.jetbrains.kotlin.util", + "org.jetbrains.kotlin.util.capitalizeDecapitalize", + "org.jetbrains.kotlin.util.collectionUtils", + "org.jetbrains.kotlin.util.javaslang", + "org.jetbrains.kotlin.util.slicedMap", + "org.jetbrains.kotlin.utils", + "org.jetbrains.kotlin.utils.addToStdlib", + "org.jetbrains.kotlin.utils.concurrent.block", + "org.jetbrains.kotlin.utils.fileUtils", + "org.jetbrains.kotlin.utils.intellij", + "org.jetbrains.kotlin.utils.kapt", + "org.jetbrains.kotlin.utils.repl", + "org.jetbrains.kotlin.utils.strings", + "org.jetbrains.kotlin.wasm.ir", + "org.jetbrains.kotlin.wasm.ir.convertors", + "org.jetbrains.org.objectweb.asm", + "org.jetbrains.org.objectweb.asm.commons", + "org.jetbrains.org.objectweb.asm.signature", + "org.jetbrains.org.objectweb.asm.tree", + "org.jetbrains.org.objectweb.asm.tree.analysis", + "org.jetbrains.org.objectweb.asm.util" + ], + "org.jetbrains.kotlin:kotlin-daemon-embeddable": [ + "org.jetbrains.kotlin.daemon", + "org.jetbrains.kotlin.daemon.common", + "org.jetbrains.kotlin.daemon.experimental", + "org.jetbrains.kotlin.daemon.report", + "org.jetbrains.kotlin.daemon.report.experimental" + ], + "org.jetbrains.kotlin:kotlin-reflect": [ + "kotlin.reflect.full", + "kotlin.reflect.jvm", + "kotlin.reflect.jvm.internal", + "kotlin.reflect.jvm.internal.calls", + "kotlin.reflect.jvm.internal.impl", + "kotlin.reflect.jvm.internal.impl.builtins", + "kotlin.reflect.jvm.internal.impl.builtins.functions", + "kotlin.reflect.jvm.internal.impl.builtins.jvm", + "kotlin.reflect.jvm.internal.impl.descriptors", + "kotlin.reflect.jvm.internal.impl.descriptors.annotations", + "kotlin.reflect.jvm.internal.impl.descriptors.deserialization", + "kotlin.reflect.jvm.internal.impl.descriptors.impl", + "kotlin.reflect.jvm.internal.impl.descriptors.java", + "kotlin.reflect.jvm.internal.impl.descriptors.runtime.components", + "kotlin.reflect.jvm.internal.impl.descriptors.runtime.structure", + "kotlin.reflect.jvm.internal.impl.incremental", + "kotlin.reflect.jvm.internal.impl.incremental.components", + "kotlin.reflect.jvm.internal.impl.load.java", + "kotlin.reflect.jvm.internal.impl.load.java.components", + "kotlin.reflect.jvm.internal.impl.load.java.descriptors", + "kotlin.reflect.jvm.internal.impl.load.java.lazy", + "kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors", + "kotlin.reflect.jvm.internal.impl.load.java.lazy.types", + "kotlin.reflect.jvm.internal.impl.load.java.sources", + "kotlin.reflect.jvm.internal.impl.load.java.structure", + "kotlin.reflect.jvm.internal.impl.load.java.typeEnhancement", + "kotlin.reflect.jvm.internal.impl.load.kotlin", + "kotlin.reflect.jvm.internal.impl.load.kotlin.header", + "kotlin.reflect.jvm.internal.impl.metadata", + "kotlin.reflect.jvm.internal.impl.metadata.builtins", + "kotlin.reflect.jvm.internal.impl.metadata.deserialization", + "kotlin.reflect.jvm.internal.impl.metadata.jvm", + "kotlin.reflect.jvm.internal.impl.metadata.jvm.deserialization", + "kotlin.reflect.jvm.internal.impl.name", + "kotlin.reflect.jvm.internal.impl.platform", + "kotlin.reflect.jvm.internal.impl.protobuf", + "kotlin.reflect.jvm.internal.impl.renderer", + "kotlin.reflect.jvm.internal.impl.resolve", + "kotlin.reflect.jvm.internal.impl.resolve.calls.inference", + "kotlin.reflect.jvm.internal.impl.resolve.constants", + "kotlin.reflect.jvm.internal.impl.resolve.deprecation", + "kotlin.reflect.jvm.internal.impl.resolve.descriptorUtil", + "kotlin.reflect.jvm.internal.impl.resolve.jvm", + "kotlin.reflect.jvm.internal.impl.resolve.sam", + "kotlin.reflect.jvm.internal.impl.resolve.scopes", + "kotlin.reflect.jvm.internal.impl.resolve.scopes.receivers", + "kotlin.reflect.jvm.internal.impl.serialization", + "kotlin.reflect.jvm.internal.impl.serialization.deserialization", + "kotlin.reflect.jvm.internal.impl.serialization.deserialization.builtins", + "kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors", + "kotlin.reflect.jvm.internal.impl.storage", + "kotlin.reflect.jvm.internal.impl.types", + "kotlin.reflect.jvm.internal.impl.types.checker", + "kotlin.reflect.jvm.internal.impl.types.error", + "kotlin.reflect.jvm.internal.impl.types.model", + "kotlin.reflect.jvm.internal.impl.types.typeUtil", + "kotlin.reflect.jvm.internal.impl.types.typesApproximation", + "kotlin.reflect.jvm.internal.impl.util", + "kotlin.reflect.jvm.internal.impl.util.capitalizeDecapitalize", + "kotlin.reflect.jvm.internal.impl.util.collectionUtils", + "kotlin.reflect.jvm.internal.impl.utils", + "kotlin.reflect.jvm.internal.pcollections" + ], + "org.jetbrains.kotlin:kotlin-script-runtime": [ + "kotlin.script.dependencies", + "kotlin.script.experimental.dependencies", + "kotlin.script.experimental.location", + "kotlin.script.extensions", + "kotlin.script.templates", + "kotlin.script.templates.standard" + ], + "org.jetbrains.kotlin:kotlin-stdlib": [ + "kotlin", + "kotlin.annotation", + "kotlin.collections", + "kotlin.collections.builders", + "kotlin.collections.unsigned", + "kotlin.comparisons", + "kotlin.concurrent", + "kotlin.contracts", + "kotlin.coroutines", + "kotlin.coroutines.cancellation", + "kotlin.coroutines.intrinsics", + "kotlin.coroutines.jvm.internal", + "kotlin.experimental", + "kotlin.internal", + "kotlin.io", + "kotlin.js", + "kotlin.jvm", + "kotlin.jvm.functions", + "kotlin.jvm.internal", + "kotlin.jvm.internal.markers", + "kotlin.jvm.internal.unsafe", + "kotlin.math", + "kotlin.properties", + "kotlin.random", + "kotlin.ranges", + "kotlin.reflect", + "kotlin.sequences", + "kotlin.system", + "kotlin.text", + "kotlin.time" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": [ + "kotlin.internal.jdk7", + "kotlin.jdk7" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": [ + "kotlin.collections.jdk8", + "kotlin.internal.jdk8", + "kotlin.random.jdk8", + "kotlin.streams.jdk8", + "kotlin.text.jdk8", + "kotlin.time.jdk8" + ], + "org.jetbrains.kotlin:kotlin-test": [ + "kotlin.test" + ], + "org.jetbrains.kotlin:kotlin-test-junit": [ + "kotlin.test.junit", + "kotlin.test.junit.annotations" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-android": [ + "kotlinx.coroutines.android" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-core": [ + "kotlinx.coroutines", + "kotlinx.coroutines.channels", + "kotlinx.coroutines.debug", + "kotlinx.coroutines.debug.internal", + "kotlinx.coroutines.flow", + "kotlinx.coroutines.flow.internal", + "kotlinx.coroutines.internal", + "kotlinx.coroutines.intrinsics", + "kotlinx.coroutines.scheduling", + "kotlinx.coroutines.selects", + "kotlinx.coroutines.sync", + "kotlinx.coroutines.test" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-debug": [ + "kotlinx.coroutines.debug", + "kotlinx.coroutines.debug.internal", + "kotlinx.coroutines.debug.junit4", + "kotlinx.coroutines.repackaged.net.bytebuddy", + "kotlinx.coroutines.repackaged.net.bytebuddy.agent", + "kotlinx.coroutines.repackaged.net.bytebuddy.agent.builder", + "kotlinx.coroutines.repackaged.net.bytebuddy.asm", + "kotlinx.coroutines.repackaged.net.bytebuddy.build", + "kotlinx.coroutines.repackaged.net.bytebuddy.description", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.annotation", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.enumeration", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.field", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.method", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.modifier", + "kotlinx.coroutines.repackaged.net.bytebuddy.description.type", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic.loading", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic.scaffold", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic.scaffold.inline", + "kotlinx.coroutines.repackaged.net.bytebuddy.dynamic.scaffold.subclass", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.attribute", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.auxiliary", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bind", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bind.annotation", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.assign", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.assign.primitive", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.assign.reference", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.collection", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.constant", + "kotlinx.coroutines.repackaged.net.bytebuddy.implementation.bytecode.member", + "kotlinx.coroutines.repackaged.net.bytebuddy.jar.asm", + "kotlinx.coroutines.repackaged.net.bytebuddy.jar.asm.commons", + "kotlinx.coroutines.repackaged.net.bytebuddy.jar.asm.signature", + "kotlinx.coroutines.repackaged.net.bytebuddy.matcher", + "kotlinx.coroutines.repackaged.net.bytebuddy.pool", + "kotlinx.coroutines.repackaged.net.bytebuddy.utility", + "kotlinx.coroutines.repackaged.net.bytebuddy.utility.privilege", + "kotlinx.coroutines.repackaged.net.bytebuddy.utility.visitor" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-test": [ + "kotlinx.coroutines.test", + "kotlinx.coroutines.test.internal" + ], + "org.jetbrains.kotlinx:kotlinx-metadata-jvm": [ + "kotlinx.metadata", + "kotlinx.metadata.impl", + "kotlinx.metadata.impl.extensions", + "kotlinx.metadata.internal.metadata", + "kotlinx.metadata.internal.metadata.builtins", + "kotlinx.metadata.internal.metadata.deserialization", + "kotlinx.metadata.internal.metadata.jvm", + "kotlinx.metadata.internal.metadata.jvm.deserialization", + "kotlinx.metadata.internal.metadata.jvm.serialization", + "kotlinx.metadata.internal.metadata.serialization", + "kotlinx.metadata.internal.protobuf", + "kotlinx.metadata.jvm", + "kotlinx.metadata.jvm.impl" + ], + "org.jetbrains:annotations": [ + "org.intellij.lang.annotations", + "org.jetbrains.annotations" + ], + "org.mockito.kotlin:mockito-kotlin": [ + "org.mockito.kotlin", + "org.mockito.kotlin.internal" + ], + "org.mockito:mockito-core": [ + "org.mockito", + "org.mockito.codegen", + "org.mockito.configuration", + "org.mockito.creation.instance", + "org.mockito.exceptions.base", + "org.mockito.exceptions.misusing", + "org.mockito.exceptions.stacktrace", + "org.mockito.exceptions.verification", + "org.mockito.exceptions.verification.junit", + "org.mockito.exceptions.verification.opentest4j", + "org.mockito.hamcrest", + "org.mockito.internal", + "org.mockito.internal.configuration", + "org.mockito.internal.configuration.injection", + "org.mockito.internal.configuration.injection.filter", + "org.mockito.internal.configuration.injection.scanner", + "org.mockito.internal.configuration.plugins", + "org.mockito.internal.creation", + "org.mockito.internal.creation.bytebuddy", + "org.mockito.internal.creation.instance", + "org.mockito.internal.creation.settings", + "org.mockito.internal.creation.util", + "org.mockito.internal.debugging", + "org.mockito.internal.exceptions", + "org.mockito.internal.exceptions.stacktrace", + "org.mockito.internal.exceptions.util", + "org.mockito.internal.framework", + "org.mockito.internal.hamcrest", + "org.mockito.internal.handler", + "org.mockito.internal.invocation", + "org.mockito.internal.invocation.finder", + "org.mockito.internal.invocation.mockref", + "org.mockito.internal.junit", + "org.mockito.internal.junit.util", + "org.mockito.internal.listeners", + "org.mockito.internal.matchers", + "org.mockito.internal.matchers.apachecommons", + "org.mockito.internal.matchers.text", + "org.mockito.internal.progress", + "org.mockito.internal.reporting", + "org.mockito.internal.runners", + "org.mockito.internal.runners.util", + "org.mockito.internal.session", + "org.mockito.internal.stubbing", + "org.mockito.internal.stubbing.answers", + "org.mockito.internal.stubbing.defaultanswers", + "org.mockito.internal.util", + "org.mockito.internal.util.collections", + "org.mockito.internal.util.concurrent", + "org.mockito.internal.util.io", + "org.mockito.internal.util.reflection", + "org.mockito.internal.verification", + "org.mockito.internal.verification.api", + "org.mockito.internal.verification.argumentmatching", + "org.mockito.internal.verification.checkers", + "org.mockito.invocation", + "org.mockito.junit", + "org.mockito.listeners", + "org.mockito.mock", + "org.mockito.plugins", + "org.mockito.quality", + "org.mockito.runners", + "org.mockito.session", + "org.mockito.stubbing", + "org.mockito.verification" + ], + "org.objenesis:objenesis": [ + "org.objenesis", + "org.objenesis.instantiator", + "org.objenesis.instantiator.android", + "org.objenesis.instantiator.annotations", + "org.objenesis.instantiator.basic", + "org.objenesis.instantiator.gcj", + "org.objenesis.instantiator.perc", + "org.objenesis.instantiator.sun", + "org.objenesis.instantiator.util", + "org.objenesis.strategy" + ], + "org.ow2.asm:asm": [ + "org.objectweb.asm", + "org.objectweb.asm.signature" + ], + "org.ow2.asm:asm-analysis": [ + "org.objectweb.asm.tree.analysis" + ], + "org.ow2.asm:asm-commons": [ + "org.objectweb.asm.commons" + ], + "org.ow2.asm:asm-tree": [ + "org.objectweb.asm.tree" + ], + "org.ow2.asm:asm-util": [ + "org.objectweb.asm.util" + ], + "org.robolectric:annotations": [ + "org.robolectric.annotation", + "org.robolectric.annotation.internal", + "org.robolectric.shadow.api" + ], + "org.robolectric:junit": [ + "org.robolectric.internal" + ], + "org.robolectric:pluginapi": [ + "org.robolectric.internal.dependency", + "org.robolectric.pluginapi", + "org.robolectric.pluginapi.config", + "org.robolectric.pluginapi.perf" + ], + "org.robolectric:plugins-maven-dependency-resolver": [ + "org.robolectric", + "org.robolectric.internal.dependency", + "org.robolectric.plugins" + ], + "org.robolectric:resources": [ + "org.robolectric", + "org.robolectric.manifest", + "org.robolectric.res", + "org.robolectric.res.android", + "org.robolectric.res.builder" + ], + "org.robolectric:robolectric": [ + "org.robolectric", + "org.robolectric.android", + "org.robolectric.android.fakes", + "org.robolectric.android.internal", + "org.robolectric.internal", + "org.robolectric.internal.dependency", + "org.robolectric.junit.rules", + "org.robolectric.plugins", + "org.robolectric.util" + ], + "org.robolectric:sandbox": [ + "org.robolectric.internal.bytecode", + "org.robolectric.sandbox", + "org.robolectric.util" + ], + "org.robolectric:shadowapi": [ + "org.robolectric.annotation.internal", + "org.robolectric.config", + "org.robolectric.internal", + "org.robolectric.shadow.api", + "org.robolectric.util" + ], + "org.robolectric:shadows-framework": [ + "android.media", + "android.webkit", + "org.robolectric", + "org.robolectric.android", + "org.robolectric.android.controller", + "org.robolectric.android.internal", + "org.robolectric.android.util.concurrent", + "org.robolectric.fakes", + "org.robolectric.shadows", + "org.robolectric.shadows.util" + ], + "org.robolectric:utils": [ + "org.robolectric", + "org.robolectric.util", + "org.robolectric.util.inject" + ], + "org.robolectric:utils-reflector": [ + "org.robolectric.util.reflector" + ] + }, + "repositories": { + "https://maven.google.com/": [ + "android.arch.core:common", + "android.arch.core:common:jar:sources", + "android.arch.core:core-testing:aar", + "android.arch.core:core-testing:jar:sources", + "android.arch.core:runtime:aar", + "android.arch.core:runtime:jar:sources", + "androidx.activity:activity:aar", + "androidx.activity:activity:jar:sources", + "androidx.annotation:annotation", + "androidx.annotation:annotation-experimental:aar", + "androidx.annotation:annotation-experimental:jar:sources", + "androidx.annotation:annotation:jar:javadoc", + "androidx.annotation:annotation:jar:sources", + "androidx.appcompat:appcompat-resources:aar", + "androidx.appcompat:appcompat-resources:jar:sources", + "androidx.appcompat:appcompat:aar", + "androidx.appcompat:appcompat:jar:sources", + "androidx.arch.core:core-common", + "androidx.arch.core:core-common:jar:sources", + "androidx.arch.core:core-runtime:aar", + "androidx.arch.core:core-runtime:jar:sources", + "androidx.arch.core:core-testing:aar", + "androidx.arch.core:core-testing:jar:sources", + "androidx.cardview:cardview:aar", + "androidx.cardview:cardview:jar:sources", + "androidx.collection:collection", + "androidx.collection:collection:jar:sources", + "androidx.constraintlayout:constraintlayout-solver", + "androidx.constraintlayout:constraintlayout:aar", + "androidx.coordinatorlayout:coordinatorlayout:aar", + "androidx.coordinatorlayout:coordinatorlayout:jar:sources", + "androidx.core:core-ktx:aar", + "androidx.core:core-ktx:jar:sources", + "androidx.core:core:aar", + "androidx.core:core:jar:sources", + "androidx.cursoradapter:cursoradapter:aar", + "androidx.cursoradapter:cursoradapter:jar:sources", + "androidx.customview:customview:aar", + "androidx.customview:customview:jar:sources", + "androidx.databinding:databinding-adapters:aar", + "androidx.databinding:databinding-adapters:jar:sources", + "androidx.databinding:databinding-common", + "androidx.databinding:databinding-common:jar:javadoc", + "androidx.databinding:databinding-common:jar:sources", + "androidx.databinding:databinding-compiler", + "androidx.databinding:databinding-compiler-common", + "androidx.databinding:databinding-compiler-common:jar:javadoc", + "androidx.databinding:databinding-compiler-common:jar:sources", + "androidx.databinding:databinding-compiler:jar:javadoc", + "androidx.databinding:databinding-compiler:jar:sources", + "androidx.databinding:databinding-runtime:aar", + "androidx.databinding:databinding-runtime:jar:sources", + "androidx.documentfile:documentfile:aar", + "androidx.documentfile:documentfile:jar:sources", + "androidx.drawerlayout:drawerlayout:aar", + "androidx.drawerlayout:drawerlayout:jar:sources", + "androidx.dynamicanimation:dynamicanimation:aar", + "androidx.dynamicanimation:dynamicanimation:jar:sources", + "androidx.exifinterface:exifinterface:aar", + "androidx.exifinterface:exifinterface:jar:sources", + "androidx.fragment:fragment:aar", + "androidx.fragment:fragment:jar:sources", + "androidx.interpolator:interpolator:aar", + "androidx.interpolator:interpolator:jar:sources", + "androidx.legacy:legacy-support-core-utils:aar", + "androidx.legacy:legacy-support-core-utils:jar:sources", + "androidx.lifecycle:lifecycle-common", + "androidx.lifecycle:lifecycle-common:jar:sources", + "androidx.lifecycle:lifecycle-extensions:aar", + "androidx.lifecycle:lifecycle-extensions:jar:sources", + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar", + "androidx.lifecycle:lifecycle-livedata-core-ktx:jar:sources", + "androidx.lifecycle:lifecycle-livedata-core:aar", + "androidx.lifecycle:lifecycle-livedata-core:jar:sources", + "androidx.lifecycle:lifecycle-livedata-ktx:aar", + "androidx.lifecycle:lifecycle-livedata-ktx:jar:sources", + "androidx.lifecycle:lifecycle-livedata:aar", + "androidx.lifecycle:lifecycle-livedata:jar:sources", + "androidx.lifecycle:lifecycle-process:aar", + "androidx.lifecycle:lifecycle-process:jar:sources", + "androidx.lifecycle:lifecycle-runtime:aar", + "androidx.lifecycle:lifecycle-runtime:jar:sources", + "androidx.lifecycle:lifecycle-service:aar", + "androidx.lifecycle:lifecycle-service:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel-ktx:aar", + "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.lifecycle:lifecycle-viewmodel:jar:sources", + "androidx.loader:loader:aar", + "androidx.loader:loader:jar:sources", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:jar:sources", + "androidx.multidex:multidex-instrumentation:aar", + "androidx.multidex:multidex:aar", + "androidx.multidex:multidex:jar:sources", + "androidx.navigation:navigation-common-ktx:aar", + "androidx.navigation:navigation-common-ktx:jar:sources", + "androidx.navigation:navigation-common:aar", + "androidx.navigation:navigation-common:jar:sources", + "androidx.navigation:navigation-fragment-ktx:aar", + "androidx.navigation:navigation-fragment-ktx:jar:sources", + "androidx.navigation:navigation-fragment:aar", + "androidx.navigation:navigation-fragment:jar:sources", + "androidx.navigation:navigation-runtime-ktx:aar", + "androidx.navigation:navigation-runtime-ktx:jar:sources", + "androidx.navigation:navigation-runtime:aar", + "androidx.navigation:navigation-runtime:jar:sources", + "androidx.navigation:navigation-ui-ktx:aar", + "androidx.navigation:navigation-ui-ktx:jar:sources", + "androidx.navigation:navigation-ui:aar", + "androidx.navigation:navigation-ui:jar:sources", + "androidx.print:print:aar", + "androidx.print:print:jar:sources", + "androidx.recyclerview:recyclerview:aar", + "androidx.recyclerview:recyclerview:jar:sources", + "androidx.room:room-common", + "androidx.room:room-common:jar:sources", + "androidx.room:room-runtime:aar", + "androidx.room:room-runtime:jar:sources", + "androidx.savedstate:savedstate:aar", + "androidx.savedstate:savedstate:jar:sources", + "androidx.sqlite:sqlite-framework:aar", + "androidx.sqlite:sqlite-framework:jar:sources", + "androidx.sqlite:sqlite:aar", + "androidx.sqlite:sqlite:jar:sources", + "androidx.test.espresso:espresso-accessibility:aar", + "androidx.test.espresso:espresso-accessibility:jar:javadoc", + "androidx.test.espresso:espresso-accessibility:jar:sources", + "androidx.test.espresso:espresso-contrib:aar", + "androidx.test.espresso:espresso-contrib:jar:javadoc", + "androidx.test.espresso:espresso-contrib:jar:sources", + "androidx.test.espresso:espresso-core:aar", + "androidx.test.espresso:espresso-core:jar:javadoc", + "androidx.test.espresso:espresso-core:jar:sources", + "androidx.test.espresso:espresso-idling-resource:aar", + "androidx.test.espresso:espresso-idling-resource:jar:javadoc", + "androidx.test.espresso:espresso-idling-resource:jar:sources", + "androidx.test.espresso:espresso-intents:aar", + "androidx.test.espresso:espresso-intents:jar:javadoc", + "androidx.test.espresso:espresso-intents:jar:sources", + "androidx.test.ext:junit:aar", + "androidx.test.ext:junit:jar:javadoc", + "androidx.test.ext:junit:jar:sources", + "androidx.test.ext:truth:aar", + "androidx.test.ext:truth:jar:javadoc", + "androidx.test.ext:truth:jar:sources", + "androidx.test.uiautomator:uiautomator:aar", + "androidx.test.uiautomator:uiautomator:jar:javadoc", + "androidx.test.uiautomator:uiautomator:jar:sources", + "androidx.test:core:aar", + "androidx.test:core:jar:javadoc", + "androidx.test:core:jar:sources", + "androidx.test:monitor:aar", + "androidx.test:monitor:jar:javadoc", + "androidx.test:monitor:jar:sources", + "androidx.test:rules:aar", + "androidx.test:rules:jar:javadoc", + "androidx.test:rules:jar:sources", + "androidx.test:runner:aar", + "androidx.test:runner:jar:javadoc", + "androidx.test:runner:jar:sources", + "androidx.transition:transition:aar", + "androidx.transition:transition:jar:sources", + "androidx.vectordrawable:vectordrawable-animated:aar", + "androidx.vectordrawable:vectordrawable-animated:jar:sources", + "androidx.vectordrawable:vectordrawable:aar", + "androidx.vectordrawable:vectordrawable:jar:sources", + "androidx.versionedparcelable:versionedparcelable:aar", + "androidx.versionedparcelable:versionedparcelable:jar:sources", + "androidx.viewpager2:viewpager2:aar", + "androidx.viewpager2:viewpager2:jar:sources", + "androidx.viewpager:viewpager:aar", + "androidx.viewpager:viewpager:jar:sources", + "androidx.work:work-runtime-ktx:aar", + "androidx.work:work-runtime-ktx:jar:sources", + "androidx.work:work-runtime:aar", + "androidx.work:work-runtime:jar:sources", + "androidx.work:work-testing:aar", + "androidx.work:work-testing:jar:sources", + "com.almworks.sqlite4java:sqlite4java", + "com.almworks.sqlite4java:sqlite4java:jar:javadoc", + "com.almworks.sqlite4java:sqlite4java:jar:sources", + "com.android.databinding:baseLibrary", + "com.android.databinding:baseLibrary:jar:javadoc", + "com.android.databinding:baseLibrary:jar:sources", + "com.android.support:support-annotations", + "com.android.tools.build.jetifier:jetifier-core", + "com.android.tools.build.jetifier:jetifier-core:jar:sources", + "com.android.tools.build:aapt2-proto", + "com.android.tools.build:aapt2-proto:jar:javadoc", + "com.android.tools.build:aapt2-proto:jar:sources", + "com.android.tools:annotations", + "com.android.tools:annotations:jar:javadoc", + "com.android.tools:annotations:jar:sources", + "com.crashlytics.sdk.android:answers:aar", + "com.crashlytics.sdk.android:beta:aar", + "com.crashlytics.sdk.android:crashlytics-core:aar", + "com.crashlytics.sdk.android:crashlytics:aar", + "com.github.bumptech.glide:annotations", + "com.github.bumptech.glide:annotations:jar:javadoc", + "com.github.bumptech.glide:annotations:jar:sources", + "com.github.bumptech.glide:compiler", + "com.github.bumptech.glide:compiler:jar:javadoc", + "com.github.bumptech.glide:compiler:jar:sources", + "com.github.bumptech.glide:disklrucache", + "com.github.bumptech.glide:disklrucache:jar:javadoc", + "com.github.bumptech.glide:disklrucache:jar:sources", + "com.github.bumptech.glide:gifdecoder:aar", + "com.github.bumptech.glide:gifdecoder:jar:javadoc", + "com.github.bumptech.glide:gifdecoder:jar:sources", + "com.github.bumptech.glide:glide:aar", + "com.github.bumptech.glide:glide:jar:javadoc", + "com.github.bumptech.glide:glide:jar:sources", + "com.github.bumptech.glide:mocks:aar", + "com.github.bumptech.glide:mocks:jar:javadoc", + "com.github.bumptech.glide:mocks:jar:sources", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:javadoc", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources", + "com.google.android.datatransport:transport-api:aar", + "com.google.android.datatransport:transport-api:jar:javadoc", + "com.google.android.datatransport:transport-backend-cct:aar", + "com.google.android.datatransport:transport-backend-cct:jar:javadoc", + "com.google.android.datatransport:transport-runtime:aar", + "com.google.android.datatransport:transport-runtime:jar:javadoc", + "com.google.android.flexbox:flexbox:aar", + "com.google.android.flexbox:flexbox:jar:sources", + "com.google.android.gms:play-services-ads-identifier:aar", + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-base:jar:javadoc", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-basement:jar:javadoc", + "com.google.android.gms:play-services-measurement-api:aar", + "com.google.android.gms:play-services-measurement-api:jar:javadoc", + "com.google.android.gms:play-services-measurement-base:aar", + "com.google.android.gms:play-services-measurement-base:jar:javadoc", + "com.google.android.gms:play-services-measurement-impl:aar", + "com.google.android.gms:play-services-measurement-impl:jar:javadoc", + "com.google.android.gms:play-services-measurement-sdk-api:aar", + "com.google.android.gms:play-services-measurement-sdk-api:jar:javadoc", + "com.google.android.gms:play-services-measurement-sdk:aar", + "com.google.android.gms:play-services-measurement-sdk:jar:javadoc", + "com.google.android.gms:play-services-measurement:aar", + "com.google.android.gms:play-services-measurement:jar:javadoc", + "com.google.android.gms:play-services-stats:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.android.gms:strict-version-matcher-plugin", + "com.google.android.material:material:aar", + "com.google.android.material:material:jar:sources", + "com.google.auto.service:auto-service-annotations", + "com.google.auto.service:auto-service-annotations:jar:javadoc", + "com.google.auto.service:auto-service-annotations:jar:sources", + "com.google.auto.value:auto-value-annotations", + "com.google.auto.value:auto-value-annotations:jar:javadoc", + "com.google.auto.value:auto-value-annotations:jar:sources", + "com.google.code.findbugs:jsr305", + "com.google.code.findbugs:jsr305:jar:javadoc", + "com.google.code.findbugs:jsr305:jar:sources", + "com.google.code.gson:gson", + "com.google.code.gson:gson:jar:javadoc", + "com.google.code.gson:gson:jar:sources", + "com.google.dagger:dagger", + "com.google.dagger:dagger-compiler", + "com.google.dagger:dagger-compiler:jar:javadoc", + "com.google.dagger:dagger-compiler:jar:sources", + "com.google.dagger:dagger-producers", + "com.google.dagger:dagger-producers:jar:javadoc", + "com.google.dagger:dagger-producers:jar:sources", + "com.google.dagger:dagger-spi", + "com.google.dagger:dagger-spi:jar:javadoc", + "com.google.dagger:dagger-spi:jar:sources", + "com.google.dagger:dagger:jar:javadoc", + "com.google.dagger:dagger:jar:sources", + "com.google.errorprone:error_prone_annotations", + "com.google.errorprone:error_prone_annotations:jar:javadoc", + "com.google.errorprone:error_prone_annotations:jar:sources", + "com.google.errorprone:javac-shaded", + "com.google.errorprone:javac-shaded:jar:javadoc", + "com.google.errorprone:javac-shaded:jar:sources", + "com.google.firebase:firebase-analytics:aar", + "com.google.firebase:firebase-analytics:jar:javadoc", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-common:jar:javadoc", + "com.google.firebase:firebase-common:jar:sources", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-components:jar:javadoc", + "com.google.firebase:firebase-components:jar:sources", + "com.google.firebase:firebase-crashlytics:aar", + "com.google.firebase:firebase-crashlytics:jar:javadoc", + "com.google.firebase:firebase-encoders-json:aar", + "com.google.firebase:firebase-encoders-json:jar:javadoc", + "com.google.firebase:firebase-encoders-json:jar:sources", + "com.google.firebase:firebase-iid-interop:aar", + "com.google.firebase:firebase-iid:aar", + "com.google.firebase:firebase-iid:jar:javadoc", + "com.google.firebase:firebase-installations-interop:aar", + "com.google.firebase:firebase-installations-interop:jar:javadoc", + "com.google.firebase:firebase-installations:aar", + "com.google.firebase:firebase-installations:jar:javadoc", + "com.google.firebase:firebase-measurement-connector:aar", + "com.google.gms:google-services", + "com.google.gms:google-services:jar:javadoc", + "com.google.gms:google-services:jar:sources", + "com.google.googlejavaformat:google-java-format", + "com.google.googlejavaformat:google-java-format:jar:javadoc", + "com.google.googlejavaformat:google-java-format:jar:sources", + "com.google.guava:failureaccess", + "com.google.guava:failureaccess:jar:javadoc", + "com.google.guava:failureaccess:jar:sources", + "com.google.guava:guava", + "com.google.guava:guava:jar:javadoc", + "com.google.guava:guava:jar:sources", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "com.google.j2objc:j2objc-annotations:jar:javadoc", + "com.google.j2objc:j2objc-annotations:jar:sources", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java:jar:javadoc", + "com.google.protobuf:protobuf-java:jar:sources", + "com.google.protobuf:protobuf-javalite", + "com.google.protobuf:protobuf-javalite:jar:javadoc", + "com.google.protobuf:protobuf-javalite:jar:sources", + "com.google.truth.extensions:truth-liteproto-extension", + "com.google.truth.extensions:truth-liteproto-extension:jar:javadoc", + "com.google.truth.extensions:truth-liteproto-extension:jar:sources", + "com.google.truth:truth", + "com.google.truth:truth:jar:javadoc", + "com.google.truth:truth:jar:sources", + "com.googlecode.juniversalchardet:juniversalchardet", + "com.googlecode.juniversalchardet:juniversalchardet:jar:javadoc", + "com.googlecode.juniversalchardet:juniversalchardet:jar:sources", + "com.ibm.icu:icu4j", + "com.ibm.icu:icu4j:jar:javadoc", + "com.ibm.icu:icu4j:jar:sources", + "com.squareup.moshi:moshi", + "com.squareup.moshi:moshi-kotlin", + "com.squareup.moshi:moshi-kotlin-codegen", + "com.squareup.moshi:moshi-kotlin-codegen:jar:javadoc", + "com.squareup.moshi:moshi-kotlin-codegen:jar:sources", + "com.squareup.moshi:moshi-kotlin:jar:javadoc", + "com.squareup.moshi:moshi-kotlin:jar:sources", + "com.squareup.moshi:moshi:jar:javadoc", + "com.squareup.moshi:moshi:jar:sources", + "com.squareup.okhttp3:mockwebserver", + "com.squareup.okhttp3:mockwebserver:jar:javadoc", + "com.squareup.okhttp3:mockwebserver:jar:sources", + "com.squareup.okhttp3:okhttp", + "com.squareup.okhttp3:okhttp:jar:javadoc", + "com.squareup.okhttp3:okhttp:jar:sources", + "com.squareup.okio:okio", + "com.squareup.okio:okio:jar:javadoc", + "com.squareup.okio:okio:jar:sources", + "com.squareup.retrofit2:converter-moshi", + "com.squareup.retrofit2:converter-moshi:jar:javadoc", + "com.squareup.retrofit2:converter-moshi:jar:sources", + "com.squareup.retrofit2:retrofit", + "com.squareup.retrofit2:retrofit-mock", + "com.squareup.retrofit2:retrofit-mock:jar:javadoc", + "com.squareup.retrofit2:retrofit-mock:jar:sources", + "com.squareup.retrofit2:retrofit:jar:javadoc", + "com.squareup.retrofit2:retrofit:jar:sources", + "com.squareup:javapoet", + "com.squareup:javapoet:jar:javadoc", + "com.squareup:javapoet:jar:sources", + "com.squareup:javawriter", + "com.squareup:javawriter:jar:javadoc", + "com.squareup:javawriter:jar:sources", + "com.squareup:kotlinpoet", + "com.squareup:kotlinpoet:jar:javadoc", + "com.squareup:kotlinpoet:jar:sources", + "commons-codec:commons-codec", + "commons-codec:commons-codec:jar:javadoc", + "commons-codec:commons-codec:jar:sources", + "commons-io:commons-io", + "commons-io:commons-io:jar:javadoc", + "commons-io:commons-io:jar:sources", + "de.hdodenhof:circleimageview:aar", + "de.hdodenhof:circleimageview:jar:javadoc", + "de.hdodenhof:circleimageview:jar:sources", + "io.fabric.sdk.android:fabric:aar", + "javax.annotation:javax.annotation-api", + "javax.annotation:javax.annotation-api:jar:javadoc", + "javax.annotation:javax.annotation-api:jar:sources", + "javax.annotation:jsr250-api", + "javax.annotation:jsr250-api:jar:sources", + "javax.inject:javax.inject", + "javax.inject:javax.inject:jar:javadoc", + "javax.inject:javax.inject:jar:sources", + "junit:junit", + "junit:junit:jar:javadoc", + "junit:junit:jar:sources", + "net.bytebuddy:byte-buddy", + "net.bytebuddy:byte-buddy-agent", + "net.bytebuddy:byte-buddy-agent:jar:javadoc", + "net.bytebuddy:byte-buddy-agent:jar:sources", + "net.bytebuddy:byte-buddy:jar:javadoc", + "net.bytebuddy:byte-buddy:jar:sources", + "net.ltgt.gradle.incap:incap", + "net.ltgt.gradle.incap:incap:jar:javadoc", + "net.ltgt.gradle.incap:incap:jar:sources", + "net.sf.kxml:kxml2", + "net.sf.kxml:kxml2:jar:javadoc", + "net.sf.kxml:kxml2:jar:sources", + "nl.dionsegijn:konfetti:aar", + "nl.dionsegijn:konfetti:jar:sources", + "org.antlr:antlr4", + "org.antlr:antlr4:jar:javadoc", + "org.antlr:antlr4:jar:sources", + "org.bouncycastle:bcprov-jdk15on", + "org.bouncycastle:bcprov-jdk15on:jar:javadoc", + "org.bouncycastle:bcprov-jdk15on:jar:sources", + "org.checkerframework:checker-compat-qual", + "org.checkerframework:checker-compat-qual:jar:javadoc", + "org.checkerframework:checker-compat-qual:jar:sources", + "org.checkerframework:checker-qual", + "org.checkerframework:checker-qual:jar:javadoc", + "org.checkerframework:checker-qual:jar:sources", + "org.hamcrest:hamcrest-core", + "org.hamcrest:hamcrest-core:jar:javadoc", + "org.hamcrest:hamcrest-core:jar:sources", + "org.hamcrest:hamcrest-integration", + "org.hamcrest:hamcrest-integration:jar:javadoc", + "org.hamcrest:hamcrest-integration:jar:sources", + "org.hamcrest:hamcrest-library", + "org.hamcrest:hamcrest-library:jar:javadoc", + "org.hamcrest:hamcrest-library:jar:sources", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.intellij.deps:trove4j:jar:javadoc", + "org.jetbrains.intellij.deps:trove4j:jar:sources", + "org.jetbrains.kotlin:kotlin-compiler-embeddable", + "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:javadoc", + "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:sources", + "org.jetbrains.kotlin:kotlin-daemon-embeddable", + "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:javadoc", + "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-reflect:jar:javadoc", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources", + "org.jetbrains.kotlin:kotlin-script-runtime", + "org.jetbrains.kotlin:kotlin-script-runtime:jar:javadoc", + "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", + "org.jetbrains.kotlin:kotlin-test", + "org.jetbrains.kotlin:kotlin-test-annotations-common", + "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources", + "org.jetbrains.kotlin:kotlin-test-common", + "org.jetbrains.kotlin:kotlin-test-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-common:jar:sources", + "org.jetbrains.kotlin:kotlin-test-junit", + "org.jetbrains.kotlin:kotlin-test-junit:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-junit:jar:sources", + "org.jetbrains.kotlin:kotlin-test:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-android", + "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-test", + "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:sources", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources", + "org.jetbrains:annotations", + "org.jetbrains:annotations:jar:javadoc", + "org.jetbrains:annotations:jar:sources", + "org.mockito.kotlin:mockito-kotlin", + "org.mockito.kotlin:mockito-kotlin:jar:javadoc", + "org.mockito.kotlin:mockito-kotlin:jar:sources", + "org.mockito:mockito-core", + "org.mockito:mockito-core:jar:javadoc", + "org.mockito:mockito-core:jar:sources", + "org.objenesis:objenesis", + "org.objenesis:objenesis:jar:javadoc", + "org.objenesis:objenesis:jar:sources", + "org.ow2.asm:asm", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-analysis:jar:javadoc", + "org.ow2.asm:asm-analysis:jar:sources", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-commons:jar:javadoc", + "org.ow2.asm:asm-commons:jar:sources", + "org.ow2.asm:asm-tree", + "org.ow2.asm:asm-tree:jar:javadoc", + "org.ow2.asm:asm-tree:jar:sources", + "org.ow2.asm:asm-util", + "org.ow2.asm:asm-util:jar:javadoc", + "org.ow2.asm:asm-util:jar:sources", + "org.ow2.asm:asm:jar:javadoc", + "org.ow2.asm:asm:jar:sources", + "org.robolectric:annotations", + "org.robolectric:annotations:jar:javadoc", + "org.robolectric:annotations:jar:sources", + "org.robolectric:junit", + "org.robolectric:junit:jar:javadoc", + "org.robolectric:junit:jar:sources", + "org.robolectric:pluginapi", + "org.robolectric:pluginapi:jar:javadoc", + "org.robolectric:pluginapi:jar:sources", + "org.robolectric:plugins-maven-dependency-resolver", + "org.robolectric:plugins-maven-dependency-resolver:jar:javadoc", + "org.robolectric:plugins-maven-dependency-resolver:jar:sources", + "org.robolectric:resources", + "org.robolectric:resources:jar:javadoc", + "org.robolectric:resources:jar:sources", + "org.robolectric:robolectric", + "org.robolectric:robolectric:jar:javadoc", + "org.robolectric:robolectric:jar:sources", + "org.robolectric:sandbox", + "org.robolectric:sandbox:jar:javadoc", + "org.robolectric:sandbox:jar:sources", + "org.robolectric:shadowapi", + "org.robolectric:shadowapi:jar:javadoc", + "org.robolectric:shadowapi:jar:sources", + "org.robolectric:shadows-framework", + "org.robolectric:shadows-framework:jar:javadoc", + "org.robolectric:shadows-framework:jar:sources", + "org.robolectric:utils", + "org.robolectric:utils-reflector", + "org.robolectric:utils-reflector:jar:javadoc", + "org.robolectric:utils-reflector:jar:sources", + "org.robolectric:utils:jar:javadoc", + "org.robolectric:utils:jar:sources" + ], + "https://repo1.maven.org/maven2/": [ + "android.arch.core:common", + "android.arch.core:common:jar:sources", + "android.arch.core:core-testing:aar", + "android.arch.core:core-testing:jar:sources", + "android.arch.core:runtime:aar", + "android.arch.core:runtime:jar:sources", + "androidx.activity:activity:aar", + "androidx.activity:activity:jar:sources", + "androidx.annotation:annotation", + "androidx.annotation:annotation-experimental:aar", + "androidx.annotation:annotation-experimental:jar:sources", + "androidx.annotation:annotation:jar:javadoc", + "androidx.annotation:annotation:jar:sources", + "androidx.appcompat:appcompat-resources:aar", + "androidx.appcompat:appcompat-resources:jar:sources", + "androidx.appcompat:appcompat:aar", + "androidx.appcompat:appcompat:jar:sources", + "androidx.arch.core:core-common", + "androidx.arch.core:core-common:jar:sources", + "androidx.arch.core:core-runtime:aar", + "androidx.arch.core:core-runtime:jar:sources", + "androidx.arch.core:core-testing:aar", + "androidx.arch.core:core-testing:jar:sources", + "androidx.cardview:cardview:aar", + "androidx.cardview:cardview:jar:sources", + "androidx.collection:collection", + "androidx.collection:collection:jar:sources", + "androidx.constraintlayout:constraintlayout-solver", + "androidx.constraintlayout:constraintlayout:aar", + "androidx.coordinatorlayout:coordinatorlayout:aar", + "androidx.coordinatorlayout:coordinatorlayout:jar:sources", + "androidx.core:core-ktx:aar", + "androidx.core:core-ktx:jar:sources", + "androidx.core:core:aar", + "androidx.core:core:jar:sources", + "androidx.cursoradapter:cursoradapter:aar", + "androidx.cursoradapter:cursoradapter:jar:sources", + "androidx.customview:customview:aar", + "androidx.customview:customview:jar:sources", + "androidx.databinding:databinding-adapters:aar", + "androidx.databinding:databinding-adapters:jar:sources", + "androidx.databinding:databinding-common", + "androidx.databinding:databinding-common:jar:javadoc", + "androidx.databinding:databinding-common:jar:sources", + "androidx.databinding:databinding-compiler", + "androidx.databinding:databinding-compiler-common", + "androidx.databinding:databinding-compiler-common:jar:javadoc", + "androidx.databinding:databinding-compiler-common:jar:sources", + "androidx.databinding:databinding-compiler:jar:javadoc", + "androidx.databinding:databinding-compiler:jar:sources", + "androidx.databinding:databinding-runtime:aar", + "androidx.databinding:databinding-runtime:jar:sources", + "androidx.documentfile:documentfile:aar", + "androidx.documentfile:documentfile:jar:sources", + "androidx.drawerlayout:drawerlayout:aar", + "androidx.drawerlayout:drawerlayout:jar:sources", + "androidx.dynamicanimation:dynamicanimation:aar", + "androidx.dynamicanimation:dynamicanimation:jar:sources", + "androidx.exifinterface:exifinterface:aar", + "androidx.exifinterface:exifinterface:jar:sources", + "androidx.fragment:fragment:aar", + "androidx.fragment:fragment:jar:sources", + "androidx.interpolator:interpolator:aar", + "androidx.interpolator:interpolator:jar:sources", + "androidx.legacy:legacy-support-core-utils:aar", + "androidx.legacy:legacy-support-core-utils:jar:sources", + "androidx.lifecycle:lifecycle-common", + "androidx.lifecycle:lifecycle-common:jar:sources", + "androidx.lifecycle:lifecycle-extensions:aar", + "androidx.lifecycle:lifecycle-extensions:jar:sources", + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar", + "androidx.lifecycle:lifecycle-livedata-core-ktx:jar:sources", + "androidx.lifecycle:lifecycle-livedata-core:aar", + "androidx.lifecycle:lifecycle-livedata-core:jar:sources", + "androidx.lifecycle:lifecycle-livedata-ktx:aar", + "androidx.lifecycle:lifecycle-livedata-ktx:jar:sources", + "androidx.lifecycle:lifecycle-livedata:aar", + "androidx.lifecycle:lifecycle-livedata:jar:sources", + "androidx.lifecycle:lifecycle-process:aar", + "androidx.lifecycle:lifecycle-process:jar:sources", + "androidx.lifecycle:lifecycle-runtime:aar", + "androidx.lifecycle:lifecycle-runtime:jar:sources", + "androidx.lifecycle:lifecycle-service:aar", + "androidx.lifecycle:lifecycle-service:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel-ktx:aar", + "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.lifecycle:lifecycle-viewmodel:jar:sources", + "androidx.loader:loader:aar", + "androidx.loader:loader:jar:sources", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:jar:sources", + "androidx.multidex:multidex-instrumentation:aar", + "androidx.multidex:multidex:aar", + "androidx.multidex:multidex:jar:sources", + "androidx.navigation:navigation-common-ktx:aar", + "androidx.navigation:navigation-common-ktx:jar:sources", + "androidx.navigation:navigation-common:aar", + "androidx.navigation:navigation-common:jar:sources", + "androidx.navigation:navigation-fragment-ktx:aar", + "androidx.navigation:navigation-fragment-ktx:jar:sources", + "androidx.navigation:navigation-fragment:aar", + "androidx.navigation:navigation-fragment:jar:sources", + "androidx.navigation:navigation-runtime-ktx:aar", + "androidx.navigation:navigation-runtime-ktx:jar:sources", + "androidx.navigation:navigation-runtime:aar", + "androidx.navigation:navigation-runtime:jar:sources", + "androidx.navigation:navigation-ui-ktx:aar", + "androidx.navigation:navigation-ui-ktx:jar:sources", + "androidx.navigation:navigation-ui:aar", + "androidx.navigation:navigation-ui:jar:sources", + "androidx.print:print:aar", + "androidx.print:print:jar:sources", + "androidx.recyclerview:recyclerview:aar", + "androidx.recyclerview:recyclerview:jar:sources", + "androidx.room:room-common", + "androidx.room:room-common:jar:sources", + "androidx.room:room-runtime:aar", + "androidx.room:room-runtime:jar:sources", + "androidx.savedstate:savedstate:aar", + "androidx.savedstate:savedstate:jar:sources", + "androidx.sqlite:sqlite-framework:aar", + "androidx.sqlite:sqlite-framework:jar:sources", + "androidx.sqlite:sqlite:aar", + "androidx.sqlite:sqlite:jar:sources", + "androidx.test.espresso:espresso-accessibility:aar", + "androidx.test.espresso:espresso-accessibility:jar:javadoc", + "androidx.test.espresso:espresso-accessibility:jar:sources", + "androidx.test.espresso:espresso-contrib:aar", + "androidx.test.espresso:espresso-contrib:jar:javadoc", + "androidx.test.espresso:espresso-contrib:jar:sources", + "androidx.test.espresso:espresso-core:aar", + "androidx.test.espresso:espresso-core:jar:javadoc", + "androidx.test.espresso:espresso-core:jar:sources", + "androidx.test.espresso:espresso-idling-resource:aar", + "androidx.test.espresso:espresso-idling-resource:jar:javadoc", + "androidx.test.espresso:espresso-idling-resource:jar:sources", + "androidx.test.espresso:espresso-intents:aar", + "androidx.test.espresso:espresso-intents:jar:javadoc", + "androidx.test.espresso:espresso-intents:jar:sources", + "androidx.test.ext:junit:aar", + "androidx.test.ext:junit:jar:javadoc", + "androidx.test.ext:junit:jar:sources", + "androidx.test.ext:truth:aar", + "androidx.test.ext:truth:jar:javadoc", + "androidx.test.ext:truth:jar:sources", + "androidx.test.uiautomator:uiautomator:aar", + "androidx.test.uiautomator:uiautomator:jar:javadoc", + "androidx.test.uiautomator:uiautomator:jar:sources", + "androidx.test:core:aar", + "androidx.test:core:jar:javadoc", + "androidx.test:core:jar:sources", + "androidx.test:monitor:aar", + "androidx.test:monitor:jar:javadoc", + "androidx.test:monitor:jar:sources", + "androidx.test:rules:aar", + "androidx.test:rules:jar:javadoc", + "androidx.test:rules:jar:sources", + "androidx.test:runner:aar", + "androidx.test:runner:jar:javadoc", + "androidx.test:runner:jar:sources", + "androidx.transition:transition:aar", + "androidx.transition:transition:jar:sources", + "androidx.vectordrawable:vectordrawable-animated:aar", + "androidx.vectordrawable:vectordrawable-animated:jar:sources", + "androidx.vectordrawable:vectordrawable:aar", + "androidx.vectordrawable:vectordrawable:jar:sources", + "androidx.versionedparcelable:versionedparcelable:aar", + "androidx.versionedparcelable:versionedparcelable:jar:sources", + "androidx.viewpager2:viewpager2:aar", + "androidx.viewpager2:viewpager2:jar:sources", + "androidx.viewpager:viewpager:aar", + "androidx.viewpager:viewpager:jar:sources", + "androidx.work:work-runtime-ktx:aar", + "androidx.work:work-runtime-ktx:jar:sources", + "androidx.work:work-runtime:aar", + "androidx.work:work-runtime:jar:sources", + "androidx.work:work-testing:aar", + "androidx.work:work-testing:jar:sources", + "com.almworks.sqlite4java:sqlite4java", + "com.almworks.sqlite4java:sqlite4java:jar:javadoc", + "com.almworks.sqlite4java:sqlite4java:jar:sources", + "com.android.databinding:baseLibrary", + "com.android.databinding:baseLibrary:jar:javadoc", + "com.android.databinding:baseLibrary:jar:sources", + "com.android.support:support-annotations", + "com.android.tools.build.jetifier:jetifier-core", + "com.android.tools.build.jetifier:jetifier-core:jar:sources", + "com.android.tools.build:aapt2-proto", + "com.android.tools.build:aapt2-proto:jar:javadoc", + "com.android.tools.build:aapt2-proto:jar:sources", + "com.android.tools:annotations", + "com.android.tools:annotations:jar:javadoc", + "com.android.tools:annotations:jar:sources", + "com.crashlytics.sdk.android:answers:aar", + "com.crashlytics.sdk.android:beta:aar", + "com.crashlytics.sdk.android:crashlytics-core:aar", + "com.crashlytics.sdk.android:crashlytics:aar", + "com.github.bumptech.glide:annotations", + "com.github.bumptech.glide:annotations:jar:javadoc", + "com.github.bumptech.glide:annotations:jar:sources", + "com.github.bumptech.glide:compiler", + "com.github.bumptech.glide:compiler:jar:javadoc", + "com.github.bumptech.glide:compiler:jar:sources", + "com.github.bumptech.glide:disklrucache", + "com.github.bumptech.glide:disklrucache:jar:javadoc", + "com.github.bumptech.glide:disklrucache:jar:sources", + "com.github.bumptech.glide:gifdecoder:aar", + "com.github.bumptech.glide:gifdecoder:jar:javadoc", + "com.github.bumptech.glide:gifdecoder:jar:sources", + "com.github.bumptech.glide:glide:aar", + "com.github.bumptech.glide:glide:jar:javadoc", + "com.github.bumptech.glide:glide:jar:sources", + "com.github.bumptech.glide:mocks:aar", + "com.github.bumptech.glide:mocks:jar:javadoc", + "com.github.bumptech.glide:mocks:jar:sources", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:javadoc", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources", + "com.google.android.datatransport:transport-api:aar", + "com.google.android.datatransport:transport-api:jar:javadoc", + "com.google.android.datatransport:transport-backend-cct:aar", + "com.google.android.datatransport:transport-backend-cct:jar:javadoc", + "com.google.android.datatransport:transport-runtime:aar", + "com.google.android.datatransport:transport-runtime:jar:javadoc", + "com.google.android.flexbox:flexbox:aar", + "com.google.android.flexbox:flexbox:jar:sources", + "com.google.android.gms:play-services-ads-identifier:aar", + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-base:jar:javadoc", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-basement:jar:javadoc", + "com.google.android.gms:play-services-measurement-api:aar", + "com.google.android.gms:play-services-measurement-api:jar:javadoc", + "com.google.android.gms:play-services-measurement-base:aar", + "com.google.android.gms:play-services-measurement-base:jar:javadoc", + "com.google.android.gms:play-services-measurement-impl:aar", + "com.google.android.gms:play-services-measurement-impl:jar:javadoc", + "com.google.android.gms:play-services-measurement-sdk-api:aar", + "com.google.android.gms:play-services-measurement-sdk-api:jar:javadoc", + "com.google.android.gms:play-services-measurement-sdk:aar", + "com.google.android.gms:play-services-measurement-sdk:jar:javadoc", + "com.google.android.gms:play-services-measurement:aar", + "com.google.android.gms:play-services-measurement:jar:javadoc", + "com.google.android.gms:play-services-stats:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.android.gms:strict-version-matcher-plugin", + "com.google.android.material:material:aar", + "com.google.android.material:material:jar:sources", + "com.google.auto.service:auto-service-annotations", + "com.google.auto.service:auto-service-annotations:jar:javadoc", + "com.google.auto.service:auto-service-annotations:jar:sources", + "com.google.auto.value:auto-value-annotations", + "com.google.auto.value:auto-value-annotations:jar:javadoc", + "com.google.auto.value:auto-value-annotations:jar:sources", + "com.google.code.findbugs:jsr305", + "com.google.code.findbugs:jsr305:jar:javadoc", + "com.google.code.findbugs:jsr305:jar:sources", + "com.google.code.gson:gson", + "com.google.code.gson:gson:jar:javadoc", + "com.google.code.gson:gson:jar:sources", + "com.google.dagger:dagger", + "com.google.dagger:dagger-compiler", + "com.google.dagger:dagger-compiler:jar:javadoc", + "com.google.dagger:dagger-compiler:jar:sources", + "com.google.dagger:dagger-producers", + "com.google.dagger:dagger-producers:jar:javadoc", + "com.google.dagger:dagger-producers:jar:sources", + "com.google.dagger:dagger-spi", + "com.google.dagger:dagger-spi:jar:javadoc", + "com.google.dagger:dagger-spi:jar:sources", + "com.google.dagger:dagger:jar:javadoc", + "com.google.dagger:dagger:jar:sources", + "com.google.errorprone:error_prone_annotations", + "com.google.errorprone:error_prone_annotations:jar:javadoc", + "com.google.errorprone:error_prone_annotations:jar:sources", + "com.google.errorprone:javac-shaded", + "com.google.errorprone:javac-shaded:jar:javadoc", + "com.google.errorprone:javac-shaded:jar:sources", + "com.google.firebase:firebase-analytics:aar", + "com.google.firebase:firebase-analytics:jar:javadoc", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-common:jar:javadoc", + "com.google.firebase:firebase-common:jar:sources", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-components:jar:javadoc", + "com.google.firebase:firebase-components:jar:sources", + "com.google.firebase:firebase-crashlytics:aar", + "com.google.firebase:firebase-crashlytics:jar:javadoc", + "com.google.firebase:firebase-encoders-json:aar", + "com.google.firebase:firebase-encoders-json:jar:javadoc", + "com.google.firebase:firebase-encoders-json:jar:sources", + "com.google.firebase:firebase-iid-interop:aar", + "com.google.firebase:firebase-iid:aar", + "com.google.firebase:firebase-iid:jar:javadoc", + "com.google.firebase:firebase-installations-interop:aar", + "com.google.firebase:firebase-installations-interop:jar:javadoc", + "com.google.firebase:firebase-installations:aar", + "com.google.firebase:firebase-installations:jar:javadoc", + "com.google.firebase:firebase-measurement-connector:aar", + "com.google.gms:google-services", + "com.google.gms:google-services:jar:javadoc", + "com.google.gms:google-services:jar:sources", + "com.google.googlejavaformat:google-java-format", + "com.google.googlejavaformat:google-java-format:jar:javadoc", + "com.google.googlejavaformat:google-java-format:jar:sources", + "com.google.guava:failureaccess", + "com.google.guava:failureaccess:jar:javadoc", + "com.google.guava:failureaccess:jar:sources", + "com.google.guava:guava", + "com.google.guava:guava:jar:javadoc", + "com.google.guava:guava:jar:sources", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "com.google.j2objc:j2objc-annotations:jar:javadoc", + "com.google.j2objc:j2objc-annotations:jar:sources", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java:jar:javadoc", + "com.google.protobuf:protobuf-java:jar:sources", + "com.google.protobuf:protobuf-javalite", + "com.google.protobuf:protobuf-javalite:jar:javadoc", + "com.google.protobuf:protobuf-javalite:jar:sources", + "com.google.truth.extensions:truth-liteproto-extension", + "com.google.truth.extensions:truth-liteproto-extension:jar:javadoc", + "com.google.truth.extensions:truth-liteproto-extension:jar:sources", + "com.google.truth:truth", + "com.google.truth:truth:jar:javadoc", + "com.google.truth:truth:jar:sources", + "com.googlecode.juniversalchardet:juniversalchardet", + "com.googlecode.juniversalchardet:juniversalchardet:jar:javadoc", + "com.googlecode.juniversalchardet:juniversalchardet:jar:sources", + "com.ibm.icu:icu4j", + "com.ibm.icu:icu4j:jar:javadoc", + "com.ibm.icu:icu4j:jar:sources", + "com.squareup.moshi:moshi", + "com.squareup.moshi:moshi-kotlin", + "com.squareup.moshi:moshi-kotlin-codegen", + "com.squareup.moshi:moshi-kotlin-codegen:jar:javadoc", + "com.squareup.moshi:moshi-kotlin-codegen:jar:sources", + "com.squareup.moshi:moshi-kotlin:jar:javadoc", + "com.squareup.moshi:moshi-kotlin:jar:sources", + "com.squareup.moshi:moshi:jar:javadoc", + "com.squareup.moshi:moshi:jar:sources", + "com.squareup.okhttp3:mockwebserver", + "com.squareup.okhttp3:mockwebserver:jar:javadoc", + "com.squareup.okhttp3:mockwebserver:jar:sources", + "com.squareup.okhttp3:okhttp", + "com.squareup.okhttp3:okhttp:jar:javadoc", + "com.squareup.okhttp3:okhttp:jar:sources", + "com.squareup.okio:okio", + "com.squareup.okio:okio:jar:javadoc", + "com.squareup.okio:okio:jar:sources", + "com.squareup.retrofit2:converter-moshi", + "com.squareup.retrofit2:converter-moshi:jar:javadoc", + "com.squareup.retrofit2:converter-moshi:jar:sources", + "com.squareup.retrofit2:retrofit", + "com.squareup.retrofit2:retrofit-mock", + "com.squareup.retrofit2:retrofit-mock:jar:javadoc", + "com.squareup.retrofit2:retrofit-mock:jar:sources", + "com.squareup.retrofit2:retrofit:jar:javadoc", + "com.squareup.retrofit2:retrofit:jar:sources", + "com.squareup:javapoet", + "com.squareup:javapoet:jar:javadoc", + "com.squareup:javapoet:jar:sources", + "com.squareup:javawriter", + "com.squareup:javawriter:jar:javadoc", + "com.squareup:javawriter:jar:sources", + "com.squareup:kotlinpoet", + "com.squareup:kotlinpoet:jar:javadoc", + "com.squareup:kotlinpoet:jar:sources", + "commons-codec:commons-codec", + "commons-codec:commons-codec:jar:javadoc", + "commons-codec:commons-codec:jar:sources", + "commons-io:commons-io", + "commons-io:commons-io:jar:javadoc", + "commons-io:commons-io:jar:sources", + "de.hdodenhof:circleimageview:aar", + "de.hdodenhof:circleimageview:jar:javadoc", + "de.hdodenhof:circleimageview:jar:sources", + "io.fabric.sdk.android:fabric:aar", + "javax.annotation:javax.annotation-api", + "javax.annotation:javax.annotation-api:jar:javadoc", + "javax.annotation:javax.annotation-api:jar:sources", + "javax.annotation:jsr250-api", + "javax.annotation:jsr250-api:jar:sources", + "javax.inject:javax.inject", + "javax.inject:javax.inject:jar:javadoc", + "javax.inject:javax.inject:jar:sources", + "junit:junit", + "junit:junit:jar:javadoc", + "junit:junit:jar:sources", + "net.bytebuddy:byte-buddy", + "net.bytebuddy:byte-buddy-agent", + "net.bytebuddy:byte-buddy-agent:jar:javadoc", + "net.bytebuddy:byte-buddy-agent:jar:sources", + "net.bytebuddy:byte-buddy:jar:javadoc", + "net.bytebuddy:byte-buddy:jar:sources", + "net.ltgt.gradle.incap:incap", + "net.ltgt.gradle.incap:incap:jar:javadoc", + "net.ltgt.gradle.incap:incap:jar:sources", + "net.sf.kxml:kxml2", + "net.sf.kxml:kxml2:jar:javadoc", + "net.sf.kxml:kxml2:jar:sources", + "nl.dionsegijn:konfetti:aar", + "nl.dionsegijn:konfetti:jar:sources", + "org.antlr:antlr4", + "org.antlr:antlr4:jar:javadoc", + "org.antlr:antlr4:jar:sources", + "org.bouncycastle:bcprov-jdk15on", + "org.bouncycastle:bcprov-jdk15on:jar:javadoc", + "org.bouncycastle:bcprov-jdk15on:jar:sources", + "org.checkerframework:checker-compat-qual", + "org.checkerframework:checker-compat-qual:jar:javadoc", + "org.checkerframework:checker-compat-qual:jar:sources", + "org.checkerframework:checker-qual", + "org.checkerframework:checker-qual:jar:javadoc", + "org.checkerframework:checker-qual:jar:sources", + "org.hamcrest:hamcrest-core", + "org.hamcrest:hamcrest-core:jar:javadoc", + "org.hamcrest:hamcrest-core:jar:sources", + "org.hamcrest:hamcrest-integration", + "org.hamcrest:hamcrest-integration:jar:javadoc", + "org.hamcrest:hamcrest-integration:jar:sources", + "org.hamcrest:hamcrest-library", + "org.hamcrest:hamcrest-library:jar:javadoc", + "org.hamcrest:hamcrest-library:jar:sources", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.intellij.deps:trove4j:jar:javadoc", + "org.jetbrains.intellij.deps:trove4j:jar:sources", + "org.jetbrains.kotlin:kotlin-compiler-embeddable", + "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:javadoc", + "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:sources", + "org.jetbrains.kotlin:kotlin-daemon-embeddable", + "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:javadoc", + "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-reflect:jar:javadoc", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources", + "org.jetbrains.kotlin:kotlin-script-runtime", + "org.jetbrains.kotlin:kotlin-script-runtime:jar:javadoc", + "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", + "org.jetbrains.kotlin:kotlin-test", + "org.jetbrains.kotlin:kotlin-test-annotations-common", + "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources", + "org.jetbrains.kotlin:kotlin-test-common", + "org.jetbrains.kotlin:kotlin-test-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-common:jar:sources", + "org.jetbrains.kotlin:kotlin-test-junit", + "org.jetbrains.kotlin:kotlin-test-junit:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-junit:jar:sources", + "org.jetbrains.kotlin:kotlin-test:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-android", + "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-test", + "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:sources", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources", + "org.jetbrains:annotations", + "org.jetbrains:annotations:jar:javadoc", + "org.jetbrains:annotations:jar:sources", + "org.mockito.kotlin:mockito-kotlin", + "org.mockito.kotlin:mockito-kotlin:jar:javadoc", + "org.mockito.kotlin:mockito-kotlin:jar:sources", + "org.mockito:mockito-core", + "org.mockito:mockito-core:jar:javadoc", + "org.mockito:mockito-core:jar:sources", + "org.objenesis:objenesis", + "org.objenesis:objenesis:jar:javadoc", + "org.objenesis:objenesis:jar:sources", + "org.ow2.asm:asm", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-analysis:jar:javadoc", + "org.ow2.asm:asm-analysis:jar:sources", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-commons:jar:javadoc", + "org.ow2.asm:asm-commons:jar:sources", + "org.ow2.asm:asm-tree", + "org.ow2.asm:asm-tree:jar:javadoc", + "org.ow2.asm:asm-tree:jar:sources", + "org.ow2.asm:asm-util", + "org.ow2.asm:asm-util:jar:javadoc", + "org.ow2.asm:asm-util:jar:sources", + "org.ow2.asm:asm:jar:javadoc", + "org.ow2.asm:asm:jar:sources", + "org.robolectric:annotations", + "org.robolectric:annotations:jar:javadoc", + "org.robolectric:annotations:jar:sources", + "org.robolectric:junit", + "org.robolectric:junit:jar:javadoc", + "org.robolectric:junit:jar:sources", + "org.robolectric:pluginapi", + "org.robolectric:pluginapi:jar:javadoc", + "org.robolectric:pluginapi:jar:sources", + "org.robolectric:plugins-maven-dependency-resolver", + "org.robolectric:plugins-maven-dependency-resolver:jar:javadoc", + "org.robolectric:plugins-maven-dependency-resolver:jar:sources", + "org.robolectric:resources", + "org.robolectric:resources:jar:javadoc", + "org.robolectric:resources:jar:sources", + "org.robolectric:robolectric", + "org.robolectric:robolectric:jar:javadoc", + "org.robolectric:robolectric:jar:sources", + "org.robolectric:sandbox", + "org.robolectric:sandbox:jar:javadoc", + "org.robolectric:sandbox:jar:sources", + "org.robolectric:shadowapi", + "org.robolectric:shadowapi:jar:javadoc", + "org.robolectric:shadowapi:jar:sources", + "org.robolectric:shadows-framework", + "org.robolectric:shadows-framework:jar:javadoc", + "org.robolectric:shadows-framework:jar:sources", + "org.robolectric:utils", + "org.robolectric:utils-reflector", + "org.robolectric:utils-reflector:jar:javadoc", + "org.robolectric:utils-reflector:jar:sources", + "org.robolectric:utils:jar:javadoc", + "org.robolectric:utils:jar:sources" + ], + "https://maven.fabric.io/public/": [ + "android.arch.core:common", + "android.arch.core:common:jar:sources", + "android.arch.core:core-testing:aar", + "android.arch.core:core-testing:jar:sources", + "android.arch.core:runtime:aar", + "android.arch.core:runtime:jar:sources", + "androidx.activity:activity:aar", + "androidx.activity:activity:jar:sources", + "androidx.annotation:annotation", + "androidx.annotation:annotation-experimental:aar", + "androidx.annotation:annotation-experimental:jar:sources", + "androidx.annotation:annotation:jar:javadoc", + "androidx.annotation:annotation:jar:sources", + "androidx.appcompat:appcompat-resources:aar", + "androidx.appcompat:appcompat-resources:jar:sources", + "androidx.appcompat:appcompat:aar", + "androidx.appcompat:appcompat:jar:sources", + "androidx.arch.core:core-common", + "androidx.arch.core:core-common:jar:sources", + "androidx.arch.core:core-runtime:aar", + "androidx.arch.core:core-runtime:jar:sources", + "androidx.arch.core:core-testing:aar", + "androidx.arch.core:core-testing:jar:sources", + "androidx.cardview:cardview:aar", + "androidx.cardview:cardview:jar:sources", + "androidx.collection:collection", + "androidx.collection:collection:jar:sources", + "androidx.constraintlayout:constraintlayout-solver", + "androidx.constraintlayout:constraintlayout:aar", + "androidx.coordinatorlayout:coordinatorlayout:aar", + "androidx.coordinatorlayout:coordinatorlayout:jar:sources", + "androidx.core:core-ktx:aar", + "androidx.core:core-ktx:jar:sources", + "androidx.core:core:aar", + "androidx.core:core:jar:sources", + "androidx.cursoradapter:cursoradapter:aar", + "androidx.cursoradapter:cursoradapter:jar:sources", + "androidx.customview:customview:aar", + "androidx.customview:customview:jar:sources", + "androidx.databinding:databinding-adapters:aar", + "androidx.databinding:databinding-adapters:jar:sources", + "androidx.databinding:databinding-common", + "androidx.databinding:databinding-common:jar:javadoc", + "androidx.databinding:databinding-common:jar:sources", + "androidx.databinding:databinding-compiler", + "androidx.databinding:databinding-compiler-common", + "androidx.databinding:databinding-compiler-common:jar:javadoc", + "androidx.databinding:databinding-compiler-common:jar:sources", + "androidx.databinding:databinding-compiler:jar:javadoc", + "androidx.databinding:databinding-compiler:jar:sources", + "androidx.databinding:databinding-runtime:aar", + "androidx.databinding:databinding-runtime:jar:sources", + "androidx.documentfile:documentfile:aar", + "androidx.documentfile:documentfile:jar:sources", + "androidx.drawerlayout:drawerlayout:aar", + "androidx.drawerlayout:drawerlayout:jar:sources", + "androidx.dynamicanimation:dynamicanimation:aar", + "androidx.dynamicanimation:dynamicanimation:jar:sources", + "androidx.exifinterface:exifinterface:aar", + "androidx.exifinterface:exifinterface:jar:sources", + "androidx.fragment:fragment:aar", + "androidx.fragment:fragment:jar:sources", + "androidx.interpolator:interpolator:aar", + "androidx.interpolator:interpolator:jar:sources", + "androidx.legacy:legacy-support-core-utils:aar", + "androidx.legacy:legacy-support-core-utils:jar:sources", + "androidx.lifecycle:lifecycle-common", + "androidx.lifecycle:lifecycle-common:jar:sources", + "androidx.lifecycle:lifecycle-extensions:aar", + "androidx.lifecycle:lifecycle-extensions:jar:sources", + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar", + "androidx.lifecycle:lifecycle-livedata-core-ktx:jar:sources", + "androidx.lifecycle:lifecycle-livedata-core:aar", + "androidx.lifecycle:lifecycle-livedata-core:jar:sources", + "androidx.lifecycle:lifecycle-livedata-ktx:aar", + "androidx.lifecycle:lifecycle-livedata-ktx:jar:sources", + "androidx.lifecycle:lifecycle-livedata:aar", + "androidx.lifecycle:lifecycle-livedata:jar:sources", + "androidx.lifecycle:lifecycle-process:aar", + "androidx.lifecycle:lifecycle-process:jar:sources", + "androidx.lifecycle:lifecycle-runtime:aar", + "androidx.lifecycle:lifecycle-runtime:jar:sources", + "androidx.lifecycle:lifecycle-service:aar", + "androidx.lifecycle:lifecycle-service:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel-ktx:aar", + "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:jar:sources", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.lifecycle:lifecycle-viewmodel:jar:sources", + "androidx.loader:loader:aar", + "androidx.loader:loader:jar:sources", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:jar:sources", + "androidx.multidex:multidex-instrumentation:aar", + "androidx.multidex:multidex:aar", + "androidx.multidex:multidex:jar:sources", + "androidx.navigation:navigation-common-ktx:aar", + "androidx.navigation:navigation-common-ktx:jar:sources", + "androidx.navigation:navigation-common:aar", + "androidx.navigation:navigation-common:jar:sources", + "androidx.navigation:navigation-fragment-ktx:aar", + "androidx.navigation:navigation-fragment-ktx:jar:sources", + "androidx.navigation:navigation-fragment:aar", + "androidx.navigation:navigation-fragment:jar:sources", + "androidx.navigation:navigation-runtime-ktx:aar", + "androidx.navigation:navigation-runtime-ktx:jar:sources", + "androidx.navigation:navigation-runtime:aar", + "androidx.navigation:navigation-runtime:jar:sources", + "androidx.navigation:navigation-ui-ktx:aar", + "androidx.navigation:navigation-ui-ktx:jar:sources", + "androidx.navigation:navigation-ui:aar", + "androidx.navigation:navigation-ui:jar:sources", + "androidx.print:print:aar", + "androidx.print:print:jar:sources", + "androidx.recyclerview:recyclerview:aar", + "androidx.recyclerview:recyclerview:jar:sources", + "androidx.room:room-common", + "androidx.room:room-common:jar:sources", + "androidx.room:room-runtime:aar", + "androidx.room:room-runtime:jar:sources", + "androidx.savedstate:savedstate:aar", + "androidx.savedstate:savedstate:jar:sources", + "androidx.sqlite:sqlite-framework:aar", + "androidx.sqlite:sqlite-framework:jar:sources", + "androidx.sqlite:sqlite:aar", + "androidx.sqlite:sqlite:jar:sources", + "androidx.test.espresso:espresso-accessibility:aar", + "androidx.test.espresso:espresso-accessibility:jar:javadoc", + "androidx.test.espresso:espresso-accessibility:jar:sources", + "androidx.test.espresso:espresso-contrib:aar", + "androidx.test.espresso:espresso-contrib:jar:javadoc", + "androidx.test.espresso:espresso-contrib:jar:sources", + "androidx.test.espresso:espresso-core:aar", + "androidx.test.espresso:espresso-core:jar:javadoc", + "androidx.test.espresso:espresso-core:jar:sources", + "androidx.test.espresso:espresso-idling-resource:aar", + "androidx.test.espresso:espresso-idling-resource:jar:javadoc", + "androidx.test.espresso:espresso-idling-resource:jar:sources", + "androidx.test.espresso:espresso-intents:aar", + "androidx.test.espresso:espresso-intents:jar:javadoc", + "androidx.test.espresso:espresso-intents:jar:sources", + "androidx.test.ext:junit:aar", + "androidx.test.ext:junit:jar:javadoc", + "androidx.test.ext:junit:jar:sources", + "androidx.test.ext:truth:aar", + "androidx.test.ext:truth:jar:javadoc", + "androidx.test.ext:truth:jar:sources", + "androidx.test.uiautomator:uiautomator:aar", + "androidx.test.uiautomator:uiautomator:jar:javadoc", + "androidx.test.uiautomator:uiautomator:jar:sources", + "androidx.test:core:aar", + "androidx.test:core:jar:javadoc", + "androidx.test:core:jar:sources", + "androidx.test:monitor:aar", + "androidx.test:monitor:jar:javadoc", + "androidx.test:monitor:jar:sources", + "androidx.test:rules:aar", + "androidx.test:rules:jar:javadoc", + "androidx.test:rules:jar:sources", + "androidx.test:runner:aar", + "androidx.test:runner:jar:javadoc", + "androidx.test:runner:jar:sources", + "androidx.transition:transition:aar", + "androidx.transition:transition:jar:sources", + "androidx.vectordrawable:vectordrawable-animated:aar", + "androidx.vectordrawable:vectordrawable-animated:jar:sources", + "androidx.vectordrawable:vectordrawable:aar", + "androidx.vectordrawable:vectordrawable:jar:sources", + "androidx.versionedparcelable:versionedparcelable:aar", + "androidx.versionedparcelable:versionedparcelable:jar:sources", + "androidx.viewpager2:viewpager2:aar", + "androidx.viewpager2:viewpager2:jar:sources", + "androidx.viewpager:viewpager:aar", + "androidx.viewpager:viewpager:jar:sources", + "androidx.work:work-runtime-ktx:aar", + "androidx.work:work-runtime-ktx:jar:sources", + "androidx.work:work-runtime:aar", + "androidx.work:work-runtime:jar:sources", + "androidx.work:work-testing:aar", + "androidx.work:work-testing:jar:sources", + "com.almworks.sqlite4java:sqlite4java", + "com.almworks.sqlite4java:sqlite4java:jar:javadoc", + "com.almworks.sqlite4java:sqlite4java:jar:sources", + "com.android.databinding:baseLibrary", + "com.android.databinding:baseLibrary:jar:javadoc", + "com.android.databinding:baseLibrary:jar:sources", + "com.android.support:support-annotations", + "com.android.tools.build.jetifier:jetifier-core", + "com.android.tools.build.jetifier:jetifier-core:jar:sources", + "com.android.tools.build:aapt2-proto", + "com.android.tools.build:aapt2-proto:jar:javadoc", + "com.android.tools.build:aapt2-proto:jar:sources", + "com.android.tools:annotations", + "com.android.tools:annotations:jar:javadoc", + "com.android.tools:annotations:jar:sources", + "com.crashlytics.sdk.android:answers:aar", + "com.crashlytics.sdk.android:beta:aar", + "com.crashlytics.sdk.android:crashlytics-core:aar", + "com.crashlytics.sdk.android:crashlytics:aar", + "com.github.bumptech.glide:annotations", + "com.github.bumptech.glide:annotations:jar:javadoc", + "com.github.bumptech.glide:annotations:jar:sources", + "com.github.bumptech.glide:compiler", + "com.github.bumptech.glide:compiler:jar:javadoc", + "com.github.bumptech.glide:compiler:jar:sources", + "com.github.bumptech.glide:disklrucache", + "com.github.bumptech.glide:disklrucache:jar:javadoc", + "com.github.bumptech.glide:disklrucache:jar:sources", + "com.github.bumptech.glide:gifdecoder:aar", + "com.github.bumptech.glide:gifdecoder:jar:javadoc", + "com.github.bumptech.glide:gifdecoder:jar:sources", + "com.github.bumptech.glide:glide:aar", + "com.github.bumptech.glide:glide:jar:javadoc", + "com.github.bumptech.glide:glide:jar:sources", + "com.github.bumptech.glide:mocks:aar", + "com.github.bumptech.glide:mocks:jar:javadoc", + "com.github.bumptech.glide:mocks:jar:sources", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:javadoc", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources", + "com.google.android.datatransport:transport-api:aar", + "com.google.android.datatransport:transport-api:jar:javadoc", + "com.google.android.datatransport:transport-backend-cct:aar", + "com.google.android.datatransport:transport-backend-cct:jar:javadoc", + "com.google.android.datatransport:transport-runtime:aar", + "com.google.android.datatransport:transport-runtime:jar:javadoc", + "com.google.android.flexbox:flexbox:aar", + "com.google.android.flexbox:flexbox:jar:sources", + "com.google.android.gms:play-services-ads-identifier:aar", + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-base:jar:javadoc", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-basement:jar:javadoc", + "com.google.android.gms:play-services-measurement-api:aar", + "com.google.android.gms:play-services-measurement-api:jar:javadoc", + "com.google.android.gms:play-services-measurement-base:aar", + "com.google.android.gms:play-services-measurement-base:jar:javadoc", + "com.google.android.gms:play-services-measurement-impl:aar", + "com.google.android.gms:play-services-measurement-impl:jar:javadoc", + "com.google.android.gms:play-services-measurement-sdk-api:aar", + "com.google.android.gms:play-services-measurement-sdk-api:jar:javadoc", + "com.google.android.gms:play-services-measurement-sdk:aar", + "com.google.android.gms:play-services-measurement-sdk:jar:javadoc", + "com.google.android.gms:play-services-measurement:aar", + "com.google.android.gms:play-services-measurement:jar:javadoc", + "com.google.android.gms:play-services-stats:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.android.gms:strict-version-matcher-plugin", + "com.google.android.material:material:aar", + "com.google.android.material:material:jar:sources", + "com.google.auto.service:auto-service-annotations", + "com.google.auto.service:auto-service-annotations:jar:javadoc", + "com.google.auto.service:auto-service-annotations:jar:sources", + "com.google.auto.value:auto-value-annotations", + "com.google.auto.value:auto-value-annotations:jar:javadoc", + "com.google.auto.value:auto-value-annotations:jar:sources", + "com.google.code.findbugs:jsr305", + "com.google.code.findbugs:jsr305:jar:javadoc", + "com.google.code.findbugs:jsr305:jar:sources", + "com.google.code.gson:gson", + "com.google.code.gson:gson:jar:javadoc", + "com.google.code.gson:gson:jar:sources", + "com.google.dagger:dagger", + "com.google.dagger:dagger-compiler", + "com.google.dagger:dagger-compiler:jar:javadoc", + "com.google.dagger:dagger-compiler:jar:sources", + "com.google.dagger:dagger-producers", + "com.google.dagger:dagger-producers:jar:javadoc", + "com.google.dagger:dagger-producers:jar:sources", + "com.google.dagger:dagger-spi", + "com.google.dagger:dagger-spi:jar:javadoc", + "com.google.dagger:dagger-spi:jar:sources", + "com.google.dagger:dagger:jar:javadoc", + "com.google.dagger:dagger:jar:sources", + "com.google.errorprone:error_prone_annotations", + "com.google.errorprone:error_prone_annotations:jar:javadoc", + "com.google.errorprone:error_prone_annotations:jar:sources", + "com.google.errorprone:javac-shaded", + "com.google.errorprone:javac-shaded:jar:javadoc", + "com.google.errorprone:javac-shaded:jar:sources", + "com.google.firebase:firebase-analytics:aar", + "com.google.firebase:firebase-analytics:jar:javadoc", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-common:jar:javadoc", + "com.google.firebase:firebase-common:jar:sources", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-components:jar:javadoc", + "com.google.firebase:firebase-components:jar:sources", + "com.google.firebase:firebase-crashlytics:aar", + "com.google.firebase:firebase-crashlytics:jar:javadoc", + "com.google.firebase:firebase-encoders-json:aar", + "com.google.firebase:firebase-encoders-json:jar:javadoc", + "com.google.firebase:firebase-encoders-json:jar:sources", + "com.google.firebase:firebase-iid-interop:aar", + "com.google.firebase:firebase-iid:aar", + "com.google.firebase:firebase-iid:jar:javadoc", + "com.google.firebase:firebase-installations-interop:aar", + "com.google.firebase:firebase-installations-interop:jar:javadoc", + "com.google.firebase:firebase-installations:aar", + "com.google.firebase:firebase-installations:jar:javadoc", + "com.google.firebase:firebase-measurement-connector:aar", + "com.google.gms:google-services", + "com.google.gms:google-services:jar:javadoc", + "com.google.gms:google-services:jar:sources", + "com.google.googlejavaformat:google-java-format", + "com.google.googlejavaformat:google-java-format:jar:javadoc", + "com.google.googlejavaformat:google-java-format:jar:sources", + "com.google.guava:failureaccess", + "com.google.guava:failureaccess:jar:javadoc", + "com.google.guava:failureaccess:jar:sources", + "com.google.guava:guava", + "com.google.guava:guava:jar:javadoc", + "com.google.guava:guava:jar:sources", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "com.google.j2objc:j2objc-annotations:jar:javadoc", + "com.google.j2objc:j2objc-annotations:jar:sources", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java:jar:javadoc", + "com.google.protobuf:protobuf-java:jar:sources", + "com.google.protobuf:protobuf-javalite", + "com.google.protobuf:protobuf-javalite:jar:javadoc", + "com.google.protobuf:protobuf-javalite:jar:sources", + "com.google.truth.extensions:truth-liteproto-extension", + "com.google.truth.extensions:truth-liteproto-extension:jar:javadoc", + "com.google.truth.extensions:truth-liteproto-extension:jar:sources", + "com.google.truth:truth", + "com.google.truth:truth:jar:javadoc", + "com.google.truth:truth:jar:sources", + "com.googlecode.juniversalchardet:juniversalchardet", + "com.googlecode.juniversalchardet:juniversalchardet:jar:javadoc", + "com.googlecode.juniversalchardet:juniversalchardet:jar:sources", + "com.ibm.icu:icu4j", + "com.ibm.icu:icu4j:jar:javadoc", + "com.ibm.icu:icu4j:jar:sources", + "com.squareup.moshi:moshi", + "com.squareup.moshi:moshi-kotlin", + "com.squareup.moshi:moshi-kotlin-codegen", + "com.squareup.moshi:moshi-kotlin-codegen:jar:javadoc", + "com.squareup.moshi:moshi-kotlin-codegen:jar:sources", + "com.squareup.moshi:moshi-kotlin:jar:javadoc", + "com.squareup.moshi:moshi-kotlin:jar:sources", + "com.squareup.moshi:moshi:jar:javadoc", + "com.squareup.moshi:moshi:jar:sources", + "com.squareup.okhttp3:mockwebserver", + "com.squareup.okhttp3:mockwebserver:jar:javadoc", + "com.squareup.okhttp3:mockwebserver:jar:sources", + "com.squareup.okhttp3:okhttp", + "com.squareup.okhttp3:okhttp:jar:javadoc", + "com.squareup.okhttp3:okhttp:jar:sources", + "com.squareup.okio:okio", + "com.squareup.okio:okio:jar:javadoc", + "com.squareup.okio:okio:jar:sources", + "com.squareup.retrofit2:converter-moshi", + "com.squareup.retrofit2:converter-moshi:jar:javadoc", + "com.squareup.retrofit2:converter-moshi:jar:sources", + "com.squareup.retrofit2:retrofit", + "com.squareup.retrofit2:retrofit-mock", + "com.squareup.retrofit2:retrofit-mock:jar:javadoc", + "com.squareup.retrofit2:retrofit-mock:jar:sources", + "com.squareup.retrofit2:retrofit:jar:javadoc", + "com.squareup.retrofit2:retrofit:jar:sources", + "com.squareup:javapoet", + "com.squareup:javapoet:jar:javadoc", + "com.squareup:javapoet:jar:sources", + "com.squareup:javawriter", + "com.squareup:javawriter:jar:javadoc", + "com.squareup:javawriter:jar:sources", + "com.squareup:kotlinpoet", + "com.squareup:kotlinpoet:jar:javadoc", + "com.squareup:kotlinpoet:jar:sources", + "commons-codec:commons-codec", + "commons-codec:commons-codec:jar:javadoc", + "commons-codec:commons-codec:jar:sources", + "commons-io:commons-io", + "commons-io:commons-io:jar:javadoc", + "commons-io:commons-io:jar:sources", + "de.hdodenhof:circleimageview:aar", + "de.hdodenhof:circleimageview:jar:javadoc", + "de.hdodenhof:circleimageview:jar:sources", + "io.fabric.sdk.android:fabric:aar", + "javax.annotation:javax.annotation-api", + "javax.annotation:javax.annotation-api:jar:javadoc", + "javax.annotation:javax.annotation-api:jar:sources", + "javax.annotation:jsr250-api", + "javax.annotation:jsr250-api:jar:sources", + "javax.inject:javax.inject", + "javax.inject:javax.inject:jar:javadoc", + "javax.inject:javax.inject:jar:sources", + "junit:junit", + "junit:junit:jar:javadoc", + "junit:junit:jar:sources", + "net.bytebuddy:byte-buddy", + "net.bytebuddy:byte-buddy-agent", + "net.bytebuddy:byte-buddy-agent:jar:javadoc", + "net.bytebuddy:byte-buddy-agent:jar:sources", + "net.bytebuddy:byte-buddy:jar:javadoc", + "net.bytebuddy:byte-buddy:jar:sources", + "net.ltgt.gradle.incap:incap", + "net.ltgt.gradle.incap:incap:jar:javadoc", + "net.ltgt.gradle.incap:incap:jar:sources", + "net.sf.kxml:kxml2", + "net.sf.kxml:kxml2:jar:javadoc", + "net.sf.kxml:kxml2:jar:sources", + "nl.dionsegijn:konfetti:aar", + "nl.dionsegijn:konfetti:jar:sources", + "org.antlr:antlr4", + "org.antlr:antlr4:jar:javadoc", + "org.antlr:antlr4:jar:sources", + "org.bouncycastle:bcprov-jdk15on", + "org.bouncycastle:bcprov-jdk15on:jar:javadoc", + "org.bouncycastle:bcprov-jdk15on:jar:sources", + "org.checkerframework:checker-compat-qual", + "org.checkerframework:checker-compat-qual:jar:javadoc", + "org.checkerframework:checker-compat-qual:jar:sources", + "org.checkerframework:checker-qual", + "org.checkerframework:checker-qual:jar:javadoc", + "org.checkerframework:checker-qual:jar:sources", + "org.hamcrest:hamcrest-core", + "org.hamcrest:hamcrest-core:jar:javadoc", + "org.hamcrest:hamcrest-core:jar:sources", + "org.hamcrest:hamcrest-integration", + "org.hamcrest:hamcrest-integration:jar:javadoc", + "org.hamcrest:hamcrest-integration:jar:sources", + "org.hamcrest:hamcrest-library", + "org.hamcrest:hamcrest-library:jar:javadoc", + "org.hamcrest:hamcrest-library:jar:sources", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.intellij.deps:trove4j:jar:javadoc", + "org.jetbrains.intellij.deps:trove4j:jar:sources", + "org.jetbrains.kotlin:kotlin-compiler-embeddable", + "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:javadoc", + "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:sources", + "org.jetbrains.kotlin:kotlin-daemon-embeddable", + "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:javadoc", + "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-reflect:jar:javadoc", + "org.jetbrains.kotlin:kotlin-reflect:jar:sources", + "org.jetbrains.kotlin:kotlin-script-runtime", + "org.jetbrains.kotlin:kotlin-script-runtime:jar:javadoc", + "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", + "org.jetbrains.kotlin:kotlin-stdlib:jar:javadoc", + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", + "org.jetbrains.kotlin:kotlin-test", + "org.jetbrains.kotlin:kotlin-test-annotations-common", + "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources", + "org.jetbrains.kotlin:kotlin-test-common", + "org.jetbrains.kotlin:kotlin-test-common:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-common:jar:sources", + "org.jetbrains.kotlin:kotlin-test-junit", + "org.jetbrains.kotlin:kotlin-test-junit:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test-junit:jar:sources", + "org.jetbrains.kotlin:kotlin-test:jar:javadoc", + "org.jetbrains.kotlin:kotlin-test:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-android", + "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources", + "org.jetbrains.kotlinx:kotlinx-coroutines-test", + "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:sources", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:javadoc", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources", + "org.jetbrains:annotations", + "org.jetbrains:annotations:jar:javadoc", + "org.jetbrains:annotations:jar:sources", + "org.mockito.kotlin:mockito-kotlin", + "org.mockito.kotlin:mockito-kotlin:jar:javadoc", + "org.mockito.kotlin:mockito-kotlin:jar:sources", + "org.mockito:mockito-core", + "org.mockito:mockito-core:jar:javadoc", + "org.mockito:mockito-core:jar:sources", + "org.objenesis:objenesis", + "org.objenesis:objenesis:jar:javadoc", + "org.objenesis:objenesis:jar:sources", + "org.ow2.asm:asm", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-analysis:jar:javadoc", + "org.ow2.asm:asm-analysis:jar:sources", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-commons:jar:javadoc", + "org.ow2.asm:asm-commons:jar:sources", + "org.ow2.asm:asm-tree", + "org.ow2.asm:asm-tree:jar:javadoc", + "org.ow2.asm:asm-tree:jar:sources", + "org.ow2.asm:asm-util", + "org.ow2.asm:asm-util:jar:javadoc", + "org.ow2.asm:asm-util:jar:sources", + "org.ow2.asm:asm:jar:javadoc", + "org.ow2.asm:asm:jar:sources", + "org.robolectric:annotations", + "org.robolectric:annotations:jar:javadoc", + "org.robolectric:annotations:jar:sources", + "org.robolectric:junit", + "org.robolectric:junit:jar:javadoc", + "org.robolectric:junit:jar:sources", + "org.robolectric:pluginapi", + "org.robolectric:pluginapi:jar:javadoc", + "org.robolectric:pluginapi:jar:sources", + "org.robolectric:plugins-maven-dependency-resolver", + "org.robolectric:plugins-maven-dependency-resolver:jar:javadoc", + "org.robolectric:plugins-maven-dependency-resolver:jar:sources", + "org.robolectric:resources", + "org.robolectric:resources:jar:javadoc", + "org.robolectric:resources:jar:sources", + "org.robolectric:robolectric", + "org.robolectric:robolectric:jar:javadoc", + "org.robolectric:robolectric:jar:sources", + "org.robolectric:sandbox", + "org.robolectric:sandbox:jar:javadoc", + "org.robolectric:sandbox:jar:sources", + "org.robolectric:shadowapi", + "org.robolectric:shadowapi:jar:javadoc", + "org.robolectric:shadowapi:jar:sources", + "org.robolectric:shadows-framework", + "org.robolectric:shadows-framework:jar:javadoc", + "org.robolectric:shadows-framework:jar:sources", + "org.robolectric:utils", + "org.robolectric:utils-reflector", + "org.robolectric:utils-reflector:jar:javadoc", + "org.robolectric:utils-reflector:jar:sources", + "org.robolectric:utils:jar:javadoc", + "org.robolectric:utils:jar:sources" + ] + }, + "version": "2" } diff --git a/third_party/versions.bzl b/third_party/versions.bzl index 391c54d952a..6b0efb281a1 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -126,8 +126,8 @@ HTTP_DEPENDENCY_VERSIONS = { "version": "4.0.0", }, "rules_jvm": { - "sha": "f36441aa876c4f6427bfb2d1f2d723b48e9d930b62662bf723ddfb8fc80f0140", - "version": "4.1", + "sha": "c4cd0fd413b43785494b986fdfeec5bb47eddca196af5a2a98061faab83ed7b2", + "version": "5.1", }, "rules_kotlin": { "sha": "6194a864280e1989b6d8118a4aee03bb50edeeae4076e5bc30eef8a98dcd4f07", From 7238b5949f1a9438e499ba2a4c7dc16873253895 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Mon, 27 Mar 2023 14:23:06 -0700 Subject: [PATCH 02/63] Fix JVm dep build warnings. --- WORKSPACE | 12 +- third_party/maven_install.json | 2427 +++----------------------------- third_party/versions.bzl | 5 + 3 files changed, 189 insertions(+), 2255 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index b900329c12e..a2b94e1e625 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -96,8 +96,9 @@ load("@dagger//:workspace_defs.bzl", "DAGGER_ARTIFACTS", "DAGGER_REPOSITORIES") # Add support for Robolectric: https://github.com/robolectric/robolectric-bazel http_archive( name = "robolectric", - strip_prefix = "robolectric-bazel-4.5", - urls = ["https://github.com/robolectric/robolectric-bazel/archive/4.5.tar.gz"], + sha256 = HTTP_DEPENDENCY_VERSIONS["robolectric"]["sha"], + strip_prefix = "robolectric-bazel-%s" % HTTP_DEPENDENCY_VERSIONS["robolectric"]["version"], + urls = ["https://github.com/robolectric/robolectric-bazel/archive/%s.tar.gz" % HTTP_DEPENDENCY_VERSIONS["robolectric"]["version"]], ) load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories") @@ -109,6 +110,7 @@ git_repository( name = "tools_android", commit = "00e6f4b7bdd75911e33c618a9bc57bab7a6e8930", remote = "https://github.com/bazelbuild/tools_android", + shallow_since = "1594238320 -0400", ) load("@tools_android//tools/googleservices:defs.bzl", "google_services_workspace_dependencies") @@ -119,6 +121,7 @@ git_repository( name = "circularimageview", commit = "35d08ba88a4a22e6e9ac96bdc5a68be27b55d09f", remote = "https://github.com/oppia/CircularImageview", + shallow_since = "1622148929 -0700", ) # A custom version of Android SVG is needed since custom changes needed to be added to the library @@ -143,7 +146,7 @@ git_repository( name = "kotlitex", commit = "43139c140833c7120f351d63d74b42c253d2b213", remote = "https://github.com/oppia/kotlitex", - shallow_since = "1647554845 -0700", + shallow_since = "1675741075 -0800", ) bind( @@ -153,6 +156,7 @@ bind( http_archive( name = "protobuf_tools", + sha256 = HTTP_DEPENDENCY_VERSIONS["protobuf_tools"]["sha"], strip_prefix = "protobuf-%s" % HTTP_DEPENDENCY_VERSIONS["protobuf_tools"]["version"], urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v{0}/protobuf-all-{0}.zip".format(HTTP_DEPENDENCY_VERSIONS["protobuf_tools"]["version"])], ) @@ -186,8 +190,6 @@ maven_install( artifacts = DAGGER_ARTIFACTS + get_maven_dependencies(), duplicate_version_warning = "error", fail_if_repin_required = True, - fetch_javadoc = True, - fetch_sources = True, maven_install_json = "//third_party:maven_install.json", repositories = DAGGER_REPOSITORIES + [ "https://maven.fabric.io/public", diff --git a/third_party/maven_install.json b/third_party/maven_install.json index f685727dfd3..cecbe092386 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", "__INPUT_ARTIFACTS_HASH": 1616765369, - "__RESOLVED_ARTIFACTS_HASH": 740282478, + "__RESOLVED_ARTIFACTS_HASH": -221705841, "conflict_resolution": { "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", @@ -17,16 +17,7 @@ "artifacts": { "android.arch.core:common": { "shasums": { - "jar": "3a616a32f433e9e23f556b38575c31b013613d3ae85206263b7625fe1f4c151a", - "javadoc": null, - "sources": "a92362968c7894fafedddbd1092aa7f775cb9a955aa794ab4c89e5bd386aec0c" - }, - "version": "1.1.1" - }, - "android.arch.core:core-testing": { - "shasums": { - "javadoc": null, - "sources": "9b15768758ff58fd31be63cc5dd5932805676e52c1147b897cc46302976126b3" + "jar": "3a616a32f433e9e23f556b38575c31b013613d3ae85206263b7625fe1f4c151a" }, "version": "1.1.1" }, @@ -36,70 +27,33 @@ }, "version": "1.1.1" }, - "android.arch.core:runtime": { - "shasums": { - "sources": "2819725bae3f0eac99197f810824a084d45d3b63922a87ace3329a64d0fb2420" - }, - "version": "1.1.1" - }, "android.arch.core:runtime:aar": { "shasums": { - "jar": "c3215aa5873311b3f88a6f4e4a3c25ad89971bc127de8c3e1291c57f93a05c39", - "javadoc": null + "jar": "c3215aa5873311b3f88a6f4e4a3c25ad89971bc127de8c3e1291c57f93a05c39" }, "version": "1.1.1" }, - "androidx.activity:activity": { - "shasums": { - "sources": "1a17836d7c91c4e3f983bba1072fa972bde277b57a718292f7c6d22659bb1f7e" - }, - "version": "1.1.0" - }, "androidx.activity:activity:aar": { "shasums": { - "jar": "4f2b35916768032f7d0c20e250e28b29037ed4ce9ebf3da4fcd51bcb0c6067ef", - "javadoc": null + "jar": "4f2b35916768032f7d0c20e250e28b29037ed4ce9ebf3da4fcd51bcb0c6067ef" }, "version": "1.1.0" }, "androidx.annotation:annotation": { "shasums": { - "jar": "d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692", - "javadoc": "64433da867505447aafaaab12182cc33b5afbdf32d183cfa07fa067168b06528", - "sources": "92bcd2773b5624fd88b7ee21d5685145d7cafed59316c4ce83de33a7b2dd8c02" + "jar": "d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692" }, "version": "1.1.0" }, - "androidx.annotation:annotation-experimental": { - "shasums": { - "javadoc": null, - "sources": "66bf83ada560031d10f6ec01e9f0e92aface467ab532db6e67f12703f50b6776" - }, - "version": "1.0.0" - }, "androidx.annotation:annotation-experimental:aar": { "shasums": { "jar": "b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11" }, "version": "1.0.0" }, - "androidx.appcompat:appcompat": { - "shasums": { - "javadoc": null, - "sources": "5c7408a4894d4d6c713c18bf53e724091d46e44a22ed9ea6275c8bb97f6dc9f3" - }, - "version": "1.2.0" - }, - "androidx.appcompat:appcompat-resources": { - "shasums": { - "sources": "2deb19e61f184904d1880f67a355da562516b5e5251dc55156eab94039244f09" - }, - "version": "1.2.0" - }, "androidx.appcompat:appcompat-resources:aar": { "shasums": { - "jar": "c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5", - "javadoc": null + "jar": "c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5" }, "version": "1.2.0" }, @@ -111,29 +65,13 @@ }, "androidx.arch.core:core-common": { "shasums": { - "jar": "fe1237bf029d063e7f29fe39aeaf73ef74c8b0a3658486fc29d3c54326653889", - "javadoc": null, - "sources": "01ef2736c9b688658d7446e8396099ff0c598d9a7e753131d566f953270c5878" - }, - "version": "2.1.0" - }, - "androidx.arch.core:core-runtime": { - "shasums": { - "sources": "913acdee357814e814745466a46a793e8ad7410086ba4548458b83cd6a98424b" + "jar": "fe1237bf029d063e7f29fe39aeaf73ef74c8b0a3658486fc29d3c54326653889" }, "version": "2.1.0" }, "androidx.arch.core:core-runtime:aar": { "shasums": { - "jar": "dd77615bd3dd275afb11b62df25bae46b10b4a117cd37943af45bdcbf8755852", - "javadoc": null - }, - "version": "2.1.0" - }, - "androidx.arch.core:core-testing": { - "shasums": { - "javadoc": null, - "sources": "68ef3af5efcd66013bbaf53c8a927354a142ddb16db804a0a83cf70176efabdc" + "jar": "dd77615bd3dd275afb11b62df25bae46b10b4a117cd37943af45bdcbf8755852" }, "version": "2.1.0" }, @@ -143,13 +81,6 @@ }, "version": "2.1.0" }, - "androidx.cardview:cardview": { - "shasums": { - "javadoc": null, - "sources": "ad7a28e7768893f8b33a8b7b275a92e33c125243ca4a9130a984c40e578e19b4" - }, - "version": "1.0.0" - }, "androidx.cardview:cardview:aar": { "shasums": { "jar": "1193c04c22a3d6b5946dae9f4e8c59d6adde6a71b6bd5d87fb99d82dda1afec7" @@ -158,24 +89,13 @@ }, "androidx.collection:collection": { "shasums": { - "jar": "632a0e5407461de774409352940e292a291037724207a787820c77daf7d33b72", - "javadoc": null, - "sources": "158ae7efee9c7394a241139ebf220751f8b812eda40269a38ef725dbe784b98d" + "jar": "632a0e5407461de774409352940e292a291037724207a787820c77daf7d33b72" }, "version": "1.1.0" }, - "androidx.constraintlayout:constraintlayout": { - "shasums": { - "javadoc": null, - "sources": null - }, - "version": "2.0.1" - }, "androidx.constraintlayout:constraintlayout-solver": { "shasums": { - "jar": "b23732edbb3511d937fea1ffef047b0e6c001b50c1921f0d959fc384d706ec6a", - "javadoc": null, - "sources": null + "jar": "b23732edbb3511d937fea1ffef047b0e6c001b50c1921f0d959fc384d706ec6a" }, "version": "2.0.1" }, @@ -185,33 +105,12 @@ }, "version": "2.0.1" }, - "androidx.coordinatorlayout:coordinatorlayout": { - "shasums": { - "javadoc": null, - "sources": "c8904cffcfb757cf14d8c0cf7563274edc3a8bc883ca9203b4b98e9823f7b22b" - }, - "version": "1.1.0" - }, "androidx.coordinatorlayout:coordinatorlayout:aar": { "shasums": { "jar": "44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb" }, "version": "1.1.0" }, - "androidx.core:core": { - "shasums": { - "javadoc": null, - "sources": "ae0e7ef2b5be9a59ef6d8c831090ba3e4407f9ae21e453c1df9f6b82cb46be28" - }, - "version": "1.3.1" - }, - "androidx.core:core-ktx": { - "shasums": { - "javadoc": null, - "sources": "a477aafb6356210d5d6a64f0d5e57e5500e1906ba1a3f49d449081589e785626" - }, - "version": "1.0.1" - }, "androidx.core:core-ktx:aar": { "shasums": { "jar": "a151b7e21acc3d272e1d397a2084e76ccce88e8542adcc4e0cf1e0655063255f" @@ -220,44 +119,22 @@ }, "androidx.core:core:aar": { "shasums": { - "jar": "e92ea65a37d589943d405a6a54d1be9d12a225948f26c4e41e511dd55e81efb6", - "javadoc": null + "jar": "e92ea65a37d589943d405a6a54d1be9d12a225948f26c4e41e511dd55e81efb6" }, "version": "1.3.1" }, - "androidx.cursoradapter:cursoradapter": { - "shasums": { - "sources": "99b72a3aec8c9edfd9de20f5913ce4c413bca2f0cf9877b504e26aa03ef50323" - }, - "version": "1.0.0" - }, "androidx.cursoradapter:cursoradapter:aar": { "shasums": { - "jar": "a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564", - "javadoc": null + "jar": "a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564" }, "version": "1.0.0" }, - "androidx.customview:customview": { - "shasums": { - "sources": "0f119c77c7613881901cbcd149e718409480c08c39661737750a35f5d6b5dfd2" - }, - "version": "1.1.0" - }, "androidx.customview:customview:aar": { "shasums": { - "jar": "01f76ab043770a97b054046f9815717b82ce0355c02967d16c61981359dc189a", - "javadoc": null + "jar": "01f76ab043770a97b054046f9815717b82ce0355c02967d16c61981359dc189a" }, "version": "1.1.0" }, - "androidx.databinding:databinding-adapters": { - "shasums": { - "javadoc": null, - "sources": "201336b6c7563cf4bf7481dc24bf8cf81944d1ff0dde75e66f989fbf599c2ac5" - }, - "version": "3.4.2" - }, "androidx.databinding:databinding-adapters:aar": { "shasums": { "jar": "840a66744866185b6a74fd99e6596bf1eb0720837c3ae470c25212bccc563939" @@ -266,32 +143,19 @@ }, "androidx.databinding:databinding-common": { "shasums": { - "jar": "52886c0ef6cfa492d07b40c3952201d6d2f0cfc680144fbefc69d2d5cb786c25", - "javadoc": "eeb6b61b31a9561e073a15e8f050de8f8fb663103be3ec390b61c6f19a821ca5", - "sources": "c06f772438c32b6cb47b4bfe44129b77c9c9470a7f9c69af1383a31f8d050eef" + "jar": "52886c0ef6cfa492d07b40c3952201d6d2f0cfc680144fbefc69d2d5cb786c25" }, "version": "3.4.2" }, "androidx.databinding:databinding-compiler": { "shasums": { - "jar": "07a9fb44f43048b18f149add7835e1239e92057e6748affde2d2bccf330c4242", - "javadoc": "8550379b595c934f4bbea2d34749506587763b58890a35088a04a7c546ba044d", - "sources": "55abb3bae194f31d0823807fd798b95447fb988f7f1291195e040b281f258464" + "jar": "07a9fb44f43048b18f149add7835e1239e92057e6748affde2d2bccf330c4242" }, "version": "3.4.2" }, "androidx.databinding:databinding-compiler-common": { "shasums": { - "jar": "770b6a82da0684f93d037ed5d241248cb25862ed14ecd7d9ec8c756153266051", - "javadoc": "91d74586e54c510cc46a8e2a8f3d9e21538d2c7e07ec38e0b3205d3828dfc47a", - "sources": "7a4baf3d6a0c08e9221e2059c505714c1ba3bb2be20ff7f0ee24210a5dbc51ba" - }, - "version": "3.4.2" - }, - "androidx.databinding:databinding-runtime": { - "shasums": { - "javadoc": null, - "sources": "5d9c949b8d3f14102a1aa85a036057bb32c715a414438c76af06c772f935bf91" + "jar": "770b6a82da0684f93d037ed5d241248cb25862ed14ecd7d9ec8c756153266051" }, "version": "3.4.2" }, @@ -301,112 +165,51 @@ }, "version": "3.4.2" }, - "androidx.documentfile:documentfile": { - "shasums": { - "sources": "79c2424477565d0500b47c8288fb8e6dd9c8306984e8dbd38d576f013873b410" - }, - "version": "1.0.0" - }, "androidx.documentfile:documentfile:aar": { "shasums": { - "jar": "865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487", - "javadoc": null + "jar": "865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487" }, "version": "1.0.0" }, - "androidx.drawerlayout:drawerlayout": { - "shasums": { - "javadoc": null, - "sources": "2273fcbb290a092634b90e0556dfb1ae978d9ed011be5692bd9e6659633b6850" - }, - "version": "1.1.0" - }, "androidx.drawerlayout:drawerlayout:aar": { "shasums": { - "jar": "9d79030ad4f93b1c6296f7a8391710f9e9e3228a3b10964c4bb0a042fd6257b8", - "javadoc": null + "jar": "9d79030ad4f93b1c6296f7a8391710f9e9e3228a3b10964c4bb0a042fd6257b8" }, "version": "1.1.0" }, - "androidx.dynamicanimation:dynamicanimation": { - "shasums": { - "javadoc": null, - "sources": "7ddbf0b830e295b8013a41c2c6771416118bcc8d61328a881daae657c1429196" - }, - "version": "1.0.0" - }, "androidx.dynamicanimation:dynamicanimation:aar": { "shasums": { "jar": "ce005162c229bf308d2d5b12fb6cad0874069cbbeaccee63a8193bd08d40de04" }, "version": "1.0.0" }, - "androidx.exifinterface:exifinterface": { - "shasums": { - "javadoc": null, - "sources": "b9404066c090ba7ee2980698448ecc4a0d9280e4916be3b9d6d6b1cdc90e4a4c" - }, - "version": "1.0.0" - }, "androidx.exifinterface:exifinterface:aar": { "shasums": { "jar": "ee48be10aab8f54efff4c14b77d11e10b9eeee4379d5ef6bf297a2923c55cc11" }, "version": "1.0.0" }, - "androidx.fragment:fragment": { - "shasums": { - "javadoc": null, - "sources": "45606d34c38e29cf9ccf4bbec79c87836e7cc53bd300031792e589df16967cbb" - }, - "version": "1.2.0" - }, "androidx.fragment:fragment:aar": { "shasums": { - "jar": "fdd0eac80c6b26c79093a63fc699303f928cc1fa73ca7196d5590a77eb6d6873", - "javadoc": null + "jar": "fdd0eac80c6b26c79093a63fc699303f928cc1fa73ca7196d5590a77eb6d6873" }, "version": "1.2.0" }, - "androidx.interpolator:interpolator": { - "shasums": { - "sources": "fa13ada71fe7bd9461f622f418e7c16a18e85da7708fb505c75229a9b8830345" - }, - "version": "1.0.0" - }, "androidx.interpolator:interpolator:aar": { "shasums": { - "jar": "33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a", - "javadoc": null - }, - "version": "1.0.0" - }, - "androidx.legacy:legacy-support-core-utils": { - "shasums": { - "javadoc": null, - "sources": "dff5a95a7a706957b16edbf5b36c619fc869742bdf18845520d0cf71748c8070" + "jar": "33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a" }, "version": "1.0.0" }, "androidx.legacy:legacy-support-core-utils:aar": { "shasums": { - "jar": "a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7", - "javadoc": null + "jar": "a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7" }, "version": "1.0.0" }, "androidx.lifecycle:lifecycle-common": { "shasums": { - "jar": "63898dabf7cfe5ec5d7ed8b8c2564c1427be876e1496ead95c2703cf59d3734b", - "javadoc": null, - "sources": "faa1efdbf3fb66de1cd40132c9ae0f642e7ffb922d21fb3acf171903aeb8e872" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-extensions": { - "shasums": { - "javadoc": null, - "sources": "3cc0bd51ff16c978cc4000a10e6df339febd97a0aed6aa301454b70798155cc4" + "jar": "63898dabf7cfe5ec5d7ed8b8c2564c1427be876e1496ead95c2703cf59d3734b" }, "version": "2.2.0" }, @@ -416,43 +219,15 @@ }, "version": "2.2.0" }, - "androidx.lifecycle:lifecycle-livedata": { - "shasums": { - "sources": "f774d6018dbc7f56c278130122e608d96304f8bd78e4778d44855a01f5982d13" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-livedata-core": { - "shasums": { - "javadoc": null, - "sources": "80de3a26fdd5857fea39d339a4d11e19c151a45ae52a16a4e237e0b4a50e10c4" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-livedata-core-ktx": { - "shasums": { - "sources": "d962111f3f83b59b90c7fee2f1c47a6532629cebc01c407be39adf34e4d0d09c" - }, - "version": "2.2.0" - }, "androidx.lifecycle:lifecycle-livedata-core-ktx:aar": { "shasums": { - "jar": "5951f882e95b7e05ceb9adfca0fa2ebd511d63ea5a00da4eae6c6d0c1903da18", - "javadoc": null + "jar": "5951f882e95b7e05ceb9adfca0fa2ebd511d63ea5a00da4eae6c6d0c1903da18" }, "version": "2.2.0" }, "androidx.lifecycle:lifecycle-livedata-core:aar": { "shasums": { - "jar": "556c1f3af90aa9d7d0d330565adbf6da71b2429148bac91e07c485f4f9abf614", - "javadoc": null - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-livedata-ktx": { - "shasums": { - "javadoc": null, - "sources": "3b1a5683ffecf2f5ec7879db1b7debf03d94b49db0bc4e2cf49d340e194fa437" + "jar": "556c1f3af90aa9d7d0d330565adbf6da71b2429148bac91e07c485f4f9abf614" }, "version": "2.2.0" }, @@ -464,61 +239,25 @@ }, "androidx.lifecycle:lifecycle-livedata:aar": { "shasums": { - "jar": "d83af94860aa9f64cbdc51f40796a7cf55b116f0e6efd752e845c0104c8b16f6", - "javadoc": null - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-process": { - "shasums": { - "sources": "2a1f34b433f339ea4f93da82bf511deb4baaabca417271a55578b3c86e1373b1" + "jar": "d83af94860aa9f64cbdc51f40796a7cf55b116f0e6efd752e845c0104c8b16f6" }, "version": "2.2.0" }, "androidx.lifecycle:lifecycle-process:aar": { "shasums": { - "jar": "3a977e7778fc8418742d388409daaba7ea8fea8823d21ffb96e4c4236f715070", - "javadoc": null - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-runtime": { - "shasums": { - "javadoc": null, - "sources": "3b7867671a7875525358a71e81adf66ba4d2a45cf2b53ffe5ad0350e3ea06362" + "jar": "3a977e7778fc8418742d388409daaba7ea8fea8823d21ffb96e4c4236f715070" }, "version": "2.2.0" }, "androidx.lifecycle:lifecycle-runtime:aar": { "shasums": { - "jar": "2f866c07a1f33a8c9bb69a9545d4f20b4f0628cd0a155432386d7cb081e1e0bc", - "javadoc": null - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-service": { - "shasums": { - "sources": "672b07e4607fc897672d2794af751724306d418e7892b636002be8e3b78fc08c" + "jar": "2f866c07a1f33a8c9bb69a9545d4f20b4f0628cd0a155432386d7cb081e1e0bc" }, "version": "2.2.0" }, "androidx.lifecycle:lifecycle-service:aar": { "shasums": { - "jar": "ca2801ffc069555afed8eddd2292130f436956452bc8bbad30fb56f8e4e382a0", - "javadoc": null - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-viewmodel": { - "shasums": { - "sources": "e0eae37c00d8cb41817ed95712083c75e3a4e3f7815de04519a8200ec155ec3c" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-viewmodel-ktx": { - "shasums": { - "javadoc": null, - "sources": "9cab05f9a642bdcb8628d4e353efa1dc2784cdc5c337687470edd0c2cd2071a3" + "jar": "ca2801ffc069555afed8eddd2292130f436956452bc8bbad30fb56f8e4e382a0" }, "version": "2.2.0" }, @@ -528,66 +267,30 @@ }, "version": "2.2.0" }, - "androidx.lifecycle:lifecycle-viewmodel-savedstate": { - "shasums": { - "sources": "4f49bba528977fd1873796623dc5f6669a6e72a5b3b624c7cea2d9285b995dd9" - }, - "version": "1.0.0" - }, "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar": { "shasums": { - "jar": "f4cceafbf86acfc7f3ba6a61d6dc6842a6738c1274610767d3ab8f8a114cba97", - "javadoc": null + "jar": "f4cceafbf86acfc7f3ba6a61d6dc6842a6738c1274610767d3ab8f8a114cba97" }, "version": "1.0.0" }, "androidx.lifecycle:lifecycle-viewmodel:aar": { "shasums": { - "jar": "967efab24d6c49dd414a8c0ac4a1cd09b018f0b8bb43b739ad360c4158ebde27", - "javadoc": null + "jar": "967efab24d6c49dd414a8c0ac4a1cd09b018f0b8bb43b739ad360c4158ebde27" }, "version": "2.2.0" }, - "androidx.loader:loader": { - "shasums": { - "sources": "efcbafaac8fc06bd5b162b57ac1e146d11919b79dea2202339470c931cecdc67" - }, - "version": "1.0.0" - }, "androidx.loader:loader:aar": { "shasums": { - "jar": "11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025", - "javadoc": null - }, - "version": "1.0.0" - }, - "androidx.localbroadcastmanager:localbroadcastmanager": { - "shasums": { - "sources": "952b8567a76d6484aa96f9712b9dc90f21b83a73e2496daf243e2e1adfb65dd4" + "jar": "11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025" }, "version": "1.0.0" }, "androidx.localbroadcastmanager:localbroadcastmanager:aar": { "shasums": { - "jar": "e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8", - "javadoc": null + "jar": "e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8" }, "version": "1.0.0" }, - "androidx.multidex:multidex": { - "shasums": { - "javadoc": null, - "sources": "b0d707d4074dd1996d0780e0b84478d4ca54515de38fe8df542fbafc44ba2b20" - }, - "version": "2.0.1" - }, - "androidx.multidex:multidex-instrumentation": { - "shasums": { - "javadoc": null, - "sources": null - }, - "version": "2.0.0" - }, "androidx.multidex:multidex-instrumentation:aar": { "shasums": { "jar": "fb8115694b1731c23c1bbb628f5baaee37a8f3b50d69a7733b55278e101e1488" @@ -600,43 +303,15 @@ }, "version": "2.0.1" }, - "androidx.navigation:navigation-common": { - "shasums": { - "sources": "f183a513b99f071dafa39d59fc474f11c8e8012f62f250d4d8d5463f259bc495" - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-common-ktx": { - "shasums": { - "sources": "5c5c19c604b95ef8e2a37e3c56817c605eeaa687e48924bbb6a07641c504ae6a" - }, - "version": "2.0.0" - }, "androidx.navigation:navigation-common-ktx:aar": { "shasums": { - "jar": "ed00b6f73d8acc7e06729f5f19cdeb410ca1d0e45afbcf6ff435a1091c3a3d57", - "javadoc": null + "jar": "ed00b6f73d8acc7e06729f5f19cdeb410ca1d0e45afbcf6ff435a1091c3a3d57" }, "version": "2.0.0" }, "androidx.navigation:navigation-common:aar": { "shasums": { - "jar": "542ec6f993b6d3bfafe2e53e0f250b8685331e2a0258f9313af9ee3376f93959", - "javadoc": null - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-fragment": { - "shasums": { - "javadoc": null, - "sources": "bc3a5b4153f886f11c5e0ab5fcba2f329beaeb5c2fa00c9b7f176884a20c0ece" - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-fragment-ktx": { - "shasums": { - "javadoc": null, - "sources": "482878c8b556ee07e9fd13fe9feee654fcbc984aa5224bfe7a5119796000020f" + "jar": "542ec6f993b6d3bfafe2e53e0f250b8685331e2a0258f9313af9ee3376f93959" }, "version": "2.0.0" }, @@ -648,48 +323,19 @@ }, "androidx.navigation:navigation-fragment:aar": { "shasums": { - "jar": "38ddf1afc99a0585904f2121eee7131fef13595e64c9bb6b22f68dd66b8d1f9c", - "javadoc": null - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-runtime": { - "shasums": { - "sources": "266f7224c7d769f356cd03aa47c248eea61d3e1fb62ff75215657b2b7ee917a5" - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-runtime-ktx": { - "shasums": { - "sources": "7d82617dd32bfc2354d568826a465fd40aaf7eb38efd1fbc126703e86f534613" + "jar": "38ddf1afc99a0585904f2121eee7131fef13595e64c9bb6b22f68dd66b8d1f9c" }, "version": "2.0.0" }, "androidx.navigation:navigation-runtime-ktx:aar": { "shasums": { - "jar": "41f1145f9aca5a7d97567dfe08924ec1cebcc72cb2c5d6d1a1cd31a780669358", - "javadoc": null + "jar": "41f1145f9aca5a7d97567dfe08924ec1cebcc72cb2c5d6d1a1cd31a780669358" }, "version": "2.0.0" }, "androidx.navigation:navigation-runtime:aar": { "shasums": { - "jar": "903cd93d3424300ff048a92086d773cfc5e23f928063d4493a45b4b042f2a550", - "javadoc": null - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-ui": { - "shasums": { - "javadoc": null, - "sources": "60565a3ce3a9aed5a85ab4bcc1c60a516d026ad09ad26e2ecfd3899f0bd8740c" - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-ui-ktx": { - "shasums": { - "javadoc": null, - "sources": "a6bd9b53e81130e6ee53294df495c114ef136517c330c7aac19ed979087815a3" + "jar": "903cd93d3424300ff048a92086d773cfc5e23f928063d4493a45b4b042f2a550" }, "version": "2.0.0" }, @@ -701,368 +347,169 @@ }, "androidx.navigation:navigation-ui:aar": { "shasums": { - "jar": "d6edc08d69268967d11336bd8c2dce1f154f0ae8117be9874895f6974123ed20", - "javadoc": null + "jar": "d6edc08d69268967d11336bd8c2dce1f154f0ae8117be9874895f6974123ed20" }, "version": "2.0.0" }, - "androidx.print:print": { - "shasums": { - "sources": "659b6e2047484dbae409b9b49c19f9ebd9540bb7ef3610438e2c2b15064fc217" - }, - "version": "1.0.0" - }, "androidx.print:print:aar": { "shasums": { - "jar": "1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd", - "javadoc": null + "jar": "1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd" }, "version": "1.0.0" }, - "androidx.recyclerview:recyclerview": { - "shasums": { - "javadoc": null, - "sources": "7552c8b621d59b68d2dc962d3bbeee8ccaea5b54cf0085adc85059d37584d93c" - }, - "version": "1.1.0" - }, "androidx.recyclerview:recyclerview:aar": { "shasums": { - "jar": "f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f", - "javadoc": null + "jar": "f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f" }, "version": "1.1.0" }, "androidx.room:room-common": { "shasums": { - "jar": "2b130dd4a1d3d91b6701ed33096d389f01c4fc1197a7acd6b91724ddc5acfc06", - "javadoc": null, - "sources": "c78682d9435986ceec6a3349d22474f13e1aa3ec62d5aea01aacb5018c2fc2d2" - }, - "version": "2.2.5" - }, - "androidx.room:room-runtime": { - "shasums": { - "javadoc": null, - "sources": "d7b194ff380442603a99761f283f607083aff7e4bee541aef98b27211b8fa4ce" + "jar": "2b130dd4a1d3d91b6701ed33096d389f01c4fc1197a7acd6b91724ddc5acfc06" }, "version": "2.2.5" }, "androidx.room:room-runtime:aar": { "shasums": { - "jar": "24a5549b796e43e337513d2908adac67f45350d9a90bca7e2e6120692140bb14", - "javadoc": null + "jar": "24a5549b796e43e337513d2908adac67f45350d9a90bca7e2e6120692140bb14" }, "version": "2.2.5" }, - "androidx.savedstate:savedstate": { - "shasums": { - "sources": "d6e27205d673e6a89a7ed0513d65376d2a6a00a951f60485659b25d946e8c743" - }, - "version": "1.0.0" - }, "androidx.savedstate:savedstate:aar": { "shasums": { - "jar": "2510a5619c37579c9ce1a04574faaf323cd0ffe2fc4e20fa8f8f01e5bb402e83", - "javadoc": null + "jar": "2510a5619c37579c9ce1a04574faaf323cd0ffe2fc4e20fa8f8f01e5bb402e83" }, "version": "1.0.0" }, - "androidx.sqlite:sqlite": { - "shasums": { - "sources": "db06b388994733ed3a678819fc91b572a92abdd7277fbb856a48969f6df6ecf1" - }, - "version": "2.1.0" - }, - "androidx.sqlite:sqlite-framework": { - "shasums": { - "sources": "5998669629684144592b0c6981c3f5e7935faaeeaa32c691ae58da3c54fb85a9" - }, - "version": "2.1.0" - }, "androidx.sqlite:sqlite-framework:aar": { "shasums": { - "jar": "8673737fdb2efbad91aeaeed1927ebb29212d36a867d93b9639c8069019f8a1e", - "javadoc": null + "jar": "8673737fdb2efbad91aeaeed1927ebb29212d36a867d93b9639c8069019f8a1e" }, "version": "2.1.0" }, "androidx.sqlite:sqlite:aar": { "shasums": { - "jar": "8341ff092d6060d62a07227f29237155fff36fb16f96c95fbd9a884e375db912", - "javadoc": null + "jar": "8341ff092d6060d62a07227f29237155fff36fb16f96c95fbd9a884e375db912" }, "version": "2.1.0" }, - "androidx.test.espresso:espresso-accessibility": { - "shasums": { - "javadoc": "37891fcbfec8fa57ae477c0c20548a4f398856edbb094a37363b32e86af77118", - "sources": "8cbe8f83d472d324ac45372ba71b2004c66e81f8cdab1e1b3202020cfc958c11" - }, - "version": "3.1.0" - }, "androidx.test.espresso:espresso-accessibility:aar": { "shasums": { "jar": "e2ee8b50081c0b578521d112808321f737f3bf1acce035fe7be0e26ef00b491f" }, "version": "3.1.0" }, - "androidx.test.espresso:espresso-contrib": { - "shasums": { - "javadoc": "20bea11b66080bb827616ac0fce9c32d515993385e03a8e65d2c01f923b3fdf5", - "sources": "a64d9cc5469b32a4f65e5b14021cfa27d9ba04733f7ca04aef644207c1d399b9" - }, - "version": "3.1.0" - }, "androidx.test.espresso:espresso-contrib:aar": { "shasums": { "jar": "277c292f02816b5e49051485b11e612c0ba7d36fc76b7dac955fe37766ec2832" }, "version": "3.1.0" }, - "androidx.test.espresso:espresso-core": { - "shasums": { - "javadoc": "d3f96a3c1419783c93da125ef42218870a06d83b200caf6d85afb48f91bc5574", - "sources": "08d443f440e8b4fdd5eb4dbc5447264d79350fa7fbc256762b86f1c9fabb6b07" - }, - "version": "3.2.0" - }, "androidx.test.espresso:espresso-core:aar": { "shasums": { "jar": "beb4712c2520c1da30ac1f25506871f16ea5b83ee686ece5a258769df1a01e15" }, "version": "3.2.0" }, - "androidx.test.espresso:espresso-idling-resource": { - "shasums": { - "javadoc": "02201274466dc2a9396fdf5d642e63ed08d73cc4e88cc942b2b9608b49465cc6", - "sources": "38935cd32b5c0a868eb3a3cda9465004867d08e631bf872ffa8bbb158b3d32fc" - }, - "version": "3.2.0" - }, "androidx.test.espresso:espresso-idling-resource:aar": { "shasums": { "jar": "c1a0454fe95788122ba652c3ecff7ec538c7e27de206aed970f2809fb8090d09" }, "version": "3.2.0" }, - "androidx.test.espresso:espresso-intents": { - "shasums": { - "javadoc": "d5baf1ba5aacf13a3cc1ddb5022ce6041c48f257d31cd11312bd47bfc493e3e0", - "sources": "133aa31a977ff67ce17b27d9d10cc2d3ca339e1fd538488feee6150f1b6552d7" - }, - "version": "3.1.0" - }, "androidx.test.espresso:espresso-intents:aar": { "shasums": { "jar": "6c252ea1221a7973301b62d1695d4d73cb1b7c0853ee2ffdb8274886148f0af6" }, "version": "3.1.0" }, - "androidx.test.ext:junit": { - "shasums": { - "javadoc": "2759ef1503ca60c267c519251803f8beb0d033faea685ab7b656713deb0cfb15", - "sources": "e8abb0752a123d337be4cced50298067a8340135e64f0a24ff52345ed20cd292" - }, - "version": "1.1.1" - }, "androidx.test.ext:junit:aar": { "shasums": { "jar": "449df418d2916a0f86fe7dafb1edb09480fafb6e995d5c751c7d0d1970d4ae72" }, "version": "1.1.1" }, - "androidx.test.ext:truth": { - "shasums": { - "javadoc": "5d7a9b2ce35d8b59d96f59d7277adaa576f1717556a012f770d6440a361d288d", - "sources": "7c7d5f0b67046f2da28ad2b99e6af9fe7b228a4420dc5863e7428be3b8f928df" - }, - "version": "1.4.0" - }, "androidx.test.ext:truth:aar": { "shasums": { "jar": "d067a9bdd009b08d4230f8283cb4579a1183ef45bbfa169fd6d0f112d6c324f6" }, "version": "1.4.0" }, - "androidx.test.uiautomator:uiautomator": { - "shasums": { - "javadoc": "d6ce5ab3d9d32aeb5c73022d36209147b463e9a6a8951b79c4010232c50e416e", - "sources": "e1f438106ac0d26b80ecf4fd6ffe6d36f60e12bdcd6316903f802ed24d00be99" - }, - "version": "2.2.0" - }, "androidx.test.uiautomator:uiautomator:aar": { "shasums": { "jar": "2838e9d961dbffefbbd229a2bd4f6f82ac4fb2462975862a9e75e9ed325a3197" }, "version": "2.2.0" }, - "androidx.test:core": { - "shasums": { - "javadoc": "8972e2aa593da387257614e45fcc3492725c6528df9ce07fc39e495d1311c4a6", - "sources": "b3125d546acfea278b82250344c83826e872e3f461109daf0948806382603b30" - }, - "version": "1.4.0" - }, "androidx.test:core:aar": { "shasums": { "jar": "671284e62e393f16ceae1a99a3a9a07bf1aacda29f8fe7b6b884355ef34c09cf" }, "version": "1.4.0" }, - "androidx.test:monitor": { - "shasums": { - "javadoc": "9672dbb39e76e7ff1c1a35b04652e24cb0b40cb0353d064de7a3ab683ad9bf11", - "sources": "a03ea6019c1ee7cc285afdbee98137ec463b891e6fc9176c121c5a70ec727f48" - }, - "version": "1.4.0" - }, "androidx.test:monitor:aar": { "shasums": { "jar": "46a912a1e175f27a97521af3f50e5af87c22c49275dd2c57c043740012806325" }, "version": "1.4.0" }, - "androidx.test:rules": { - "shasums": { - "javadoc": "f3af3597242684cbec5f69a5045a67c649094fc8d04c5af1c8e124b6f9464bbd", - "sources": "644ab3c4a55fea00bc36c814ca52abf8d0aacc43a685ff80ae033c534ec18dcb" - }, - "version": "1.1.0" - }, "androidx.test:rules:aar": { "shasums": { "jar": "0c5c87df67b358c1a17765357138ea1d4bb58c61159ae635b4cb4dcaa3bb5986" }, "version": "1.1.0" }, - "androidx.test:runner": { - "shasums": { - "javadoc": "baec1bfd44e3065191f0d87aa3fa8e6f0e3b83701a6c0eb0cbd27929a2ee61be", - "sources": "ec71974ddd8245a85ca856577c70972fd4c484f715df0a26271f0c28f8a58739" - }, - "version": "1.2.0" - }, "androidx.test:runner:aar": { "shasums": { "jar": "5387e011167a3c8da08d99b5d59248c0e2da839317b48ebf202e31dc1f791ec1" }, "version": "1.2.0" }, - "androidx.transition:transition": { - "shasums": { - "javadoc": null, - "sources": "86febeb3fbb96b93a355ada8a97e5c17355cf709e1bab178d5c4bc73c67c9887" - }, - "version": "1.2.0" - }, "androidx.transition:transition:aar": { "shasums": { "jar": "a1e059b3bc0b43a58dec0efecdcaa89c82d2bca552ea5bacf6656c46e853157e" }, "version": "1.2.0" }, - "androidx.vectordrawable:vectordrawable": { - "shasums": { - "javadoc": null, - "sources": "a1ae4fccc4ab76a734c10f79adf39262517658a79084bad467c4c6f41c478187" - }, - "version": "1.1.0" - }, - "androidx.vectordrawable:vectordrawable-animated": { - "shasums": { - "javadoc": null, - "sources": "a3880c595965c55fd1bdee0554b99c66e9c28d3311b7ce6242189fc1f554fcf1" - }, - "version": "1.1.0" - }, "androidx.vectordrawable:vectordrawable-animated:aar": { "shasums": { - "jar": "76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8", - "javadoc": null + "jar": "76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8" }, "version": "1.1.0" }, "androidx.vectordrawable:vectordrawable:aar": { "shasums": { - "jar": "46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26", - "javadoc": null - }, - "version": "1.1.0" - }, - "androidx.versionedparcelable:versionedparcelable": { - "shasums": { - "sources": "135016af471acf4cd9583d36ceb779710c6b46812ccaaef7c526d5d60eae6b0b" + "jar": "46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26" }, "version": "1.1.0" }, "androidx.versionedparcelable:versionedparcelable:aar": { "shasums": { - "jar": "9a1d77140ac222b7866b5054ee7d159bc1800987ed2d46dd6afdd145abb710c1", - "javadoc": null + "jar": "9a1d77140ac222b7866b5054ee7d159bc1800987ed2d46dd6afdd145abb710c1" }, "version": "1.1.0" }, - "androidx.viewpager2:viewpager2": { - "shasums": { - "javadoc": null, - "sources": "b091618751f3ee04176d8f976077c353d7c902c4aeafc134d18aee3b771f19a1" - }, - "version": "1.0.0" - }, "androidx.viewpager2:viewpager2:aar": { "shasums": { "jar": "e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af" }, "version": "1.0.0" }, - "androidx.viewpager:viewpager": { - "shasums": { - "javadoc": null, - "sources": "d4f9a044ab8c23392b12a3f2930d5fd6b5982421a746f2f2a812e9619431fbfd" - }, - "version": "1.0.0" - }, "androidx.viewpager:viewpager:aar": { "shasums": { - "jar": "147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682", - "javadoc": null + "jar": "147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682" }, "version": "1.0.0" }, - "androidx.work:work-runtime": { - "shasums": { - "javadoc": null, - "sources": "7312584b39b43499968297c6bedb2d4759844539ce3c9a0ad178184f75663fff" - }, - "version": "2.4.0" - }, - "androidx.work:work-runtime-ktx": { - "shasums": { - "javadoc": null, - "sources": "f2815313e99aff830108784a855c6112e6161b451f28b5ea8345936470e4422f" - }, - "version": "2.4.0" - }, "androidx.work:work-runtime-ktx:aar": { "shasums": { - "jar": "290d2e9c1a22388b3f0c3dbc204a6176f8c49174126de884820befa83899f129", - "javadoc": null + "jar": "290d2e9c1a22388b3f0c3dbc204a6176f8c49174126de884820befa83899f129" }, "version": "2.4.0" }, "androidx.work:work-runtime:aar": { "shasums": { - "jar": "7801441cb973fb007ef311d3db35c3b3c9d011cef890357e7ca33890833354e5", - "javadoc": null - }, - "version": "2.4.0" - }, - "androidx.work:work-testing": { - "shasums": { - "javadoc": null, - "sources": "238556cb095dbfffc6a2f376630410cfd0eddb1aaa3f6976476f1152e9615570" + "jar": "7801441cb973fb007ef311d3db35c3b3c9d011cef890357e7ca33890833354e5" }, "version": "2.4.0" }, @@ -1074,80 +521,55 @@ }, "com.almworks.sqlite4java:sqlite4java": { "shasums": { - "jar": "243a64470fda0e86a6fddeb0af4c7aa9426ce84e68cbfe18d75ee5da4b7e0b92", - "javadoc": "ca8b2face1fc29691a5f13c1df01055382fd2291b7fc8211231ed225feed359f", - "sources": "778b2c2c6f7e0fb5d9b4a5c7ccea3836c2c172e581bfa3121514b8de628b3180" + "jar": "243a64470fda0e86a6fddeb0af4c7aa9426ce84e68cbfe18d75ee5da4b7e0b92" }, "version": "1.0.392" }, "com.android.databinding:baseLibrary": { "shasums": { - "jar": "5e4f3b90995be63f3c8eeecce120c588a98c6aad3b54f60ad4c80b5418c4b012", - "javadoc": "086fbefbb6bc12f3a57a278aa2b813e07595bc8be69e8e498312c2a138ec27cc", - "sources": "26c82ea4632135e7ab806c27862055d32b05aec4cc54b4fedbb2f529e6764276" + "jar": "5e4f3b90995be63f3c8eeecce120c588a98c6aad3b54f60ad4c80b5418c4b012" }, "version": "3.4.2" }, "com.android.support:support-annotations": { "shasums": { - "jar": "5d5b9414f02d3fa0ee7526b8d5ddae0da67c8ecc8c4d63ffa6cf91488a93b927", - "javadoc": null, - "sources": null + "jar": "5d5b9414f02d3fa0ee7526b8d5ddae0da67c8ecc8c4d63ffa6cf91488a93b927" }, "version": "28.0.0" }, "com.android.tools.build.jetifier:jetifier-core": { "shasums": { - "jar": "c9f8b016144cfb31c5aee92d47f34de23289167cac5e8ef68365b2dd05766f11", - "javadoc": null, - "sources": "b1293035a1cb88d25e3eb481b66813cb2e04fe2b3a82daca523ef1e0cded1409" + "jar": "c9f8b016144cfb31c5aee92d47f34de23289167cac5e8ef68365b2dd05766f11" }, "version": "1.0.0-beta04" }, "com.android.tools.build:aapt2-proto": { "shasums": { - "jar": "d5e2f3e1e1eb06224b6875f5e513c72a65182342745718160caf191d46a96664", - "javadoc": "8ba7e35b05c714b1110a37f758de2806afe20a1e19d2b77d91ea03ddf4f4b919", - "sources": "9887a82631d64be27278ea588bfa69ebc6a8f73564e222abab950a406653114c" + "jar": "d5e2f3e1e1eb06224b6875f5e513c72a65182342745718160caf191d46a96664" }, "version": "7.3.1-8691043" }, "com.android.tools:annotations": { "shasums": { - "jar": "1877849936f48cd65857bf448743f9a0bf93ed47fe57527d9ad8af875024888d", - "javadoc": "45402160e5368929730e2e8f6caf2c2c8d9568e5c788445e671cb85abf568d5a", - "sources": "f4d3a5813226ec6a0767e811576834254c2daea1d95a7ff1c18e8e50f214c882" + "jar": "1877849936f48cd65857bf448743f9a0bf93ed47fe57527d9ad8af875024888d" }, "version": "26.4.2" }, "com.crashlytics.sdk.android:answers:aar": { "shasums": { - "jar": "5a05ddeda9f421b73727f4287a5d89e981a45e3feb7fac458cfddf29b97e3df8", - "javadoc": null, - "sources": null + "jar": "5a05ddeda9f421b73727f4287a5d89e981a45e3feb7fac458cfddf29b97e3df8" }, "version": "1.4.6" }, "com.crashlytics.sdk.android:beta:aar": { "shasums": { - "jar": "2a6b77374ebe6168588bd9116cdd66f60f7c151bd931b9a0f8b2012c06b1cd4d", - "javadoc": null, - "sources": null + "jar": "2a6b77374ebe6168588bd9116cdd66f60f7c151bd931b9a0f8b2012c06b1cd4d" }, "version": "1.2.10" }, - "com.crashlytics.sdk.android:crashlytics": { - "shasums": { - "javadoc": null, - "sources": null - }, - "version": "2.9.8" - }, "com.crashlytics.sdk.android:crashlytics-core:aar": { "shasums": { - "jar": "4c055e1ad07fbe65a3e315bd27712be715962fb3c065d286a1d19f4f5db6768a", - "javadoc": null, - "sources": null + "jar": "4c055e1ad07fbe65a3e315bd27712be715962fb3c065d286a1d19f4f5db6768a" }, "version": "2.6.7" }, @@ -1159,32 +581,19 @@ }, "com.github.bumptech.glide:annotations": { "shasums": { - "jar": "d219d238006d824962176229d4708abcdddcfe342c6a18a5d0fa48d6f0479b3e", - "javadoc": "68f38b5cbbc0433316f36b54bd8051211ed4b198c118c4e29a620f3fc8f974d1", - "sources": "79e5ce46aa6004289f1f55b5a8b9f56be55c0518f98dfb8e158160a1cf24d8cc" + "jar": "d219d238006d824962176229d4708abcdddcfe342c6a18a5d0fa48d6f0479b3e" }, "version": "4.11.0" }, "com.github.bumptech.glide:compiler": { "shasums": { - "jar": "a98cdf265c36261b1d523448b05c322ec290afa865946425eded6361980e8770", - "javadoc": "137824d00981dc6ad7ecf9ac512a8880e29e2a7f47e03a4394d8542fda5b410a", - "sources": "9920cfa9ffc052253d7bfe0601867c83c0ad5669055383fbc6fc909e6c717aaf" + "jar": "a98cdf265c36261b1d523448b05c322ec290afa865946425eded6361980e8770" }, "version": "4.11.0" }, "com.github.bumptech.glide:disklrucache": { "shasums": { - "jar": "d06775a5171b777aa3db031eb0dd4a1dbe3f00dda35b5574dfd953f6b0d5ef18", - "javadoc": "12d97082772cb757eb51863456d1881e0618e0b39e6373473c5a45d35b0c09ea", - "sources": "af83281627baee37032545b99b40acee237b057227dca1bac5b7ad62b392b16b" - }, - "version": "4.11.0" - }, - "com.github.bumptech.glide:gifdecoder": { - "shasums": { - "javadoc": "5a7756e186482956a041c792793e1e23f799f89b70a373da47df5dc1bd101267", - "sources": "73e2de3c596295f4ce53185544329dfd628edb687edf61af4c8baa53cb19fced" + "jar": "d06775a5171b777aa3db031eb0dd4a1dbe3f00dda35b5574dfd953f6b0d5ef18" }, "version": "4.11.0" }, @@ -1194,26 +603,12 @@ }, "version": "4.11.0" }, - "com.github.bumptech.glide:glide": { - "shasums": { - "javadoc": "1b715180d88923e2a62149e4f425c8b928ea1db80cb940388aa5d06a7781afe5", - "sources": "82684421d237c8da5c1cd3f7549b672b91c93fb5d64032af637ab28345960945" - }, - "version": "4.11.0" - }, "com.github.bumptech.glide:glide:aar": { "shasums": { "jar": "5c294e6a5f0f812cef876b8412954c1822da184af38e082a5b766e3c4f4fcd95" }, "version": "4.11.0" }, - "com.github.bumptech.glide:mocks": { - "shasums": { - "javadoc": "69afdb0f622213e11355f014c7c8a2d7ab6eb01babbdb59f024c44be50d7c1fb", - "sources": "f20b6851e4acf0a3c7bc233a4123f1983c8047e7c63fd7dc9021d76533a8dfcd" - }, - "version": "4.11.0" - }, "com.github.bumptech.glide:mocks:aar": { "shasums": { "jar": "cf58b7972da6695ace6296fb3746535d30d41b422711a897c270d8480e3b055a" @@ -1222,58 +617,28 @@ }, "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework": { "shasums": { - "jar": "cdf16ef8f5b8023d003ce3cc1b0d51bda737762e2dab2fedf43d1c4292353f7f", - "javadoc": "48df4594d9e4ab860b06f2c5c4317f03dbe918345187479a790c0ec328dae423", - "sources": "e15536e0c7ed75e8d7fddc23a41c427850939a06552ce4d74eaee31acda0059e" + "jar": "cdf16ef8f5b8023d003ce3cc1b0d51bda737762e2dab2fedf43d1c4292353f7f" }, "version": "2.0" }, - "com.google.android.datatransport:transport-api": { - "shasums": { - "javadoc": "974431863d29a64066b63fd144a01f84abb3cb0579d139dd15a14ac238aa7967" - }, - "version": "2.2.0" - }, "com.google.android.datatransport:transport-api:aar": { "shasums": { - "jar": "576514f8b75d8ae32897f1b9b031f88b00465bf6e0996e227d09af688195f71e", - "sources": null + "jar": "576514f8b75d8ae32897f1b9b031f88b00465bf6e0996e227d09af688195f71e" }, "version": "2.2.0" }, - "com.google.android.datatransport:transport-backend-cct": { - "shasums": { - "javadoc": "41297c7f4be39517c743ae145483a8772f2d5983befb07bf74348a933c77c8cb" - }, - "version": "2.3.0" - }, "com.google.android.datatransport:transport-backend-cct:aar": { "shasums": { - "jar": "6a2d99756c1fa634d3f14b4479257ac83d5d0fbf7fe5aa1db0a014df95ae217f", - "sources": null + "jar": "6a2d99756c1fa634d3f14b4479257ac83d5d0fbf7fe5aa1db0a014df95ae217f" }, "version": "2.3.0" }, - "com.google.android.datatransport:transport-runtime": { - "shasums": { - "javadoc": "a7da57d4af9c4e527760ee2ed818758b351ad78193bfe56022cb3affa7ea6a66" - }, - "version": "2.2.3" - }, "com.google.android.datatransport:transport-runtime:aar": { "shasums": { - "jar": "5e219672fe5a03f5b80c4d2211f39c2b0ceeb3988bfe1e8f1e033579dee20414", - "sources": null + "jar": "5e219672fe5a03f5b80c4d2211f39c2b0ceeb3988bfe1e8f1e033579dee20414" }, "version": "2.2.3" }, - "com.google.android.flexbox:flexbox": { - "shasums": { - "javadoc": null, - "sources": "6084ded8a7a6de74d6887bcb8293816dc051a5d822b6fa74a0e4f9005ae0a5b8" - }, - "version": "3.0.0" - }, "com.google.android.flexbox:flexbox:aar": { "shasums": { "jar": "5e19500486fd7c8e2e8c7aad6bbba9c8d0ada7057c6b32b9b5c61439814e7574" @@ -1282,147 +647,76 @@ }, "com.google.android.gms:play-services-ads-identifier:aar": { "shasums": { - "jar": "b01c408c265b3aa171d19be86d7b8d4f3454f3085169a775690a6a85f57abb73", - "javadoc": null, - "sources": null - }, - "version": "17.0.0" - }, - "com.google.android.gms:play-services-base": { - "shasums": { - "javadoc": "e1da44cd2b03220bfd7db759a813392b2d6b5080649beae1ee1857a2f69d63c2" + "jar": "b01c408c265b3aa171d19be86d7b8d4f3454f3085169a775690a6a85f57abb73" }, "version": "17.0.0" }, "com.google.android.gms:play-services-base:aar": { "shasums": { - "jar": "dd0980edf729e0d346e2b58e70801dc237c1aed0c7ab274fa3f1c8c8efc64cc7", - "sources": null - }, - "version": "17.0.0" - }, - "com.google.android.gms:play-services-basement": { - "shasums": { - "javadoc": "79dfa254f02fcaa72a6a9436eeec419cf13f589e12d2d21d42205b7f1b96dfe4" + "jar": "dd0980edf729e0d346e2b58e70801dc237c1aed0c7ab274fa3f1c8c8efc64cc7" }, "version": "17.0.0" }, "com.google.android.gms:play-services-basement:aar": { "shasums": { - "jar": "d324a1785bbc48bfe3639fc847cfd3cf43d49e967b5caf2794240a854557a39c", - "sources": null + "jar": "d324a1785bbc48bfe3639fc847cfd3cf43d49e967b5caf2794240a854557a39c" }, "version": "17.0.0" }, - "com.google.android.gms:play-services-measurement": { - "shasums": { - "javadoc": "18cfddfc1b58823b31f6aaddec428639ecd24cd43b81a01e4adf634a603950ef" - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-api": { - "shasums": { - "javadoc": "3b2e8ecb44cbdb854c82f4284bec715e818170be792bd987b6416559270ebe72" - }, - "version": "17.5.0" - }, "com.google.android.gms:play-services-measurement-api:aar": { "shasums": { - "jar": "fde4cb8493409aa5130de84775eba9f967aaaf916512362987e1bd61b60babfc", - "sources": null - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-base": { - "shasums": { - "javadoc": "79885f21418842f9f98f1bbd0e109742a73b08bfbca6412285d02d1f813b0719" + "jar": "fde4cb8493409aa5130de84775eba9f967aaaf916512362987e1bd61b60babfc" }, "version": "17.5.0" }, "com.google.android.gms:play-services-measurement-base:aar": { "shasums": { - "jar": "39fd34e7da8e822a93b64c66134e2479075c298588018d4f379c53b9eea1cf1e", - "sources": null - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-impl": { - "shasums": { - "javadoc": "919d22db0a3e0baec2f5e1185ca85f554943c58047e6be9bd7b77a601c9da4d1" + "jar": "39fd34e7da8e822a93b64c66134e2479075c298588018d4f379c53b9eea1cf1e" }, "version": "17.5.0" }, "com.google.android.gms:play-services-measurement-impl:aar": { "shasums": { - "jar": "d143f6d909619a0aa597ccc127713cd5e4b2eea38477521de739331bb791f3ec", - "sources": null - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-sdk": { - "shasums": { - "javadoc": "79885f21418842f9f98f1bbd0e109742a73b08bfbca6412285d02d1f813b0719" - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-sdk-api": { - "shasums": { - "javadoc": "79885f21418842f9f98f1bbd0e109742a73b08bfbca6412285d02d1f813b0719" + "jar": "d143f6d909619a0aa597ccc127713cd5e4b2eea38477521de739331bb791f3ec" }, "version": "17.5.0" }, "com.google.android.gms:play-services-measurement-sdk-api:aar": { "shasums": { - "jar": "afff4861d76bc1f6c7527ae9c4c58c50d6d9e4668a3dc58b03cd77e508e305b3", - "sources": null + "jar": "afff4861d76bc1f6c7527ae9c4c58c50d6d9e4668a3dc58b03cd77e508e305b3" }, "version": "17.5.0" }, "com.google.android.gms:play-services-measurement-sdk:aar": { "shasums": { - "jar": "24c3c4085609a85debabc43718ac3049583b5452e4d34b2e8c9e620542631b30", - "sources": null + "jar": "24c3c4085609a85debabc43718ac3049583b5452e4d34b2e8c9e620542631b30" }, "version": "17.5.0" }, "com.google.android.gms:play-services-measurement:aar": { "shasums": { - "jar": "553f0b6fc6e44eed81bb5b7b4cb80719c05a244a394eb38ae91271871dcddf07", - "sources": null + "jar": "553f0b6fc6e44eed81bb5b7b4cb80719c05a244a394eb38ae91271871dcddf07" }, "version": "17.5.0" }, "com.google.android.gms:play-services-stats:aar": { "shasums": { - "jar": "e8ae5b40512b71e2258bfacd8cd3da398733aa4cde3b32d056093f832b83a6fe", - "javadoc": null, - "sources": null + "jar": "e8ae5b40512b71e2258bfacd8cd3da398733aa4cde3b32d056093f832b83a6fe" }, "version": "17.0.0" }, "com.google.android.gms:play-services-tasks:aar": { "shasums": { - "jar": "2e6d1738b73647f3fe7a038b9780b97717b3746eae258009197e36e7bf3112a5", - "javadoc": null, - "sources": null + "jar": "2e6d1738b73647f3fe7a038b9780b97717b3746eae258009197e36e7bf3112a5" }, "version": "17.0.0" }, "com.google.android.gms:strict-version-matcher-plugin": { "shasums": { - "jar": "0c1027a51198190386eae3f90adee9a30687e76da7589f06c79269fea4c7a4c0", - "javadoc": null, - "sources": null + "jar": "0c1027a51198190386eae3f90adee9a30687e76da7589f06c79269fea4c7a4c0" }, "version": "1.2.1" }, - "com.google.android.material:material": { - "shasums": { - "javadoc": null, - "sources": "1d9fe3a4512512a311889be798e4a0f9cf9fbccddea50a7ca330b1b99ee92993" - }, - "version": "1.3.0" - }, "com.google.android.material:material:aar": { "shasums": { "jar": "cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a" @@ -1431,511 +725,340 @@ }, "com.google.auto.service:auto-service-annotations": { "shasums": { - "jar": "986dc826fa0a43bf9f04194c1a8667774f4f44190ec816b08554b47891ba5459", - "javadoc": "a94ebf1c368b5c962583a44a2af7b0841cee582a6bd2b750453dd245e307f7ec", - "sources": "0cb604b1ddea687434e7b3908079ad9e261adaeff398e4374f81b6f06cceee58" + "jar": "986dc826fa0a43bf9f04194c1a8667774f4f44190ec816b08554b47891ba5459" }, "version": "1.0-rc7" }, "com.google.auto.value:auto-value-annotations": { "shasums": { - "jar": "37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852", - "javadoc": "750d76457ac497f41dbece710c0cfdd7aef0263fd343221eb4d63d3c4305ee6c", - "sources": "0fc83f827602d4378b97a8dec07ce22e364e4b8bb352db213801a6a8c654a330" + "jar": "37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852" }, "version": "1.8.1" }, "com.google.code.findbugs:jsr305": { "shasums": { - "jar": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", - "javadoc": "3791d601c8757344a5b9714a1122e2f852743114a9d55c1b1fed64b13116c353", - "sources": "1c9e85e272d0708c6a591dc74828c71603053b48cc75ae83cce56912a2aa063b" + "jar": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7" }, "version": "3.0.2" }, "com.google.code.gson:gson": { "shasums": { - "jar": "233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81", - "javadoc": "c32e90ccb6cadc8c4162bf807a4f1df630a7c907186337dcd06cf982ede71284", - "sources": "512b4bf6927f4864acc419b8c5109c23361c30ed1f5798170248d33040de068e" + "jar": "233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81" }, "version": "2.8.5" }, "com.google.dagger:dagger": { "shasums": { - "jar": "c2a09540677b6ffeeb5911c5d8e69738718004e875a10c176e84ed8c997739a7", - "javadoc": "9d13760fa15cd7bf4fe0a03d63c5cc5aad2bb412df72bfdea7873d90a0525c62", - "sources": "bd27a8952be63263a86c3dad1ee175eb02a66cdf9956d041a3985b50a1979b3a" + "jar": "c2a09540677b6ffeeb5911c5d8e69738718004e875a10c176e84ed8c997739a7" }, "version": "2.28.1" }, "com.google.dagger:dagger-compiler": { "shasums": { - "jar": "379d4fce6d11234c3814aca1676aa34f5dd0f0ec5155c44de2d5e49cacee573c", - "javadoc": "bbfe777fa0db3087c03748dc829819b650a084e860493d7a6adc92724c731c2c", - "sources": "af48aca813093236f5fdbf90bb6ba566c51e323283e1666aef29432e14265651" + "jar": "379d4fce6d11234c3814aca1676aa34f5dd0f0ec5155c44de2d5e49cacee573c" }, "version": "2.28.1" }, "com.google.dagger:dagger-producers": { "shasums": { - "jar": "7c44499d5717cf6fdc3d026e5440c6bac9cabc98226d28715ca0eda90e68f7b2", - "javadoc": "73b5217b40aaf3c8d000a5ed744e291ea7c519595e21f25d76ffebef0e37389b", - "sources": "eae1e6a10f61270251e634b63886246a4500cb16a254309d86f696604ce2ff03" + "jar": "7c44499d5717cf6fdc3d026e5440c6bac9cabc98226d28715ca0eda90e68f7b2" }, "version": "2.28.1" }, "com.google.dagger:dagger-spi": { "shasums": { - "jar": "aae2a23d0bce8bae6d6c0e302b048c389d0f2354adc14fd80366c2913e3c5f07", - "javadoc": "e0a3ca154b3fe86f90424f676df3c689532b2221dbcd010400a5bd0726d12bb9", - "sources": "da97df1daa28befc4f721df7cd925429b08bc7a766596ff28d21b646097e08cc" + "jar": "aae2a23d0bce8bae6d6c0e302b048c389d0f2354adc14fd80366c2913e3c5f07" }, "version": "2.28.1" }, "com.google.errorprone:error_prone_annotations": { "shasums": { - "jar": "cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3", - "javadoc": "075f00902f2694aa9f2390dcba0b9e272aea0079281d5db86a6d13695fe1ce6c", - "sources": "e38921f918b8ad8eabd12bc61de426fa96c72de077054e9147d2f9fe7c648923" + "jar": "cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3" }, "version": "2.7.1" }, "com.google.errorprone:javac-shaded": { "shasums": { - "jar": "65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30", - "javadoc": "02e74bd2468ed5be0f49b32fa4d7f35aa7c542c2d3fd486e1883e4d8b9fa6f6a", - "sources": "cf0fde1aad77ac6e0e2d36a9f9179193ae1707088ba00ffa91fcfb5269304a6a" + "jar": "65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30" }, "version": "9-dev-r4023-3" }, - "com.google.firebase:firebase-analytics": { - "shasums": { - "javadoc": "79885f21418842f9f98f1bbd0e109742a73b08bfbca6412285d02d1f813b0719", - "sources": null - }, - "version": "17.5.0" - }, "com.google.firebase:firebase-analytics:aar": { "shasums": { "jar": "5c36ae943a719de1c598287370cb3ee1d27fd2dc9d0ada650de2b7f9a1dcac54" }, "version": "17.5.0" }, - "com.google.firebase:firebase-common": { - "shasums": { - "javadoc": "54495b003c6a7e3556598b28458924786b64523aed4b0e41facacbf311c52578", - "sources": "1a3f326b3992552200c91db1132c81ec5f6143bc6dd9af8f6f3b66388707c62b" - }, - "version": "19.3.0" - }, "com.google.firebase:firebase-common:aar": { "shasums": { "jar": "7bd7971470ff943e3c3abb1d7809ef5cb4b81f1996be0867714372b3efa7405a" }, "version": "19.3.0" }, - "com.google.firebase:firebase-components": { - "shasums": { - "javadoc": "dff8676a3a0702b1115c7427dbbced106d3b15a82106805db7dd79252023d2b5", - "sources": "8c541d1b27245aff00937b08131cb41c99b4a6dcb5b5a7440283018d13fe9747" - }, - "version": "16.0.0" - }, "com.google.firebase:firebase-components:aar": { "shasums": { "jar": "8ef43b412de4ec3e36a87c66d8a0a14a3de0a2e8566946da6a0e799b7fdd8ec9" }, "version": "16.0.0" }, - "com.google.firebase:firebase-crashlytics": { - "shasums": { - "javadoc": "62234f33ea18163c7c6c47d9a703d6fa0a6b44d40037bad74297acac444c3742", - "sources": null - }, - "version": "17.1.1" - }, "com.google.firebase:firebase-crashlytics:aar": { "shasums": { "jar": "635953640e1bbb277affadbc3e59b43f1c4dd07de79c8973b6341a756ad8b74b" }, "version": "17.1.1" }, - "com.google.firebase:firebase-encoders-json": { - "shasums": { - "javadoc": "550ff7a066b67ce6730c2b5e5b6d0d1247198d19546ff4451a05ec15779fc080", - "sources": "791b1521a8f5eda7ded50ccdf3afa7632a1198964e3c60e93e7ae602d54ca314" - }, - "version": "16.1.0" - }, "com.google.firebase:firebase-encoders-json:aar": { "shasums": { "jar": "24ce7c1cfda1d526b76b16437a2e7d0920d7176a377e0e30b2a7381341f22ea1" }, "version": "16.1.0" }, - "com.google.firebase:firebase-iid": { - "shasums": { - "javadoc": "710dd4f9a00b1fde98c0e5f5d42cf4c173ad484c5b2683dccb30d97826072119" - }, - "version": "20.1.5" - }, "com.google.firebase:firebase-iid-interop:aar": { "shasums": { - "jar": "b6f4ad581eb489370be3bf38a4bdabfc6ea3d4e716234c625a0f42516c53523c", - "javadoc": null, - "sources": null + "jar": "b6f4ad581eb489370be3bf38a4bdabfc6ea3d4e716234c625a0f42516c53523c" }, "version": "17.0.0" }, "com.google.firebase:firebase-iid:aar": { "shasums": { - "jar": "f1c174e75a24f298fbc0ed93dde29c997f29ca511d7e8a18dec068203553cf6b", - "sources": null + "jar": "f1c174e75a24f298fbc0ed93dde29c997f29ca511d7e8a18dec068203553cf6b" }, "version": "20.1.5" }, - "com.google.firebase:firebase-installations": { - "shasums": { - "javadoc": "42c17879e63b6a85e1cca77e717259100f618f5c6bfd18ce56bd7338769ac775" - }, - "version": "16.3.2" - }, - "com.google.firebase:firebase-installations-interop": { - "shasums": { - "javadoc": "a8b05b82b7866ed44cb2624e4908dec78f9d61a6e4e46a16bf06a40ee2490b2b" - }, - "version": "16.0.0" - }, "com.google.firebase:firebase-installations-interop:aar": { "shasums": { - "jar": "d498fe20e7d2c65fc8f7124f1c1791d2828bebdf6bf06ab4cdee13e7fe9ccaa2", - "sources": null + "jar": "d498fe20e7d2c65fc8f7124f1c1791d2828bebdf6bf06ab4cdee13e7fe9ccaa2" }, "version": "16.0.0" }, "com.google.firebase:firebase-installations:aar": { "shasums": { - "jar": "0d0f88b3c3789d5fe1aa9a69bd5ab6c0e92036fcf34520775a0091e37268dd3f", - "sources": null + "jar": "0d0f88b3c3789d5fe1aa9a69bd5ab6c0e92036fcf34520775a0091e37268dd3f" }, "version": "16.3.2" }, "com.google.firebase:firebase-measurement-connector:aar": { "shasums": { - "jar": "17e8b9b60ac0a79fcbed754d03d4b966cc5bb8837e79c2308bf2970f1d05700c", - "javadoc": null, - "sources": null + "jar": "17e8b9b60ac0a79fcbed754d03d4b966cc5bb8837e79c2308bf2970f1d05700c" }, "version": "18.0.0" }, "com.google.gms:google-services": { "shasums": { - "jar": "d9668002ef7032deddf7dbf853b47e10e6722bbce1b318fe7d6a297e28a8dcae", - "javadoc": "936c70c14961b0d083b2b31787105e1da14beed3f5650d7b5b674ad15c9cffbe", - "sources": "453def3af6897f944b3175ce0538c3ca1536583ace3b3b3a15aca1c2e2be6bb0" + "jar": "d9668002ef7032deddf7dbf853b47e10e6722bbce1b318fe7d6a297e28a8dcae" }, "version": "4.3.3" }, "com.google.googlejavaformat:google-java-format": { "shasums": { - "jar": "aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e", - "javadoc": "b440f115df006988b5122b1cef06f8692aea307a016b0d70415004f41a85e963", - "sources": "c204b15b3834128d335f17213f7e621ddb2cc5bfff5b8dd035cd1f2affb7fa8f" + "jar": "aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e" }, "version": "1.5" }, "com.google.guava:failureaccess": { "shasums": { - "jar": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26", - "javadoc": "93ac95225225e06945575f64f6ebb615bf799dad6aa7d26fe51927a5a080967b", - "sources": "092346eebbb1657b51aa7485a246bf602bb464cc0b0e2e1c7e7201fadce1e98f" + "jar": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26" }, "version": "1.0.1" }, "com.google.guava:guava": { "shasums": { - "jar": "355f79352f8c252f2bdaa06c687c4836a38016caccfc4c28d16ae77ecfdffa2f", - "javadoc": "f2f9b6e1110a6c49d04338964456fed3fbaa4a64859d6e6c623faef3e6252204", - "sources": "dac52416371d86baea1ffe6ef7b54b2730b52fcea19091ae32942cb5cd9f868c" + "jar": "355f79352f8c252f2bdaa06c687c4836a38016caccfc4c28d16ae77ecfdffa2f" }, "version": "30.1.1-android" }, "com.google.guava:listenablefuture": { "shasums": { - "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99", - "javadoc": null, - "sources": null + "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99" }, "version": "9999.0-empty-to-avoid-conflict-with-guava" }, "com.google.j2objc:j2objc-annotations": { "shasums": { - "jar": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", - "javadoc": "c77d07b37c01e36d154b13ea0ef9c4a130bf44b06484487d38f9e67491dd1c91", - "sources": "ba4df669fec153fa4cd0ef8d02c6d3ef0702b7ac4cabe080facf3b6e490bb972" + "jar": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b" }, "version": "1.3" }, "com.google.protobuf:protobuf-java": { "shasums": { - "jar": "4ac549b192694141958049f060a1c826a33342f619e108ced8c17d9877f5e3ed", - "javadoc": "64b50edd7d0017d04302ca4cfaf3508726411636d3fc62bf8c1db827e5c4b2fc", - "sources": "204bad0a36827296ed0b6fdbdf1a17028f3e3d289dd20042980331b8f0ef646e" + "jar": "4ac549b192694141958049f060a1c826a33342f619e108ced8c17d9877f5e3ed" }, "version": "3.17.3" }, "com.google.protobuf:protobuf-javalite": { "shasums": { - "jar": "dc643901cc9d95998a1e45ab11e75d4237a7e1947bcbca0b7eca569aaf5e714d", - "javadoc": "90da18bc4800a877bd2c1a958a081d0b84a33e57dc6acc39d25b424dd6a7c425", - "sources": "b7bc7b41c266f59c921bf094b4325fb9bcdd0a8d95d742db8cca3a1c76503f9b" + "jar": "dc643901cc9d95998a1e45ab11e75d4237a7e1947bcbca0b7eca569aaf5e714d" }, "version": "3.17.3" }, "com.google.truth.extensions:truth-liteproto-extension": { "shasums": { - "jar": "71cce6284554e546d1b5ba48e310ee4b4050676f09fb0eced136d779284ff78d", - "javadoc": "0cbbfe60ab9a24dd97fd1687c24957cf68bda2d001469c27bd7814c02aab4b4e", - "sources": "fd3c26b2232966a3ff25e5b9c642f9ae9f19c86b29dfeb6e72aeb67e45e36130" + "jar": "71cce6284554e546d1b5ba48e310ee4b4050676f09fb0eced136d779284ff78d" }, "version": "1.1.3" }, "com.google.truth:truth": { "shasums": { - "jar": "fc0b67782289a2aabfddfdf99eff1dcd5edc890d49143fcd489214b107b8f4f3", - "javadoc": "f18e3d4f565b5d6674ac7259e3115b8cb6701ab3bb154f554a2788abf0aaa6ed", - "sources": "6c35e3d7087cd222938b41bbdb54041239b79dda07cf96c4027c118d566df545" + "jar": "fc0b67782289a2aabfddfdf99eff1dcd5edc890d49143fcd489214b107b8f4f3" }, "version": "1.1.3" }, "com.googlecode.juniversalchardet:juniversalchardet": { "shasums": { - "jar": "757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76", - "javadoc": "7cbe0e01929e6d2f80fda6c4153933877c4929262187b5b781ff99bdd7f9a472", - "sources": "3d1cb067f5cfe3cc19b77c837156f22368462af9acac5dd878e785966758fc27" + "jar": "757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76" }, "version": "1.0.3" }, "com.ibm.icu:icu4j": { "shasums": { - "jar": "e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab", - "javadoc": "5d858aabc259220f93a8ab0d4edaa45fc4d93e67722031641af6c2b5342a7067", - "sources": "610f0f35cd11415effe23b248ab129a316e7f73994c20ac1ebe7e092629eb994" + "jar": "e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab" }, "version": "53.1" }, "com.squareup.moshi:moshi": { "shasums": { - "jar": "b6ee64fb84a7486aa9983e20c75259d4931bd597c169e1e67c3bc0521fd03b27", - "javadoc": "2a8213686a82a12400d6409503547de0e08ea20deb81328c7ade037b74acdad6", - "sources": "ca8cbe76fb144ea7f274f914adfa51b932f390a67a16bf1f71f9b254303d4729" + "jar": "b6ee64fb84a7486aa9983e20c75259d4931bd597c169e1e67c3bc0521fd03b27" }, "version": "1.11.0" }, "com.squareup.moshi:moshi-kotlin": { "shasums": { - "jar": "220f3b85d99ea40ff65609813f3624fb4313de3634a747adb04040cf7cb486bc", - "javadoc": "3f48d8ddcc079d0218cfa1d5651a24c165a5c771bf575b39daaa1d58cb9e71e6", - "sources": "8ff200ab30a6d222281eb3db17d6c8f1854d4bc9e2d5ccf1d237029cb448dbb2" + "jar": "220f3b85d99ea40ff65609813f3624fb4313de3634a747adb04040cf7cb486bc" }, "version": "1.11.0" }, "com.squareup.moshi:moshi-kotlin-codegen": { "shasums": { - "jar": "e5d8e5cba11d8aca0261649c362fdee718e16ccc647124e55ee2e2c328be4c82", - "javadoc": "a175aeb55a2828ac8f288418239963fb6a81b6e40baaa73a2dfde678ebc2ccb7", - "sources": "c77fe938333fd96539aee34cdb8e923591f145ad727a2fb9ab250f527d85859c" + "jar": "e5d8e5cba11d8aca0261649c362fdee718e16ccc647124e55ee2e2c328be4c82" }, "version": "1.11.0" }, "com.squareup.okhttp3:mockwebserver": { "shasums": { - "jar": "d7d08b5096336d5b5a27d0e91bb2ebfa7dd54e48c3bb1e3cba15cc9bf16526b7", - "javadoc": "6c548d8f404c5f1d6a685dfa87ac5f896ec41ad5d174ca2d43839205eabda351", - "sources": "c5bc89a4ba5429b68713443e0dc625e0bd073e2c4b06a7b6c6c643d4ce29e32b" + "jar": "d7d08b5096336d5b5a27d0e91bb2ebfa7dd54e48c3bb1e3cba15cc9bf16526b7" }, "version": "4.7.2" }, "com.squareup.okhttp3:okhttp": { "shasums": { - "jar": "6b64ca1d2069751242984537d5de2cbe627ae000430f5117c47d8cb3d272facd", - "javadoc": "daea5d4fbe521965fced59c40333d5f90025073b040566c4b1661ea98b9e177f", - "sources": "88348cf944f841a7a8f5f38960474592e0c1ed8a53349cabe05b22d255479772" + "jar": "6b64ca1d2069751242984537d5de2cbe627ae000430f5117c47d8cb3d272facd" }, "version": "4.7.2" }, "com.squareup.okio:okio": { "shasums": { - "jar": "4d84ef686277b58eb05691ac19cd3befa3429a27274982ee65ea0f07044bcc00", - "javadoc": "65c7a3fb6e4ff094f8b34e0bdfa9705b644f6598cc23bbc024944e40e3ea00b0", - "sources": "bffda723f6706a29a0406993bd5262ecc4459460baa1b248147e03a3c55b62b4" + "jar": "4d84ef686277b58eb05691ac19cd3befa3429a27274982ee65ea0f07044bcc00" }, "version": "2.6.0" }, "com.squareup.retrofit2:converter-moshi": { "shasums": { - "jar": "6bade0b754a7b8b7551e2208cb8227e697c2db553b8f12df6f1aa70c6f058600", - "javadoc": "f03e10386344e9b69499d4d53e465780da3a02fb839efd73760173aa2a795cb4", - "sources": "d36be44932f400577eccd3c060543e74c8be651b245ad9d5c96fbb79a5ecbf03" + "jar": "6bade0b754a7b8b7551e2208cb8227e697c2db553b8f12df6f1aa70c6f058600" }, "version": "2.5.0" }, "com.squareup.retrofit2:retrofit": { "shasums": { - "jar": "e6ea1929c46852f5bec66ab3357da383476cef4e8d1deefdbf195b79cc4d6581", - "javadoc": "3beb28517a651c96f26e257fa526a13b1fb524327e1f3c4fe131273e54929697", - "sources": "64dab37d8cdca9846df237e766a48251287c188e4ff0ac488d1664e7a6644f7a" + "jar": "e6ea1929c46852f5bec66ab3357da383476cef4e8d1deefdbf195b79cc4d6581" }, "version": "2.9.0" }, "com.squareup.retrofit2:retrofit-mock": { "shasums": { - "jar": "00692755410b4367c7c12e6e4aadd3b1a28b5169e8961d94bc27ab36ece9bf29", - "javadoc": "2e0f93ae493e34973069cdacf493b6b5ccfa89db4f64b0afed3cf7d9644dbd8d", - "sources": "e0423bab50f7097f02e5a9e874a630d3b31e49bba559c6e526e443cfeae5ad92" + "jar": "00692755410b4367c7c12e6e4aadd3b1a28b5169e8961d94bc27ab36ece9bf29" }, "version": "2.5.0" }, "com.squareup:javapoet": { "shasums": { - "jar": "9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90", - "javadoc": "5df4dedf43c0c0615698bb4477512799b8e99d1b1aa0f91a2b5e0cb571a283e3", - "sources": "63d3187d924582b1afe9eb171e725d27a7e15603513890de0f8804a7fc07e9ac" + "jar": "9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90" }, "version": "1.11.1" }, "com.squareup:javawriter": { "shasums": { - "jar": "f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e", - "javadoc": "09ef551197bbc3da310470ca5a5a395ec0b81690b48ffd927089684946f0a891", - "sources": "f57646206c5908c69342022c7b5ccbc15dbf605ce80421da3b96af9f86331e28" + "jar": "f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e" }, "version": "2.1.1" }, "com.squareup:kotlinpoet": { "shasums": { - "jar": "8085eb4c8b1ece4f32259b22f26bf880bc47b74f548e29010b0146aa6b38f24b", - "javadoc": "5d9fcbd093c7a721b02f96e07909e61bccabe632d4041a3bc3e48c8fc223e110", - "sources": "cca9ad8636922585e3f116a885c580890d6be1a19655b0916a54c1928a7f0840" + "jar": "8085eb4c8b1ece4f32259b22f26bf880bc47b74f548e29010b0146aa6b38f24b" }, "version": "1.6.0" }, "commons-codec:commons-codec": { "shasums": { - "jar": "4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569", - "javadoc": "f6af892a0d6428336af6764adaa9bac90155a3a23cfbee3ba2d6a84e7b19a6a3", - "sources": "dfae68268ce86f1a18fc45b99317c13d6c9d252f001d37961e79a51076808986" + "jar": "4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569" }, "version": "1.10" }, "commons-io:commons-io": { "shasums": { - "jar": "cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581", - "javadoc": "bb19c34db63f970845325fb8930e6805fa70c6ec9c8cdea96b0ac4664a7ea118", - "sources": "d4635b348bbbf3f166d972b052bc4cac5b326c133beed7b8a1cab7ea22b61e01" + "jar": "cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581" }, "version": "2.4" }, - "de.hdodenhof:circleimageview": { - "shasums": { - "javadoc": "a00143daa4ee7a7690b062361adcd8f3e59dc20fcaae27195bba94601c65206a", - "sources": "41ac0df4f7bab17c56b075a0c802a6f0b6d9013831d409556fdcd56bdb8a460b" - }, - "version": "3.0.1" - }, "de.hdodenhof:circleimageview:aar": { "shasums": { "jar": "7b0f088436ad4dcbb36d779fd09bf2192d9cc1e1a734bb6337904a7648f97617" }, "version": "3.0.1" }, - "io.fabric.sdk.android:fabric": { - "shasums": { - "javadoc": null, - "sources": null - }, - "version": "1.4.7" - }, "io.fabric.sdk.android:fabric:aar": { "shasums": { - "jar": "36df4b321ec95e31226ff5abaae73e66f3a99dedddbc2d03054c4e141c8aaa5c", - "javadoc": null, - "sources": null + "jar": "36df4b321ec95e31226ff5abaae73e66f3a99dedddbc2d03054c4e141c8aaa5c" }, "version": "1.4.7" }, "javax.annotation:javax.annotation-api": { "shasums": { - "jar": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b", - "javadoc": "58b24f21a237175c1fa3063d5469bfddfcbb92154fdf73194b8b3c21a0535b1a", - "sources": "128971e52e0d84a66e3b6e049dab8ad7b2c58b7e1ad37fa2debd3d40c2947b95" + "jar": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b" }, "version": "1.3.2" }, "javax.annotation:jsr250-api": { "shasums": { - "jar": "a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f", - "javadoc": null, - "sources": "025c47d76c60199381be07012a0c5f9e74661aac5bd67f5aec847741c5b7f838" + "jar": "a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f" }, "version": "1.0" }, "javax.inject:javax.inject": { "shasums": { - "jar": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff", - "javadoc": "f938e8eb481314d7306ae16ad91998409c8c8056bf336bc0732b4a07ad4a4f44", - "sources": "c4b87ee2911c139c3daf498a781967f1eb2e75bc1a8529a2e7b328a15d0e433e" + "jar": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" }, "version": "1" }, "junit:junit": { "shasums": { - "jar": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3", - "javadoc": "9607be074b0200ce78f544a52ecae544b1ba559f430ba5b6c4ff110e30db0b8c", - "sources": "34181df6482d40ea4c046b063cb53c7ffae94bdf1b1d62695bdf3adf9dea7e3a" + "jar": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3" }, "version": "4.13.2" }, "net.bytebuddy:byte-buddy": { "shasums": { - "jar": "5fcad05da791e9a22811c255a4a74b7ea094b7243d9dbf3e6fc578c8c94290ac", - "javadoc": "22dafd51c83ac203076c522856800cc563707eaa852862d08559f24dab25f58f", - "sources": "50334bed7d0c05a7e02224105ff33267c9d2acb1a07ec3a532bac28e38abdd0e" + "jar": "5fcad05da791e9a22811c255a4a74b7ea094b7243d9dbf3e6fc578c8c94290ac" }, "version": "1.10.20" }, "net.bytebuddy:byte-buddy-agent": { "shasums": { - "jar": "b592a6c43e752bf41659717956c57fbb790394d2ee5f8941876659f9c5c0e7e8", - "javadoc": "9cf30e91b619d7cf38d06fb1c55f3bf2d207f7dee6a024a4ca558435df73a427", - "sources": "1c86f2ad5d84a8640292a84af3e8245851bab08a9136dbe4c084e50585bf9c8a" + "jar": "b592a6c43e752bf41659717956c57fbb790394d2ee5f8941876659f9c5c0e7e8" }, "version": "1.10.20" }, "net.ltgt.gradle.incap:incap": { "shasums": { - "jar": "1d3ebe10d6059a26438dd183ab5a823cf8cd8081bc0d4cf997ad80e9ab9607d8", - "javadoc": "0da714bf8cd33ac26788f0e5d6619a00d2048f358163bf6b802e2d71c64e3afc", - "sources": "e78a7277cb9ce4980fba22d809352821848581df0a6b545fa22aa7400a05db43" + "jar": "1d3ebe10d6059a26438dd183ab5a823cf8cd8081bc0d4cf997ad80e9ab9607d8" }, "version": "0.3" }, "net.sf.kxml:kxml2": { "shasums": { - "jar": "f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2", - "javadoc": "32f5678eedbe61c060316dbb886405f08084c132b03cb091d6d168b62ad7292d", - "sources": "85495366666158b58961e8911ced0f6f3bc92f1ebee865518b493fdb90760250" + "jar": "f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2" }, "version": "2.3.0" }, - "nl.dionsegijn:konfetti": { - "shasums": { - "javadoc": null, - "sources": "2943d6e48ac1c23d977b059f11ebf47015bccc6649d3dd09bbcb1c19e474dcb5" - }, - "version": "1.2.5" - }, "nl.dionsegijn:konfetti:aar": { "shasums": { "jar": "a9beb9371e9c06c39eeff1ed052142a6ed6f0b28e3408230d8771867f9d817ba" @@ -1944,361 +1067,271 @@ }, "org.antlr:antlr4": { "shasums": { - "jar": "a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4", - "javadoc": "b99717847bf6859863bd34fec6d1ab24ebc32f93eacab9e6bc7caeb3c3bfb1b0", - "sources": "c31df8fc18dd75dbf7820b36ce57aa85c00616e4fd89daf415163fa3432f623d" + "jar": "a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4" }, "version": "4.5.3" }, "org.bouncycastle:bcprov-jdk15on": { "shasums": { - "jar": "e78f96eb59066c94c94fb2d6b5eb80f52feac6f5f9776898634f8addec6e2137", - "javadoc": "da9820f5151c2f7edfb6e7cc0380f54f0cef2b4d0d89a27479dca3452163f068", - "sources": "12f179dee8bb7113f3d187319b260f3210d1ca7fbf403cd70385d339eacaeb4b" + "jar": "e78f96eb59066c94c94fb2d6b5eb80f52feac6f5f9776898634f8addec6e2137" }, "version": "1.65" }, "org.checkerframework:checker-compat-qual": { "shasums": { - "jar": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a", - "javadoc": "ddd4cbd46607570ce8b1d6046bcad2ab6008e58e83c6030b32c4973b6248ffb4", - "sources": "7c63a4a46b2ef903f941aeac63da87dd345be3243b472796aa945fa715bf3ca9" + "jar": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a" }, "version": "2.5.5" }, "org.checkerframework:checker-qual": { "shasums": { - "jar": "3ea0dcd73b4d6cb2fb34bd7ed4dad6db327a01ebad7db05eb7894076b3d64491", - "javadoc": "81472a63d13c651dbb69750d06316444829b3cc77166c649c388f3c09e1549f7", - "sources": "52fd5b908ed38b2c543fac371c2192ff2896fec0f3ddea29f23b5db117a7ea6e" + "jar": "3ea0dcd73b4d6cb2fb34bd7ed4dad6db327a01ebad7db05eb7894076b3d64491" }, "version": "3.13.0" }, "org.hamcrest:hamcrest-core": { "shasums": { - "jar": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9", - "javadoc": "27f7327aee87324952da2405b02094df40a4e772b48dae7e419d8b50067ca745", - "sources": "e223d2d8fbafd66057a8848cc94222d63c3cedd652cc48eddc0ab5c39c0f84df" + "jar": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9" }, "version": "1.3" }, "org.hamcrest:hamcrest-integration": { "shasums": { - "jar": "70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2", - "javadoc": "f67bc93ff98fa007e683ae1f7263db8c9f814cce8048f527ab3b4de94c8974a0", - "sources": "0827a37533a135bfab9c27e0f4b6d6fb1394856e842ef20a1693d3bfeb061365" + "jar": "70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2" }, "version": "1.3" }, "org.hamcrest:hamcrest-library": { "shasums": { - "jar": "711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c", - "javadoc": "1f72eb23230afdd4951758c623c8eefc742f4e79daf2318802425863fbf2886c", - "sources": "1c0ff84455f539eb3c29a8c430de1f6f6f1ba4b9ab39ca19b195f33203cd539c" + "jar": "711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c" }, "version": "1.3" }, "org.jetbrains.intellij.deps:trove4j": { "shasums": { - "jar": "affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601", - "javadoc": "ffd424518ad331cfdf8c767aa35454552ea7d1d28c4660b4f76bc7292334ba1a", - "sources": "6a37f965621293e9f23eb2053040d31e5231596a068ee581410d6047e958a695" + "jar": "affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601" }, "version": "1.0.20181211" }, "org.jetbrains.kotlin:kotlin-compiler-embeddable": { "shasums": { - "jar": "d7b85448039e468daf3b9462a172244477fa3eb890f199ec77703992f36ade44", - "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "sources": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53" + "jar": "d7b85448039e468daf3b9462a172244477fa3eb890f199ec77703992f36ade44" }, "version": "1.5.0" }, "org.jetbrains.kotlin:kotlin-daemon-embeddable": { "shasums": { - "jar": "bf32071706cf3c20580516b04d25a733c7a21db9cd9d04fc7060c00720bc91bc", - "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "sources": "f431a1129d6ea1cadb1a69885c3935e6e03deee4b12d924ff8e3cd068ae1cebb" + "jar": "bf32071706cf3c20580516b04d25a733c7a21db9cd9d04fc7060c00720bc91bc" }, "version": "1.5.0" }, "org.jetbrains.kotlin:kotlin-reflect": { "shasums": { - "jar": "e30acc4ff74534177d1657feafb57327ede838ae17763aeaae182a9109d26157", - "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "sources": "7c0d0b477b2d077d785d3c5439346622731d903c7f9e21f87c709e9f7a9a9e65" + "jar": "e30acc4ff74534177d1657feafb57327ede838ae17763aeaae182a9109d26157" }, "version": "1.5.0" }, "org.jetbrains.kotlin:kotlin-script-runtime": { "shasums": { - "jar": "f2d45a350628bdfea25570c4c3f29198087e0f8cf53d87d928fb0da8a30c8fb7", - "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "sources": "13db4d1b3123ae2fefccbc07ae0d8de07406f604fd518eb03195208531345a0c" + "jar": "f2d45a350628bdfea25570c4c3f29198087e0f8cf53d87d928fb0da8a30c8fb7" }, "version": "1.5.0" }, "org.jetbrains.kotlin:kotlin-stdlib": { "shasums": { - "jar": "52283996fe4067cd7330288b96ae67ecd463614dc741172c54d9d349ab6a9cd7", - "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "sources": "b163dff413167ec95d0c620b985f6b59965ebbd947ac5878904dd18ab8915166" + "jar": "52283996fe4067cd7330288b96ae67ecd463614dc741172c54d9d349ab6a9cd7" }, "version": "1.5.0" }, "org.jetbrains.kotlin:kotlin-stdlib-common": { "shasums": { - "jar": "c14ce6720a487b5e238f1b0c30ac3ad73e45b90a40731ca0b1cfddec1a37682f", - "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "sources": "7a79a086fe7ae85675f9f81a9d12645fbcfd7abf03e1b36873253634a193477a" + "jar": "c14ce6720a487b5e238f1b0c30ac3ad73e45b90a40731ca0b1cfddec1a37682f" }, "version": "1.5.0" }, "org.jetbrains.kotlin:kotlin-stdlib-jdk7": { "shasums": { - "jar": "f9566380c08722c780ce33ceee23e98ddf765ca98fabd3e2fabae7975c8d232b", - "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "sources": "447c623d66e5ba7f79cf2171f79540e6f3e04c4e683cbae8317bb6a2fcfd80bd" + "jar": "f9566380c08722c780ce33ceee23e98ddf765ca98fabd3e2fabae7975c8d232b" }, "version": "1.4.10" }, "org.jetbrains.kotlin:kotlin-stdlib-jdk8": { "shasums": { - "jar": "39b7a9442d7a3865e0f4a732c56c1d5da0e11ffb3bb82a461d32deb0c0ca7673", - "javadoc": "69e1a62e5752ca3f43fb1607f161379bbe88b64af89c1a543c126160adf7cc53", - "sources": "9c3e3f939fc57fb82c0675c99e60ecd80e6cec96c15c13dc0f16a19721c4ae72" + "jar": "39b7a9442d7a3865e0f4a732c56c1d5da0e11ffb3bb82a461d32deb0c0ca7673" }, "version": "1.4.10" }, "org.jetbrains.kotlin:kotlin-test": { "shasums": { - "jar": "1794237a1fc908d37adb2fa3d9739b883124571720ad285cfa81e74190e87ba9", - "javadoc": "ddbb961eb52a7d2c6669cefafd82ce97714f26ef4e5ca7721e9c58d47bd716d1", - "sources": "06689d90dedff6cb9d9bea762bb19ce7882d1e12f495158a760bfbc2ff1ac1a4" + "jar": "1794237a1fc908d37adb2fa3d9739b883124571720ad285cfa81e74190e87ba9" }, "version": "1.3.72" }, "org.jetbrains.kotlin:kotlin-test-annotations-common": { "shasums": { - "jar": "cadb25f8660392c1fbc7f9b2b1b9daa36469587b97bd30ba718d3bbaea71dfb3", - "javadoc": "9f0e2b81c851f003887723cff18948cc553da0eb9885fcf478197b515908112a", - "sources": "6b122ec23e06fe2e3b66a58a179470f6f109011ddaf5168020a33a0c53ff1630" + "jar": "cadb25f8660392c1fbc7f9b2b1b9daa36469587b97bd30ba718d3bbaea71dfb3" }, "version": "1.3.72" }, "org.jetbrains.kotlin:kotlin-test-common": { "shasums": { - "jar": "6b4abd7d7d1c07ab72c2318afec2f9b627b9e99a39767f597ac40cf7b1955b8a", - "javadoc": "9f0e2b81c851f003887723cff18948cc553da0eb9885fcf478197b515908112a", - "sources": "81a826f1c61c0d403483235e5db1c2e63f7a7d17fcacc8611f769221ba33f120" + "jar": "6b4abd7d7d1c07ab72c2318afec2f9b627b9e99a39767f597ac40cf7b1955b8a" }, "version": "1.3.72" }, "org.jetbrains.kotlin:kotlin-test-junit": { "shasums": { - "jar": "d8266ebb919568ddc15c98d2790017f31240ac51936445fd8b27231d60fe4566", - "javadoc": "ddbb961eb52a7d2c6669cefafd82ce97714f26ef4e5ca7721e9c58d47bd716d1", - "sources": "a8ab7ee99074595f118e0aff19ceee43c8c2538e4420bb2342035015025d2c31" + "jar": "d8266ebb919568ddc15c98d2790017f31240ac51936445fd8b27231d60fe4566" }, "version": "1.3.72" }, "org.jetbrains.kotlinx:kotlinx-coroutines-android": { "shasums": { - "jar": "d4cadb673b2101f1ee5fbc147956ac78b1cfd9cc255fb53d3aeb88dff11d99ca", - "javadoc": "66b1dd0f86a6894f99992956da5ce6310739138da2bb519734225c44b9979e49", - "sources": "b2370993da3e0a183109d58004d7fde48af9dbba93c6774299fda9069ebb5eeb" + "jar": "d4cadb673b2101f1ee5fbc147956ac78b1cfd9cc255fb53d3aeb88dff11d99ca" }, "version": "1.4.1" }, "org.jetbrains.kotlinx:kotlinx-coroutines-core": { "shasums": { - "jar": "6d2f87764b6638f27aff12ed380db4b63c9d46ba55dc32683a650598fa5a3e22", - "javadoc": "39c0c07744ac0d09d1b007250b5b2f46b33538faf42cbea37c5a013352276def", - "sources": "bb339efebc2d9141401f1aa43a035abe929210e362cfff13d03c6b7b11dc0469" + "jar": "6d2f87764b6638f27aff12ed380db4b63c9d46ba55dc32683a650598fa5a3e22" }, "version": "1.4.1" }, "org.jetbrains.kotlinx:kotlinx-coroutines-debug": { "shasums": { - "jar": "6a92f46fe713e9cade9cf55489844b0acf38596a070c1c85f0580e8107ae485e", - "javadoc": "76169a24017cc8cacf91abc0d0a8d1a47344fd480048d822ebfd6f65c17ef0a0", - "sources": "264927d634bc72c1995011ecaa7bc91085b0b880fef3c752a523f86b6e4cb94e" + "jar": "6a92f46fe713e9cade9cf55489844b0acf38596a070c1c85f0580e8107ae485e" }, "version": "1.2.2" }, "org.jetbrains.kotlinx:kotlinx-coroutines-test": { "shasums": { - "jar": "31e03c48a2f63ee11ee4d1eed4c1a19f561531e838525c67346f4bacdd422444", - "javadoc": "1e2ffc834330a05449650f5d039df39e522f30d524ae7ce4115370195aaca214", - "sources": "6eb4b2095410fd4a2896b137799e586765c8dec2a35103d58e7155227bbfcd73" + "jar": "31e03c48a2f63ee11ee4d1eed4c1a19f561531e838525c67346f4bacdd422444" }, "version": "1.2.2" }, "org.jetbrains.kotlinx:kotlinx-metadata-jvm": { "shasums": { - "jar": "9753bb39efef35957c5c15df9a3cb769aabf2cdfa74b47afcb7760e5146be3b5", - "javadoc": "adbfb6241ef597b5b046c27d9337f71c7d9a3412134640c02b2985f9ff35ad9a", - "sources": "a2cdb2a6a90a199addb8f312e3d5ab12b4626573f22b076176cc1d09999d6e78" + "jar": "9753bb39efef35957c5c15df9a3cb769aabf2cdfa74b47afcb7760e5146be3b5" }, "version": "0.1.0" }, "org.jetbrains:annotations": { "shasums": { - "jar": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478", - "javadoc": "189d6d7726b293869ae97bc35bdab234f46e735549516974260543ce26df1d47", - "sources": "42a5e144b8e81d50d6913d1007b695e62e614705268d8cf9f13dbdc478c2c68e" + "jar": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478" }, "version": "13.0" }, "org.mockito.kotlin:mockito-kotlin": { "shasums": { - "jar": "12995c7fdb8de84cf58fca31f1cd8810eeaa39e63c00e61ffcb2b49a4305f21f", - "javadoc": "90e9236a1f5169ccd4bb03852a4c9c9dee7f22eeaa062b84b006887116baf2bd", - "sources": "50bae6ff5fb02d2c211479df3e55799190df77d60f3e3f0be669a68ccde1e10b" + "jar": "12995c7fdb8de84cf58fca31f1cd8810eeaa39e63c00e61ffcb2b49a4305f21f" }, "version": "3.2.0" }, "org.mockito:mockito-core": { "shasums": { - "jar": "a1f64211407b8dc4cf80b16e07cc11aa9e5228d53dc4a5357326d66825f6a4ac", - "javadoc": "db83f99deadf3a0854546f6281867e9dd62ad34ac21276532735cf07c3f74ad1", - "sources": "6457852efe7e4ba539e5816d069401c9f2a39abc8cea43d0039174ac112a6ac3" + "jar": "a1f64211407b8dc4cf80b16e07cc11aa9e5228d53dc4a5357326d66825f6a4ac" }, "version": "3.9.0" }, "org.objenesis:objenesis": { "shasums": { - "jar": "03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3", - "javadoc": "dbfc5b05c607e0a08c2416fc77fd075dbd71d19f64735ec122ca5d6255f4b4ce", - "sources": "56a7987f5746bd809c363e29055c41f5472a086b0e0e32248693e064d10bc306" + "jar": "03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3" }, "version": "3.2" }, "org.ow2.asm:asm": { "shasums": { - "jar": "cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2", - "javadoc": "8bad3921fed9a2c8d897db545da7db87c2aea0c6d33612f24c217937a2af139c", - "sources": "64a1059b152dee08e203b4e1117b7979fff1578c545573f05329fb6d9090bb41" + "jar": "cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2" }, "version": "9.1" }, "org.ow2.asm:asm-analysis": { "shasums": { - "jar": "2d46de6df856a4daac9aa534459ab7287eb80584e9109850405e5b302dc9c2a6", - "javadoc": "7532547722c6be3ba7d079e213028ecd4ada7166c7f4cdf19ff8c2d59de35d97", - "sources": "a34153ef6bac79a2a0535f62590671fe7c632ade294aa74938ee79da14707521" + "jar": "2d46de6df856a4daac9aa534459ab7287eb80584e9109850405e5b302dc9c2a6" }, "version": "9.0" }, "org.ow2.asm:asm-commons": { "shasums": { - "jar": "1b9090acb7e67bd4ed2f2cfb002063316d79cecace237bd07cc4f7f1b302092f", - "javadoc": "b9f929932df93371bf048501d164ac2b4aa6f0d4cad7d28ca8299855d91ab0aa", - "sources": "7ced1227cc5e9d9762a930e19f8708591c5ef458bcdebdebd7e934fbb1b1adf3" + "jar": "1b9090acb7e67bd4ed2f2cfb002063316d79cecace237bd07cc4f7f1b302092f" }, "version": "9.0" }, "org.ow2.asm:asm-tree": { "shasums": { - "jar": "e2c25f332eb95861883a8568e45aac5e77d140d0fe961ae8eb9a474ec876e00d", - "javadoc": "9a35ebbec75750cb8e7de8106ad06a71c380021a990525e2f315919115195129", - "sources": "e75b132b75a861dcbb8aa75b98783b863310fb2e3e3d28394c22063db5ec7432" + "jar": "e2c25f332eb95861883a8568e45aac5e77d140d0fe961ae8eb9a474ec876e00d" }, "version": "9.0" }, "org.ow2.asm:asm-util": { "shasums": { - "jar": "2af6e7d01e0862e75193f3c01a06a689b0a245947e29f38eb683633391519bb6", - "javadoc": "3cbd7d1b4f18a947cc9c7fb7288b98d1d1c8c401c86ee2de1d81c5ec207a5411", - "sources": "cdc52c849b9af5d157df3919621d484697ed35c755292c682704227c0e012710" + "jar": "2af6e7d01e0862e75193f3c01a06a689b0a245947e29f38eb683633391519bb6" }, "version": "9.0" }, "org.robolectric:annotations": { "shasums": { - "jar": "76b5bf55bb0d98e3b72fee1e015dea04c3a5a907aff02b9b405cebd50a19e1ab", - "javadoc": "0aacace08db91457f12dc0ac82b4c931bd550f53ced74911b86e150e84b6f2fa", - "sources": "32eccf8cbb11da68ffbe0fc14278150dc4236f77de26af1d1727e6acd61a086b" + "jar": "76b5bf55bb0d98e3b72fee1e015dea04c3a5a907aff02b9b405cebd50a19e1ab" }, "version": "4.5" }, "org.robolectric:junit": { "shasums": { - "jar": "c9eec2e87d53fc7a4af3c0c1c4b722963f2dc7d0a01b90568a6c83ca6d751c4a", - "javadoc": "60fe133208cb0abbb6842c2bf7144351e6a5944cb3987a7a8fd4bcfb88fa1e47", - "sources": "6e631445ffcb2ecefb4ba4e170ae31e39f281244a3ce68b444f8d8fe1944782f" + "jar": "c9eec2e87d53fc7a4af3c0c1c4b722963f2dc7d0a01b90568a6c83ca6d751c4a" }, "version": "4.5" }, "org.robolectric:pluginapi": { "shasums": { - "jar": "9292f4a65d546b27b000112f1daeea8228c039ba9eb790d122ee99a4b04d8c43", - "javadoc": "b0805f1670d05d7004834375fdb2a88dd560df5489bbf7e201fe5f931cb8b142", - "sources": "c90002bd085a03daf77b51ed4e0867cff898adaa754023aea21f4bcb84567127" + "jar": "9292f4a65d546b27b000112f1daeea8228c039ba9eb790d122ee99a4b04d8c43" }, "version": "4.5" }, "org.robolectric:plugins-maven-dependency-resolver": { "shasums": { - "jar": "e6c381016e2da09c3f3a7859075042d3457d0dc0a6ba088b8d969b9d3a525cfa", - "javadoc": "997536de988ae0086235cf54e5ee81dad096896b58d637bf0c9d6e5cbc7988b4", - "sources": "628689f56c37d669a60d5aa669e59acb0d64001f6b2533174ed5ddee4871d7bb" + "jar": "e6c381016e2da09c3f3a7859075042d3457d0dc0a6ba088b8d969b9d3a525cfa" }, "version": "4.5" }, "org.robolectric:resources": { "shasums": { - "jar": "21b60d114670827bf80b7815faa16da02eeda2fcd01cba088dfb630fa9721eb3", - "javadoc": "b5b3139231aed8a1058b7bc6d63fee2f2e292112c61ae0d815f95eb8f6ddd7f5", - "sources": "d5baa25e556e4fc67d3dc6bdf0bf32d29df4439856fc054112f81596a1fe1574" + "jar": "21b60d114670827bf80b7815faa16da02eeda2fcd01cba088dfb630fa9721eb3" }, "version": "4.5" }, "org.robolectric:robolectric": { "shasums": { - "jar": "ba9f8130c11d5b34dfe61990d2e9adfbcf5a945476309c3dcb48fce547331c27", - "javadoc": "0b25f1b6866deb4089817faa2a1c45f045be5cb5323c2500186e1b35d94ca1d2", - "sources": "54293237f2b9f48f1609935bffc37b353b3e981962fb578da64bae1a82c6c25d" + "jar": "ba9f8130c11d5b34dfe61990d2e9adfbcf5a945476309c3dcb48fce547331c27" }, "version": "4.5" }, "org.robolectric:sandbox": { "shasums": { - "jar": "cf18639f2991893122f88df87bf83eb325b3ca1031c9a730acead5acdc7e275c", - "javadoc": "5859b3a7807c3b2c050c54bb7733be979d5e3ecc2f2e333a6cb863f19a8fd9a6", - "sources": "e9c61c173f65a73f4ae415cc0095c8570ed199d8247b4421032b82cc2aca3571" + "jar": "cf18639f2991893122f88df87bf83eb325b3ca1031c9a730acead5acdc7e275c" }, "version": "4.5" }, "org.robolectric:shadowapi": { "shasums": { - "jar": "a158c49d0274a1412fb909d6b2e52a06b230a2b80ad8657c072c7474f0e69c1f", - "javadoc": "687a26edb933561b57f73a86479e790bde0160dbc0e8759f9adfb315e0d29c95", - "sources": "4a220cfd840b1aec509512825a6b332dbe8889f988f25d60369ceb599396ac9e" + "jar": "a158c49d0274a1412fb909d6b2e52a06b230a2b80ad8657c072c7474f0e69c1f" }, "version": "4.5" }, "org.robolectric:shadows-framework": { "shasums": { - "jar": "3be4c7d01ee2fb5cff4cb90a65af26831199baac3e92311dd2d5f42cadb50723", - "javadoc": "32ab2b084c605c673b0a45a785605b99bc9ef1d8fed5ea3794269059a9aee387", - "sources": "879288cd58699b4a75ebda38bb0905f359a258575f18ff0e7b861d18a8595231" + "jar": "3be4c7d01ee2fb5cff4cb90a65af26831199baac3e92311dd2d5f42cadb50723" }, "version": "4.5" }, "org.robolectric:utils": { "shasums": { - "jar": "b0982a413c4bd874a8099b97a22cdcd4826cf62178f17dbca67d814627124de1", - "javadoc": "ed6b69a41d73bb5e96e059862dddfeac67387a3f544055de04ee731aecdcb3d4", - "sources": "f8b7e1a3ed9916c1d2529ede178af4bd6dc3b2f41fc9be57c22476f3e91ffdb4" + "jar": "b0982a413c4bd874a8099b97a22cdcd4826cf62178f17dbca67d814627124de1" }, "version": "4.5" }, "org.robolectric:utils-reflector": { "shasums": { - "jar": "91f9e5f9eacd6a2f308473b39d473f3edd205365fe3c4188f8c4c11191c6d914", - "javadoc": "22ec55c4f3126796df44b2a7b68ab33980590861df06ee1486eecca934e9257d", - "sources": "a8f9c774036f4ed79a1c08cd876a4ec0e8eac311875c0a3e9df7de8ab0e5e003" + "jar": "91f9e5f9eacd6a2f308473b39d473f3edd205365fe3c4188f8c4c11191c6d914" }, "version": "4.5" } @@ -3177,143 +2210,6 @@ "org.robolectric:utils" ] }, - "skipped": [ - "android.arch.core:common:jar:javadoc", - "android.arch.core:core-testing:jar:javadoc", - "android.arch.core:runtime:aar:javadoc", - "androidx.activity:activity:aar:javadoc", - "androidx.annotation:annotation-experimental:jar:javadoc", - "androidx.appcompat:appcompat-resources:aar:javadoc", - "androidx.appcompat:appcompat:jar:javadoc", - "androidx.arch.core:core-common:jar:javadoc", - "androidx.arch.core:core-runtime:aar:javadoc", - "androidx.arch.core:core-testing:jar:javadoc", - "androidx.cardview:cardview:jar:javadoc", - "androidx.collection:collection:jar:javadoc", - "androidx.constraintlayout:constraintlayout-solver:jar:javadoc", - "androidx.constraintlayout:constraintlayout-solver:jar:sources", - "androidx.constraintlayout:constraintlayout:jar:javadoc", - "androidx.constraintlayout:constraintlayout:jar:sources", - "androidx.coordinatorlayout:coordinatorlayout:jar:javadoc", - "androidx.core:core-ktx:jar:javadoc", - "androidx.core:core:aar:javadoc", - "androidx.core:core:jar:javadoc", - "androidx.cursoradapter:cursoradapter:aar:javadoc", - "androidx.customview:customview:aar:javadoc", - "androidx.databinding:databinding-adapters:jar:javadoc", - "androidx.databinding:databinding-runtime:jar:javadoc", - "androidx.documentfile:documentfile:aar:javadoc", - "androidx.drawerlayout:drawerlayout:aar:javadoc", - "androidx.drawerlayout:drawerlayout:jar:javadoc", - "androidx.dynamicanimation:dynamicanimation:jar:javadoc", - "androidx.exifinterface:exifinterface:jar:javadoc", - "androidx.fragment:fragment:aar:javadoc", - "androidx.fragment:fragment:jar:javadoc", - "androidx.interpolator:interpolator:aar:javadoc", - "androidx.legacy:legacy-support-core-utils:aar:javadoc", - "androidx.legacy:legacy-support-core-utils:jar:javadoc", - "androidx.lifecycle:lifecycle-common:jar:javadoc", - "androidx.lifecycle:lifecycle-extensions:jar:javadoc", - "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:javadoc", - "androidx.lifecycle:lifecycle-livedata-core:aar:javadoc", - "androidx.lifecycle:lifecycle-livedata-core:jar:javadoc", - "androidx.lifecycle:lifecycle-livedata-ktx:jar:javadoc", - "androidx.lifecycle:lifecycle-livedata:aar:javadoc", - "androidx.lifecycle:lifecycle-process:aar:javadoc", - "androidx.lifecycle:lifecycle-runtime:aar:javadoc", - "androidx.lifecycle:lifecycle-runtime:jar:javadoc", - "androidx.lifecycle:lifecycle-service:aar:javadoc", - "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:javadoc", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar:javadoc", - "androidx.lifecycle:lifecycle-viewmodel:aar:javadoc", - "androidx.loader:loader:aar:javadoc", - "androidx.localbroadcastmanager:localbroadcastmanager:aar:javadoc", - "androidx.multidex:multidex-instrumentation:jar:javadoc", - "androidx.multidex:multidex-instrumentation:jar:sources", - "androidx.multidex:multidex:jar:javadoc", - "androidx.navigation:navigation-common-ktx:aar:javadoc", - "androidx.navigation:navigation-common:aar:javadoc", - "androidx.navigation:navigation-fragment-ktx:jar:javadoc", - "androidx.navigation:navigation-fragment:aar:javadoc", - "androidx.navigation:navigation-fragment:jar:javadoc", - "androidx.navigation:navigation-runtime-ktx:aar:javadoc", - "androidx.navigation:navigation-runtime:aar:javadoc", - "androidx.navigation:navigation-ui-ktx:jar:javadoc", - "androidx.navigation:navigation-ui:aar:javadoc", - "androidx.navigation:navigation-ui:jar:javadoc", - "androidx.print:print:aar:javadoc", - "androidx.recyclerview:recyclerview:aar:javadoc", - "androidx.recyclerview:recyclerview:jar:javadoc", - "androidx.room:room-common:jar:javadoc", - "androidx.room:room-runtime:aar:javadoc", - "androidx.room:room-runtime:jar:javadoc", - "androidx.savedstate:savedstate:aar:javadoc", - "androidx.sqlite:sqlite-framework:aar:javadoc", - "androidx.sqlite:sqlite:aar:javadoc", - "androidx.transition:transition:jar:javadoc", - "androidx.vectordrawable:vectordrawable-animated:aar:javadoc", - "androidx.vectordrawable:vectordrawable-animated:jar:javadoc", - "androidx.vectordrawable:vectordrawable:aar:javadoc", - "androidx.vectordrawable:vectordrawable:jar:javadoc", - "androidx.versionedparcelable:versionedparcelable:aar:javadoc", - "androidx.viewpager2:viewpager2:jar:javadoc", - "androidx.viewpager:viewpager:aar:javadoc", - "androidx.viewpager:viewpager:jar:javadoc", - "androidx.work:work-runtime-ktx:aar:javadoc", - "androidx.work:work-runtime-ktx:jar:javadoc", - "androidx.work:work-runtime:aar:javadoc", - "androidx.work:work-runtime:jar:javadoc", - "androidx.work:work-testing:jar:javadoc", - "com.android.support:support-annotations:jar:javadoc", - "com.android.support:support-annotations:jar:sources", - "com.android.tools.build.jetifier:jetifier-core:jar:javadoc", - "com.crashlytics.sdk.android:answers:aar:javadoc", - "com.crashlytics.sdk.android:answers:aar:sources", - "com.crashlytics.sdk.android:beta:aar:javadoc", - "com.crashlytics.sdk.android:beta:aar:sources", - "com.crashlytics.sdk.android:crashlytics-core:aar:javadoc", - "com.crashlytics.sdk.android:crashlytics-core:aar:sources", - "com.crashlytics.sdk.android:crashlytics:jar:javadoc", - "com.crashlytics.sdk.android:crashlytics:jar:sources", - "com.google.android.datatransport:transport-api:aar:sources", - "com.google.android.datatransport:transport-backend-cct:aar:sources", - "com.google.android.datatransport:transport-runtime:aar:sources", - "com.google.android.flexbox:flexbox:jar:javadoc", - "com.google.android.gms:play-services-ads-identifier:aar:javadoc", - "com.google.android.gms:play-services-ads-identifier:aar:sources", - "com.google.android.gms:play-services-base:aar:sources", - "com.google.android.gms:play-services-basement:aar:sources", - "com.google.android.gms:play-services-measurement-api:aar:sources", - "com.google.android.gms:play-services-measurement-base:aar:sources", - "com.google.android.gms:play-services-measurement-impl:aar:sources", - "com.google.android.gms:play-services-measurement-sdk-api:aar:sources", - "com.google.android.gms:play-services-measurement-sdk:aar:sources", - "com.google.android.gms:play-services-measurement:aar:sources", - "com.google.android.gms:play-services-stats:aar:javadoc", - "com.google.android.gms:play-services-stats:aar:sources", - "com.google.android.gms:play-services-tasks:aar:javadoc", - "com.google.android.gms:play-services-tasks:aar:sources", - "com.google.android.gms:strict-version-matcher-plugin:jar:javadoc", - "com.google.android.gms:strict-version-matcher-plugin:jar:sources", - "com.google.android.material:material:jar:javadoc", - "com.google.firebase:firebase-analytics:jar:sources", - "com.google.firebase:firebase-crashlytics:jar:sources", - "com.google.firebase:firebase-iid-interop:aar:javadoc", - "com.google.firebase:firebase-iid-interop:aar:sources", - "com.google.firebase:firebase-iid:aar:sources", - "com.google.firebase:firebase-installations-interop:aar:sources", - "com.google.firebase:firebase-installations:aar:sources", - "com.google.firebase:firebase-measurement-connector:aar:javadoc", - "com.google.firebase:firebase-measurement-connector:aar:sources", - "com.google.guava:listenablefuture:jar:javadoc", - "com.google.guava:listenablefuture:jar:sources", - "io.fabric.sdk.android:fabric:aar:javadoc", - "io.fabric.sdk.android:fabric:aar:sources", - "io.fabric.sdk.android:fabric:jar:javadoc", - "io.fabric.sdk.android:fabric:jar:sources", - "javax.annotation:jsr250-api:jar:javadoc", - "nl.dionsegijn:konfetti:jar:javadoc" - ], "packages": { "android.arch.core:common": [ "android.arch.core.internal", @@ -3781,9 +2677,6 @@ "net.bytebuddy:byte-buddy-agent": [ "net.bytebuddy.agent" ], - "net.bytebuddy:byte-buddy:jar:sources": [ - "net.bytebuddy.build" - ], "net.ltgt.gradle.incap:incap": [ "net.ltgt.gradle.incap" ], @@ -5177,1635 +4070,669 @@ "repositories": { "https://maven.google.com/": [ "android.arch.core:common", - "android.arch.core:common:jar:sources", "android.arch.core:core-testing:aar", - "android.arch.core:core-testing:jar:sources", "android.arch.core:runtime:aar", - "android.arch.core:runtime:jar:sources", "androidx.activity:activity:aar", - "androidx.activity:activity:jar:sources", "androidx.annotation:annotation", "androidx.annotation:annotation-experimental:aar", - "androidx.annotation:annotation-experimental:jar:sources", - "androidx.annotation:annotation:jar:javadoc", - "androidx.annotation:annotation:jar:sources", "androidx.appcompat:appcompat-resources:aar", - "androidx.appcompat:appcompat-resources:jar:sources", "androidx.appcompat:appcompat:aar", - "androidx.appcompat:appcompat:jar:sources", "androidx.arch.core:core-common", - "androidx.arch.core:core-common:jar:sources", "androidx.arch.core:core-runtime:aar", - "androidx.arch.core:core-runtime:jar:sources", "androidx.arch.core:core-testing:aar", - "androidx.arch.core:core-testing:jar:sources", "androidx.cardview:cardview:aar", - "androidx.cardview:cardview:jar:sources", "androidx.collection:collection", - "androidx.collection:collection:jar:sources", "androidx.constraintlayout:constraintlayout-solver", "androidx.constraintlayout:constraintlayout:aar", "androidx.coordinatorlayout:coordinatorlayout:aar", - "androidx.coordinatorlayout:coordinatorlayout:jar:sources", "androidx.core:core-ktx:aar", - "androidx.core:core-ktx:jar:sources", "androidx.core:core:aar", - "androidx.core:core:jar:sources", "androidx.cursoradapter:cursoradapter:aar", - "androidx.cursoradapter:cursoradapter:jar:sources", "androidx.customview:customview:aar", - "androidx.customview:customview:jar:sources", "androidx.databinding:databinding-adapters:aar", - "androidx.databinding:databinding-adapters:jar:sources", "androidx.databinding:databinding-common", - "androidx.databinding:databinding-common:jar:javadoc", - "androidx.databinding:databinding-common:jar:sources", "androidx.databinding:databinding-compiler", "androidx.databinding:databinding-compiler-common", - "androidx.databinding:databinding-compiler-common:jar:javadoc", - "androidx.databinding:databinding-compiler-common:jar:sources", - "androidx.databinding:databinding-compiler:jar:javadoc", - "androidx.databinding:databinding-compiler:jar:sources", "androidx.databinding:databinding-runtime:aar", - "androidx.databinding:databinding-runtime:jar:sources", "androidx.documentfile:documentfile:aar", - "androidx.documentfile:documentfile:jar:sources", "androidx.drawerlayout:drawerlayout:aar", - "androidx.drawerlayout:drawerlayout:jar:sources", "androidx.dynamicanimation:dynamicanimation:aar", - "androidx.dynamicanimation:dynamicanimation:jar:sources", "androidx.exifinterface:exifinterface:aar", - "androidx.exifinterface:exifinterface:jar:sources", "androidx.fragment:fragment:aar", - "androidx.fragment:fragment:jar:sources", "androidx.interpolator:interpolator:aar", - "androidx.interpolator:interpolator:jar:sources", "androidx.legacy:legacy-support-core-utils:aar", - "androidx.legacy:legacy-support-core-utils:jar:sources", "androidx.lifecycle:lifecycle-common", - "androidx.lifecycle:lifecycle-common:jar:sources", "androidx.lifecycle:lifecycle-extensions:aar", - "androidx.lifecycle:lifecycle-extensions:jar:sources", "androidx.lifecycle:lifecycle-livedata-core-ktx:aar", - "androidx.lifecycle:lifecycle-livedata-core-ktx:jar:sources", "androidx.lifecycle:lifecycle-livedata-core:aar", - "androidx.lifecycle:lifecycle-livedata-core:jar:sources", "androidx.lifecycle:lifecycle-livedata-ktx:aar", - "androidx.lifecycle:lifecycle-livedata-ktx:jar:sources", "androidx.lifecycle:lifecycle-livedata:aar", - "androidx.lifecycle:lifecycle-livedata:jar:sources", "androidx.lifecycle:lifecycle-process:aar", - "androidx.lifecycle:lifecycle-process:jar:sources", "androidx.lifecycle:lifecycle-runtime:aar", - "androidx.lifecycle:lifecycle-runtime:jar:sources", "androidx.lifecycle:lifecycle-service:aar", - "androidx.lifecycle:lifecycle-service:jar:sources", "androidx.lifecycle:lifecycle-viewmodel-ktx:aar", - "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:sources", "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:jar:sources", "androidx.lifecycle:lifecycle-viewmodel:aar", - "androidx.lifecycle:lifecycle-viewmodel:jar:sources", "androidx.loader:loader:aar", - "androidx.loader:loader:jar:sources", "androidx.localbroadcastmanager:localbroadcastmanager:aar", - "androidx.localbroadcastmanager:localbroadcastmanager:jar:sources", "androidx.multidex:multidex-instrumentation:aar", "androidx.multidex:multidex:aar", - "androidx.multidex:multidex:jar:sources", "androidx.navigation:navigation-common-ktx:aar", - "androidx.navigation:navigation-common-ktx:jar:sources", "androidx.navigation:navigation-common:aar", - "androidx.navigation:navigation-common:jar:sources", "androidx.navigation:navigation-fragment-ktx:aar", - "androidx.navigation:navigation-fragment-ktx:jar:sources", "androidx.navigation:navigation-fragment:aar", - "androidx.navigation:navigation-fragment:jar:sources", "androidx.navigation:navigation-runtime-ktx:aar", - "androidx.navigation:navigation-runtime-ktx:jar:sources", "androidx.navigation:navigation-runtime:aar", - "androidx.navigation:navigation-runtime:jar:sources", "androidx.navigation:navigation-ui-ktx:aar", - "androidx.navigation:navigation-ui-ktx:jar:sources", "androidx.navigation:navigation-ui:aar", - "androidx.navigation:navigation-ui:jar:sources", "androidx.print:print:aar", - "androidx.print:print:jar:sources", "androidx.recyclerview:recyclerview:aar", - "androidx.recyclerview:recyclerview:jar:sources", "androidx.room:room-common", - "androidx.room:room-common:jar:sources", "androidx.room:room-runtime:aar", - "androidx.room:room-runtime:jar:sources", "androidx.savedstate:savedstate:aar", - "androidx.savedstate:savedstate:jar:sources", "androidx.sqlite:sqlite-framework:aar", - "androidx.sqlite:sqlite-framework:jar:sources", "androidx.sqlite:sqlite:aar", - "androidx.sqlite:sqlite:jar:sources", "androidx.test.espresso:espresso-accessibility:aar", - "androidx.test.espresso:espresso-accessibility:jar:javadoc", - "androidx.test.espresso:espresso-accessibility:jar:sources", "androidx.test.espresso:espresso-contrib:aar", - "androidx.test.espresso:espresso-contrib:jar:javadoc", - "androidx.test.espresso:espresso-contrib:jar:sources", "androidx.test.espresso:espresso-core:aar", - "androidx.test.espresso:espresso-core:jar:javadoc", - "androidx.test.espresso:espresso-core:jar:sources", "androidx.test.espresso:espresso-idling-resource:aar", - "androidx.test.espresso:espresso-idling-resource:jar:javadoc", - "androidx.test.espresso:espresso-idling-resource:jar:sources", "androidx.test.espresso:espresso-intents:aar", - "androidx.test.espresso:espresso-intents:jar:javadoc", - "androidx.test.espresso:espresso-intents:jar:sources", "androidx.test.ext:junit:aar", - "androidx.test.ext:junit:jar:javadoc", - "androidx.test.ext:junit:jar:sources", "androidx.test.ext:truth:aar", - "androidx.test.ext:truth:jar:javadoc", - "androidx.test.ext:truth:jar:sources", "androidx.test.uiautomator:uiautomator:aar", - "androidx.test.uiautomator:uiautomator:jar:javadoc", - "androidx.test.uiautomator:uiautomator:jar:sources", "androidx.test:core:aar", - "androidx.test:core:jar:javadoc", - "androidx.test:core:jar:sources", "androidx.test:monitor:aar", - "androidx.test:monitor:jar:javadoc", - "androidx.test:monitor:jar:sources", "androidx.test:rules:aar", - "androidx.test:rules:jar:javadoc", - "androidx.test:rules:jar:sources", "androidx.test:runner:aar", - "androidx.test:runner:jar:javadoc", - "androidx.test:runner:jar:sources", "androidx.transition:transition:aar", - "androidx.transition:transition:jar:sources", "androidx.vectordrawable:vectordrawable-animated:aar", - "androidx.vectordrawable:vectordrawable-animated:jar:sources", "androidx.vectordrawable:vectordrawable:aar", - "androidx.vectordrawable:vectordrawable:jar:sources", "androidx.versionedparcelable:versionedparcelable:aar", - "androidx.versionedparcelable:versionedparcelable:jar:sources", "androidx.viewpager2:viewpager2:aar", - "androidx.viewpager2:viewpager2:jar:sources", "androidx.viewpager:viewpager:aar", - "androidx.viewpager:viewpager:jar:sources", "androidx.work:work-runtime-ktx:aar", - "androidx.work:work-runtime-ktx:jar:sources", "androidx.work:work-runtime:aar", - "androidx.work:work-runtime:jar:sources", "androidx.work:work-testing:aar", - "androidx.work:work-testing:jar:sources", "com.almworks.sqlite4java:sqlite4java", - "com.almworks.sqlite4java:sqlite4java:jar:javadoc", - "com.almworks.sqlite4java:sqlite4java:jar:sources", "com.android.databinding:baseLibrary", - "com.android.databinding:baseLibrary:jar:javadoc", - "com.android.databinding:baseLibrary:jar:sources", "com.android.support:support-annotations", "com.android.tools.build.jetifier:jetifier-core", - "com.android.tools.build.jetifier:jetifier-core:jar:sources", "com.android.tools.build:aapt2-proto", - "com.android.tools.build:aapt2-proto:jar:javadoc", - "com.android.tools.build:aapt2-proto:jar:sources", "com.android.tools:annotations", - "com.android.tools:annotations:jar:javadoc", - "com.android.tools:annotations:jar:sources", "com.crashlytics.sdk.android:answers:aar", "com.crashlytics.sdk.android:beta:aar", "com.crashlytics.sdk.android:crashlytics-core:aar", "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", - "com.github.bumptech.glide:annotations:jar:javadoc", - "com.github.bumptech.glide:annotations:jar:sources", "com.github.bumptech.glide:compiler", - "com.github.bumptech.glide:compiler:jar:javadoc", - "com.github.bumptech.glide:compiler:jar:sources", "com.github.bumptech.glide:disklrucache", - "com.github.bumptech.glide:disklrucache:jar:javadoc", - "com.github.bumptech.glide:disklrucache:jar:sources", "com.github.bumptech.glide:gifdecoder:aar", - "com.github.bumptech.glide:gifdecoder:jar:javadoc", - "com.github.bumptech.glide:gifdecoder:jar:sources", "com.github.bumptech.glide:glide:aar", - "com.github.bumptech.glide:glide:jar:javadoc", - "com.github.bumptech.glide:glide:jar:sources", "com.github.bumptech.glide:mocks:aar", - "com.github.bumptech.glide:mocks:jar:javadoc", - "com.github.bumptech.glide:mocks:jar:sources", "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:javadoc", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources", "com.google.android.datatransport:transport-api:aar", - "com.google.android.datatransport:transport-api:jar:javadoc", "com.google.android.datatransport:transport-backend-cct:aar", - "com.google.android.datatransport:transport-backend-cct:jar:javadoc", "com.google.android.datatransport:transport-runtime:aar", - "com.google.android.datatransport:transport-runtime:jar:javadoc", "com.google.android.flexbox:flexbox:aar", - "com.google.android.flexbox:flexbox:jar:sources", "com.google.android.gms:play-services-ads-identifier:aar", "com.google.android.gms:play-services-base:aar", - "com.google.android.gms:play-services-base:jar:javadoc", "com.google.android.gms:play-services-basement:aar", - "com.google.android.gms:play-services-basement:jar:javadoc", "com.google.android.gms:play-services-measurement-api:aar", - "com.google.android.gms:play-services-measurement-api:jar:javadoc", "com.google.android.gms:play-services-measurement-base:aar", - "com.google.android.gms:play-services-measurement-base:jar:javadoc", "com.google.android.gms:play-services-measurement-impl:aar", - "com.google.android.gms:play-services-measurement-impl:jar:javadoc", "com.google.android.gms:play-services-measurement-sdk-api:aar", - "com.google.android.gms:play-services-measurement-sdk-api:jar:javadoc", "com.google.android.gms:play-services-measurement-sdk:aar", - "com.google.android.gms:play-services-measurement-sdk:jar:javadoc", "com.google.android.gms:play-services-measurement:aar", - "com.google.android.gms:play-services-measurement:jar:javadoc", "com.google.android.gms:play-services-stats:aar", "com.google.android.gms:play-services-tasks:aar", "com.google.android.gms:strict-version-matcher-plugin", "com.google.android.material:material:aar", - "com.google.android.material:material:jar:sources", "com.google.auto.service:auto-service-annotations", - "com.google.auto.service:auto-service-annotations:jar:javadoc", - "com.google.auto.service:auto-service-annotations:jar:sources", "com.google.auto.value:auto-value-annotations", - "com.google.auto.value:auto-value-annotations:jar:javadoc", - "com.google.auto.value:auto-value-annotations:jar:sources", "com.google.code.findbugs:jsr305", - "com.google.code.findbugs:jsr305:jar:javadoc", - "com.google.code.findbugs:jsr305:jar:sources", "com.google.code.gson:gson", - "com.google.code.gson:gson:jar:javadoc", - "com.google.code.gson:gson:jar:sources", "com.google.dagger:dagger", "com.google.dagger:dagger-compiler", - "com.google.dagger:dagger-compiler:jar:javadoc", - "com.google.dagger:dagger-compiler:jar:sources", "com.google.dagger:dagger-producers", - "com.google.dagger:dagger-producers:jar:javadoc", - "com.google.dagger:dagger-producers:jar:sources", "com.google.dagger:dagger-spi", - "com.google.dagger:dagger-spi:jar:javadoc", - "com.google.dagger:dagger-spi:jar:sources", - "com.google.dagger:dagger:jar:javadoc", - "com.google.dagger:dagger:jar:sources", "com.google.errorprone:error_prone_annotations", - "com.google.errorprone:error_prone_annotations:jar:javadoc", - "com.google.errorprone:error_prone_annotations:jar:sources", "com.google.errorprone:javac-shaded", - "com.google.errorprone:javac-shaded:jar:javadoc", - "com.google.errorprone:javac-shaded:jar:sources", "com.google.firebase:firebase-analytics:aar", - "com.google.firebase:firebase-analytics:jar:javadoc", "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-common:jar:javadoc", - "com.google.firebase:firebase-common:jar:sources", "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-components:jar:javadoc", - "com.google.firebase:firebase-components:jar:sources", "com.google.firebase:firebase-crashlytics:aar", - "com.google.firebase:firebase-crashlytics:jar:javadoc", "com.google.firebase:firebase-encoders-json:aar", - "com.google.firebase:firebase-encoders-json:jar:javadoc", - "com.google.firebase:firebase-encoders-json:jar:sources", "com.google.firebase:firebase-iid-interop:aar", "com.google.firebase:firebase-iid:aar", - "com.google.firebase:firebase-iid:jar:javadoc", "com.google.firebase:firebase-installations-interop:aar", - "com.google.firebase:firebase-installations-interop:jar:javadoc", "com.google.firebase:firebase-installations:aar", - "com.google.firebase:firebase-installations:jar:javadoc", "com.google.firebase:firebase-measurement-connector:aar", "com.google.gms:google-services", - "com.google.gms:google-services:jar:javadoc", - "com.google.gms:google-services:jar:sources", "com.google.googlejavaformat:google-java-format", - "com.google.googlejavaformat:google-java-format:jar:javadoc", - "com.google.googlejavaformat:google-java-format:jar:sources", "com.google.guava:failureaccess", - "com.google.guava:failureaccess:jar:javadoc", - "com.google.guava:failureaccess:jar:sources", "com.google.guava:guava", - "com.google.guava:guava:jar:javadoc", - "com.google.guava:guava:jar:sources", "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", - "com.google.j2objc:j2objc-annotations:jar:javadoc", - "com.google.j2objc:j2objc-annotations:jar:sources", "com.google.protobuf:protobuf-java", - "com.google.protobuf:protobuf-java:jar:javadoc", - "com.google.protobuf:protobuf-java:jar:sources", "com.google.protobuf:protobuf-javalite", - "com.google.protobuf:protobuf-javalite:jar:javadoc", - "com.google.protobuf:protobuf-javalite:jar:sources", "com.google.truth.extensions:truth-liteproto-extension", - "com.google.truth.extensions:truth-liteproto-extension:jar:javadoc", - "com.google.truth.extensions:truth-liteproto-extension:jar:sources", "com.google.truth:truth", - "com.google.truth:truth:jar:javadoc", - "com.google.truth:truth:jar:sources", "com.googlecode.juniversalchardet:juniversalchardet", - "com.googlecode.juniversalchardet:juniversalchardet:jar:javadoc", - "com.googlecode.juniversalchardet:juniversalchardet:jar:sources", "com.ibm.icu:icu4j", - "com.ibm.icu:icu4j:jar:javadoc", - "com.ibm.icu:icu4j:jar:sources", "com.squareup.moshi:moshi", "com.squareup.moshi:moshi-kotlin", "com.squareup.moshi:moshi-kotlin-codegen", - "com.squareup.moshi:moshi-kotlin-codegen:jar:javadoc", - "com.squareup.moshi:moshi-kotlin-codegen:jar:sources", - "com.squareup.moshi:moshi-kotlin:jar:javadoc", - "com.squareup.moshi:moshi-kotlin:jar:sources", - "com.squareup.moshi:moshi:jar:javadoc", - "com.squareup.moshi:moshi:jar:sources", "com.squareup.okhttp3:mockwebserver", - "com.squareup.okhttp3:mockwebserver:jar:javadoc", - "com.squareup.okhttp3:mockwebserver:jar:sources", "com.squareup.okhttp3:okhttp", - "com.squareup.okhttp3:okhttp:jar:javadoc", - "com.squareup.okhttp3:okhttp:jar:sources", "com.squareup.okio:okio", - "com.squareup.okio:okio:jar:javadoc", - "com.squareup.okio:okio:jar:sources", "com.squareup.retrofit2:converter-moshi", - "com.squareup.retrofit2:converter-moshi:jar:javadoc", - "com.squareup.retrofit2:converter-moshi:jar:sources", "com.squareup.retrofit2:retrofit", "com.squareup.retrofit2:retrofit-mock", - "com.squareup.retrofit2:retrofit-mock:jar:javadoc", - "com.squareup.retrofit2:retrofit-mock:jar:sources", - "com.squareup.retrofit2:retrofit:jar:javadoc", - "com.squareup.retrofit2:retrofit:jar:sources", "com.squareup:javapoet", - "com.squareup:javapoet:jar:javadoc", - "com.squareup:javapoet:jar:sources", "com.squareup:javawriter", - "com.squareup:javawriter:jar:javadoc", - "com.squareup:javawriter:jar:sources", "com.squareup:kotlinpoet", - "com.squareup:kotlinpoet:jar:javadoc", - "com.squareup:kotlinpoet:jar:sources", "commons-codec:commons-codec", - "commons-codec:commons-codec:jar:javadoc", - "commons-codec:commons-codec:jar:sources", "commons-io:commons-io", - "commons-io:commons-io:jar:javadoc", - "commons-io:commons-io:jar:sources", "de.hdodenhof:circleimageview:aar", - "de.hdodenhof:circleimageview:jar:javadoc", - "de.hdodenhof:circleimageview:jar:sources", "io.fabric.sdk.android:fabric:aar", "javax.annotation:javax.annotation-api", - "javax.annotation:javax.annotation-api:jar:javadoc", - "javax.annotation:javax.annotation-api:jar:sources", "javax.annotation:jsr250-api", - "javax.annotation:jsr250-api:jar:sources", "javax.inject:javax.inject", - "javax.inject:javax.inject:jar:javadoc", - "javax.inject:javax.inject:jar:sources", "junit:junit", - "junit:junit:jar:javadoc", - "junit:junit:jar:sources", "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", - "net.bytebuddy:byte-buddy-agent:jar:javadoc", - "net.bytebuddy:byte-buddy-agent:jar:sources", - "net.bytebuddy:byte-buddy:jar:javadoc", - "net.bytebuddy:byte-buddy:jar:sources", "net.ltgt.gradle.incap:incap", - "net.ltgt.gradle.incap:incap:jar:javadoc", - "net.ltgt.gradle.incap:incap:jar:sources", "net.sf.kxml:kxml2", - "net.sf.kxml:kxml2:jar:javadoc", - "net.sf.kxml:kxml2:jar:sources", "nl.dionsegijn:konfetti:aar", - "nl.dionsegijn:konfetti:jar:sources", "org.antlr:antlr4", - "org.antlr:antlr4:jar:javadoc", - "org.antlr:antlr4:jar:sources", "org.bouncycastle:bcprov-jdk15on", - "org.bouncycastle:bcprov-jdk15on:jar:javadoc", - "org.bouncycastle:bcprov-jdk15on:jar:sources", "org.checkerframework:checker-compat-qual", - "org.checkerframework:checker-compat-qual:jar:javadoc", - "org.checkerframework:checker-compat-qual:jar:sources", "org.checkerframework:checker-qual", - "org.checkerframework:checker-qual:jar:javadoc", - "org.checkerframework:checker-qual:jar:sources", "org.hamcrest:hamcrest-core", - "org.hamcrest:hamcrest-core:jar:javadoc", - "org.hamcrest:hamcrest-core:jar:sources", "org.hamcrest:hamcrest-integration", - "org.hamcrest:hamcrest-integration:jar:javadoc", - "org.hamcrest:hamcrest-integration:jar:sources", "org.hamcrest:hamcrest-library", - "org.hamcrest:hamcrest-library:jar:javadoc", - "org.hamcrest:hamcrest-library:jar:sources", "org.jetbrains.intellij.deps:trove4j", - "org.jetbrains.intellij.deps:trove4j:jar:javadoc", - "org.jetbrains.intellij.deps:trove4j:jar:sources", "org.jetbrains.kotlin:kotlin-compiler-embeddable", - "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:javadoc", - "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:sources", "org.jetbrains.kotlin:kotlin-daemon-embeddable", - "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:javadoc", - "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources", "org.jetbrains.kotlin:kotlin-reflect", - "org.jetbrains.kotlin:kotlin-reflect:jar:javadoc", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources", "org.jetbrains.kotlin:kotlin-script-runtime", - "org.jetbrains.kotlin:kotlin-script-runtime:jar:javadoc", - "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib", "org.jetbrains.kotlin:kotlin-stdlib-common", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib-jdk7", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib-jdk8", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", - "org.jetbrains.kotlin:kotlin-stdlib:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", "org.jetbrains.kotlin:kotlin-test", "org.jetbrains.kotlin:kotlin-test-annotations-common", - "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources", "org.jetbrains.kotlin:kotlin-test-common", - "org.jetbrains.kotlin:kotlin-test-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-common:jar:sources", "org.jetbrains.kotlin:kotlin-test-junit", - "org.jetbrains.kotlin:kotlin-test-junit:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-junit:jar:sources", - "org.jetbrains.kotlin:kotlin-test:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-android", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-core", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-debug", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-test", - "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:sources", "org.jetbrains.kotlinx:kotlinx-metadata-jvm", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources", "org.jetbrains:annotations", - "org.jetbrains:annotations:jar:javadoc", - "org.jetbrains:annotations:jar:sources", "org.mockito.kotlin:mockito-kotlin", - "org.mockito.kotlin:mockito-kotlin:jar:javadoc", - "org.mockito.kotlin:mockito-kotlin:jar:sources", "org.mockito:mockito-core", - "org.mockito:mockito-core:jar:javadoc", - "org.mockito:mockito-core:jar:sources", "org.objenesis:objenesis", - "org.objenesis:objenesis:jar:javadoc", - "org.objenesis:objenesis:jar:sources", "org.ow2.asm:asm", "org.ow2.asm:asm-analysis", - "org.ow2.asm:asm-analysis:jar:javadoc", - "org.ow2.asm:asm-analysis:jar:sources", "org.ow2.asm:asm-commons", - "org.ow2.asm:asm-commons:jar:javadoc", - "org.ow2.asm:asm-commons:jar:sources", "org.ow2.asm:asm-tree", - "org.ow2.asm:asm-tree:jar:javadoc", - "org.ow2.asm:asm-tree:jar:sources", "org.ow2.asm:asm-util", - "org.ow2.asm:asm-util:jar:javadoc", - "org.ow2.asm:asm-util:jar:sources", - "org.ow2.asm:asm:jar:javadoc", - "org.ow2.asm:asm:jar:sources", "org.robolectric:annotations", - "org.robolectric:annotations:jar:javadoc", - "org.robolectric:annotations:jar:sources", "org.robolectric:junit", - "org.robolectric:junit:jar:javadoc", - "org.robolectric:junit:jar:sources", "org.robolectric:pluginapi", - "org.robolectric:pluginapi:jar:javadoc", - "org.robolectric:pluginapi:jar:sources", "org.robolectric:plugins-maven-dependency-resolver", - "org.robolectric:plugins-maven-dependency-resolver:jar:javadoc", - "org.robolectric:plugins-maven-dependency-resolver:jar:sources", "org.robolectric:resources", - "org.robolectric:resources:jar:javadoc", - "org.robolectric:resources:jar:sources", "org.robolectric:robolectric", - "org.robolectric:robolectric:jar:javadoc", - "org.robolectric:robolectric:jar:sources", "org.robolectric:sandbox", - "org.robolectric:sandbox:jar:javadoc", - "org.robolectric:sandbox:jar:sources", "org.robolectric:shadowapi", - "org.robolectric:shadowapi:jar:javadoc", - "org.robolectric:shadowapi:jar:sources", "org.robolectric:shadows-framework", - "org.robolectric:shadows-framework:jar:javadoc", - "org.robolectric:shadows-framework:jar:sources", "org.robolectric:utils", - "org.robolectric:utils-reflector", - "org.robolectric:utils-reflector:jar:javadoc", - "org.robolectric:utils-reflector:jar:sources", - "org.robolectric:utils:jar:javadoc", - "org.robolectric:utils:jar:sources" + "org.robolectric:utils-reflector" ], "https://repo1.maven.org/maven2/": [ "android.arch.core:common", - "android.arch.core:common:jar:sources", "android.arch.core:core-testing:aar", - "android.arch.core:core-testing:jar:sources", "android.arch.core:runtime:aar", - "android.arch.core:runtime:jar:sources", "androidx.activity:activity:aar", - "androidx.activity:activity:jar:sources", "androidx.annotation:annotation", "androidx.annotation:annotation-experimental:aar", - "androidx.annotation:annotation-experimental:jar:sources", - "androidx.annotation:annotation:jar:javadoc", - "androidx.annotation:annotation:jar:sources", "androidx.appcompat:appcompat-resources:aar", - "androidx.appcompat:appcompat-resources:jar:sources", "androidx.appcompat:appcompat:aar", - "androidx.appcompat:appcompat:jar:sources", "androidx.arch.core:core-common", - "androidx.arch.core:core-common:jar:sources", "androidx.arch.core:core-runtime:aar", - "androidx.arch.core:core-runtime:jar:sources", "androidx.arch.core:core-testing:aar", - "androidx.arch.core:core-testing:jar:sources", "androidx.cardview:cardview:aar", - "androidx.cardview:cardview:jar:sources", "androidx.collection:collection", - "androidx.collection:collection:jar:sources", "androidx.constraintlayout:constraintlayout-solver", "androidx.constraintlayout:constraintlayout:aar", "androidx.coordinatorlayout:coordinatorlayout:aar", - "androidx.coordinatorlayout:coordinatorlayout:jar:sources", "androidx.core:core-ktx:aar", - "androidx.core:core-ktx:jar:sources", "androidx.core:core:aar", - "androidx.core:core:jar:sources", "androidx.cursoradapter:cursoradapter:aar", - "androidx.cursoradapter:cursoradapter:jar:sources", "androidx.customview:customview:aar", - "androidx.customview:customview:jar:sources", "androidx.databinding:databinding-adapters:aar", - "androidx.databinding:databinding-adapters:jar:sources", "androidx.databinding:databinding-common", - "androidx.databinding:databinding-common:jar:javadoc", - "androidx.databinding:databinding-common:jar:sources", "androidx.databinding:databinding-compiler", "androidx.databinding:databinding-compiler-common", - "androidx.databinding:databinding-compiler-common:jar:javadoc", - "androidx.databinding:databinding-compiler-common:jar:sources", - "androidx.databinding:databinding-compiler:jar:javadoc", - "androidx.databinding:databinding-compiler:jar:sources", "androidx.databinding:databinding-runtime:aar", - "androidx.databinding:databinding-runtime:jar:sources", "androidx.documentfile:documentfile:aar", - "androidx.documentfile:documentfile:jar:sources", "androidx.drawerlayout:drawerlayout:aar", - "androidx.drawerlayout:drawerlayout:jar:sources", "androidx.dynamicanimation:dynamicanimation:aar", - "androidx.dynamicanimation:dynamicanimation:jar:sources", "androidx.exifinterface:exifinterface:aar", - "androidx.exifinterface:exifinterface:jar:sources", "androidx.fragment:fragment:aar", - "androidx.fragment:fragment:jar:sources", "androidx.interpolator:interpolator:aar", - "androidx.interpolator:interpolator:jar:sources", "androidx.legacy:legacy-support-core-utils:aar", - "androidx.legacy:legacy-support-core-utils:jar:sources", "androidx.lifecycle:lifecycle-common", - "androidx.lifecycle:lifecycle-common:jar:sources", "androidx.lifecycle:lifecycle-extensions:aar", - "androidx.lifecycle:lifecycle-extensions:jar:sources", "androidx.lifecycle:lifecycle-livedata-core-ktx:aar", - "androidx.lifecycle:lifecycle-livedata-core-ktx:jar:sources", "androidx.lifecycle:lifecycle-livedata-core:aar", - "androidx.lifecycle:lifecycle-livedata-core:jar:sources", "androidx.lifecycle:lifecycle-livedata-ktx:aar", - "androidx.lifecycle:lifecycle-livedata-ktx:jar:sources", "androidx.lifecycle:lifecycle-livedata:aar", - "androidx.lifecycle:lifecycle-livedata:jar:sources", "androidx.lifecycle:lifecycle-process:aar", - "androidx.lifecycle:lifecycle-process:jar:sources", "androidx.lifecycle:lifecycle-runtime:aar", - "androidx.lifecycle:lifecycle-runtime:jar:sources", "androidx.lifecycle:lifecycle-service:aar", - "androidx.lifecycle:lifecycle-service:jar:sources", "androidx.lifecycle:lifecycle-viewmodel-ktx:aar", - "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:sources", "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:jar:sources", "androidx.lifecycle:lifecycle-viewmodel:aar", - "androidx.lifecycle:lifecycle-viewmodel:jar:sources", "androidx.loader:loader:aar", - "androidx.loader:loader:jar:sources", "androidx.localbroadcastmanager:localbroadcastmanager:aar", - "androidx.localbroadcastmanager:localbroadcastmanager:jar:sources", "androidx.multidex:multidex-instrumentation:aar", "androidx.multidex:multidex:aar", - "androidx.multidex:multidex:jar:sources", "androidx.navigation:navigation-common-ktx:aar", - "androidx.navigation:navigation-common-ktx:jar:sources", "androidx.navigation:navigation-common:aar", - "androidx.navigation:navigation-common:jar:sources", "androidx.navigation:navigation-fragment-ktx:aar", - "androidx.navigation:navigation-fragment-ktx:jar:sources", "androidx.navigation:navigation-fragment:aar", - "androidx.navigation:navigation-fragment:jar:sources", "androidx.navigation:navigation-runtime-ktx:aar", - "androidx.navigation:navigation-runtime-ktx:jar:sources", "androidx.navigation:navigation-runtime:aar", - "androidx.navigation:navigation-runtime:jar:sources", "androidx.navigation:navigation-ui-ktx:aar", - "androidx.navigation:navigation-ui-ktx:jar:sources", "androidx.navigation:navigation-ui:aar", - "androidx.navigation:navigation-ui:jar:sources", "androidx.print:print:aar", - "androidx.print:print:jar:sources", "androidx.recyclerview:recyclerview:aar", - "androidx.recyclerview:recyclerview:jar:sources", "androidx.room:room-common", - "androidx.room:room-common:jar:sources", "androidx.room:room-runtime:aar", - "androidx.room:room-runtime:jar:sources", "androidx.savedstate:savedstate:aar", - "androidx.savedstate:savedstate:jar:sources", "androidx.sqlite:sqlite-framework:aar", - "androidx.sqlite:sqlite-framework:jar:sources", "androidx.sqlite:sqlite:aar", - "androidx.sqlite:sqlite:jar:sources", "androidx.test.espresso:espresso-accessibility:aar", - "androidx.test.espresso:espresso-accessibility:jar:javadoc", - "androidx.test.espresso:espresso-accessibility:jar:sources", "androidx.test.espresso:espresso-contrib:aar", - "androidx.test.espresso:espresso-contrib:jar:javadoc", - "androidx.test.espresso:espresso-contrib:jar:sources", "androidx.test.espresso:espresso-core:aar", - "androidx.test.espresso:espresso-core:jar:javadoc", - "androidx.test.espresso:espresso-core:jar:sources", "androidx.test.espresso:espresso-idling-resource:aar", - "androidx.test.espresso:espresso-idling-resource:jar:javadoc", - "androidx.test.espresso:espresso-idling-resource:jar:sources", "androidx.test.espresso:espresso-intents:aar", - "androidx.test.espresso:espresso-intents:jar:javadoc", - "androidx.test.espresso:espresso-intents:jar:sources", "androidx.test.ext:junit:aar", - "androidx.test.ext:junit:jar:javadoc", - "androidx.test.ext:junit:jar:sources", "androidx.test.ext:truth:aar", - "androidx.test.ext:truth:jar:javadoc", - "androidx.test.ext:truth:jar:sources", "androidx.test.uiautomator:uiautomator:aar", - "androidx.test.uiautomator:uiautomator:jar:javadoc", - "androidx.test.uiautomator:uiautomator:jar:sources", "androidx.test:core:aar", - "androidx.test:core:jar:javadoc", - "androidx.test:core:jar:sources", "androidx.test:monitor:aar", - "androidx.test:monitor:jar:javadoc", - "androidx.test:monitor:jar:sources", "androidx.test:rules:aar", - "androidx.test:rules:jar:javadoc", - "androidx.test:rules:jar:sources", "androidx.test:runner:aar", - "androidx.test:runner:jar:javadoc", - "androidx.test:runner:jar:sources", "androidx.transition:transition:aar", - "androidx.transition:transition:jar:sources", "androidx.vectordrawable:vectordrawable-animated:aar", - "androidx.vectordrawable:vectordrawable-animated:jar:sources", "androidx.vectordrawable:vectordrawable:aar", - "androidx.vectordrawable:vectordrawable:jar:sources", "androidx.versionedparcelable:versionedparcelable:aar", - "androidx.versionedparcelable:versionedparcelable:jar:sources", "androidx.viewpager2:viewpager2:aar", - "androidx.viewpager2:viewpager2:jar:sources", "androidx.viewpager:viewpager:aar", - "androidx.viewpager:viewpager:jar:sources", "androidx.work:work-runtime-ktx:aar", - "androidx.work:work-runtime-ktx:jar:sources", "androidx.work:work-runtime:aar", - "androidx.work:work-runtime:jar:sources", "androidx.work:work-testing:aar", - "androidx.work:work-testing:jar:sources", "com.almworks.sqlite4java:sqlite4java", - "com.almworks.sqlite4java:sqlite4java:jar:javadoc", - "com.almworks.sqlite4java:sqlite4java:jar:sources", "com.android.databinding:baseLibrary", - "com.android.databinding:baseLibrary:jar:javadoc", - "com.android.databinding:baseLibrary:jar:sources", "com.android.support:support-annotations", "com.android.tools.build.jetifier:jetifier-core", - "com.android.tools.build.jetifier:jetifier-core:jar:sources", "com.android.tools.build:aapt2-proto", - "com.android.tools.build:aapt2-proto:jar:javadoc", - "com.android.tools.build:aapt2-proto:jar:sources", "com.android.tools:annotations", - "com.android.tools:annotations:jar:javadoc", - "com.android.tools:annotations:jar:sources", "com.crashlytics.sdk.android:answers:aar", "com.crashlytics.sdk.android:beta:aar", "com.crashlytics.sdk.android:crashlytics-core:aar", "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", - "com.github.bumptech.glide:annotations:jar:javadoc", - "com.github.bumptech.glide:annotations:jar:sources", "com.github.bumptech.glide:compiler", - "com.github.bumptech.glide:compiler:jar:javadoc", - "com.github.bumptech.glide:compiler:jar:sources", "com.github.bumptech.glide:disklrucache", - "com.github.bumptech.glide:disklrucache:jar:javadoc", - "com.github.bumptech.glide:disklrucache:jar:sources", "com.github.bumptech.glide:gifdecoder:aar", - "com.github.bumptech.glide:gifdecoder:jar:javadoc", - "com.github.bumptech.glide:gifdecoder:jar:sources", "com.github.bumptech.glide:glide:aar", - "com.github.bumptech.glide:glide:jar:javadoc", - "com.github.bumptech.glide:glide:jar:sources", "com.github.bumptech.glide:mocks:aar", - "com.github.bumptech.glide:mocks:jar:javadoc", - "com.github.bumptech.glide:mocks:jar:sources", "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:javadoc", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources", "com.google.android.datatransport:transport-api:aar", - "com.google.android.datatransport:transport-api:jar:javadoc", "com.google.android.datatransport:transport-backend-cct:aar", - "com.google.android.datatransport:transport-backend-cct:jar:javadoc", "com.google.android.datatransport:transport-runtime:aar", - "com.google.android.datatransport:transport-runtime:jar:javadoc", "com.google.android.flexbox:flexbox:aar", - "com.google.android.flexbox:flexbox:jar:sources", "com.google.android.gms:play-services-ads-identifier:aar", "com.google.android.gms:play-services-base:aar", - "com.google.android.gms:play-services-base:jar:javadoc", "com.google.android.gms:play-services-basement:aar", - "com.google.android.gms:play-services-basement:jar:javadoc", "com.google.android.gms:play-services-measurement-api:aar", - "com.google.android.gms:play-services-measurement-api:jar:javadoc", "com.google.android.gms:play-services-measurement-base:aar", - "com.google.android.gms:play-services-measurement-base:jar:javadoc", "com.google.android.gms:play-services-measurement-impl:aar", - "com.google.android.gms:play-services-measurement-impl:jar:javadoc", "com.google.android.gms:play-services-measurement-sdk-api:aar", - "com.google.android.gms:play-services-measurement-sdk-api:jar:javadoc", "com.google.android.gms:play-services-measurement-sdk:aar", - "com.google.android.gms:play-services-measurement-sdk:jar:javadoc", "com.google.android.gms:play-services-measurement:aar", - "com.google.android.gms:play-services-measurement:jar:javadoc", "com.google.android.gms:play-services-stats:aar", "com.google.android.gms:play-services-tasks:aar", "com.google.android.gms:strict-version-matcher-plugin", "com.google.android.material:material:aar", - "com.google.android.material:material:jar:sources", "com.google.auto.service:auto-service-annotations", - "com.google.auto.service:auto-service-annotations:jar:javadoc", - "com.google.auto.service:auto-service-annotations:jar:sources", "com.google.auto.value:auto-value-annotations", - "com.google.auto.value:auto-value-annotations:jar:javadoc", - "com.google.auto.value:auto-value-annotations:jar:sources", "com.google.code.findbugs:jsr305", - "com.google.code.findbugs:jsr305:jar:javadoc", - "com.google.code.findbugs:jsr305:jar:sources", "com.google.code.gson:gson", - "com.google.code.gson:gson:jar:javadoc", - "com.google.code.gson:gson:jar:sources", "com.google.dagger:dagger", "com.google.dagger:dagger-compiler", - "com.google.dagger:dagger-compiler:jar:javadoc", - "com.google.dagger:dagger-compiler:jar:sources", "com.google.dagger:dagger-producers", - "com.google.dagger:dagger-producers:jar:javadoc", - "com.google.dagger:dagger-producers:jar:sources", "com.google.dagger:dagger-spi", - "com.google.dagger:dagger-spi:jar:javadoc", - "com.google.dagger:dagger-spi:jar:sources", - "com.google.dagger:dagger:jar:javadoc", - "com.google.dagger:dagger:jar:sources", "com.google.errorprone:error_prone_annotations", - "com.google.errorprone:error_prone_annotations:jar:javadoc", - "com.google.errorprone:error_prone_annotations:jar:sources", "com.google.errorprone:javac-shaded", - "com.google.errorprone:javac-shaded:jar:javadoc", - "com.google.errorprone:javac-shaded:jar:sources", "com.google.firebase:firebase-analytics:aar", - "com.google.firebase:firebase-analytics:jar:javadoc", "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-common:jar:javadoc", - "com.google.firebase:firebase-common:jar:sources", "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-components:jar:javadoc", - "com.google.firebase:firebase-components:jar:sources", "com.google.firebase:firebase-crashlytics:aar", - "com.google.firebase:firebase-crashlytics:jar:javadoc", "com.google.firebase:firebase-encoders-json:aar", - "com.google.firebase:firebase-encoders-json:jar:javadoc", - "com.google.firebase:firebase-encoders-json:jar:sources", "com.google.firebase:firebase-iid-interop:aar", "com.google.firebase:firebase-iid:aar", - "com.google.firebase:firebase-iid:jar:javadoc", "com.google.firebase:firebase-installations-interop:aar", - "com.google.firebase:firebase-installations-interop:jar:javadoc", "com.google.firebase:firebase-installations:aar", - "com.google.firebase:firebase-installations:jar:javadoc", "com.google.firebase:firebase-measurement-connector:aar", "com.google.gms:google-services", - "com.google.gms:google-services:jar:javadoc", - "com.google.gms:google-services:jar:sources", "com.google.googlejavaformat:google-java-format", - "com.google.googlejavaformat:google-java-format:jar:javadoc", - "com.google.googlejavaformat:google-java-format:jar:sources", "com.google.guava:failureaccess", - "com.google.guava:failureaccess:jar:javadoc", - "com.google.guava:failureaccess:jar:sources", "com.google.guava:guava", - "com.google.guava:guava:jar:javadoc", - "com.google.guava:guava:jar:sources", "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", - "com.google.j2objc:j2objc-annotations:jar:javadoc", - "com.google.j2objc:j2objc-annotations:jar:sources", "com.google.protobuf:protobuf-java", - "com.google.protobuf:protobuf-java:jar:javadoc", - "com.google.protobuf:protobuf-java:jar:sources", "com.google.protobuf:protobuf-javalite", - "com.google.protobuf:protobuf-javalite:jar:javadoc", - "com.google.protobuf:protobuf-javalite:jar:sources", "com.google.truth.extensions:truth-liteproto-extension", - "com.google.truth.extensions:truth-liteproto-extension:jar:javadoc", - "com.google.truth.extensions:truth-liteproto-extension:jar:sources", "com.google.truth:truth", - "com.google.truth:truth:jar:javadoc", - "com.google.truth:truth:jar:sources", "com.googlecode.juniversalchardet:juniversalchardet", - "com.googlecode.juniversalchardet:juniversalchardet:jar:javadoc", - "com.googlecode.juniversalchardet:juniversalchardet:jar:sources", "com.ibm.icu:icu4j", - "com.ibm.icu:icu4j:jar:javadoc", - "com.ibm.icu:icu4j:jar:sources", "com.squareup.moshi:moshi", "com.squareup.moshi:moshi-kotlin", "com.squareup.moshi:moshi-kotlin-codegen", - "com.squareup.moshi:moshi-kotlin-codegen:jar:javadoc", - "com.squareup.moshi:moshi-kotlin-codegen:jar:sources", - "com.squareup.moshi:moshi-kotlin:jar:javadoc", - "com.squareup.moshi:moshi-kotlin:jar:sources", - "com.squareup.moshi:moshi:jar:javadoc", - "com.squareup.moshi:moshi:jar:sources", "com.squareup.okhttp3:mockwebserver", - "com.squareup.okhttp3:mockwebserver:jar:javadoc", - "com.squareup.okhttp3:mockwebserver:jar:sources", "com.squareup.okhttp3:okhttp", - "com.squareup.okhttp3:okhttp:jar:javadoc", - "com.squareup.okhttp3:okhttp:jar:sources", "com.squareup.okio:okio", - "com.squareup.okio:okio:jar:javadoc", - "com.squareup.okio:okio:jar:sources", "com.squareup.retrofit2:converter-moshi", - "com.squareup.retrofit2:converter-moshi:jar:javadoc", - "com.squareup.retrofit2:converter-moshi:jar:sources", "com.squareup.retrofit2:retrofit", "com.squareup.retrofit2:retrofit-mock", - "com.squareup.retrofit2:retrofit-mock:jar:javadoc", - "com.squareup.retrofit2:retrofit-mock:jar:sources", - "com.squareup.retrofit2:retrofit:jar:javadoc", - "com.squareup.retrofit2:retrofit:jar:sources", "com.squareup:javapoet", - "com.squareup:javapoet:jar:javadoc", - "com.squareup:javapoet:jar:sources", "com.squareup:javawriter", - "com.squareup:javawriter:jar:javadoc", - "com.squareup:javawriter:jar:sources", "com.squareup:kotlinpoet", - "com.squareup:kotlinpoet:jar:javadoc", - "com.squareup:kotlinpoet:jar:sources", "commons-codec:commons-codec", - "commons-codec:commons-codec:jar:javadoc", - "commons-codec:commons-codec:jar:sources", "commons-io:commons-io", - "commons-io:commons-io:jar:javadoc", - "commons-io:commons-io:jar:sources", "de.hdodenhof:circleimageview:aar", - "de.hdodenhof:circleimageview:jar:javadoc", - "de.hdodenhof:circleimageview:jar:sources", "io.fabric.sdk.android:fabric:aar", "javax.annotation:javax.annotation-api", - "javax.annotation:javax.annotation-api:jar:javadoc", - "javax.annotation:javax.annotation-api:jar:sources", "javax.annotation:jsr250-api", - "javax.annotation:jsr250-api:jar:sources", "javax.inject:javax.inject", - "javax.inject:javax.inject:jar:javadoc", - "javax.inject:javax.inject:jar:sources", "junit:junit", - "junit:junit:jar:javadoc", - "junit:junit:jar:sources", "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", - "net.bytebuddy:byte-buddy-agent:jar:javadoc", - "net.bytebuddy:byte-buddy-agent:jar:sources", - "net.bytebuddy:byte-buddy:jar:javadoc", - "net.bytebuddy:byte-buddy:jar:sources", "net.ltgt.gradle.incap:incap", - "net.ltgt.gradle.incap:incap:jar:javadoc", - "net.ltgt.gradle.incap:incap:jar:sources", "net.sf.kxml:kxml2", - "net.sf.kxml:kxml2:jar:javadoc", - "net.sf.kxml:kxml2:jar:sources", "nl.dionsegijn:konfetti:aar", - "nl.dionsegijn:konfetti:jar:sources", "org.antlr:antlr4", - "org.antlr:antlr4:jar:javadoc", - "org.antlr:antlr4:jar:sources", "org.bouncycastle:bcprov-jdk15on", - "org.bouncycastle:bcprov-jdk15on:jar:javadoc", - "org.bouncycastle:bcprov-jdk15on:jar:sources", "org.checkerframework:checker-compat-qual", - "org.checkerframework:checker-compat-qual:jar:javadoc", - "org.checkerframework:checker-compat-qual:jar:sources", "org.checkerframework:checker-qual", - "org.checkerframework:checker-qual:jar:javadoc", - "org.checkerframework:checker-qual:jar:sources", "org.hamcrest:hamcrest-core", - "org.hamcrest:hamcrest-core:jar:javadoc", - "org.hamcrest:hamcrest-core:jar:sources", "org.hamcrest:hamcrest-integration", - "org.hamcrest:hamcrest-integration:jar:javadoc", - "org.hamcrest:hamcrest-integration:jar:sources", "org.hamcrest:hamcrest-library", - "org.hamcrest:hamcrest-library:jar:javadoc", - "org.hamcrest:hamcrest-library:jar:sources", "org.jetbrains.intellij.deps:trove4j", - "org.jetbrains.intellij.deps:trove4j:jar:javadoc", - "org.jetbrains.intellij.deps:trove4j:jar:sources", "org.jetbrains.kotlin:kotlin-compiler-embeddable", - "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:javadoc", - "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:sources", "org.jetbrains.kotlin:kotlin-daemon-embeddable", - "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:javadoc", - "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources", "org.jetbrains.kotlin:kotlin-reflect", - "org.jetbrains.kotlin:kotlin-reflect:jar:javadoc", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources", "org.jetbrains.kotlin:kotlin-script-runtime", - "org.jetbrains.kotlin:kotlin-script-runtime:jar:javadoc", - "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib", "org.jetbrains.kotlin:kotlin-stdlib-common", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib-jdk7", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib-jdk8", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", - "org.jetbrains.kotlin:kotlin-stdlib:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", "org.jetbrains.kotlin:kotlin-test", "org.jetbrains.kotlin:kotlin-test-annotations-common", - "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources", "org.jetbrains.kotlin:kotlin-test-common", - "org.jetbrains.kotlin:kotlin-test-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-common:jar:sources", "org.jetbrains.kotlin:kotlin-test-junit", - "org.jetbrains.kotlin:kotlin-test-junit:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-junit:jar:sources", - "org.jetbrains.kotlin:kotlin-test:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-android", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-core", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-debug", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-test", - "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:sources", "org.jetbrains.kotlinx:kotlinx-metadata-jvm", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources", "org.jetbrains:annotations", - "org.jetbrains:annotations:jar:javadoc", - "org.jetbrains:annotations:jar:sources", "org.mockito.kotlin:mockito-kotlin", - "org.mockito.kotlin:mockito-kotlin:jar:javadoc", - "org.mockito.kotlin:mockito-kotlin:jar:sources", "org.mockito:mockito-core", - "org.mockito:mockito-core:jar:javadoc", - "org.mockito:mockito-core:jar:sources", "org.objenesis:objenesis", - "org.objenesis:objenesis:jar:javadoc", - "org.objenesis:objenesis:jar:sources", "org.ow2.asm:asm", "org.ow2.asm:asm-analysis", - "org.ow2.asm:asm-analysis:jar:javadoc", - "org.ow2.asm:asm-analysis:jar:sources", "org.ow2.asm:asm-commons", - "org.ow2.asm:asm-commons:jar:javadoc", - "org.ow2.asm:asm-commons:jar:sources", "org.ow2.asm:asm-tree", - "org.ow2.asm:asm-tree:jar:javadoc", - "org.ow2.asm:asm-tree:jar:sources", "org.ow2.asm:asm-util", - "org.ow2.asm:asm-util:jar:javadoc", - "org.ow2.asm:asm-util:jar:sources", - "org.ow2.asm:asm:jar:javadoc", - "org.ow2.asm:asm:jar:sources", "org.robolectric:annotations", - "org.robolectric:annotations:jar:javadoc", - "org.robolectric:annotations:jar:sources", "org.robolectric:junit", - "org.robolectric:junit:jar:javadoc", - "org.robolectric:junit:jar:sources", "org.robolectric:pluginapi", - "org.robolectric:pluginapi:jar:javadoc", - "org.robolectric:pluginapi:jar:sources", "org.robolectric:plugins-maven-dependency-resolver", - "org.robolectric:plugins-maven-dependency-resolver:jar:javadoc", - "org.robolectric:plugins-maven-dependency-resolver:jar:sources", "org.robolectric:resources", - "org.robolectric:resources:jar:javadoc", - "org.robolectric:resources:jar:sources", "org.robolectric:robolectric", - "org.robolectric:robolectric:jar:javadoc", - "org.robolectric:robolectric:jar:sources", "org.robolectric:sandbox", - "org.robolectric:sandbox:jar:javadoc", - "org.robolectric:sandbox:jar:sources", "org.robolectric:shadowapi", - "org.robolectric:shadowapi:jar:javadoc", - "org.robolectric:shadowapi:jar:sources", "org.robolectric:shadows-framework", - "org.robolectric:shadows-framework:jar:javadoc", - "org.robolectric:shadows-framework:jar:sources", "org.robolectric:utils", - "org.robolectric:utils-reflector", - "org.robolectric:utils-reflector:jar:javadoc", - "org.robolectric:utils-reflector:jar:sources", - "org.robolectric:utils:jar:javadoc", - "org.robolectric:utils:jar:sources" + "org.robolectric:utils-reflector" ], "https://maven.fabric.io/public/": [ "android.arch.core:common", - "android.arch.core:common:jar:sources", "android.arch.core:core-testing:aar", - "android.arch.core:core-testing:jar:sources", "android.arch.core:runtime:aar", - "android.arch.core:runtime:jar:sources", "androidx.activity:activity:aar", - "androidx.activity:activity:jar:sources", "androidx.annotation:annotation", "androidx.annotation:annotation-experimental:aar", - "androidx.annotation:annotation-experimental:jar:sources", - "androidx.annotation:annotation:jar:javadoc", - "androidx.annotation:annotation:jar:sources", "androidx.appcompat:appcompat-resources:aar", - "androidx.appcompat:appcompat-resources:jar:sources", "androidx.appcompat:appcompat:aar", - "androidx.appcompat:appcompat:jar:sources", "androidx.arch.core:core-common", - "androidx.arch.core:core-common:jar:sources", "androidx.arch.core:core-runtime:aar", - "androidx.arch.core:core-runtime:jar:sources", "androidx.arch.core:core-testing:aar", - "androidx.arch.core:core-testing:jar:sources", "androidx.cardview:cardview:aar", - "androidx.cardview:cardview:jar:sources", "androidx.collection:collection", - "androidx.collection:collection:jar:sources", "androidx.constraintlayout:constraintlayout-solver", "androidx.constraintlayout:constraintlayout:aar", "androidx.coordinatorlayout:coordinatorlayout:aar", - "androidx.coordinatorlayout:coordinatorlayout:jar:sources", "androidx.core:core-ktx:aar", - "androidx.core:core-ktx:jar:sources", "androidx.core:core:aar", - "androidx.core:core:jar:sources", "androidx.cursoradapter:cursoradapter:aar", - "androidx.cursoradapter:cursoradapter:jar:sources", "androidx.customview:customview:aar", - "androidx.customview:customview:jar:sources", "androidx.databinding:databinding-adapters:aar", - "androidx.databinding:databinding-adapters:jar:sources", "androidx.databinding:databinding-common", - "androidx.databinding:databinding-common:jar:javadoc", - "androidx.databinding:databinding-common:jar:sources", "androidx.databinding:databinding-compiler", "androidx.databinding:databinding-compiler-common", - "androidx.databinding:databinding-compiler-common:jar:javadoc", - "androidx.databinding:databinding-compiler-common:jar:sources", - "androidx.databinding:databinding-compiler:jar:javadoc", - "androidx.databinding:databinding-compiler:jar:sources", "androidx.databinding:databinding-runtime:aar", - "androidx.databinding:databinding-runtime:jar:sources", "androidx.documentfile:documentfile:aar", - "androidx.documentfile:documentfile:jar:sources", "androidx.drawerlayout:drawerlayout:aar", - "androidx.drawerlayout:drawerlayout:jar:sources", "androidx.dynamicanimation:dynamicanimation:aar", - "androidx.dynamicanimation:dynamicanimation:jar:sources", "androidx.exifinterface:exifinterface:aar", - "androidx.exifinterface:exifinterface:jar:sources", "androidx.fragment:fragment:aar", - "androidx.fragment:fragment:jar:sources", "androidx.interpolator:interpolator:aar", - "androidx.interpolator:interpolator:jar:sources", "androidx.legacy:legacy-support-core-utils:aar", - "androidx.legacy:legacy-support-core-utils:jar:sources", "androidx.lifecycle:lifecycle-common", - "androidx.lifecycle:lifecycle-common:jar:sources", "androidx.lifecycle:lifecycle-extensions:aar", - "androidx.lifecycle:lifecycle-extensions:jar:sources", "androidx.lifecycle:lifecycle-livedata-core-ktx:aar", - "androidx.lifecycle:lifecycle-livedata-core-ktx:jar:sources", "androidx.lifecycle:lifecycle-livedata-core:aar", - "androidx.lifecycle:lifecycle-livedata-core:jar:sources", "androidx.lifecycle:lifecycle-livedata-ktx:aar", - "androidx.lifecycle:lifecycle-livedata-ktx:jar:sources", "androidx.lifecycle:lifecycle-livedata:aar", - "androidx.lifecycle:lifecycle-livedata:jar:sources", "androidx.lifecycle:lifecycle-process:aar", - "androidx.lifecycle:lifecycle-process:jar:sources", "androidx.lifecycle:lifecycle-runtime:aar", - "androidx.lifecycle:lifecycle-runtime:jar:sources", "androidx.lifecycle:lifecycle-service:aar", - "androidx.lifecycle:lifecycle-service:jar:sources", "androidx.lifecycle:lifecycle-viewmodel-ktx:aar", - "androidx.lifecycle:lifecycle-viewmodel-ktx:jar:sources", "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", - "androidx.lifecycle:lifecycle-viewmodel-savedstate:jar:sources", "androidx.lifecycle:lifecycle-viewmodel:aar", - "androidx.lifecycle:lifecycle-viewmodel:jar:sources", "androidx.loader:loader:aar", - "androidx.loader:loader:jar:sources", "androidx.localbroadcastmanager:localbroadcastmanager:aar", - "androidx.localbroadcastmanager:localbroadcastmanager:jar:sources", "androidx.multidex:multidex-instrumentation:aar", "androidx.multidex:multidex:aar", - "androidx.multidex:multidex:jar:sources", "androidx.navigation:navigation-common-ktx:aar", - "androidx.navigation:navigation-common-ktx:jar:sources", "androidx.navigation:navigation-common:aar", - "androidx.navigation:navigation-common:jar:sources", "androidx.navigation:navigation-fragment-ktx:aar", - "androidx.navigation:navigation-fragment-ktx:jar:sources", "androidx.navigation:navigation-fragment:aar", - "androidx.navigation:navigation-fragment:jar:sources", "androidx.navigation:navigation-runtime-ktx:aar", - "androidx.navigation:navigation-runtime-ktx:jar:sources", "androidx.navigation:navigation-runtime:aar", - "androidx.navigation:navigation-runtime:jar:sources", "androidx.navigation:navigation-ui-ktx:aar", - "androidx.navigation:navigation-ui-ktx:jar:sources", "androidx.navigation:navigation-ui:aar", - "androidx.navigation:navigation-ui:jar:sources", "androidx.print:print:aar", - "androidx.print:print:jar:sources", "androidx.recyclerview:recyclerview:aar", - "androidx.recyclerview:recyclerview:jar:sources", "androidx.room:room-common", - "androidx.room:room-common:jar:sources", "androidx.room:room-runtime:aar", - "androidx.room:room-runtime:jar:sources", "androidx.savedstate:savedstate:aar", - "androidx.savedstate:savedstate:jar:sources", "androidx.sqlite:sqlite-framework:aar", - "androidx.sqlite:sqlite-framework:jar:sources", "androidx.sqlite:sqlite:aar", - "androidx.sqlite:sqlite:jar:sources", "androidx.test.espresso:espresso-accessibility:aar", - "androidx.test.espresso:espresso-accessibility:jar:javadoc", - "androidx.test.espresso:espresso-accessibility:jar:sources", "androidx.test.espresso:espresso-contrib:aar", - "androidx.test.espresso:espresso-contrib:jar:javadoc", - "androidx.test.espresso:espresso-contrib:jar:sources", "androidx.test.espresso:espresso-core:aar", - "androidx.test.espresso:espresso-core:jar:javadoc", - "androidx.test.espresso:espresso-core:jar:sources", "androidx.test.espresso:espresso-idling-resource:aar", - "androidx.test.espresso:espresso-idling-resource:jar:javadoc", - "androidx.test.espresso:espresso-idling-resource:jar:sources", "androidx.test.espresso:espresso-intents:aar", - "androidx.test.espresso:espresso-intents:jar:javadoc", - "androidx.test.espresso:espresso-intents:jar:sources", "androidx.test.ext:junit:aar", - "androidx.test.ext:junit:jar:javadoc", - "androidx.test.ext:junit:jar:sources", "androidx.test.ext:truth:aar", - "androidx.test.ext:truth:jar:javadoc", - "androidx.test.ext:truth:jar:sources", "androidx.test.uiautomator:uiautomator:aar", - "androidx.test.uiautomator:uiautomator:jar:javadoc", - "androidx.test.uiautomator:uiautomator:jar:sources", "androidx.test:core:aar", - "androidx.test:core:jar:javadoc", - "androidx.test:core:jar:sources", "androidx.test:monitor:aar", - "androidx.test:monitor:jar:javadoc", - "androidx.test:monitor:jar:sources", "androidx.test:rules:aar", - "androidx.test:rules:jar:javadoc", - "androidx.test:rules:jar:sources", "androidx.test:runner:aar", - "androidx.test:runner:jar:javadoc", - "androidx.test:runner:jar:sources", "androidx.transition:transition:aar", - "androidx.transition:transition:jar:sources", "androidx.vectordrawable:vectordrawable-animated:aar", - "androidx.vectordrawable:vectordrawable-animated:jar:sources", "androidx.vectordrawable:vectordrawable:aar", - "androidx.vectordrawable:vectordrawable:jar:sources", "androidx.versionedparcelable:versionedparcelable:aar", - "androidx.versionedparcelable:versionedparcelable:jar:sources", "androidx.viewpager2:viewpager2:aar", - "androidx.viewpager2:viewpager2:jar:sources", "androidx.viewpager:viewpager:aar", - "androidx.viewpager:viewpager:jar:sources", "androidx.work:work-runtime-ktx:aar", - "androidx.work:work-runtime-ktx:jar:sources", "androidx.work:work-runtime:aar", - "androidx.work:work-runtime:jar:sources", "androidx.work:work-testing:aar", - "androidx.work:work-testing:jar:sources", "com.almworks.sqlite4java:sqlite4java", - "com.almworks.sqlite4java:sqlite4java:jar:javadoc", - "com.almworks.sqlite4java:sqlite4java:jar:sources", "com.android.databinding:baseLibrary", - "com.android.databinding:baseLibrary:jar:javadoc", - "com.android.databinding:baseLibrary:jar:sources", "com.android.support:support-annotations", "com.android.tools.build.jetifier:jetifier-core", - "com.android.tools.build.jetifier:jetifier-core:jar:sources", "com.android.tools.build:aapt2-proto", - "com.android.tools.build:aapt2-proto:jar:javadoc", - "com.android.tools.build:aapt2-proto:jar:sources", "com.android.tools:annotations", - "com.android.tools:annotations:jar:javadoc", - "com.android.tools:annotations:jar:sources", "com.crashlytics.sdk.android:answers:aar", "com.crashlytics.sdk.android:beta:aar", "com.crashlytics.sdk.android:crashlytics-core:aar", "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", - "com.github.bumptech.glide:annotations:jar:javadoc", - "com.github.bumptech.glide:annotations:jar:sources", "com.github.bumptech.glide:compiler", - "com.github.bumptech.glide:compiler:jar:javadoc", - "com.github.bumptech.glide:compiler:jar:sources", "com.github.bumptech.glide:disklrucache", - "com.github.bumptech.glide:disklrucache:jar:javadoc", - "com.github.bumptech.glide:disklrucache:jar:sources", "com.github.bumptech.glide:gifdecoder:aar", - "com.github.bumptech.glide:gifdecoder:jar:javadoc", - "com.github.bumptech.glide:gifdecoder:jar:sources", "com.github.bumptech.glide:glide:aar", - "com.github.bumptech.glide:glide:jar:javadoc", - "com.github.bumptech.glide:glide:jar:sources", "com.github.bumptech.glide:mocks:aar", - "com.github.bumptech.glide:mocks:jar:javadoc", - "com.github.bumptech.glide:mocks:jar:sources", "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:javadoc", - "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:jar:sources", "com.google.android.datatransport:transport-api:aar", - "com.google.android.datatransport:transport-api:jar:javadoc", "com.google.android.datatransport:transport-backend-cct:aar", - "com.google.android.datatransport:transport-backend-cct:jar:javadoc", "com.google.android.datatransport:transport-runtime:aar", - "com.google.android.datatransport:transport-runtime:jar:javadoc", "com.google.android.flexbox:flexbox:aar", - "com.google.android.flexbox:flexbox:jar:sources", "com.google.android.gms:play-services-ads-identifier:aar", "com.google.android.gms:play-services-base:aar", - "com.google.android.gms:play-services-base:jar:javadoc", "com.google.android.gms:play-services-basement:aar", - "com.google.android.gms:play-services-basement:jar:javadoc", "com.google.android.gms:play-services-measurement-api:aar", - "com.google.android.gms:play-services-measurement-api:jar:javadoc", "com.google.android.gms:play-services-measurement-base:aar", - "com.google.android.gms:play-services-measurement-base:jar:javadoc", "com.google.android.gms:play-services-measurement-impl:aar", - "com.google.android.gms:play-services-measurement-impl:jar:javadoc", "com.google.android.gms:play-services-measurement-sdk-api:aar", - "com.google.android.gms:play-services-measurement-sdk-api:jar:javadoc", "com.google.android.gms:play-services-measurement-sdk:aar", - "com.google.android.gms:play-services-measurement-sdk:jar:javadoc", "com.google.android.gms:play-services-measurement:aar", - "com.google.android.gms:play-services-measurement:jar:javadoc", "com.google.android.gms:play-services-stats:aar", "com.google.android.gms:play-services-tasks:aar", "com.google.android.gms:strict-version-matcher-plugin", "com.google.android.material:material:aar", - "com.google.android.material:material:jar:sources", "com.google.auto.service:auto-service-annotations", - "com.google.auto.service:auto-service-annotations:jar:javadoc", - "com.google.auto.service:auto-service-annotations:jar:sources", "com.google.auto.value:auto-value-annotations", - "com.google.auto.value:auto-value-annotations:jar:javadoc", - "com.google.auto.value:auto-value-annotations:jar:sources", "com.google.code.findbugs:jsr305", - "com.google.code.findbugs:jsr305:jar:javadoc", - "com.google.code.findbugs:jsr305:jar:sources", "com.google.code.gson:gson", - "com.google.code.gson:gson:jar:javadoc", - "com.google.code.gson:gson:jar:sources", "com.google.dagger:dagger", "com.google.dagger:dagger-compiler", - "com.google.dagger:dagger-compiler:jar:javadoc", - "com.google.dagger:dagger-compiler:jar:sources", "com.google.dagger:dagger-producers", - "com.google.dagger:dagger-producers:jar:javadoc", - "com.google.dagger:dagger-producers:jar:sources", "com.google.dagger:dagger-spi", - "com.google.dagger:dagger-spi:jar:javadoc", - "com.google.dagger:dagger-spi:jar:sources", - "com.google.dagger:dagger:jar:javadoc", - "com.google.dagger:dagger:jar:sources", "com.google.errorprone:error_prone_annotations", - "com.google.errorprone:error_prone_annotations:jar:javadoc", - "com.google.errorprone:error_prone_annotations:jar:sources", "com.google.errorprone:javac-shaded", - "com.google.errorprone:javac-shaded:jar:javadoc", - "com.google.errorprone:javac-shaded:jar:sources", "com.google.firebase:firebase-analytics:aar", - "com.google.firebase:firebase-analytics:jar:javadoc", "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-common:jar:javadoc", - "com.google.firebase:firebase-common:jar:sources", "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-components:jar:javadoc", - "com.google.firebase:firebase-components:jar:sources", "com.google.firebase:firebase-crashlytics:aar", - "com.google.firebase:firebase-crashlytics:jar:javadoc", "com.google.firebase:firebase-encoders-json:aar", - "com.google.firebase:firebase-encoders-json:jar:javadoc", - "com.google.firebase:firebase-encoders-json:jar:sources", "com.google.firebase:firebase-iid-interop:aar", "com.google.firebase:firebase-iid:aar", - "com.google.firebase:firebase-iid:jar:javadoc", "com.google.firebase:firebase-installations-interop:aar", - "com.google.firebase:firebase-installations-interop:jar:javadoc", "com.google.firebase:firebase-installations:aar", - "com.google.firebase:firebase-installations:jar:javadoc", "com.google.firebase:firebase-measurement-connector:aar", "com.google.gms:google-services", - "com.google.gms:google-services:jar:javadoc", - "com.google.gms:google-services:jar:sources", "com.google.googlejavaformat:google-java-format", - "com.google.googlejavaformat:google-java-format:jar:javadoc", - "com.google.googlejavaformat:google-java-format:jar:sources", "com.google.guava:failureaccess", - "com.google.guava:failureaccess:jar:javadoc", - "com.google.guava:failureaccess:jar:sources", "com.google.guava:guava", - "com.google.guava:guava:jar:javadoc", - "com.google.guava:guava:jar:sources", "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", - "com.google.j2objc:j2objc-annotations:jar:javadoc", - "com.google.j2objc:j2objc-annotations:jar:sources", "com.google.protobuf:protobuf-java", - "com.google.protobuf:protobuf-java:jar:javadoc", - "com.google.protobuf:protobuf-java:jar:sources", "com.google.protobuf:protobuf-javalite", - "com.google.protobuf:protobuf-javalite:jar:javadoc", - "com.google.protobuf:protobuf-javalite:jar:sources", "com.google.truth.extensions:truth-liteproto-extension", - "com.google.truth.extensions:truth-liteproto-extension:jar:javadoc", - "com.google.truth.extensions:truth-liteproto-extension:jar:sources", "com.google.truth:truth", - "com.google.truth:truth:jar:javadoc", - "com.google.truth:truth:jar:sources", "com.googlecode.juniversalchardet:juniversalchardet", - "com.googlecode.juniversalchardet:juniversalchardet:jar:javadoc", - "com.googlecode.juniversalchardet:juniversalchardet:jar:sources", "com.ibm.icu:icu4j", - "com.ibm.icu:icu4j:jar:javadoc", - "com.ibm.icu:icu4j:jar:sources", "com.squareup.moshi:moshi", "com.squareup.moshi:moshi-kotlin", "com.squareup.moshi:moshi-kotlin-codegen", - "com.squareup.moshi:moshi-kotlin-codegen:jar:javadoc", - "com.squareup.moshi:moshi-kotlin-codegen:jar:sources", - "com.squareup.moshi:moshi-kotlin:jar:javadoc", - "com.squareup.moshi:moshi-kotlin:jar:sources", - "com.squareup.moshi:moshi:jar:javadoc", - "com.squareup.moshi:moshi:jar:sources", "com.squareup.okhttp3:mockwebserver", - "com.squareup.okhttp3:mockwebserver:jar:javadoc", - "com.squareup.okhttp3:mockwebserver:jar:sources", "com.squareup.okhttp3:okhttp", - "com.squareup.okhttp3:okhttp:jar:javadoc", - "com.squareup.okhttp3:okhttp:jar:sources", "com.squareup.okio:okio", - "com.squareup.okio:okio:jar:javadoc", - "com.squareup.okio:okio:jar:sources", "com.squareup.retrofit2:converter-moshi", - "com.squareup.retrofit2:converter-moshi:jar:javadoc", - "com.squareup.retrofit2:converter-moshi:jar:sources", "com.squareup.retrofit2:retrofit", "com.squareup.retrofit2:retrofit-mock", - "com.squareup.retrofit2:retrofit-mock:jar:javadoc", - "com.squareup.retrofit2:retrofit-mock:jar:sources", - "com.squareup.retrofit2:retrofit:jar:javadoc", - "com.squareup.retrofit2:retrofit:jar:sources", "com.squareup:javapoet", - "com.squareup:javapoet:jar:javadoc", - "com.squareup:javapoet:jar:sources", "com.squareup:javawriter", - "com.squareup:javawriter:jar:javadoc", - "com.squareup:javawriter:jar:sources", "com.squareup:kotlinpoet", - "com.squareup:kotlinpoet:jar:javadoc", - "com.squareup:kotlinpoet:jar:sources", "commons-codec:commons-codec", - "commons-codec:commons-codec:jar:javadoc", - "commons-codec:commons-codec:jar:sources", "commons-io:commons-io", - "commons-io:commons-io:jar:javadoc", - "commons-io:commons-io:jar:sources", "de.hdodenhof:circleimageview:aar", - "de.hdodenhof:circleimageview:jar:javadoc", - "de.hdodenhof:circleimageview:jar:sources", "io.fabric.sdk.android:fabric:aar", "javax.annotation:javax.annotation-api", - "javax.annotation:javax.annotation-api:jar:javadoc", - "javax.annotation:javax.annotation-api:jar:sources", "javax.annotation:jsr250-api", - "javax.annotation:jsr250-api:jar:sources", "javax.inject:javax.inject", - "javax.inject:javax.inject:jar:javadoc", - "javax.inject:javax.inject:jar:sources", "junit:junit", - "junit:junit:jar:javadoc", - "junit:junit:jar:sources", "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", - "net.bytebuddy:byte-buddy-agent:jar:javadoc", - "net.bytebuddy:byte-buddy-agent:jar:sources", - "net.bytebuddy:byte-buddy:jar:javadoc", - "net.bytebuddy:byte-buddy:jar:sources", "net.ltgt.gradle.incap:incap", - "net.ltgt.gradle.incap:incap:jar:javadoc", - "net.ltgt.gradle.incap:incap:jar:sources", "net.sf.kxml:kxml2", - "net.sf.kxml:kxml2:jar:javadoc", - "net.sf.kxml:kxml2:jar:sources", "nl.dionsegijn:konfetti:aar", - "nl.dionsegijn:konfetti:jar:sources", "org.antlr:antlr4", - "org.antlr:antlr4:jar:javadoc", - "org.antlr:antlr4:jar:sources", "org.bouncycastle:bcprov-jdk15on", - "org.bouncycastle:bcprov-jdk15on:jar:javadoc", - "org.bouncycastle:bcprov-jdk15on:jar:sources", "org.checkerframework:checker-compat-qual", - "org.checkerframework:checker-compat-qual:jar:javadoc", - "org.checkerframework:checker-compat-qual:jar:sources", "org.checkerframework:checker-qual", - "org.checkerframework:checker-qual:jar:javadoc", - "org.checkerframework:checker-qual:jar:sources", "org.hamcrest:hamcrest-core", - "org.hamcrest:hamcrest-core:jar:javadoc", - "org.hamcrest:hamcrest-core:jar:sources", "org.hamcrest:hamcrest-integration", - "org.hamcrest:hamcrest-integration:jar:javadoc", - "org.hamcrest:hamcrest-integration:jar:sources", "org.hamcrest:hamcrest-library", - "org.hamcrest:hamcrest-library:jar:javadoc", - "org.hamcrest:hamcrest-library:jar:sources", "org.jetbrains.intellij.deps:trove4j", - "org.jetbrains.intellij.deps:trove4j:jar:javadoc", - "org.jetbrains.intellij.deps:trove4j:jar:sources", "org.jetbrains.kotlin:kotlin-compiler-embeddable", - "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:javadoc", - "org.jetbrains.kotlin:kotlin-compiler-embeddable:jar:sources", "org.jetbrains.kotlin:kotlin-daemon-embeddable", - "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:javadoc", - "org.jetbrains.kotlin:kotlin-daemon-embeddable:jar:sources", "org.jetbrains.kotlin:kotlin-reflect", - "org.jetbrains.kotlin:kotlin-reflect:jar:javadoc", - "org.jetbrains.kotlin:kotlin-reflect:jar:sources", "org.jetbrains.kotlin:kotlin-script-runtime", - "org.jetbrains.kotlin:kotlin-script-runtime:jar:javadoc", - "org.jetbrains.kotlin:kotlin-script-runtime:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib", "org.jetbrains.kotlin:kotlin-stdlib-common", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib-jdk7", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7:jar:sources", "org.jetbrains.kotlin:kotlin-stdlib-jdk8", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources", - "org.jetbrains.kotlin:kotlin-stdlib:jar:javadoc", - "org.jetbrains.kotlin:kotlin-stdlib:jar:sources", "org.jetbrains.kotlin:kotlin-test", "org.jetbrains.kotlin:kotlin-test-annotations-common", - "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-annotations-common:jar:sources", "org.jetbrains.kotlin:kotlin-test-common", - "org.jetbrains.kotlin:kotlin-test-common:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-common:jar:sources", "org.jetbrains.kotlin:kotlin-test-junit", - "org.jetbrains.kotlin:kotlin-test-junit:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test-junit:jar:sources", - "org.jetbrains.kotlin:kotlin-test:jar:javadoc", - "org.jetbrains.kotlin:kotlin-test:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-android", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-core", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-debug", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources", "org.jetbrains.kotlinx:kotlinx-coroutines-test", - "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:sources", "org.jetbrains.kotlinx:kotlinx-metadata-jvm", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:javadoc", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm:jar:sources", "org.jetbrains:annotations", - "org.jetbrains:annotations:jar:javadoc", - "org.jetbrains:annotations:jar:sources", "org.mockito.kotlin:mockito-kotlin", - "org.mockito.kotlin:mockito-kotlin:jar:javadoc", - "org.mockito.kotlin:mockito-kotlin:jar:sources", "org.mockito:mockito-core", - "org.mockito:mockito-core:jar:javadoc", - "org.mockito:mockito-core:jar:sources", "org.objenesis:objenesis", - "org.objenesis:objenesis:jar:javadoc", - "org.objenesis:objenesis:jar:sources", "org.ow2.asm:asm", "org.ow2.asm:asm-analysis", - "org.ow2.asm:asm-analysis:jar:javadoc", - "org.ow2.asm:asm-analysis:jar:sources", "org.ow2.asm:asm-commons", - "org.ow2.asm:asm-commons:jar:javadoc", - "org.ow2.asm:asm-commons:jar:sources", "org.ow2.asm:asm-tree", - "org.ow2.asm:asm-tree:jar:javadoc", - "org.ow2.asm:asm-tree:jar:sources", "org.ow2.asm:asm-util", - "org.ow2.asm:asm-util:jar:javadoc", - "org.ow2.asm:asm-util:jar:sources", - "org.ow2.asm:asm:jar:javadoc", - "org.ow2.asm:asm:jar:sources", "org.robolectric:annotations", - "org.robolectric:annotations:jar:javadoc", - "org.robolectric:annotations:jar:sources", "org.robolectric:junit", - "org.robolectric:junit:jar:javadoc", - "org.robolectric:junit:jar:sources", "org.robolectric:pluginapi", - "org.robolectric:pluginapi:jar:javadoc", - "org.robolectric:pluginapi:jar:sources", "org.robolectric:plugins-maven-dependency-resolver", - "org.robolectric:plugins-maven-dependency-resolver:jar:javadoc", - "org.robolectric:plugins-maven-dependency-resolver:jar:sources", "org.robolectric:resources", - "org.robolectric:resources:jar:javadoc", - "org.robolectric:resources:jar:sources", "org.robolectric:robolectric", - "org.robolectric:robolectric:jar:javadoc", - "org.robolectric:robolectric:jar:sources", "org.robolectric:sandbox", - "org.robolectric:sandbox:jar:javadoc", - "org.robolectric:sandbox:jar:sources", "org.robolectric:shadowapi", - "org.robolectric:shadowapi:jar:javadoc", - "org.robolectric:shadowapi:jar:sources", "org.robolectric:shadows-framework", - "org.robolectric:shadows-framework:jar:javadoc", - "org.robolectric:shadows-framework:jar:sources", "org.robolectric:utils", - "org.robolectric:utils-reflector", - "org.robolectric:utils-reflector:jar:javadoc", - "org.robolectric:utils-reflector:jar:sources", - "org.robolectric:utils:jar:javadoc", - "org.robolectric:utils:jar:sources" + "org.robolectric:utils-reflector" ] }, "version": "2" diff --git a/third_party/versions.bzl b/third_party/versions.bzl index 6b0efb281a1..703fd2b8857 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -119,8 +119,13 @@ HTTP_DEPENDENCY_VERSIONS = { "version": "2.28.1", }, "protobuf_tools": { + "sha": "efcb0b9004200fce79de23be796072a055105273905a5a441dbb5a979d724d20", "version": "3.11.0", }, + "robolectric": { + "sha": "af0177d32ecd2cd68ee6e9f5d38288e1c4de0dd2a756bb7133c243f2d5fe06f7", + "version": "4.5", + }, "rules_java": { "sha": "34b41ec683e67253043ab1a3d1e8b7c61e4e8edefbcad485381328c934d072fe", "version": "4.0.0", From f6188ac768f7d6a4743d52b2c83e046fc7945abc Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Mon, 27 Mar 2023 20:16:28 -0700 Subject: [PATCH 03/63] Fix Maven license check & update the list. The check & related scripts required fairly involved reworking since the Maven install file (from which it sources Maven URL context) changed in format as part of the upgrade for rules_jvm_external. This has actually led to what seems to be more correct analysis of libraries that the build depends on, so more licenses have been added to the maven_dependencies.textproto tracking file. One unused Crashlytics dependency was removed since it was referencing an old license that doesn't exist anymore (and the artifact should be replaced in full by more recent Firebase Crashlytics dependencies that we are already using). --- app/BUILD.bazel | 1 - scripts/assets/maven_dependencies.textproto | 488 ++++++++++++- scripts/assets/test_file_exemptions.textproto | 9 +- .../oppia/android/scripts/common/BUILD.bazel | 10 + .../ScriptBackgroundCoroutineDispatcher.kt | 86 +++ .../oppia/android/scripts/license/BUILD.bazel | 11 +- .../android/scripts/license/LicenseFetcher.kt | 7 - .../scripts/license/LicenseFetcherImpl.kt | 11 - .../license/MavenArtifactPropertyFetcher.kt | 10 + .../MavenArtifactPropertyFetcherImpl.kt | 24 + .../license/MavenDependenciesListCheck.kt | 36 +- .../license/MavenDependenciesRetriever.kt | 239 +++++-- .../oppia/android/scripts/maven/BUILD.bazel | 3 +- .../maven/GenerateMavenDependenciesList.kt | 58 +- .../scripts/maven/RetrieveLicenseTexts.kt | 10 +- .../android/scripts/maven/model/BUILD.bazel | 5 +- .../scripts/maven/model/MavenArtifact.kt | 12 + .../scripts/maven/model/MavenInstallJson.kt | 16 + .../maven/model/MavenListDependencies.kt | 19 - .../maven/model/MavenListDependency.kt | 17 - .../maven/model/MavenListDependencyTree.kt | 14 - .../oppia/android/scripts/common/BUILD.bazel | 11 + ...ScriptBackgroundCoroutineDispatcherTest.kt | 79 +++ .../oppia/android/scripts/license/BUILD.bazel | 1 + .../license/MavenDependenciesListCheckTest.kt | 248 ++++--- .../license/MavenDependenciesRetrieverTest.kt | 647 ++++++++++++++---- .../GenerateMavenDependenciesListTest.kt | 213 +++--- .../scripts/maven/RetrieveLicenseTextsTest.kt | 24 +- third_party/maven_install.json | 53 +- third_party/versions.bzl | 1 - 30 files changed, 1745 insertions(+), 618 deletions(-) create mode 100644 scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt delete mode 100644 scripts/src/java/org/oppia/android/scripts/license/LicenseFetcher.kt delete mode 100644 scripts/src/java/org/oppia/android/scripts/license/LicenseFetcherImpl.kt create mode 100644 scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt create mode 100644 scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt create mode 100644 scripts/src/java/org/oppia/android/scripts/maven/model/MavenArtifact.kt create mode 100644 scripts/src/java/org/oppia/android/scripts/maven/model/MavenInstallJson.kt delete mode 100644 scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencies.kt delete mode 100644 scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependency.kt delete mode 100644 scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencyTree.kt create mode 100644 scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt diff --git a/app/BUILD.bazel b/app/BUILD.bazel index 807971798d3..594feecc970 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -995,7 +995,6 @@ crashlytics_android_library( android_library( name = "crashlytics_deps", exports = [ - "//third_party:com_crashlytics_sdk_android_crashlytics", "//third_party:com_google_firebase_firebase-analytics", "//third_party:com_google_firebase_firebase-crashlytics", "//third_party:io_fabric_sdk_android_fabric", diff --git a/scripts/assets/maven_dependencies.textproto b/scripts/assets/maven_dependencies.textproto index ddb692a40f3..b4b49ff013f 100644 --- a/scripts/assets/maven_dependencies.textproto +++ b/scripts/assets/maven_dependencies.textproto @@ -1,6 +1,6 @@ maven_dependency { - artifact_name: "androidx.annotation:annotation-experimental:1.0.0" - artifact_version: "1.0.0" + artifact_name: "androidx.activity:activity:1.1.0" + artifact_version: "1.1.0" license { license_name: "The Apache Software License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -20,6 +20,28 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.annotation:annotation-experimental:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.appcompat:appcompat-resources:1.2.0" + artifact_version: "1.2.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.appcompat:appcompat:1.2.0" artifact_version: "1.2.0" @@ -42,6 +64,17 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.arch.core:core-runtime:2.1.0" + artifact_version: "2.1.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.cardview:cardview:1.0.0" artifact_version: "1.0.0" @@ -119,6 +152,28 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.cursoradapter:cursoradapter:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.customview:customview:1.1.0" + artifact_version: "1.1.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.databinding:databinding-adapters:3.4.2" artifact_version: "3.4.2" @@ -152,6 +207,17 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.documentfile:documentfile:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.drawerlayout:drawerlayout:1.1.0" artifact_version: "1.1.0" @@ -196,6 +262,17 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.interpolator:interpolator:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.legacy:legacy-support-core-utils:1.0.0" artifact_version: "1.0.0" @@ -229,6 +306,17 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0" + artifact_version: "2.2.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.lifecycle:lifecycle-livedata-core:2.2.0" artifact_version: "2.2.0" @@ -251,6 +339,28 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.lifecycle:lifecycle-livedata:2.2.0" + artifact_version: "2.2.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.lifecycle:lifecycle-process:2.2.0" + artifact_version: "2.2.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.lifecycle:lifecycle-runtime:2.2.0" artifact_version: "2.2.0" @@ -262,6 +372,61 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.lifecycle:lifecycle-service:2.2.0" + artifact_version: "2.2.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.lifecycle:lifecycle-viewmodel:2.2.0" + artifact_version: "2.2.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.loader:loader:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.multidex:multidex:2.0.1" artifact_version: "2.0.1" @@ -273,6 +438,17 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.print:print:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.recyclerview:recyclerview:1.1.0" artifact_version: "1.1.0" @@ -306,6 +482,39 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "androidx.savedstate:savedstate:1.0.0" + artifact_version: "1.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.sqlite:sqlite-framework:2.1.0" + artifact_version: "2.1.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "androidx.sqlite:sqlite:2.1.0" + artifact_version: "2.1.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "androidx.transition:transition:1.2.0" artifact_version: "1.2.0" @@ -340,8 +549,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "androidx.viewpager2:viewpager2:1.0.0" - artifact_version: "1.0.0" + artifact_name: "androidx.versionedparcelable:versionedparcelable:1.1.0" + artifact_version: "1.1.0" license { license_name: "The Apache Software License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -351,7 +560,7 @@ maven_dependency { } } maven_dependency { - artifact_name: "androidx.viewpager:viewpager:1.0.0" + artifact_name: "androidx.viewpager2:viewpager2:1.0.0" artifact_version: "1.0.0" license { license_name: "The Apache Software License, Version 2.0" @@ -362,8 +571,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "androidx.work:work-runtime-ktx:2.4.0" - artifact_version: "2.4.0" + artifact_name: "androidx.viewpager:viewpager:1.0.0" + artifact_version: "1.0.0" license { license_name: "The Apache Software License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -373,7 +582,7 @@ maven_dependency { } } maven_dependency { - artifact_name: "androidx.work:work-runtime:2.4.0" + artifact_name: "androidx.work:work-runtime-ktx:2.4.0" artifact_version: "2.4.0" license { license_name: "The Apache Software License, Version 2.0" @@ -384,21 +593,13 @@ maven_dependency { } } maven_dependency { - artifact_name: "com.crashlytics.sdk.android:crashlytics:2.9.8" - artifact_version: "2.9.8" - license { - license_name: "Crashlytics Terms of Service" - original_link: "https://try.crashlytics.com/terms/terms-of-service.pdf" - direct_link_only { - url: "https://firebase.google.com/terms/crashlytics" - } - is_original_link_invalid: true - } + artifact_name: "androidx.work:work-runtime:2.4.0" + artifact_version: "2.4.0" license { license_name: "The Apache Software License, Version 2.0" - original_link: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/master/LICENSE" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" scrapable_link { - url: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/52e1cf89efd795d798ae5485b8503e04e4a936b8/LICENSE" + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" } } } @@ -492,6 +693,39 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "com.google.android.datatransport:transport-api:2.2.0" + artifact_version: "2.2.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "com.google.android.datatransport:transport-backend-cct:2.3.0" + artifact_version: "2.3.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "com.google.android.datatransport:transport-runtime:2.2.3" + artifact_version: "2.2.3" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "com.google.android.flexbox:flexbox:3.0.0" artifact_version: "3.0.0" @@ -503,6 +737,127 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "com.google.android.gms:play-services-ads-identifier:17.0.0" + artifact_version: "17.0.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-base:17.0.0" + artifact_version: "17.0.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-basement:17.0.0" + artifact_version: "17.0.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-measurement-api:17.5.0" + artifact_version: "17.5.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-measurement-base:17.5.0" + artifact_version: "17.5.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-measurement-impl:17.5.0" + artifact_version: "17.5.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-measurement-sdk-api:17.5.0" + artifact_version: "17.5.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-measurement-sdk:17.5.0" + artifact_version: "17.5.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-measurement:17.5.0" + artifact_version: "17.5.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-stats:17.0.0" + artifact_version: "17.0.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.android.gms:play-services-tasks:17.0.0" + artifact_version: "17.0.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} maven_dependency { artifact_name: "com.google.android.material:material:1.3.0" artifact_version: "1.3.0" @@ -589,6 +944,17 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "com.google.firebase:firebase-components:16.0.0" + artifact_version: "16.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} maven_dependency { artifact_name: "com.google.firebase:firebase-crashlytics:17.1.1" artifact_version: "17.1.1" @@ -600,6 +966,72 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "com.google.firebase:firebase-encoders-json:16.1.0" + artifact_version: "16.1.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "com.google.firebase:firebase-iid-interop:17.0.0" + artifact_version: "17.0.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.firebase:firebase-iid:20.1.5" + artifact_version: "20.1.5" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} +maven_dependency { + artifact_name: "com.google.firebase:firebase-installations-interop:16.0.0" + artifact_version: "16.0.0" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "com.google.firebase:firebase-installations:16.3.2" + artifact_version: "16.3.2" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "com.google.firebase:firebase-measurement-connector:18.0.0" + artifact_version: "18.0.0" + license { + license_name: "Android Software Development Kit License" + original_link: "https://developer.android.com/studio/terms.html" + direct_link_only { + url: "https://developer.android.com/studio/terms.html" + } + } +} maven_dependency { artifact_name: "com.google.guava:failureaccess:1.0.1" artifact_version: "1.0.1" @@ -652,7 +1084,7 @@ maven_dependency { } } maven_dependency { - artifact_name: "com.squareup.moshi:moshi-kotlin-codegen:1.11.0" + artifact_name: "com.squareup.moshi:moshi:1.11.0" artifact_version: "1.11.0" license { license_name: "The Apache Software License, Version 2.0" @@ -674,7 +1106,7 @@ maven_dependency { } } maven_dependency { - artifact_name: "com.squareup.moshi:moshi:1.11.0" + artifact_name: "com.squareup.moshi:moshi-kotlin-codegen:1.11.0" artifact_version: "1.11.0" license { license_name: "The Apache Software License, Version 2.0" @@ -842,7 +1274,7 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" + artifact_name: "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" artifact_version: "1.5.0" license { license_name: "The Apache License, Version 2.0" @@ -853,8 +1285,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10" - artifact_version: "1.4.10" + artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" + artifact_version: "1.5.0" license { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -864,7 +1296,7 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10" + artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10" artifact_version: "1.4.10" license { license_name: "The Apache License, Version 2.0" @@ -875,8 +1307,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - artifact_version: "1.5.0" + artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10" + artifact_version: "1.4.10" license { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" diff --git a/scripts/assets/test_file_exemptions.textproto b/scripts/assets/test_file_exemptions.textproto index 82cad956e39..b69a1d0efbe 100644 --- a/scripts/assets/test_file_exemptions.textproto +++ b/scripts/assets/test_file_exemptions.textproto @@ -704,13 +704,12 @@ exempted_file_path: "instrumentation/src/java/org/oppia/android/instrumentation/ exempted_file_path: "instrumentation/src/java/org/oppia/android/instrumentation/testing/EndToEndTestHelper.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/common/CommandExecutor.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/common/CommandResult.kt" -exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/LicenseFetcher.kt" -exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/LicenseFetcherImpl.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/model/CopyrightLicense.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/model/Dependency.kt" -exempted_file_path: "scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependency.kt" -exempted_file_path: "scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencies.kt" -exempted_file_path: "scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencyTree.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/maven/model/MavenArtifact.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/maven/model/MavenInstallJson.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Issue.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt" exempted_file_path: "testing/src/main/java/org/oppia/android/testing/AccessibilityTestRule.kt" diff --git a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel index 3a94254e9fc..eb538afedc7 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel @@ -57,3 +57,13 @@ kt_jvm_library( "//third_party:org_jetbrains_kotlin_kotlin-stdlib-jdk8_jar", ], ) + +kt_jvm_library( + name = "script_background_coroutine_dispatcher", + testonly = True, + srcs = ["ScriptBackgroundCoroutineDispatcher.kt"], + visibility = ["//scripts:oppia_script_library_visibility"], + deps = [ + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + ], +) diff --git a/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt b/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt new file mode 100644 index 00000000000..52bb21c0a0f --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt @@ -0,0 +1,86 @@ +package org.oppia.android.scripts.common + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Runnable +import kotlinx.coroutines.asCoroutineDispatcher +import java.io.Closeable +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit +import kotlin.coroutines.CoroutineContext + +/** + * A [CoroutineDispatcher] that's [Closeable] and particularly tailored to be easily used in scripts + * that need to perform parallel tasks for expensive IO. It's highly recommended to exclusively use + * this dispatcher over any others, and to ensure that [close] is called at the end of the script to + * avoid any potential threads hanging (causing the script to not actually close). + * + * Note that the dispatcher attempts to finish any ongoing tasks when [close] is called, but it will + * reject new tasks from being scheduled and it will force terminate if any pending tasks at the + * time of closing don't end within the configured [closeTimeout] provided. + * + * A simple example for using this dispatcher: + * ```kotlin + * ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + * val deferred = CoroutineScope(scriptBgDispatcher).async { + * // Expensive task... + * } + * // IMPORTANT: The operation must be observed before use{} ends, otherwise the dispatcher will + * // close and terminate any pending tasks. + * runBlocking { deferred.await() } + * } + * ``` + * + * A more complex example for I/O operations: + * ```kotlin + * ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + * val deferred = CoroutineScope(scriptBgDispatcher).async { + * withContext(Dispatchers.IO) { + * // Perform I/O using Kotlin's highly parallelized I/O dispatcher, but wait for the result + * // using the background script dispatcher (since execution could continue if other I/O + * // operations need to be kicked off, or if other work can be done alongside the I/O). + * } + * } + * // IMPORTANT: The operation must be observed before use{} ends, otherwise the dispatcher will + * // close and terminate any pending tasks. + * runBlocking { deferred.await() } + * } + * ``` + * + * @property closeTimeout the amount of time, in [closeTimeoutUnit] units, that should be waited + * when [close]ing this dispatcher before force-ending ongoing tasks + * @property closeTimeoutUnit the unit of time used for [closeTimeout] + */ +class ScriptBackgroundCoroutineDispatcher( + private val closeTimeout: Long = 5, + private val closeTimeoutUnit: TimeUnit = TimeUnit.SECONDS +) : CoroutineDispatcher(), Closeable { + private val threadPool by lazy { Executors.newCachedThreadPool() } + private val coroutineDispatcher by lazy { threadPool.asCoroutineDispatcher() } + + override fun dispatch(context: CoroutineContext, block: Runnable) { + coroutineDispatcher.dispatch(context, block) + } + + override fun close() { + threadPool.tryShutdownFully(timeout = closeTimeout, unit = closeTimeoutUnit) + coroutineDispatcher.close() + } + + private companion object { + private fun ExecutorService.tryShutdownFully(timeout: Long, unit: TimeUnit) { + // Try to fully shutdown the executor service per https://stackoverflow.com/a/33690603 and + // https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html. + shutdown() + try { + if (!awaitTermination(timeout, unit)) { + shutdownNow() + check(awaitTermination(timeout, unit)) { "ExecutorService didn't fully shutdown: $this." } + } + } catch (e: InterruptedException) { + shutdownNow() + Thread.currentThread().interrupt() + } + } + } +} diff --git a/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel index aaeeb5d34a6..220630a368b 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel @@ -5,11 +5,11 @@ Libraries corresponding to maven dependencies and their licenses checks. load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") kt_jvm_library( - name = "license_fetcher", + name = "maven_artifact_property_fetcher", testonly = True, srcs = [ - "LicenseFetcher.kt", - "LicenseFetcherImpl.kt", + "MavenArtifactPropertyFetcher.kt", + "MavenArtifactPropertyFetcherImpl.kt", ], visibility = ["//scripts:oppia_script_library_visibility"], ) @@ -20,12 +20,14 @@ kt_jvm_library( srcs = ["MavenDependenciesRetriever.kt"], visibility = ["//scripts:oppia_script_library_visibility"], deps = [ - ":license_fetcher", + ":maven_artifact_property_fetcher", "//scripts/src/java/org/oppia/android/scripts/common:bazel_client", + "//scripts/src/java/org/oppia/android/scripts/common:script_background_coroutine_dispatcher", "//scripts/src/java/org/oppia/android/scripts/maven/model", "//scripts/src/java/org/oppia/android/scripts/proto:maven_dependencies_java_proto", "//scripts/src/java/org/oppia/android/scripts/proto:maven_dependencies_java_proto_lite", "//third_party:com_google_protobuf_protobuf-java", + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", ], ) @@ -35,6 +37,7 @@ kt_jvm_library( srcs = ["MavenDependenciesListCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ + "//scripts/src/java/org/oppia/android/scripts/common:script_background_coroutine_dispatcher", "//scripts/src/java/org/oppia/android/scripts/license:maven_dependencies_retriever", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/license/LicenseFetcher.kt b/scripts/src/java/org/oppia/android/scripts/license/LicenseFetcher.kt deleted file mode 100644 index b21d112cf97..00000000000 --- a/scripts/src/java/org/oppia/android/scripts/license/LicenseFetcher.kt +++ /dev/null @@ -1,7 +0,0 @@ -package org.oppia.android.scripts.license - -/** Utility class to extract the license text from a given URL. */ -interface LicenseFetcher { - /** Scrapes and returns the text from a given URL. */ - fun scrapeText(link: String): String -} diff --git a/scripts/src/java/org/oppia/android/scripts/license/LicenseFetcherImpl.kt b/scripts/src/java/org/oppia/android/scripts/license/LicenseFetcherImpl.kt deleted file mode 100644 index bfbcd611c7b..00000000000 --- a/scripts/src/java/org/oppia/android/scripts/license/LicenseFetcherImpl.kt +++ /dev/null @@ -1,11 +0,0 @@ -package org.oppia.android.scripts.license - -import java.net.URL - -/** Default implementation of [LicenseFetcher]. */ -class LicenseFetcherImpl() : LicenseFetcher { - - override fun scrapeText(link: String): String { - return URL(link).openStream().bufferedReader().readText() - } -} diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt new file mode 100644 index 00000000000..fac6c57181d --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt @@ -0,0 +1,10 @@ +package org.oppia.android.scripts.license + +/** Utility class to extract specific Maven artifact properties from remote sources. */ +interface MavenArtifactPropertyFetcher { + /** Scrapes and returns the text from a given URL. */ + fun scrapeText(link: String): String + + /** Returns whether the specified URL corresponds to a real Maven artifact file. */ + fun isValidArtifactFileUrl(url: String): Boolean +} diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt new file mode 100644 index 00000000000..27c53f1cd9f --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt @@ -0,0 +1,24 @@ +package org.oppia.android.scripts.license + +import java.net.HttpURLConnection +import java.net.URL + +/** Default implementation of [MavenArtifactPropertyFetcher]. */ +class MavenArtifactPropertyFetcherImpl : MavenArtifactPropertyFetcher { + override fun scrapeText(link: String): String { + return URL(link).openStream().bufferedReader().readText() + } + + override fun isValidArtifactFileUrl(url: String): Boolean { + // Partial reference: https://stackoverflow.com/q/19670622/3689782. + val connection = URL(url).openConnection() as? HttpURLConnection + val responseCode = try { + connection?.requestMethod = "HEAD" + connection?.connect() + connection?.responseCode + } finally { + connection?.disconnect() + } ?: error("Failed to connect to URL: $url.") + return responseCode == 200 + } +} diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt index 1632c3c9068..bce4fb8a547 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt @@ -1,8 +1,10 @@ package org.oppia.android.scripts.license import com.google.protobuf.TextFormat +import kotlinx.coroutines.runBlocking import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.MavenDependency /** @@ -24,18 +26,17 @@ import org.oppia.android.scripts.proto.MavenDependency * third_party/maven_install.json scripts/assets/maven_dependencies.pb */ fun main(args: Array) { - MavenDependenciesListCheck(LicenseFetcherImpl()).main(args) + MavenDependenciesListCheck(MavenArtifactPropertyFetcherImpl()).main(args) } /** - * Wrapper class to pass [LicenseFetcher] and [CommandExecutor] to be utilized by the the main + * Wrapper class to pass [MavenArtifactPropertyFetcher] and [CommandExecutor] to be utilized by the the main * method. */ class MavenDependenciesListCheck( - private val licenseFetcher: LicenseFetcher, + private val mavenArtifactPropertyFetcher: MavenArtifactPropertyFetcher, private val commandExecutor: CommandExecutor = CommandExecutorImpl() ) { - /** * Verifies that the list of third-party maven dependencies in maven_dependnecies.textproto is * up-to-date. @@ -44,16 +45,31 @@ class MavenDependenciesListCheck( val pathToRoot = args[0] val pathToMavenInstallJson = "$pathToRoot/${args[1]}" val pathToMavenDependenciesPb = args[2] + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + runBlocking { + checkMavenDependenciesList( + pathToRoot, pathToMavenInstallJson, pathToMavenDependenciesPb, scriptBgDispatcher + ) + } + } + } + private suspend fun checkMavenDependenciesList( + pathToRoot: String, + pathToMavenInstallJson: String, + pathToMavenDependenciesPb: String, + scriptBackgroundCoroutineDispatcher: ScriptBackgroundCoroutineDispatcher + ) { val mavenDependenciesRetriever = MavenDependenciesRetriever( pathToRoot, - licenseFetcher, + mavenArtifactPropertyFetcher, + scriptBackgroundCoroutineDispatcher, commandExecutor ) val bazelQueryDepsList = mavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() - val mavenInstallDepsList = mavenDependenciesRetriever.getDependencyListFromMavenInstall( + val mavenInstallDepsList = mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( pathToMavenInstallJson, bazelQueryDepsList ) @@ -166,16 +182,12 @@ class MavenDependenciesListCheck( private fun findRedundantDependencies( dependenciesList: List, updatedDependenciesList: List - ): List { - return updatedDependenciesList - dependenciesList - } + ): List = updatedDependenciesList - dependenciesList.toSet() private fun findMissingDependencies( dependenciesList: List, updatedDependenciesList: List - ): List { - return dependenciesList - updatedDependenciesList - } + ): List = dependenciesList - updatedDependenciesList.toSet() private fun printDependenciesList(dependencyList: List) { dependencyList.forEach { dep -> diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt index 3b67d51a751..e90419c2259 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt @@ -2,12 +2,16 @@ package org.oppia.android.scripts.license import com.google.protobuf.TextFormat import com.squareup.moshi.Moshi -import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext import org.oppia.android.scripts.common.BazelClient import org.oppia.android.scripts.common.CommandExecutor -import org.oppia.android.scripts.common.CommandExecutorImpl -import org.oppia.android.scripts.maven.model.MavenListDependency -import org.oppia.android.scripts.maven.model.MavenListDependencyTree +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher +import org.oppia.android.scripts.maven.model.MavenInstallJson import org.oppia.android.scripts.proto.License import org.oppia.android.scripts.proto.MavenDependency import org.oppia.android.scripts.proto.MavenDependencyList @@ -23,21 +27,18 @@ private const val MAVEN_PREFIX = "@maven//:" /** Helper to compile the third-party maven dependencies list for Oppia Android. */ class MavenDependenciesRetriever( private val rootPath: String, - private val licenseFetcher: LicenseFetcher, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() + private val mavenArtifactPropertyFetcher: MavenArtifactPropertyFetcher, + private val coroutineDispatcher: ScriptBackgroundCoroutineDispatcher, + private val commandExecutor: CommandExecutor ) { - - private val bazelClient by lazy { - initializeBazelClient(rootPath) - } + private val bazelClient by lazy { BazelClient(File(rootPath), commandExecutor) } + private val coroutineScope by lazy { CoroutineScope(coroutineDispatcher) } /** Returns the list of third-party dependency names per Bazel. */ fun retrieveThirdPartyMavenDependenciesList(): List { return bazelClient .retrieveThirdPartyMavenDepsListForBinary("//:oppia") - .map { dep -> - dep.removePrefix(MAVEN_PREFIX) - } + .map { it.removePrefix(MAVEN_PREFIX) } } /** @@ -159,11 +160,10 @@ class MavenDependenciesRetriever( // be invalid need further intervention. In this case, the developer needs to manually fill in // the license links for each of these dependencies. return mavenDependenciesList.filter { dependency -> - dependency.licenseList.isEmpty() || - dependency.licenseList.filter { license -> - license.verifiedLinkCase.equals(License.VerifiedLinkCase.VERIFIEDLINK_NOT_SET) && - license.isOriginalLinkInvalid - }.isNotEmpty() + dependency.licenseList.isEmpty() || dependency.licenseList.any { license -> + license.verifiedLinkCase.equals(License.VerifiedLinkCase.VERIFIEDLINK_NOT_SET) && + license.isOriginalLinkInvalid + } }.toSet() } @@ -180,24 +180,6 @@ class MavenDependenciesRetriever( ).mavenDependencyList } - /** - * Retrieves the list of [MavenListDependency]s such that each of these dependencies is present - * in maven_install.json and is also obtained from the Bazel query. - * - * @param pathToMavenInstall path to the maven_install.json file - * @param bazelQueryDepsNames list of dependency names generated from Bazel Query - * @return list of [MavenListDependency] - */ - fun getDependencyListFromMavenInstall( - pathToMavenInstall: String, - bazelQueryDepsNames: List - ): List { - val dependencyTree = retrieveDependencyTree(pathToMavenInstall) - return dependencyTree.mavenListDependencies.dependencyList.filter { dep -> - omitVersionAndReplaceColonsHyphensPeriods(dep.coord) in bazelQueryDepsNames - } - } - /** * Extracts the license names and license links of the dependencies from their corresponding POM * files. @@ -209,15 +191,13 @@ class MavenDependenciesRetriever( fun retrieveDependencyListFromPom( finalDependenciesList: List ): MavenDependencyList { - val mavenDependencyList = finalDependenciesList.map { it -> - // Remove ".jar" or ".aar" or any other extension from the specified url. - val pomFileUrl = "${it.url?.substringBeforeLast('.')}.pom" - val artifactName = it.coord - val artifactVersion = artifactName.substringAfterLast(':') - val pomFile = licenseFetcher.scrapeText(pomFileUrl) + val mavenDependencyList = finalDependenciesList.map { + val repoBaseUrl = it.repoUrls.firstOrNull() ?: error("No repo URL found for artifact: $it.") + val pomFileUrl = it.coord.computePomUrl(repoBaseUrl) + val pomFile = mavenArtifactPropertyFetcher.scrapeText(pomFileUrl) val mavenDependency = MavenDependency.newBuilder().apply { - this.artifactName = it.coord - this.artifactVersion = artifactVersion.toString() + this.artifactName = it.coord.reducedCoordinateString + this.artifactVersion = it.coord.version this.addAllLicense(extractLicenseLinksFromPom(pomFile)) } mavenDependency.build() @@ -233,14 +213,12 @@ class MavenDependenciesRetriever( * @return list of [MavenListDependency]s that contains the artifact name and a URL that is used * to obtain the URL of the POM file of the dependency */ - fun generateDependenciesListFromMavenInstall( + suspend fun generateDependenciesListFromMavenInstall( pathToMavenInstall: String, bazelQueryDepsNames: List ): List { - val dependencyTree = retrieveDependencyTree(pathToMavenInstall) - val mavenInstallDependencyList = dependencyTree.mavenListDependencies.dependencyList - return mavenInstallDependencyList.filter { dep -> - bazelQueryDepsNames.contains(omitVersionAndReplaceColonsHyphensPeriods(dep.coord)) + return computeMavenDependencies(pathToMavenInstall).filter { dep -> + dep.coord.bazelTarget in bazelQueryDepsNames } } @@ -260,13 +238,6 @@ class MavenDependenciesRetriever( }.build() as MavenDependencyList } - private fun omitVersionAndReplaceColonsHyphensPeriods(artifactName: String): String { - return artifactName.substring(0, artifactName.lastIndexOf(':')) - .replace('.', '_') - .replace(':', '_') - .replace('-', '_') - } - private fun extractLicenseLinksFromPom( pomText: String ): List { @@ -276,8 +247,8 @@ class MavenDependenciesRetriever( val doc = docBuilder.parse(InputSource(pomText.byteInputStream())) val licenses = doc.getElementsByTagName("license") - for (i in 0 until licenses.getLength()) { - if (licenses.item(0).getNodeType() == Node.ELEMENT_NODE) { + for (i in 0 until licenses.length) { + if (licenses.item(0).nodeType == Node.ELEMENT_NODE) { val element = licenses.item(i) as Element val licenseName = getNodeValue("name", element) val licenseLink = replaceHttpWithHttps(getNodeValue("url", element)) @@ -292,13 +263,45 @@ class MavenDependenciesRetriever( return licenseList } - private fun retrieveDependencyTree(pathToMavenInstall: String): MavenListDependencyTree { + private suspend fun computeMavenDependencies( + pathToMavenInstall: String + ): List { + val mavenInstallJson = parseMavenInstallJson(pathToMavenInstall) + val artifactPartialCoordToRepoUrls = + mavenInstallJson.repositories.entries.flatMap { (repoBaseUrl, arifactCoordStrs) -> + arifactCoordStrs.map { it to repoBaseUrl } + }.groupBy { (artifactCoordStr, _) -> + artifactCoordStr + }.mapValues { (_, coordUrlToRepoUrlPairs) -> coordUrlToRepoUrlPairs.map { it.second } } + + val coordToPossibleUrls = mavenInstallJson.artifacts.map { (partialCoord, artifact) -> + val coord = MavenCoordinate.parseFrom("$partialCoord:${artifact.version}") + return@map coord to artifactPartialCoordToRepoUrls.getValue(partialCoord) + } + val filteredCoordToPossibleUrls = coordToPossibleUrls.map { (coord, possibleUrls) -> + coroutineScope.async { + coord to possibleUrls.filter { + // Run blocking I/O operations on the I/O thread pool. + withContext(Dispatchers.IO) { + mavenArtifactPropertyFetcher.isValidArtifactFileUrl(coord.computeArtifactUrl(it)) + } + } + } + } + // Wait for all repo URL checks to finish (parallely). + return runBlocking { + filteredCoordToPossibleUrls.awaitAll().map { (coord, validRepoUrls) -> + MavenListDependency(coord, validRepoUrls) + } + } + } + + private fun parseMavenInstallJson(pathToMavenInstall: String): MavenInstallJson { val mavenInstallJsonText = File(pathToMavenInstall).inputStream().bufferedReader().use { it.readText() } - val moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build() - val adapter = moshi.adapter(MavenListDependencyTree::class.java) - return adapter.fromJson(mavenInstallJsonText) - ?: throw Exception("Failed to parse $pathToMavenInstall") + val moshi = Moshi.Builder().build() + val adapter = moshi.adapter(MavenInstallJson::class.java) + return adapter.fromJson(mavenInstallJsonText) ?: error("Failed to parse $pathToMavenInstall.") } private fun getNodeValue(tag: String, element: Element): String { @@ -306,10 +309,10 @@ class MavenDependenciesRetriever( val node = nodeList.item(0) if (node != null) { if (node.hasChildNodes()) { - val child = node.getFirstChild() + val child = node.firstChild while (child != null) { - if (child.getNodeType() === Node.TEXT_NODE) { - return child.getNodeValue() + if (child.nodeType == Node.TEXT_NODE) { + return child.nodeValue } } } @@ -317,13 +320,103 @@ class MavenDependenciesRetriever( return "" } - private fun replaceHttpWithHttps( - url: String - ): String { - return url.replaceFirst("http://", "https://") - } + private fun replaceHttpWithHttps(url: String): String = url.replaceFirst("http://", "https://") - private fun initializeBazelClient(rootPath: String): BazelClient { - return BazelClient(File(rootPath), commandExecutor) + /** + * Represents the coordinate to a unique Maven artifact, as defined by: + * https://maven.apache.org/repositories/artifacts.html. + * + * @property groupId the artifact's group (which is often the artifact author or maintainer) + * @property artifactId the unique ID for the artifact within its group + * @property version the artifact's version (which often uses SemVer) + * @property classifier the unique classifier of the coordinate, e.g. "sources", or null if none + * @property extension the optional extension of the artifact, or null if not specified + */ + data class MavenCoordinate( + val groupId: String, + val artifactId: String, + val version: String, + val classifier: String? = null, + val extension: String? = null + ) { + /** + * A reduced string representation of this coordinate that ignores any specified [classifier] or + * [extension]. + */ + val reducedCoordinateString: String get() = "$groupId:$artifactId:$version" + + /** + * A base computation of what the suffix of the Bazel target would look like for the artifact + * represented by this coordinate. Note that this is specifically the suffix of a Maven-imported + * artifact target and not one produced by Oppia (so they may look a bit different). + */ + val bazelTarget: String + get() = "${groupId.bazelifyCoordFragment()}_${artifactId.bazelifyCoordFragment()}" + + private val delimitedClassifierUrlFragment get() = classifier?.let { "-$it" } ?: "" + + /** + * Returns the downloadable URL for the main file of the artifact represented by this + * coordinate. + * + * Note that per https://maven.apache.org/repositories/artifacts.html the extension will assumed + * to be 'jar' if an [extension] hasn't been provided. + */ + fun computeArtifactUrl(baseRepoUrl: String): String = + computeArtifactFileUrl(baseRepoUrl, extension ?: "jar") + + /** + * Returns the downloadable URL for the POM file corresponding to the artifact represented by + * this coordinate. + * + * See https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#what-is-a-pom + * for more context on POM files. + */ + fun computePomUrl(baseRepoUrl: String): String = + computeArtifactFileUrl(baseRepoUrl, extension = "pom") + + private fun computeArtifactFileUrl(baseRepoUrl: String, extension: String): String { + return "${baseRepoUrl.removeSuffix("/")}/${groupId.replace('.', '/')}/$artifactId/$version" + + "/$artifactId-$version$delimitedClassifierUrlFragment.$extension" + } + + companion object { + /** + * Returns a new [MavenCoordinate] derived from the specified [coordinateString] with + * fragments defined by https://maven.apache.org/repositories/artifacts.html. + * + * Note that this function does not support 'baseVersion'-style versions and will treat such + * fragments as a whole 'version' piece. + */ + fun parseFrom(coordinateString: String): MavenCoordinate { + val components = coordinateString.split(':') + return when (components.size) { + 3 -> { + val (groupId, artifactId, version) = components + MavenCoordinate(groupId, artifactId, version) + } + 4 -> { + val (groupId, artifactId, extension, version) = components + MavenCoordinate(groupId, artifactId, version, extension = extension) + } + 5 -> { + val (groupId, artifactId, extension, classifier, version) = components + MavenCoordinate(groupId, artifactId, version, classifier, extension) + } + else -> error("Invalid Maven coordinate string: $coordinateString.") + } + } + + private fun String.bazelifyCoordFragment(): String = replace('.', '_').replace('-', '_') + } } + + /** + * Represents a single downloadable maven_install_json dependency. + * + * @property coord the [MavenCoordinate] of the dependency + * @property repoUrls a list of Maven repository URLs from which the dependency may be downloaded. + * Note that these repositories have been confirmed to include this specific dependency. + */ + data class MavenListDependency(val coord: MavenCoordinate, val repoUrls: List) } diff --git a/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel index 189bc4e2be9..f610d77cf41 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel @@ -10,6 +10,7 @@ kt_jvm_library( srcs = ["GenerateMavenDependenciesList.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ + "//scripts/src/java/org/oppia/android/scripts/common:script_background_coroutine_dispatcher", "//scripts/src/java/org/oppia/android/scripts/license:maven_dependencies_retriever", ], ) @@ -20,7 +21,7 @@ kt_jvm_library( srcs = ["RetrieveLicenseTexts.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ - "//scripts/src/java/org/oppia/android/scripts/license:license_fetcher", + "//scripts/src/java/org/oppia/android/scripts/license:maven_artifact_property_fetcher", "//scripts/src/java/org/oppia/android/scripts/license/model", "//scripts/src/java/org/oppia/android/scripts/maven/model", "//scripts/src/java/org/oppia/android/scripts/proto:maven_dependencies_java_proto", diff --git a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt index 8829a55a475..804c1939428 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt +++ b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt @@ -1,9 +1,11 @@ package org.oppia.android.scripts.maven +import kotlinx.coroutines.runBlocking import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl -import org.oppia.android.scripts.license.LicenseFetcher -import org.oppia.android.scripts.license.LicenseFetcherImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher +import org.oppia.android.scripts.license.MavenArtifactPropertyFetcher +import org.oppia.android.scripts.license.MavenArtifactPropertyFetcherImpl import org.oppia.android.scripts.license.MavenDependenciesRetriever import org.oppia.android.scripts.proto.MavenDependencyList @@ -27,12 +29,12 @@ import org.oppia.android.scripts.proto.MavenDependencyList * scripts/assets/maven_dependencies.pb */ fun main(args: Array) { - GenerateMavenDependenciesList(LicenseFetcherImpl()).main(args) + GenerateMavenDependenciesList(MavenArtifactPropertyFetcherImpl()).main(args) } /** Wrapper class to pass dependencies to be utilized by the the main method. */ class GenerateMavenDependenciesList( - private val licenseFetcher: LicenseFetcher, + private val mavenArtifactPropertyFetcher: MavenArtifactPropertyFetcher, private val commandExecutor: CommandExecutor = CommandExecutorImpl() ) { /** @@ -47,46 +49,68 @@ class GenerateMavenDependenciesList( val pathToMavenInstallJson = "$pathToRoot/${args[1]}" val pathToMavenDependenciesTextProto = "$pathToRoot/${args[2]}" val pathToMavenDependenciesPb = args[3] + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + runBlocking { + generateDependenciesList( + pathToRoot, + pathToMavenInstallJson, + pathToMavenDependenciesTextProto, + pathToMavenDependenciesPb, + scriptBgDispatcher + ) + } + } + } - val MavenDependenciesRetriever = MavenDependenciesRetriever(pathToRoot, licenseFetcher) + private suspend fun generateDependenciesList( + pathToRoot: String, + pathToMavenInstallJson: String, + pathToMavenDependenciesTextProto: String, + pathToMavenDependenciesPb: String, + scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher + ) { + val retriever = + MavenDependenciesRetriever( + pathToRoot, mavenArtifactPropertyFetcher, scriptBgDispatcher, commandExecutor + ) val bazelQueryDepsList = - MavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() - val mavenInstallDepsList = MavenDependenciesRetriever.getDependencyListFromMavenInstall( + retriever.retrieveThirdPartyMavenDependenciesList() + val mavenInstallDepsList = retriever.generateDependenciesListFromMavenInstall( pathToMavenInstallJson, bazelQueryDepsList ) val dependenciesListFromPom = - MavenDependenciesRetriever + retriever .retrieveDependencyListFromPom(mavenInstallDepsList) .mavenDependencyList val dependenciesListFromTextProto = - MavenDependenciesRetriever.retrieveMavenDependencyList(pathToMavenDependenciesPb) + retriever.retrieveMavenDependencyList(pathToMavenDependenciesPb) - val updatedDependenciesList = MavenDependenciesRetriever.addChangesFromTextProto( + val updatedDependenciesList = retriever.addChangesFromTextProto( dependenciesListFromPom, dependenciesListFromTextProto ) val manuallyUpdatedLicenses = - MavenDependenciesRetriever.retrieveManuallyUpdatedLicensesSet(updatedDependenciesList) + retriever.retrieveManuallyUpdatedLicensesSet(updatedDependenciesList) - val finalDependenciesList = MavenDependenciesRetriever.updateMavenDependenciesList( + val finalDependenciesList = retriever.updateMavenDependenciesList( updatedDependenciesList, manuallyUpdatedLicenses ) - MavenDependenciesRetriever.writeTextProto( + retriever.writeTextProto( pathToMavenDependenciesTextProto, MavenDependencyList.newBuilder().addAllMavenDependency(finalDependenciesList).build() ) val licensesToBeFixed = - MavenDependenciesRetriever.getAllBrokenLicenses(finalDependenciesList) + retriever.getAllBrokenLicenses(finalDependenciesList) if (licensesToBeFixed.isNotEmpty()) { - val licenseToDependencyMap = MavenDependenciesRetriever + val licenseToDependencyMap = retriever .findFirstDependenciesWithBrokenLicenses( finalDependenciesList, licensesToBeFixed @@ -150,7 +174,7 @@ class GenerateMavenDependenciesList( } val dependenciesWithoutAnyLinks = - MavenDependenciesRetriever.getDependenciesThatNeedIntervention(finalDependenciesList) + retriever.getDependenciesThatNeedIntervention(finalDependenciesList) if (dependenciesWithoutAnyLinks.isNotEmpty()) { println( """ @@ -184,6 +208,6 @@ class GenerateMavenDependenciesList( } throw Exception("License links are invalid or not available for some dependencies") } - println("\nScript executed succesfully: maven_dependencies.textproto updated successfully.") + println("\nScript executed successfully: maven_dependencies.textproto updated successfully.") } } diff --git a/scripts/src/java/org/oppia/android/scripts/maven/RetrieveLicenseTexts.kt b/scripts/src/java/org/oppia/android/scripts/maven/RetrieveLicenseTexts.kt index 7b7e46cd035..b6f29bc58f0 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/RetrieveLicenseTexts.kt +++ b/scripts/src/java/org/oppia/android/scripts/maven/RetrieveLicenseTexts.kt @@ -1,7 +1,7 @@ package org.oppia.android.scripts.maven -import org.oppia.android.scripts.license.LicenseFetcher -import org.oppia.android.scripts.license.LicenseFetcherImpl +import org.oppia.android.scripts.license.MavenArtifactPropertyFetcher +import org.oppia.android.scripts.license.MavenArtifactPropertyFetcherImpl import org.oppia.android.scripts.license.model.CopyrightLicense import org.oppia.android.scripts.license.model.Dependency import org.oppia.android.scripts.proto.License @@ -42,7 +42,7 @@ const val MAX_LICENSE_LENGTH = 16383 * scripts/assets/maven_dependencies.pb */ fun main(args: Array) { - RetrieveLicenseTexts(LicenseFetcherImpl()).main(args) + RetrieveLicenseTexts(MavenArtifactPropertyFetcherImpl()).main(args) } /** @@ -50,7 +50,7 @@ fun main(args: Array) { * texts of the dependencies. */ class RetrieveLicenseTexts( - private val licenseFetcher: LicenseFetcher + private val mavenArtifactPropertyFetcher: MavenArtifactPropertyFetcher ) { /** Generates a resource xml file that contains license texts of the third-party dependencies. */ @@ -394,7 +394,7 @@ class RetrieveLicenseTexts( } private fun fetchLicenseText(url: String): String { - return licenseFetcher.scrapeText(url) + return mavenArtifactPropertyFetcher.scrapeText(url) } private fun omitVersion(artifactName: String): String { diff --git a/scripts/src/java/org/oppia/android/scripts/maven/model/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/maven/model/BUILD.bazel index 3bc304442f6..39107193490 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/model/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/maven/model/BUILD.bazel @@ -8,9 +8,8 @@ kt_jvm_library( name = "model", testonly = True, srcs = [ - "MavenListDependencies.kt", - "MavenListDependency.kt", - "MavenListDependencyTree.kt", + "MavenArtifact.kt", + "MavenInstallJson.kt", ], visibility = ["//scripts:oppia_script_library_visibility"], deps = ["//third_party:moshi"], diff --git a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenArtifact.kt b/scripts/src/java/org/oppia/android/scripts/maven/model/MavenArtifact.kt new file mode 100644 index 00000000000..82144e0972a --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/maven/model/MavenArtifact.kt @@ -0,0 +1,12 @@ +package org.oppia.android.scripts.maven.model + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * Represents a single artifact contained within a maven_install_json file. + * + * @property version the self-reported version of the artifact + */ +@JsonClass(generateAdapter = true) +data class MavenArtifact(@Json(name = "version") val version: String) diff --git a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenInstallJson.kt b/scripts/src/java/org/oppia/android/scripts/maven/model/MavenInstallJson.kt new file mode 100644 index 00000000000..9b78a4a483a --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/maven/model/MavenInstallJson.kt @@ -0,0 +1,16 @@ +package org.oppia.android.scripts.maven.model + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +/** + * Represents a parsable a maven_install_json file. + * + * @property artifacts a map of artifact coordinate to [MavenArtifact] + * @property repositories a map of repository URL to a list of [MavenArtifact] coordinates + */ +@JsonClass(generateAdapter = true) +data class MavenInstallJson( + @Json(name = "artifacts") val artifacts: Map, + @Json(name = "repositories") val repositories: Map> +) diff --git a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencies.kt b/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencies.kt deleted file mode 100644 index 7ed67a25bd5..00000000000 --- a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencies.kt +++ /dev/null @@ -1,19 +0,0 @@ -package org.oppia.android.scripts.maven.model - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -/** - * Data class that stores the list of dependencies present in `dependencies` array in - * maven_install.json. - */ -@JsonClass(generateAdapter = true) -data class MavenListDependencies( - /** - * The list of dependencies parsed from the maven_install.json file where each dependency - * would contain the full name of the dependency, and a url that refers to the .aar or - * .jar file of the dependency. This url can also take us to the POM file of the dependency - * by just repplacing the extension in the url to .pom. - */ - @Json(name = "dependencies") val dependencyList: List -) diff --git a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependency.kt b/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependency.kt deleted file mode 100644 index bd00c0687ca..00000000000 --- a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependency.kt +++ /dev/null @@ -1,17 +0,0 @@ -package org.oppia.android.scripts.maven.model - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -/** - * Data class that contains all the details relevant to a dependency that is present in - * maven_install.json. - */ -@JsonClass(generateAdapter = true) -data class MavenListDependency( - /** The name of the maven dependency. */ - @Json(name = "coord") val coord: String, - - /** The url that points to the .jar or .aar file of the dependeny. */ - @Json(name = "url") val url: String? -) diff --git a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencyTree.kt b/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencyTree.kt deleted file mode 100644 index ca6b8b080fa..00000000000 --- a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenListDependencyTree.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.oppia.android.scripts.maven.model - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -/** Data class to parse the list of maven dependencies from maven_install.json. */ -@JsonClass(generateAdapter = true) -data class MavenListDependencyTree( - /** - * Parses the `dependeny_tree` key of the maven_install.json file that maps to an array of - * maven dependencies. - */ - @Json(name = "dependency_tree") val mavenListDependencies: MavenListDependencies -) diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel index e47fc741ab6..bd1ef437389 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel @@ -60,3 +60,14 @@ kt_jvm_test( "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) + +kt_jvm_test( + name = "ScriptBackgroundCoroutineDispatcherTest", + srcs = ["ScriptBackgroundCoroutineDispatcherTest.kt"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/common:script_background_coroutine_dispatcher", + "//testing:assertion_helpers", + "//third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//third_party:org_mockito_mockito-core", + ], +) diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt new file mode 100644 index 00000000000..dce99691bcb --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt @@ -0,0 +1,79 @@ +package org.oppia.android.scripts.common + +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.async +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import org.junit.Rule +import org.junit.Test +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule +import org.oppia.android.testing.assertThrows +import java.util.concurrent.TimeUnit + +/** Tests for [ScriptBackgroundCoroutineDispatcher]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +class ScriptBackgroundCoroutineDispatcherTest { + @field:[Rule JvmField] val mockitoRule: MockitoRule = MockitoJUnit.rule() + + @Mock lateinit var mockRunnable: Runnable + + @Test + fun testDispatchTask_taskIsRun() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + + runBlocking { withContext(dispatcher) { mockRunnable.run() } } + + verify(mockRunnable).run() + } + + @Test + fun testClose_noExceptionThrown() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + + dispatcher.close() + + // The verification is that no exception is thrown (otherwise the test should fail). + } + + @Test + fun testDispatch_afterClosing_throwsException() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + dispatcher.close() + + // The task should fail to schedule since the dispatcher has been closed. + assertThrows(CancellationException::class) { + runBlocking { withContext(dispatcher) { mockRunnable.run() } } + } + } + + @Test + fun testClose_pendingTaskLongerThanCloseTimeout_taskIsNotRun() { + val dispatcher = + ScriptBackgroundCoroutineDispatcher( + closeTimeout = 50L, closeTimeoutUnit = TimeUnit.MILLISECONDS + ) + val taskStartedChannel = Channel() + // Schedule a task but make sure that the attempt to close the dispatcher happens exactly + // between the task starting and ending (to verify close timeout flows). + @Suppress("DeferredResultUnused") + CoroutineScope(dispatcher).async { + taskStartedChannel.send(true) + delay(1_000L) + mockRunnable.run() + } + runBlocking { taskStartedChannel.receive() } + + dispatcher.close() + + // The task should not have run since it was cancelled, but no exception will be thrown. + verifyNoMoreInteractions(mockRunnable) + } +} diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel index 707ec3e8081..ade58a2cca8 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel @@ -36,6 +36,7 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/license:maven_dependencies_retriever", "//scripts/src/java/org/oppia/android/scripts/testing:test_bazel_workspace", + "//testing:assertion_helpers", "//third_party:com_google_truth_truth", "//third_party:org_jetbrains_kotlin_kotlin-test-junit", "//third_party:org_mockito_kotlin_mockito-kotlin", diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt index f30b261f53a..9a43bf256f9 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt @@ -24,65 +24,13 @@ import java.io.PrintStream import java.util.concurrent.TimeUnit /** Tests for [MavenDependenciesListCheck]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") class MavenDependenciesListCheckTest { - - private val DATA_BINDING_DEP = "androidx.databinding:databinding-adapters:3.4.2" - private val PROTO_LITE_DEP = "com.google.protobuf:protobuf-lite:3.0.0" - private val GLIDE_DEP = - "com.github.bumptech.glide:annotations:4.11.0" - private val FIREBASE_ANALYTICS_DEP = "com.google.firebase:firebase-analytics:17.5.0" - private val IO_FABRIC_DEP = "io.fabric.sdk.android:fabric:1.4.7" - private val FIREBASE_ANALYTICS_UPGRADED_DEP = - "com.google.firebase:firebase-analytics:19.0.0" - - private val DATA_BINDING_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:androidx_databinding_databinding-adapters" - private val PROTO_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:com_google_protobuf_protobuf-javalite" - private val GLIDE_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:com_github_bumptech_glide_annotations" - private val FIREBASE_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:com_google_firebase_firebase-analytics" - private val IO_FABRIC_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:io_fabric_sdk_android_fabric" - - private val DATA_BINDING_VERSION = "3.4.2" - private val PROTO_LITE_VERSION = "3.0.0" - private val GLIDE_ANNOTATIONS_VERSION = "4.11.0" - private val FIREBASE_ANALYTICS_VERSION = "17.5.0" - private val FIREBASE_ANALYTICS_UPGRADED_VERSION = "19.0.0" - private val IO_FABRIC_VERSION = "1.4.7" - - private val DATA_BINDING_POM = "https://maven.google.com/androidx/databinding/databinding-" + - "adapters/$DATA_BINDING_VERSION/databinding-adapters-$DATA_BINDING_VERSION.pom" - private val PROTO_LITE_POM = "https://repo1.maven.org/maven2/com/google/protobuf/protobuf" + - "-lite/$PROTO_LITE_VERSION/protobuf-lite-$PROTO_LITE_VERSION.pom" - private val IO_FABRIC_POM = "https://maven.google.com/io/fabric/sdk/android/fabric/" + - "$IO_FABRIC_VERSION/fabric-$IO_FABRIC_VERSION.pom" - private val GLIDE_ANNOTATIONS_POM = "https://repo1.maven.org/maven2/com/github/bumptech/glide" + - "/annotations/$GLIDE_ANNOTATIONS_VERSION/annotations-$GLIDE_ANNOTATIONS_VERSION.pom" - private val FIREBASE_ANALYTICS_POM = "https://maven.google.com/com/google/firebase/firebase-" + - "analytics/$FIREBASE_ANALYTICS_VERSION/firebase-analytics-$FIREBASE_ANALYTICS_VERSION.pom" - private val UPGRADED_FIREBASE_ANALYTICS_POM = "https://maven.google.com/com/google/firebase/" + - "firebase-analytics/$FIREBASE_ANALYTICS_UPGRADED_VERSION/firebase-analytics-" + - "$FIREBASE_ANALYTICS_UPGRADED_VERSION.pom" - - private val SCRIPT_PASSED_MESSAGE = - "maven_dependencies.textproto is up-to-date." - private val MISSING_DEPENDENCIES_ONLY_FAILURE = - "Missing dependencies in maven_dependencies.textproto" - private val REDUNDANT_DEPENDENCIES_ONLY_FAILURE = - "Redundant dependencies in maven_dependencies.textproto" - private val MISSING_AND_REDUNDANT_DEPENDENCIES_FAILURE = - "Redundant and missing dependencies in maven_dependencies.textproto" - private val LICENSE_DETAILS_INCOMPLETE_FAILURE = "Licenses details are not completed" - private val UNAVAILABLE_OR_INVALID_LICENSE_LINKS_FAILURE = - "License links are invalid or not available for some dependencies" - private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out - private val mockLicenseFetcher by lazy { initializeLicenseFetcher() } + private val mockArtifactPropertyFetcher by lazy { initializeArtifactPropertyFetcher() } private val commandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } private lateinit var testBazelWorkspace: TestBazelWorkspace @@ -112,7 +60,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -188,7 +136,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -252,7 +200,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -328,7 +276,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -407,7 +355,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -483,7 +431,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -561,7 +509,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -639,7 +587,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -719,7 +667,7 @@ class MavenDependenciesListCheckTest { setUpBazelEnvironment(coordsList) MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -772,7 +720,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -821,7 +769,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -876,7 +824,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -891,7 +839,7 @@ class MavenDependenciesListCheckTest { private fun setUpBazelEnvironment(coordsList: List) { val mavenInstallJson = tempFolder.newFile("scripts/assets/maven_install.json") - writeMavenInstallJson(mavenInstallJson) + writeMavenInstallJson(mavenInstallJson, FIREBASE_ANALYTICS_VERSION) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal(coordsList) val thirdPartyPrefixCoordList = coordsList.map { coordinate -> when (coordinate) { @@ -909,11 +857,7 @@ class MavenDependenciesListCheckTest { private fun setUpBazelEnvironmentWithUpdatedFirebaseDependency(coordsList: List) { val mavenInstallJson = tempFolder.newFile("scripts/assets/maven_install.json") - writeMavenInstallJson( - mavenInstallJsonFile = mavenInstallJson, - firebaseAnalyticsCoord = FIREBASE_ANALYTICS_UPGRADED_DEP, - firebaseAnalayticsPom = UPGRADED_FIREBASE_ANALYTICS_POM - ) + writeMavenInstallJson(mavenInstallJson, FIREBASE_ANALYTICS_UPGRADED_VERSION) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal(coordsList) val thirdPartyPrefixCoordList = coordsList.map { coordinate -> when (coordinate) { @@ -986,36 +930,36 @@ class MavenDependenciesListCheckTest { } /** Helper function to write a fake maven_install.json file. */ - private fun writeMavenInstallJson( - mavenInstallJsonFile: File, - firebaseAnalyticsCoord: String = FIREBASE_ANALYTICS_DEP, - firebaseAnalayticsPom: String = FIREBASE_ANALYTICS_POM - ) { + private fun writeMavenInstallJson(mavenInstallJsonFile: File, firebaseAnalyticsVersion: String) { mavenInstallJsonFile.writeText( """ { - "dependency_tree": { - "dependencies": [ - { - "coord": "androidx.databinding:databinding-adapters:3.4.2", - "url": "${DATA_BINDING_POM.dropLast(3)}aar" - }, - { - "coord": "com.github.bumptech.glide:annotations:4.11.0", - "url": "${GLIDE_ANNOTATIONS_POM.dropLast(3)}jar" - }, - { - "coord": "$firebaseAnalyticsCoord", - "url": "${firebaseAnalayticsPom.dropLast(3)}aar" - }, - { - "coord": "com.google.protobuf:protobuf-lite:3.0.0", - "url": "${PROTO_LITE_POM.dropLast(3)}jar" - }, - { - "coord": "io.fabric.sdk.android:fabric:1.4.7", - "url": "${IO_FABRIC_POM.dropLast(3)}aar" - } + "artifacts": { + "androidx.databinding:databinding-adapters": { + "version": "3.4.2" + }, + "com.github.bumptech.glide:annotations": { + "version": "4.11.0" + }, + "com.google.firebase:firebase-analytics": { + "version": "$firebaseAnalyticsVersion" + }, + "com.google.protobuf:protobuf-lite": { + "version": "3.0.0" + }, + "io.fabric.sdk.android:fabric": { + "version": "1.4.7" + } + }, + "repositories": { + "$GOOGLE_MAVEN_URL": [ + "androidx.databinding:databinding-adapters", + "com.google.firebase:firebase-analytics", + "io.fabric.sdk.android:fabric" + ], + "$PUBLIC_MAVEN_URL": [ + "com.github.bumptech.glide:annotations", + "com.google.protobuf:protobuf-lite" ] } } @@ -1027,10 +971,10 @@ class MavenDependenciesListCheckTest { return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) } - /** Returns a mock for the [LicenseFetcher]. */ - private fun initializeLicenseFetcher(): LicenseFetcher { - return mock { - on { scrapeText(eq(DATA_BINDING_POM)) } + /** Returns a mock for the [MavenArtifactPropertyFetcher]. */ + private fun initializeArtifactPropertyFetcher(): MavenArtifactPropertyFetcher { + return mock { + on { scrapeText(eq(DATA_BINDING_POM_URL)) } .doReturn( """ @@ -1043,7 +987,7 @@ class MavenDependenciesListCheckTest { """.trimIndent() ) - on { scrapeText(eq(GLIDE_ANNOTATIONS_POM)) } + on { scrapeText(eq(GLIDE_ANNOTATIONS_POM_URL)) } .doReturn( """ @@ -1061,7 +1005,7 @@ class MavenDependenciesListCheckTest { """.trimIndent() ) - on { scrapeText(eq(FIREBASE_ANALYTICS_POM)) } + on { scrapeText(eq(FIREBASE_ANALYTICS_POM_URL)) } .doReturn( """ @@ -1074,7 +1018,7 @@ class MavenDependenciesListCheckTest { """.trimIndent() ) - on { scrapeText(eq(UPGRADED_FIREBASE_ANALYTICS_POM)) } + on { scrapeText(eq(UPGRADED_FIREBASE_ANALYTICS_POM_URL)) } .doReturn( """ @@ -1087,7 +1031,7 @@ class MavenDependenciesListCheckTest { """.trimIndent() ) - on { scrapeText(eq(IO_FABRIC_POM)) } + on { scrapeText(eq(IO_FABRIC_POM_URL)) } .doReturn( """ @@ -1100,13 +1044,99 @@ class MavenDependenciesListCheckTest { """.trimIndent() ) - on { scrapeText(eq(PROTO_LITE_POM)) } + on { scrapeText(eq(PROTO_LITE_POM_URL)) } .doReturn( """ Random Project """.trimIndent() ) + on { isValidArtifactFileUrl(eq(DATA_BINDING_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(PROTO_LITE_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(IO_FABRIC_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(GLIDE_ANNOTATIONS_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(FIREBASE_ANALYTICS_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(UPGRADED_FIREBASE_ANALYTICS_ARTIFACT_URL)) }.thenReturn(true) } } + + private companion object { + private const val DATA_BINDING_DEP = "androidx.databinding:databinding-adapters:3.4.2" + private const val PROTO_LITE_DEP = "com.google.protobuf:protobuf-lite:3.0.0" + private const val GLIDE_DEP = "com.github.bumptech.glide:annotations:4.11.0" + private const val FIREBASE_ANALYTICS_DEP = "com.google.firebase:firebase-analytics:17.5.0" + private const val IO_FABRIC_DEP = "io.fabric.sdk.android:fabric:1.4.7" + private const val FIREBASE_ANALYTICS_UPGRADED_DEP = + "com.google.firebase:firebase-analytics:19.0.0" + + private const val DATA_BINDING_DEP_WITH_THIRD_PARTY_PREFIX = + "//third_party:androidx_databinding_databinding-adapters" + private const val PROTO_DEP_WITH_THIRD_PARTY_PREFIX = + "//third_party:com_google_protobuf_protobuf-javalite" + private const val GLIDE_DEP_WITH_THIRD_PARTY_PREFIX = + "//third_party:com_github_bumptech_glide_annotations" + private const val FIREBASE_DEP_WITH_THIRD_PARTY_PREFIX = + "//third_party:com_google_firebase_firebase-analytics" + private const val IO_FABRIC_DEP_WITH_THIRD_PARTY_PREFIX = + "//third_party:io_fabric_sdk_android_fabric" + + private const val GOOGLE_MAVEN_URL = "https://maven.google.com" + private const val PUBLIC_MAVEN_URL = "https://repo1.maven.org/maven2" + + private const val DATA_BINDING_VERSION = "3.4.2" + private const val DATA_BINDING_BASE_URL = + "$GOOGLE_MAVEN_URL/androidx/databinding/databinding-adapters" + + "/$DATA_BINDING_VERSION/databinding-adapters-$DATA_BINDING_VERSION" + private const val DATA_BINDING_ARTIFACT_URL = "$DATA_BINDING_BASE_URL.jar" + private const val DATA_BINDING_POM_URL = "$DATA_BINDING_BASE_URL.pom" + + private const val PROTO_LITE_VERSION = "3.0.0" + private const val PROTO_LITE_BASE_URL = + "$PUBLIC_MAVEN_URL/com/google/protobuf/protobuf-lite/$PROTO_LITE_VERSION" + + "/protobuf-lite-$PROTO_LITE_VERSION" + private const val PROTO_LITE_POM_URL = "$PROTO_LITE_BASE_URL.pom" + private const val PROTO_LITE_ARTIFACT_URL = "$PROTO_LITE_BASE_URL.jar" + + private const val IO_FABRIC_VERSION = "1.4.7" + private const val IO_FABRIC_BASE_URL = + "$GOOGLE_MAVEN_URL/io/fabric/sdk/android/fabric/$IO_FABRIC_VERSION/fabric-$IO_FABRIC_VERSION" + private const val IO_FABRIC_POM_URL = "$IO_FABRIC_BASE_URL.pom" + private const val IO_FABRIC_ARTIFACT_URL = "$IO_FABRIC_BASE_URL.jar" + + private const val GLIDE_ANNOTATIONS_VERSION = "4.11.0" + private const val GLIDE_ANNOTATIONS_BASE_URL = + "$PUBLIC_MAVEN_URL/com/github/bumptech/glide/annotations/$GLIDE_ANNOTATIONS_VERSION" + + "/annotations-$GLIDE_ANNOTATIONS_VERSION" + private const val GLIDE_ANNOTATIONS_POM_URL = "$GLIDE_ANNOTATIONS_BASE_URL.pom" + private const val GLIDE_ANNOTATIONS_ARTIFACT_URL = "$GLIDE_ANNOTATIONS_BASE_URL.jar" + + private const val FIREBASE_ANALYTICS_VERSION = "17.5.0" + private const val FIREBASE_ANALYTICS_BASE_URL = + "$GOOGLE_MAVEN_URL/com/google/firebase/firebase-analytics/$FIREBASE_ANALYTICS_VERSION" + + "/firebase-analytics-$FIREBASE_ANALYTICS_VERSION" + private const val FIREBASE_ANALYTICS_POM_URL = "$FIREBASE_ANALYTICS_BASE_URL.pom" + private const val FIREBASE_ANALYTICS_ARTIFACT_URL = "$FIREBASE_ANALYTICS_BASE_URL.jar" + + private const val FIREBASE_ANALYTICS_UPGRADED_VERSION = "19.0.0" + private const val UPGRADED_FIREBASE_ANALYTICS_BASE_URL = + "$GOOGLE_MAVEN_URL/com/google/firebase/firebase-analytics" + + "/$FIREBASE_ANALYTICS_UPGRADED_VERSION" + + "/firebase-analytics-$FIREBASE_ANALYTICS_UPGRADED_VERSION" + private const val UPGRADED_FIREBASE_ANALYTICS_POM_URL = + "$UPGRADED_FIREBASE_ANALYTICS_BASE_URL.pom" + private const val UPGRADED_FIREBASE_ANALYTICS_ARTIFACT_URL = + "$UPGRADED_FIREBASE_ANALYTICS_BASE_URL.jar" + + private const val SCRIPT_PASSED_MESSAGE = + "maven_dependencies.textproto is up-to-date." + private const val MISSING_DEPENDENCIES_ONLY_FAILURE = + "Missing dependencies in maven_dependencies.textproto" + private const val REDUNDANT_DEPENDENCIES_ONLY_FAILURE = + "Redundant dependencies in maven_dependencies.textproto" + private const val MISSING_AND_REDUNDANT_DEPENDENCIES_FAILURE = + "Redundant and missing dependencies in maven_dependencies.textproto" + private const val LICENSE_DETAILS_INCOMPLETE_FAILURE = "Licenses details are not completed" + private const val UNAVAILABLE_OR_INVALID_LICENSE_LINKS_FAILURE = + "License links are invalid or not available for some dependencies" + } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt index 5dd8baec8b3..2921b6220ed 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt @@ -2,6 +2,7 @@ package org.oppia.android.scripts.license import com.google.common.truth.Truth.assertThat import com.google.protobuf.TextFormat +import kotlinx.coroutines.runBlocking import org.junit.After import org.junit.Before import org.junit.Rule @@ -11,7 +12,8 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl -import org.oppia.android.scripts.maven.model.MavenListDependency +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher +import org.oppia.android.scripts.license.MavenDependenciesRetriever.MavenListDependency import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink import org.oppia.android.scripts.proto.License @@ -19,68 +21,23 @@ import org.oppia.android.scripts.proto.MavenDependency import org.oppia.android.scripts.proto.MavenDependencyList import org.oppia.android.scripts.proto.ScrapableLink import org.oppia.android.scripts.testing.TestBazelWorkspace +import org.oppia.android.testing.assertThrows import java.io.ByteArrayOutputStream import java.io.File import java.io.PrintStream import java.util.concurrent.TimeUnit /** Tests for [MavenDependenciesRetriever]. */ +// FunctionName: test names are conventionally named with underscores. +// SameParameterValue: tests should have specific context included/excluded for readability. +@Suppress("FunctionName", "SameParameterValue") class MavenDependenciesRetrieverTest { - - private val DEP_WITH_SCRAPABLE_LICENSE = "androidx.databinding:databinding-adapters:3.4.2" - private val DEP_WITH_NO_LICENSE = "com.google.protobuf:protobuf-lite:3.0.0" - private val DEP_WITH_SCRAPABLE_AND_EXTRACTED_COPY_LICENSES = - "com.github.bumptech.glide:annotations:4.11.0" - private val DEP_WITH_DIRECT_LINK_ONLY_LICENSE = "com.google.firebase:firebase-analytics:17.5.0" - private val DEP_WITH_INVALID_LINKS = "io.fabric.sdk.android:fabric:1.4.7" - - private val DATA_BINDING_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:androidx_databinding_databinding-adapters" - private val PROTO_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:com_google_protobuf_protobuf-javalite" - private val GLIDE_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:com_github_bumptech_glide_annotations" - private val FIREBASE_DEP_WITH_THIRD_PARTY_PREFIX = - "//third_party:com_google_firebase_firebase-analytics" - private val IO_FABRIC_DEP_WITH_THIRD_PARTY_PREFIX = "//third_party:io_fabric_sdk_android_fabric" - - private val DATA_BINDING_DEP = "androidx_databinding_databinding_adapters" - private val PROTO_DEP = "com_google_protobuf_protobuf_lite" - private val GLIDE_DEP = "com_github_bumptech_glide_annotations" - private val FIREBASE_DEP = "com_google_firebase_firebase_analytics" - private val IO_FABRIC_DEP = "io_fabric_sdk_android_fabric" - - private val DATA_BINDING_VERSION = "3.4.2" - private val PROTO_LITE_VERSION = "3.0.0" - private val GLIDE_ANNOTATIONS_VERSION = "4.11.0" - private val FIREBASE_ANALYTICS_VERSION = "17.5.0" - private val IO_FABRIC_VERSION = "1.4.7" - - private val DATA_BINDING_POM = "https://maven.google.com/androidx/databinding/databinding-" + - "adapters/$DATA_BINDING_VERSION/databinding-adapters-$DATA_BINDING_VERSION.pom" - private val PROTO_LITE_POM = "https://repo1.maven.org/maven2/com/google/protobuf/protobuf" + - "-lite/$PROTO_LITE_VERSION/protobuf-lite-$PROTO_LITE_VERSION.pom" - private val IO_FABRIC_POM = "https://maven.google.com/io/fabric/sdk/android/fabric/" + - "$IO_FABRIC_VERSION/fabric-$IO_FABRIC_VERSION.pom" - private val GLIDE_ANNOTATIONS_POM = "https://repo1.maven.org/maven2/com/github/bumptech/glide" + - "/annotations/$GLIDE_ANNOTATIONS_VERSION/annotations-$GLIDE_ANNOTATIONS_VERSION.pom" - private val FIREBASE_ANALYTICS_POM = "https://maven.google.com/com/google/firebase/firebase-" + - "analytics/$FIREBASE_ANALYTICS_VERSION/firebase-analytics-$FIREBASE_ANALYTICS_VERSION.pom" - - private val LICENSE_DETAILS_INCOMPLETE_FAILURE = "Licenses details are not completed" - private val UNAVAILABLE_OR_INVALID_LICENSE_LINKS_FAILURE = - "License links are invalid or not available for some dependencies" - private val SCRIPT_PASSED_MESSAGE = - "Script executed succesfully: maven_dependencies.textproto updated successfully." - private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out - private val mockLicenseFetcher by lazy { initializeLicenseFetcher() } + private val mockArtifactPropertyFetcher by lazy { initializeArtifactPropertyFetcher() } private val commandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } - private val mavenDependenciesRetriever by lazy { - initializeMavenDependenciesRetriever() - } + private val mavenDependenciesRetriever by lazy { initializeMavenDependenciesRetriever() } private lateinit var testBazelWorkspace: TestBazelWorkspace @@ -239,11 +196,10 @@ class MavenDependenciesRetrieverTest { this.addAllLicense(listOf(license2)) }.build() ) - val updatedMavenDependenciesList = mavenDependenciesList val finalDepsList = mavenDependenciesRetriever.addChangesFromTextProto( - mavenDependenciesList, - updatedMavenDependenciesList + dependencyListFromPom = mavenDependenciesList, + dependencyListFromProto = mavenDependenciesList ) assertThat(finalDepsList).hasSize(2) assertIsDependency( @@ -428,10 +384,10 @@ class MavenDependenciesRetrieverTest { }.build() ) - val finalDepsList = mavenDependenciesRetriever.updateMavenDependenciesList( - mavenDependenciesList, - setOf() - ) + val finalDepsList = + mavenDependenciesRetriever.updateMavenDependenciesList( + mavenDependenciesList, manuallyUpdatedLicenses = setOf() + ) assertThat(finalDepsList).isEqualTo(mavenDependenciesList) } @@ -711,8 +667,7 @@ class MavenDependenciesRetrieverTest { val licenseToDepNameMap = mavenDependenciesRetriever.findFirstDependenciesWithBrokenLicenses( - mavenDependenciesList, - setOf() + mavenDependenciesList, brokenLicenses = setOf() ) assertThat(licenseToDepNameMap).isEmpty() } @@ -927,11 +882,14 @@ class MavenDependenciesRetrieverTest { fun testGetDepListFromMavenInstall_emptyBazelQueryDepsList_returnsEmptyDepList() { val mavenInstallFile = tempFolder.newFile("third_party/maven_install.json") writeMavenInstallJson(mavenInstallFile) - val mavenListDependencies = mavenDependenciesRetriever - .generateDependenciesListFromMavenInstall( + + val mavenListDependencies = runBlocking { + mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( "${tempFolder.root}/third_party/maven_install.json", listOf() ) + } + assertThat(mavenListDependencies).isEmpty() } @@ -939,19 +897,22 @@ class MavenDependenciesRetrieverTest { fun testGetDepListFromMavenInstall_commonBazelQueryDepsList_returnsCorrectDepsList() { val mavenInstallFile = tempFolder.newFile("third_party/maven_install.json") writeMavenInstallJson(mavenInstallFile) - val mavenListDependencies = mavenDependenciesRetriever - .generateDependenciesListFromMavenInstall( + + val mavenListDependencies = runBlocking { + mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( "${tempFolder.root}/third_party/maven_install.json", listOf(DATA_BINDING_DEP, FIREBASE_DEP) ) + } + assertThat(mavenListDependencies).containsExactly( MavenListDependency( - coord = DEP_WITH_SCRAPABLE_LICENSE, - url = "${DATA_BINDING_POM.dropLast(3)}aar" + coord = DEP_WITH_SCRAPABLE_LICENSE.coordStrToMavenCoord(), + repoUrls = listOf(GOOGLE_MAVEN_URL) ), MavenListDependency( - coord = DEP_WITH_DIRECT_LINK_ONLY_LICENSE, - url = "${FIREBASE_ANALYTICS_POM.dropLast(3)}aar" + coord = DEP_WITH_DIRECT_LINK_ONLY_LICENSE.coordStrToMavenCoord(), + repoUrls = listOf(GOOGLE_MAVEN_URL) ) ) } @@ -969,12 +930,12 @@ class MavenDependenciesRetrieverTest { val mavenDependencyList = mavenDependenciesRetriever.retrieveDependencyListFromPom( listOf( MavenListDependency( - coord = DEP_WITH_SCRAPABLE_LICENSE, - url = "${DATA_BINDING_POM.dropLast(3)}aar" + coord = DEP_WITH_SCRAPABLE_LICENSE.coordStrToMavenCoord(), + repoUrls = listOf(GOOGLE_MAVEN_URL) ), MavenListDependency( - coord = DEP_WITH_NO_LICENSE, - url = "${PROTO_LITE_POM.dropLast(3)}jar" + coord = DEP_WITH_NO_LICENSE.coordStrToMavenCoord(), + repoUrls = listOf(PUBLIC_MAVEN_URL) ) ) ) @@ -1004,11 +965,14 @@ class MavenDependenciesRetrieverTest { fun testGenerateDepsListFromMavenInstall_emptyBazelQueryDeps_returnsEmptyList() { val mavenInstallFile = tempFolder.newFile("third_party/maven_install.json") writeMavenInstallJson(mavenInstallFile) - val mavenListDependencies = mavenDependenciesRetriever - .generateDependenciesListFromMavenInstall( + + val mavenListDependencies = runBlocking { + mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( "${tempFolder.root}/third_party/maven_install.json", listOf() ) + } + assertThat(mavenListDependencies).isEmpty() } @@ -1016,20 +980,380 @@ class MavenDependenciesRetrieverTest { fun testGenerateDepsListFromMavenInstall_nonEmptyBazelQueryDepNames_returnsCorrectList() { val mavenInstallFile = tempFolder.newFile("third_party/maven_install.json") writeMavenInstallJson(mavenInstallFile) - val mavenListDependencies = mavenDependenciesRetriever - .generateDependenciesListFromMavenInstall( + + val mavenListDependencies = runBlocking { + mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( "${tempFolder.root}/third_party/maven_install.json", listOf(DATA_BINDING_DEP, FIREBASE_DEP) ) + } + assertThat(mavenListDependencies).containsExactly( MavenListDependency( - coord = DEP_WITH_SCRAPABLE_LICENSE, - url = "${DATA_BINDING_POM.dropLast(3)}aar" + coord = DEP_WITH_SCRAPABLE_LICENSE.coordStrToMavenCoord(), + repoUrls = listOf(GOOGLE_MAVEN_URL) ), MavenListDependency( - coord = DEP_WITH_DIRECT_LINK_ONLY_LICENSE, - url = "${FIREBASE_ANALYTICS_POM.dropLast(3)}aar" + coord = DEP_WITH_DIRECT_LINK_ONLY_LICENSE.coordStrToMavenCoord(), + repoUrls = listOf(GOOGLE_MAVEN_URL) + ) + ) + } + + @Test + fun testMavenCoordinate_parseFrom_oneComponent_throwsException() { + val exception = assertThrows(IllegalStateException::class) { + MavenDependenciesRetriever.MavenCoordinate.parseFrom("androidx.lifecycle") + } + + assertThat(exception).hasMessageThat().contains("Invalid Maven coordinate string") + } + + @Test + fun testMavenCoordinate_parseFrom_twoComponents_throwsException() { + val exception = assertThrows(IllegalStateException::class) { + MavenDependenciesRetriever.MavenCoordinate.parseFrom("androidx.lifecycle:lifecycle-viewmodel") + } + + assertThat(exception).hasMessageThat().contains("Invalid Maven coordinate string") + } + + @Test + fun testMavenCoordinate_parseFrom_threeComponents_returnsCoordinateWithGroupArtifactVersion() { + val coord = + MavenDependenciesRetriever.MavenCoordinate.parseFrom( + "androidx.lifecycle:lifecycle-viewmodel:2.2.0" + ) + + assertThat(coord.groupId).isEqualTo("androidx.lifecycle") + assertThat(coord.artifactId).isEqualTo("lifecycle-viewmodel") + assertThat(coord.version).isEqualTo("2.2.0") + assertThat(coord.classifier).isNull() + assertThat(coord.extension).isNull() + } + + @Test + fun testMavenCoordinate_parseFrom_fourComponents_returnsCoordinateWithExtension() { + val coord = + MavenDependenciesRetriever.MavenCoordinate.parseFrom( + "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0" + ) + + assertThat(coord.groupId).isEqualTo("androidx.lifecycle") + assertThat(coord.artifactId).isEqualTo("lifecycle-viewmodel") + assertThat(coord.version).isEqualTo("2.2.0") + assertThat(coord.classifier).isNull() + assertThat(coord.extension).isEqualTo("aar") + } + + @Test + fun testMavenCoordinate_parseFrom_fiveComponents_returnsCoordinateWithClassifierAndExtension() { + val coord = + MavenDependenciesRetriever.MavenCoordinate.parseFrom( + "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0" + ) + + assertThat(coord.groupId).isEqualTo("androidx.lifecycle") + assertThat(coord.artifactId).isEqualTo("lifecycle-viewmodel") + assertThat(coord.version).isEqualTo("2.2.0") + assertThat(coord.classifier).isEqualTo("sources") + assertThat(coord.extension).isEqualTo("aar") + } + + @Test + fun testMavenCoordinate_parseFrom_sixComponents_throwsException() { + val exception = assertThrows(IllegalStateException::class) { + MavenDependenciesRetriever.MavenCoordinate.parseFrom( + "androidx.lifecycle:lifecycle-viewmodel:aar:sources:fake:2.2.0" + ) + } + + assertThat(exception).hasMessageThat().contains("Invalid Maven coordinate string") + } + + @Test + fun testMavenCoordinate_reducedCoordinateString_simpleCoordinate_returnsCorrectValue() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0" + ) + + val reducedCoordStr = coord.reducedCoordinateString + + // The group ID, artifact ID, and version should all be included in a reduced coordinate string. + assertThat(reducedCoordStr).isEqualTo("androidx.lifecycle:lifecycle-viewmodel:2.2.0") + } + + @Test + fun testMavenCoordinate_reducedCoordinateString_coordWithExtension_returnsCoordStrNoExtension() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + extension = "aar" + ) + + val reducedCoordStr = coord.reducedCoordinateString + + // The extension is ignored in the reduced coordinate string. + assertThat(reducedCoordStr).isEqualTo("androidx.lifecycle:lifecycle-viewmodel:2.2.0") + } + + @Test + fun testMavenCoordinate_reducedCoordinateString_coordWithClassifier_returnsCoordStrNoClass() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + classifier = "sources" + ) + + val reducedCoordStr = coord.reducedCoordinateString + + // The classifier is ignored in the reduced coordinate string. + assertThat(reducedCoordStr).isEqualTo("androidx.lifecycle:lifecycle-viewmodel:2.2.0") + } + + @Test + fun testMavenCoordinate_reducedCoordinateString_coordWithClassAndExt_returnsStrWithoutBoth() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + extension = "aar", + classifier = "sources" + ) + + val reducedCoordStr = coord.reducedCoordinateString + + // Both the extension and classifier are ignored in the reduced coordinate string. + assertThat(reducedCoordStr).isEqualTo("androidx.lifecycle:lifecycle-viewmodel:2.2.0") + } + + @Test + fun testMavenCoordinate_bazelTarget_simpleCoordinate_returnsTargetIgnoringVersion() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0" + ) + + val bazelTarget = coord.bazelTarget + + // Only the group & artifact IDs should be included in the base Bazel target. + assertThat(bazelTarget).isEqualTo("androidx_lifecycle_lifecycle_viewmodel") + } + + @Test + fun testMavenCoordinate_bazelTarget_coordWithExtension_returnsTargetIgnoringExtension() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + extension = "aar" + ) + + val bazelTarget = coord.bazelTarget + + // The extension is ignored in the base Bazel target. + assertThat(bazelTarget).isEqualTo("androidx_lifecycle_lifecycle_viewmodel") + } + + @Test + fun testMavenCoordinate_bazelTarget_coordWithClassifier_returnsTargetIgnoringClassifier() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + classifier = "sources" + ) + + val bazelTarget = coord.bazelTarget + + // The classifier is ignored in the base Bazel target. + assertThat(bazelTarget).isEqualTo("androidx_lifecycle_lifecycle_viewmodel") + } + + @Test + fun testMavenCoordinate_bazelTarget_coordWithClassAndExt_returnsTargetIgnoringBoth() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + extension = "aar", + classifier = "sources" + ) + + val bazelTarget = coord.bazelTarget + + // Both the extension and classifier are ignored the base Bazel target. + assertThat(bazelTarget).isEqualTo("androidx_lifecycle_lifecycle_viewmodel") + } + + @Test + fun testMavenCoordinate_computeArtifactUrl_simpleCoordinate_returnsCorrectMavenUrl() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0" + ) + + val artifactUrl = coord.computeArtifactUrl("https://maven.google.com") + + // All properties of the coordinate should be included when computing the artifact URL. If + // there's no extension defined, it should default to 'jar' per: + // https://maven.apache.org/repositories/artifacts.html. + assertThat(artifactUrl).isEqualTo( + "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0" + + "/lifecycle-viewmodel-2.2.0.jar" + ) + } + + @Test + fun testMavenCoordinate_computeArtifactUrl_coordWithExtension_returnsUrlWithExtension() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + extension = "aar" + ) + + val artifactUrl = coord.computeArtifactUrl("https://maven.google.com") + + // All properties of the coordinate should be included when computing the artifact URL. + assertThat(artifactUrl).isEqualTo( + "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0" + + "/lifecycle-viewmodel-2.2.0.aar" + ) + } + + @Test + fun testMavenCoordinate_computeArtifactUrl_coordWithClassifier_returnsUrlWithClassifier() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + classifier = "sources" ) + + val artifactUrl = coord.computeArtifactUrl("https://maven.google.com") + + // All properties of the coordinate should be included when computing the artifact URL. + assertThat(artifactUrl).isEqualTo( + "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0" + + "/lifecycle-viewmodel-2.2.0-sources.jar" + ) + } + + @Test + fun testMavenCoordinate_computeArtifactUrl_coordWithClassAndExt_returnsUrlWithBoth() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + extension = "aar", + classifier = "sources" + ) + + val artifactUrl = coord.computeArtifactUrl("https://maven.google.com") + + // All properties of the coordinate should be included when computing the artifact URL. + assertThat(artifactUrl).isEqualTo( + "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0" + + "/lifecycle-viewmodel-2.2.0-sources.aar" + ) + } + + @Test + fun testMavenCoordinate_computePomUrl_simpleCoordinate_returnsCorrectMavenUrl() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0" + ) + + val pomUrl = coord.computePomUrl("https://maven.google.com") + + // All properties of the coordinate should be included when computing the POM URL except for + // extension since the ending of the URL is always 'pom'. + assertThat(pomUrl).isEqualTo( + "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0" + + "/lifecycle-viewmodel-2.2.0.pom" + ) + } + + @Test + fun testMavenCoordinate_computePomUrl_coordWithExtension_returnsUrlWithExtension() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + extension = "aar" + ) + + val pomUrl = coord.computePomUrl("https://maven.google.com") + + // All properties of the coordinate should be included when computing the POM URL except for + // extension since the ending of the URL is always 'pom'. + assertThat(pomUrl).isEqualTo( + "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0" + + "/lifecycle-viewmodel-2.2.0.pom" + ) + } + + @Test + fun testMavenCoordinate_computePomUrl_coordWithClassifier_returnsUrlWithClassifier() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + classifier = "sources" + ) + + val pomUrl = coord.computePomUrl("https://maven.google.com") + + // All properties of the coordinate should be included when computing the POM URL except for + // extension since the ending of the URL is always 'pom'. + assertThat(pomUrl).isEqualTo( + "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0" + + "/lifecycle-viewmodel-2.2.0-sources.pom" + ) + } + + @Test + fun testMavenCoordinate_computePomUrl_coordWithClassAndExt_returnsUrlWithBoth() { + val coord = + MavenDependenciesRetriever.MavenCoordinate( + groupId = "androidx.lifecycle", + artifactId = "lifecycle-viewmodel", + version = "2.2.0", + extension = "aar", + classifier = "sources" + ) + + val pomUrl = coord.computePomUrl("https://maven.google.com") + + // All properties of the coordinate should be included when computing the POM URL except for + // extension since the ending of the URL is always 'pom'. + assertThat(pomUrl).isEqualTo( + "https://maven.google.com/androidx/lifecycle/lifecycle-viewmodel/2.2.0" + + "/lifecycle-viewmodel-2.2.0-sources.pom" ) } @@ -1089,17 +1413,6 @@ class MavenDependenciesRetrieverTest { assertThat(license.isOriginalLinkInvalid).isFalse() } - private fun verifyLicenseHasOriginalLinkInvalid( - license: License, - originalLink: String, - licenseName: String - ) { - assertThat(license.licenseName).isEqualTo(licenseName) - assertThat(license.verifiedLinkCase).isEqualTo(License.VerifiedLinkCase.VERIFIEDLINK_NOT_SET) - assertThat(license.originalLink).isEqualTo(originalLink) - assertThat(license.isOriginalLinkInvalid).isTrue() - } - private fun assertIsDependency( dependency: MavenDependency, artifactName: String, @@ -1118,23 +1431,6 @@ class MavenDependenciesRetrieverTest { return builder.build() } - private fun setUpBazelEnvironment(coordsList: List) { - val mavenInstallJson = tempFolder.newFile("scripts/assets/maven_install.json") - writeMavenInstallJson(mavenInstallJson) - testBazelWorkspace.setUpWorkspaceForRulesJvmExternal(coordsList) - val thirdPartyPrefixCoordList = coordsList.map { coordinate -> - when (coordinate) { - DEP_WITH_SCRAPABLE_LICENSE -> DATA_BINDING_DEP_WITH_THIRD_PARTY_PREFIX - DEP_WITH_DIRECT_LINK_ONLY_LICENSE -> FIREBASE_DEP_WITH_THIRD_PARTY_PREFIX - DEP_WITH_INVALID_LINKS -> IO_FABRIC_DEP_WITH_THIRD_PARTY_PREFIX - DEP_WITH_SCRAPABLE_AND_EXTRACTED_COPY_LICENSES -> GLIDE_DEP_WITH_THIRD_PARTY_PREFIX - else -> PROTO_DEP_WITH_THIRD_PARTY_PREFIX - } - } - createThirdPartyAndroidBinary(thirdPartyPrefixCoordList) - writeThirdPartyBuildFile(coordsList, thirdPartyPrefixCoordList) - } - private fun writeThirdPartyBuildFile( coordsList: List, thirdPartyPrefixCoordList: List @@ -1196,28 +1492,32 @@ class MavenDependenciesRetrieverTest { file.writeText( """ { - "dependency_tree": { - "dependencies": [ - { - "coord": "androidx.databinding:databinding-adapters:3.4.2", - "url": "${DATA_BINDING_POM.dropLast(3)}aar" - }, - { - "coord": "com.github.bumptech.glide:annotations:4.11.0", - "url": "${GLIDE_ANNOTATIONS_POM.dropLast(3)}jar" - }, - { - "coord": "com.google.firebase:firebase-analytics:17.5.0", - "url": "${FIREBASE_ANALYTICS_POM.dropLast(3)}aar" - }, - { - "coord": "com.google.protobuf:protobuf-lite:3.0.0", - "url": "${PROTO_LITE_POM.dropLast(3)}jar" - }, - { - "coord": "io.fabric.sdk.android:fabric:1.4.7", - "url": "${IO_FABRIC_POM.dropLast(3)}aar" - } + "artifacts": { + "androidx.databinding:databinding-adapters": { + "version": "3.4.2" + }, + "com.github.bumptech.glide:annotations": { + "version": "4.11.0" + }, + "com.google.firebase:firebase-analytics": { + "version": "17.5.0" + }, + "com.google.protobuf:protobuf-lite": { + "version": "3.0.0" + }, + "io.fabric.sdk.android:fabric": { + "version": "1.4.7" + } + }, + "repositories": { + "$GOOGLE_MAVEN_URL": [ + "androidx.databinding:databinding-adapters", + "com.google.firebase:firebase-analytics", + "io.fabric.sdk.android:fabric" + ], + "$PUBLIC_MAVEN_URL": [ + "com.github.bumptech.glide:annotations", + "com.google.protobuf:protobuf-lite" ] } } @@ -1229,10 +1529,10 @@ class MavenDependenciesRetrieverTest { return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) } - /** Returns a mock for the [LicenseFetcher]. */ - private fun initializeLicenseFetcher(): LicenseFetcher { - return mock { - on { scrapeText(eq(DATA_BINDING_POM)) } + /** Returns a mock for the [MavenArtifactPropertyFetcher]. */ + private fun initializeArtifactPropertyFetcher(): MavenArtifactPropertyFetcher { + return mock { + on { scrapeText(eq(DATA_BINDING_POM_URL)) } .doReturn( """ @@ -1245,7 +1545,7 @@ class MavenDependenciesRetrieverTest { """.trimIndent() ) - on { scrapeText(eq(GLIDE_ANNOTATIONS_POM)) } + on { scrapeText(eq(GLIDE_ANNOTATIONS_POM_URL)) } .doReturn( """ @@ -1263,7 +1563,7 @@ class MavenDependenciesRetrieverTest { """.trimIndent() ) - on { scrapeText(eq(FIREBASE_ANALYTICS_POM)) } + on { scrapeText(eq(FIREBASE_ANALYTICS_POM_URL)) } .doReturn( """ @@ -1276,7 +1576,7 @@ class MavenDependenciesRetrieverTest { """.trimIndent() ) - on { scrapeText(eq(IO_FABRIC_POM)) } + on { scrapeText(eq(IO_FABRIC_POM_URL)) } .doReturn( """ @@ -1289,21 +1589,88 @@ class MavenDependenciesRetrieverTest { """.trimIndent() ) - on { scrapeText(eq(PROTO_LITE_POM)) } + on { scrapeText(eq(PROTO_LITE_POM_URL)) } .doReturn( """ Random Project """.trimIndent() ) + on { isValidArtifactFileUrl(eq(DATA_BINDING_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(PROTO_LITE_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(IO_FABRIC_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(GLIDE_ANNOTATIONS_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(FIREBASE_ANALYTICS_ARTIFACT_URL)) }.thenReturn(true) } } private fun initializeMavenDependenciesRetriever(): MavenDependenciesRetriever { return MavenDependenciesRetriever( "${tempFolder.root}", - mockLicenseFetcher, + mockArtifactPropertyFetcher, + ScriptBackgroundCoroutineDispatcher(), commandExecutor ) } + + private fun String.coordStrToMavenCoord() = + MavenDependenciesRetriever.MavenCoordinate.parseFrom(this) + + private companion object { + private const val DEP_WITH_SCRAPABLE_LICENSE = "androidx.databinding:databinding-adapters:3.4.2" + private const val DEP_WITH_NO_LICENSE = "com.google.protobuf:protobuf-lite:3.0.0" + private const val DEP_WITH_SCRAPABLE_AND_EXTRACTED_COPY_LICENSES = + "com.github.bumptech.glide:annotations:4.11.0" + private const val DEP_WITH_DIRECT_LINK_ONLY_LICENSE = + "com.google.firebase:firebase-analytics:17.5.0" + private const val DEP_WITH_INVALID_LINKS = "io.fabric.sdk.android:fabric:1.4.7" + + private const val DATA_BINDING_DEP_WITH_THIRD_PARTY_PREFIX = + "//third_party:androidx_databinding_databinding-adapters" + private const val FIREBASE_DEP_WITH_THIRD_PARTY_PREFIX = + "//third_party:com_google_firebase_firebase-analytics" + private const val IO_FABRIC_DEP_WITH_THIRD_PARTY_PREFIX = + "//third_party:io_fabric_sdk_android_fabric" + + private const val DATA_BINDING_DEP = "androidx_databinding_databinding_adapters" + private const val FIREBASE_DEP = "com_google_firebase_firebase_analytics" + private const val IO_FABRIC_DEP = "io_fabric_sdk_android_fabric" + + private const val GOOGLE_MAVEN_URL = "https://maven.google.com" + private const val PUBLIC_MAVEN_URL = "https://repo1.maven.org/maven2" + + private const val DATA_BINDING_VERSION = "3.4.2" + private const val DATA_BINDING_BASE_URL = + "$GOOGLE_MAVEN_URL/androidx/databinding/databinding-adapters" + + "/$DATA_BINDING_VERSION/databinding-adapters-$DATA_BINDING_VERSION" + private const val DATA_BINDING_ARTIFACT_URL = "$DATA_BINDING_BASE_URL.jar" + private const val DATA_BINDING_POM_URL = "$DATA_BINDING_BASE_URL.pom" + + private const val PROTO_LITE_VERSION = "3.0.0" + private const val PROTO_LITE_BASE_URL = + "$PUBLIC_MAVEN_URL/com/google/protobuf/protobuf-lite/$PROTO_LITE_VERSION" + + "/protobuf-lite-$PROTO_LITE_VERSION" + private const val PROTO_LITE_POM_URL = "$PROTO_LITE_BASE_URL.pom" + private const val PROTO_LITE_ARTIFACT_URL = "$PROTO_LITE_BASE_URL.jar" + + private const val IO_FABRIC_VERSION = "1.4.7" + private const val IO_FABRIC_BASE_URL = + "$GOOGLE_MAVEN_URL/io/fabric/sdk/android/fabric/$IO_FABRIC_VERSION/fabric-$IO_FABRIC_VERSION" + private const val IO_FABRIC_POM_URL = "$IO_FABRIC_BASE_URL.pom" + private const val IO_FABRIC_ARTIFACT_URL = "$IO_FABRIC_BASE_URL.jar" + + private const val GLIDE_ANNOTATIONS_VERSION = "4.11.0" + private const val GLIDE_ANNOTATIONS_BASE_URL = + "$PUBLIC_MAVEN_URL/com/github/bumptech/glide/annotations/$GLIDE_ANNOTATIONS_VERSION" + + "/annotations-$GLIDE_ANNOTATIONS_VERSION" + private const val GLIDE_ANNOTATIONS_POM_URL = "$GLIDE_ANNOTATIONS_BASE_URL.pom" + private const val GLIDE_ANNOTATIONS_ARTIFACT_URL = "$GLIDE_ANNOTATIONS_BASE_URL.jar" + + private const val FIREBASE_ANALYTICS_VERSION = "17.5.0" + private const val FIREBASE_ANALYTICS_BASE_URL = + "$GOOGLE_MAVEN_URL/com/google/firebase/firebase-analytics/$FIREBASE_ANALYTICS_VERSION" + + "/firebase-analytics-$FIREBASE_ANALYTICS_VERSION" + private const val FIREBASE_ANALYTICS_POM_URL = "$FIREBASE_ANALYTICS_BASE_URL.pom" + private const val FIREBASE_ANALYTICS_ARTIFACT_URL = "$FIREBASE_ANALYTICS_BASE_URL.jar" + } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt index 6d63a6e9c6d..30769f078ac 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt @@ -11,7 +11,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl -import org.oppia.android.scripts.license.LicenseFetcher +import org.oppia.android.scripts.license.MavenArtifactPropertyFetcher import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink import org.oppia.android.scripts.proto.License @@ -26,48 +26,14 @@ import java.io.PrintStream import java.util.concurrent.TimeUnit /** Tests for [GenerateMavenDependenciesList]. */ +// FunctionName: test names are conventionally named with underscores. +// SameParameterValue: tests should have specific context included/excluded for readability. +@Suppress("FunctionName", "SameParameterValue") class GenerateMavenDependenciesListTest { - - private val THIRD_PARTY_PREFIX = "//third_pary:" - private val DEP_WITH_SCRAPABLE_LICENSE = "androidx.databinding:databinding-adapters:3.4.2" - private val DEP_WITH_NO_LICENSE = "com.google.protobuf:protobuf-lite:3.0.0" - private val DEP_WITH_SCRAPABLE_AND_EXTRACTED_COPY_LICENSES = - "com.github.bumptech.glide:annotations:4.11.0" - private val DEP_WITH_DIRECT_LINK_ONLY_LICENSE = "com.google.firebase:firebase-analytics:17.5.0" - private val DEP_WITH_INVALID_LINKS = "io.fabric.sdk.android:fabric:1.4.7" - private val DEP_WITH_SAME_SCRAPABLE_LICENSE_BUT_DIFFERENT_NAME = - "com.squareup.moshi:moshi:1.11.0" - - private val DATA_BINDING_VERSION = "3.4.2" - private val PROTO_LITE_VERSION = "3.0.0" - private val GLIDE_ANNOTATIONS_VERSION = "4.11.0" - private val FIREBASE_ANALYTICS_VERSION = "17.5.0" - private val IO_FABRIC_VERSION = "1.4.7" - private val MOSHI_VERSION = "1.11.0" - - private val DATA_BINDING_POM = "https://maven.google.com/androidx/databinding/databinding-" + - "adapters/$DATA_BINDING_VERSION/databinding-adapters-$DATA_BINDING_VERSION.pom" - private val PROTO_LITE_POM = "https://repo1.maven.org/maven2/com/google/protobuf/protobuf" + - "-lite/$PROTO_LITE_VERSION/protobuf-lite-$PROTO_LITE_VERSION.pom" - private val IO_FABRIC_POM = "https://maven.google.com/io/fabric/sdk/android/fabric/" + - "$IO_FABRIC_VERSION/fabric-$IO_FABRIC_VERSION.pom" - private val GLIDE_ANNOTATIONS_POM = "https://repo1.maven.org/maven2/com/github/bumptech/glide" + - "/annotations/$GLIDE_ANNOTATIONS_VERSION/annotations-$GLIDE_ANNOTATIONS_VERSION.pom" - private val FIREBASE_ANALYTICS_POM = "https://maven.google.com/com/google/firebase/firebase-" + - "analytics/$FIREBASE_ANALYTICS_VERSION/firebase-analytics-$FIREBASE_ANALYTICS_VERSION.pom" - private val MOSHI_POM = "https://repo1.maven.org/maven2/com/squareup/moshi/moshi/" + - "$MOSHI_VERSION/moshi-$MOSHI_VERSION.pom" - - private val LICENSE_DETAILS_INCOMPLETE_FAILURE = "Licenses details are not completed" - private val UNAVAILABLE_OR_INVALID_LICENSE_LINKS_FAILURE = - "License links are invalid or not available for some dependencies" - private val SCRIPT_PASSED_MESSAGE = - "Script executed succesfully: maven_dependencies.textproto updated successfully." - private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out - private val mockLicenseFetcher by lazy { initializeLicenseFetcher() } + private val mockArtifactPropertyFetcher by lazy { initializeArtifactPropertyFetcher() } private val commandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } private lateinit var testBazelWorkspace: TestBazelWorkspace @@ -98,7 +64,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -182,7 +148,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -206,7 +172,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -248,7 +214,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -315,7 +281,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -357,7 +323,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -425,7 +391,7 @@ class GenerateMavenDependenciesListTest { setUpBazelEnvironment(coordsList) GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -518,7 +484,7 @@ class GenerateMavenDependenciesListTest { setUpBazelEnvironment(coordsList) GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -616,7 +582,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -679,7 +645,7 @@ class GenerateMavenDependenciesListTest { setUpBazelEnvironment(coordsList) GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -792,7 +758,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -917,7 +883,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -1030,7 +996,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -1149,7 +1115,7 @@ class GenerateMavenDependenciesListTest { setUpBazelEnvironment(coordsList) GenerateMavenDependenciesList( - mockLicenseFetcher, + mockArtifactPropertyFetcher, commandExecutor ).main( arrayOf( @@ -1366,32 +1332,36 @@ class GenerateMavenDependenciesListTest { file.writeText( """ { - "dependency_tree": { - "dependencies": [ - { - "coord": "androidx.databinding:databinding-adapters:3.4.2", - "url": "${DATA_BINDING_POM.dropLast(3)}aar" - }, - { - "coord": "com.github.bumptech.glide:annotations:4.11.0", - "url": "${GLIDE_ANNOTATIONS_POM.dropLast(3)}jar" - }, - { - "coord": "com.google.firebase:firebase-analytics:17.5.0", - "url": "${FIREBASE_ANALYTICS_POM.dropLast(3)}aar" - }, - { - "coord": "com.google.protobuf:protobuf-lite:3.0.0", - "url": "${PROTO_LITE_POM.dropLast(3)}jar" - }, - { - "coord": "com.squareup.moshi:moshi:1.11.0", - "url": "${MOSHI_POM.dropLast(3)}jar" - }, - { - "coord": "io.fabric.sdk.android:fabric:1.4.7", - "url": "${IO_FABRIC_POM.dropLast(3)}aar" - } + "artifacts": { + "androidx.databinding:databinding-adapters": { + "version": "3.4.2" + }, + "com.github.bumptech.glide:annotations": { + "version": "4.11.0" + }, + "com.google.firebase:firebase-analytics": { + "version": "17.5.0" + }, + "com.google.protobuf:protobuf-lite": { + "version": "3.0.0" + }, + "com.squareup.moshi:moshi": { + "version": "1.11.0" + }, + "io.fabric.sdk.android:fabric": { + "version": "1.4.7" + } + }, + "repositories": { + "$GOOGLE_MAVEN_URL": [ + "androidx.databinding:databinding-adapters", + "com.google.firebase:firebase-analytics", + "io.fabric.sdk.android:fabric" + ], + "$PUBLIC_MAVEN_URL": [ + "com.github.bumptech.glide:annotations", + "com.google.protobuf:protobuf-lite", + "com.squareup.moshi:moshi" ] } } @@ -1403,10 +1373,10 @@ class GenerateMavenDependenciesListTest { return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) } - /** Returns a mock for the [LicenseFetcher]. */ - private fun initializeLicenseFetcher(): LicenseFetcher { - return mock { - on { scrapeText(eq(DATA_BINDING_POM)) } + /** Returns a mock for the [MavenArtifactPropertyFetcher]. */ + private fun initializeArtifactPropertyFetcher(): MavenArtifactPropertyFetcher { + return mock { + on { scrapeText(eq(DATA_BINDING_POM_URL)) } .doReturn( """ @@ -1419,7 +1389,7 @@ class GenerateMavenDependenciesListTest { """.trimIndent() ) - on { scrapeText(eq(GLIDE_ANNOTATIONS_POM)) } + on { scrapeText(eq(GLIDE_ANNOTATIONS_POM_URL)) } .doReturn( """ @@ -1437,7 +1407,7 @@ class GenerateMavenDependenciesListTest { """.trimIndent() ) - on { scrapeText(eq(FIREBASE_ANALYTICS_POM)) } + on { scrapeText(eq(FIREBASE_ANALYTICS_POM_URL)) } .doReturn( """ @@ -1450,7 +1420,7 @@ class GenerateMavenDependenciesListTest { """.trimIndent() ) - on { scrapeText(eq(MOSHI_POM)) } + on { scrapeText(eq(MOSHI_POM_URL)) } .doReturn( """ @@ -1463,7 +1433,7 @@ class GenerateMavenDependenciesListTest { """.trimIndent() ) - on { scrapeText(eq(IO_FABRIC_POM)) } + on { scrapeText(eq(IO_FABRIC_POM_URL)) } .doReturn( """ @@ -1476,13 +1446,80 @@ class GenerateMavenDependenciesListTest { """.trimIndent() ) - on { scrapeText(eq(PROTO_LITE_POM)) } + on { scrapeText(eq(PROTO_LITE_POM_URL)) } .doReturn( """ Random Project """.trimIndent() ) + on { isValidArtifactFileUrl(eq(DATA_BINDING_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(PROTO_LITE_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(IO_FABRIC_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(GLIDE_ANNOTATIONS_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(FIREBASE_ANALYTICS_ARTIFACT_URL)) }.thenReturn(true) + on { isValidArtifactFileUrl(eq(MOSHI_ARTIFACT_URL)) }.thenReturn(true) } } + + private companion object { + private const val DEP_WITH_SCRAPABLE_LICENSE = "androidx.databinding:databinding-adapters:3.4.2" + private const val DEP_WITH_NO_LICENSE = "com.google.protobuf:protobuf-lite:3.0.0" + private const val DEP_WITH_SCRAPABLE_AND_EXTRACTED_COPY_LICENSES = + "com.github.bumptech.glide:annotations:4.11.0" + private const val DEP_WITH_DIRECT_LINK_ONLY_LICENSE = + "com.google.firebase:firebase-analytics:17.5.0" + private const val DEP_WITH_INVALID_LINKS = "io.fabric.sdk.android:fabric:1.4.7" + private const val DEP_WITH_SAME_SCRAPABLE_LICENSE_BUT_DIFFERENT_NAME = + "com.squareup.moshi:moshi:1.11.0" + + private const val GOOGLE_MAVEN_URL = "https://maven.google.com" + private const val PUBLIC_MAVEN_URL = "https://repo1.maven.org/maven2" + + private const val DATA_BINDING_VERSION = "3.4.2" + private const val DATA_BINDING_BASE_URL = + "$GOOGLE_MAVEN_URL/androidx/databinding/databinding-adapters" + + "/$DATA_BINDING_VERSION/databinding-adapters-$DATA_BINDING_VERSION" + private const val DATA_BINDING_ARTIFACT_URL = "$DATA_BINDING_BASE_URL.jar" + private const val DATA_BINDING_POM_URL = "$DATA_BINDING_BASE_URL.pom" + + private const val PROTO_LITE_VERSION = "3.0.0" + private const val PROTO_LITE_BASE_URL = + "$PUBLIC_MAVEN_URL/com/google/protobuf/protobuf-lite/$PROTO_LITE_VERSION" + + "/protobuf-lite-$PROTO_LITE_VERSION" + private const val PROTO_LITE_POM_URL = "$PROTO_LITE_BASE_URL.pom" + private const val PROTO_LITE_ARTIFACT_URL = "$PROTO_LITE_BASE_URL.jar" + + private const val IO_FABRIC_VERSION = "1.4.7" + private const val IO_FABRIC_BASE_URL = + "$GOOGLE_MAVEN_URL/io/fabric/sdk/android/fabric/$IO_FABRIC_VERSION/fabric-$IO_FABRIC_VERSION" + private const val IO_FABRIC_POM_URL = "$IO_FABRIC_BASE_URL.pom" + private const val IO_FABRIC_ARTIFACT_URL = "$IO_FABRIC_BASE_URL.jar" + + private const val GLIDE_ANNOTATIONS_VERSION = "4.11.0" + private const val GLIDE_ANNOTATIONS_BASE_URL = + "$PUBLIC_MAVEN_URL/com/github/bumptech/glide/annotations/$GLIDE_ANNOTATIONS_VERSION" + + "/annotations-$GLIDE_ANNOTATIONS_VERSION" + private const val GLIDE_ANNOTATIONS_POM_URL = "$GLIDE_ANNOTATIONS_BASE_URL.pom" + private const val GLIDE_ANNOTATIONS_ARTIFACT_URL = "$GLIDE_ANNOTATIONS_BASE_URL.jar" + + private const val FIREBASE_ANALYTICS_VERSION = "17.5.0" + private const val FIREBASE_ANALYTICS_BASE_URL = + "$GOOGLE_MAVEN_URL/com/google/firebase/firebase-analytics/$FIREBASE_ANALYTICS_VERSION" + + "/firebase-analytics-$FIREBASE_ANALYTICS_VERSION" + private const val FIREBASE_ANALYTICS_POM_URL = "$FIREBASE_ANALYTICS_BASE_URL.pom" + private const val FIREBASE_ANALYTICS_ARTIFACT_URL = "$FIREBASE_ANALYTICS_BASE_URL.jar" + + private const val MOSHI_VERSION = "1.11.0" + private const val MOSHI_BASE_URL = + "$PUBLIC_MAVEN_URL/com/squareup/moshi/moshi/$MOSHI_VERSION/moshi-$MOSHI_VERSION" + private const val MOSHI_POM_URL = "$MOSHI_BASE_URL.pom" + private const val MOSHI_ARTIFACT_URL = "$MOSHI_BASE_URL.jar" + + private const val LICENSE_DETAILS_INCOMPLETE_FAILURE = "Licenses details are not completed" + private const val UNAVAILABLE_OR_INVALID_LICENSE_LINKS_FAILURE = + "License links are invalid or not available for some dependencies" + private const val SCRIPT_PASSED_MESSAGE = + "Script executed successfully: maven_dependencies.textproto updated successfully." + } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt index 6be3f9c0d71..f8031d063e9 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt @@ -9,7 +9,7 @@ import org.junit.rules.TemporaryFolder import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock -import org.oppia.android.scripts.license.LicenseFetcher +import org.oppia.android.scripts.license.MavenArtifactPropertyFetcher import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink import org.oppia.android.scripts.proto.License @@ -40,7 +40,7 @@ class RetrieveLicenseTextsTest { "licenses/develop/simplified-bsd-license.txt" private val LONG_LICENSE_TEXT_LINK = "https://verylonglicense.txt" - private val mockLicenseFetcher by lazy { initializeLicenseFetcher() } + private val mockArtifactPropertyFetcher by lazy { initializeArtifactPropertyFetcher() } private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out @@ -64,7 +64,7 @@ class RetrieveLicenseTextsTest { @Test fun testScript_oneArgument_printsUsageStringAndThrowsException() { val exception = assertThrows(Exception::class) { - RetrieveLicenseTexts(mockLicenseFetcher).main(arrayOf()) + RetrieveLicenseTexts(mockArtifactPropertyFetcher).main(arrayOf()) } assertThat(exception).hasMessageThat().contains(TOO_FEW_ARGS_FAILURE) @@ -74,7 +74,7 @@ class RetrieveLicenseTextsTest { @Test fun testScript_oneArguments_printsUsageStringAndThrowsException() { val exception = assertThrows(Exception::class) { - RetrieveLicenseTexts(mockLicenseFetcher).main( + RetrieveLicenseTexts(mockArtifactPropertyFetcher).main( arrayOf( "${tempFolder.root}/values" ) @@ -93,7 +93,7 @@ class RetrieveLicenseTextsTest { pbFile.outputStream().use { mavenDependencyList.writeTo(it) } val exception = assertThrows(Exception::class) { - RetrieveLicenseTexts(mockLicenseFetcher).main( + RetrieveLicenseTexts(mockArtifactPropertyFetcher).main( arrayOf( "${tempFolder.root}/values", "${tempFolder.root}/scripts/assets/maven_dependencies.pb" @@ -112,7 +112,7 @@ class RetrieveLicenseTextsTest { pbFile.outputStream().use { mavenDependencyList.writeTo(it) } val exception = assertThrows(Exception::class) { - RetrieveLicenseTexts(mockLicenseFetcher).main( + RetrieveLicenseTexts(mockArtifactPropertyFetcher).main( arrayOf( "${tempFolder.root}/values", "${tempFolder.root}/scripts/assets/maven_dependencies.pb" @@ -142,7 +142,7 @@ class RetrieveLicenseTextsTest { pbFile.outputStream().use { mavenDependencyList.writeTo(it) } val exception = assertThrows(Exception::class) { - RetrieveLicenseTexts(mockLicenseFetcher).main( + RetrieveLicenseTexts(mockArtifactPropertyFetcher).main( arrayOf( "${tempFolder.root}/values", "${tempFolder.root}/scripts/assets/maven_dependencies.pb" @@ -185,7 +185,7 @@ class RetrieveLicenseTextsTest { val pbFile = tempFolder.newFile("scripts/assets/maven_dependencies.pb") pbFile.outputStream().use { mavenDependencyList.writeTo(it) } - RetrieveLicenseTexts(mockLicenseFetcher).main( + RetrieveLicenseTexts(mockArtifactPropertyFetcher).main( arrayOf( "${tempFolder.root}/values", "${tempFolder.root}/scripts/assets/maven_dependencies.pb" @@ -239,7 +239,7 @@ class RetrieveLicenseTextsTest { val xmlFile = tempFolder.newFile("values/third_party_dependencies.xml") pbFile.outputStream().use { mavenDependencyList.writeTo(it) } - RetrieveLicenseTexts(mockLicenseFetcher).main( + RetrieveLicenseTexts(mockArtifactPropertyFetcher).main( arrayOf( "${tempFolder.root}/values", "${tempFolder.root}/scripts/assets/maven_dependencies.pb" @@ -557,9 +557,9 @@ class RetrieveLicenseTextsTest { .joinToString("") } - /** Returns a mock for the [LicenseFetcher]. */ - private fun initializeLicenseFetcher(): LicenseFetcher { - return mock { + /** Returns a mock for the [MavenArtifactPropertyFetcher]. */ + private fun initializeArtifactPropertyFetcher(): MavenArtifactPropertyFetcher { + return mock { on { scrapeText(eq(SCRAPABLE_LINK)) } .doReturn( """ diff --git a/third_party/maven_install.json b/third_party/maven_install.json index cecbe092386..5ca106d5463 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": 1616765369, - "__RESOLVED_ARTIFACTS_HASH": -221705841, + "__INPUT_ARTIFACTS_HASH": -18032934, + "__RESOLVED_ARTIFACTS_HASH": -568966258, "conflict_resolution": { "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", @@ -555,30 +555,6 @@ }, "version": "26.4.2" }, - "com.crashlytics.sdk.android:answers:aar": { - "shasums": { - "jar": "5a05ddeda9f421b73727f4287a5d89e981a45e3feb7fac458cfddf29b97e3df8" - }, - "version": "1.4.6" - }, - "com.crashlytics.sdk.android:beta:aar": { - "shasums": { - "jar": "2a6b77374ebe6168588bd9116cdd66f60f7c151bd931b9a0f8b2012c06b1cd4d" - }, - "version": "1.2.10" - }, - "com.crashlytics.sdk.android:crashlytics-core:aar": { - "shasums": { - "jar": "4c055e1ad07fbe65a3e315bd27712be715962fb3c065d286a1d19f4f5db6768a" - }, - "version": "2.6.7" - }, - "com.crashlytics.sdk.android:crashlytics:aar": { - "shasums": { - "jar": "06d90c9d6693f302deae19f4cba67d724b44e8efcfc3c57308a78eead874dfeb" - }, - "version": "2.9.8" - }, "com.github.bumptech.glide:annotations": { "shasums": { "jar": "d219d238006d824962176229d4708abcdddcfe342c6a18a5d0fa48d6f0479b3e" @@ -1741,19 +1717,6 @@ "com.android.tools.build:aapt2-proto": [ "com.google.protobuf:protobuf-java" ], - "com.crashlytics.sdk.android:answers:aar": [ - "io.fabric.sdk.android:fabric:aar" - ], - "com.crashlytics.sdk.android:crashlytics-core:aar": [ - "com.crashlytics.sdk.android:answers:aar", - "io.fabric.sdk.android:fabric:aar" - ], - "com.crashlytics.sdk.android:crashlytics:aar": [ - "com.crashlytics.sdk.android:answers:aar", - "com.crashlytics.sdk.android:beta:aar", - "com.crashlytics.sdk.android:crashlytics-core:aar", - "io.fabric.sdk.android:fabric:aar" - ], "com.github.bumptech.glide:compiler": [ "com.github.bumptech.glide:annotations" ], @@ -4159,10 +4122,6 @@ "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools:annotations", - "com.crashlytics.sdk.android:answers:aar", - "com.crashlytics.sdk.android:beta:aar", - "com.crashlytics.sdk.android:crashlytics-core:aar", - "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", "com.github.bumptech.glide:compiler", "com.github.bumptech.glide:disklrucache", @@ -4381,10 +4340,6 @@ "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools:annotations", - "com.crashlytics.sdk.android:answers:aar", - "com.crashlytics.sdk.android:beta:aar", - "com.crashlytics.sdk.android:crashlytics-core:aar", - "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", "com.github.bumptech.glide:compiler", "com.github.bumptech.glide:disklrucache", @@ -4603,10 +4558,6 @@ "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools:annotations", - "com.crashlytics.sdk.android:answers:aar", - "com.crashlytics.sdk.android:beta:aar", - "com.crashlytics.sdk.android:crashlytics-core:aar", - "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", "com.github.bumptech.glide:compiler", "com.github.bumptech.glide:disklrucache", diff --git a/third_party/versions.bzl b/third_party/versions.bzl index 703fd2b8857..ec3c4e561ca 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -49,7 +49,6 @@ MAVEN_PRODUCTION_DEPENDENCY_VERSIONS = { "androidx.work:work-runtime-ktx": "2.4.0", "com.android.support:support-annotations": "28.0.0", "com.android.tools.build:aapt2-proto": "7.3.1-8691043", - "com.crashlytics.sdk.android:crashlytics": "2.9.8", "com.github.bumptech.glide:compiler": "4.11.0", "com.github.bumptech.glide:glide": "4.11.0", "com.google.android.flexbox:flexbox": "3.0.0", From 2c3b6ea3aa8079bf223557e20f04bdefc3a23a64 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Tue, 28 Mar 2023 20:43:05 -0700 Subject: [PATCH 04/63] Fix issues with compute_affected_tests. This addresses an underlying bug with the command executor that can, in some cases, break compute_affected_tests. It also refines some of its internal mechanisms for much better performance on expensive PRs. It also prepares the base support needed for merge queues, but the CI workflows aren't being updated in this change. --- .../scripts/build/TransformAndroidManifest.kt | 43 ++++++---- .../scripts/ci/ComputeAffectedTests.kt | 68 +++++++++------ .../oppia/android/scripts/common/BUILD.bazel | 13 +++ .../android/scripts/common/BazelClient.kt | 21 ++--- .../scripts/common/CommandExecutorImpl.kt | 66 +++++++++++++- .../oppia/android/scripts/common/GitClient.kt | 15 ++-- .../ScriptBackgroundCoroutineDispatcher.kt | 86 +++++++++++++++++++ .../license/MavenDependenciesListCheck.kt | 8 +- .../license/MavenDependenciesRetriever.kt | 3 +- .../maven/GenerateMavenDependenciesList.kt | 33 ++++--- .../build/FilterPerLanguageResourcesTest.kt | 2 +- .../build/TransformAndroidManifestTest.kt | 16 ++-- .../scripts/ci/ComputeAffectedTestsTest.kt | 79 ++++++++++++----- .../scripts/ci/RetrieveAffectedTestsTest.kt | 4 +- .../oppia/android/scripts/common/BUILD.bazel | 11 +++ .../android/scripts/common/BazelClientTest.kt | 64 +++++++------- .../scripts/common/CommandExecutorImplTest.kt | 32 ++++--- .../android/scripts/common/GitClientTest.kt | 42 ++++----- .../scripts/common/ProtoStringEncoderTest.kt | 4 +- .../scripts/common/RepositoryFileTest.kt | 4 +- ...ScriptBackgroundCoroutineDispatcherTest.kt | 79 +++++++++++++++++ .../scripts/docs/KdocValidityCheckTest.kt | 4 +- .../label/AccessibilityLabelCheckTest.kt | 4 +- .../scripts/license/LicenseTextsCheckTest.kt | 4 +- .../license/MavenDependenciesListCheckTest.kt | 26 ++++-- .../license/MavenDependenciesRetrieverTest.kt | 11 ++- .../GenerateMavenDependenciesListTest.kt | 27 ++++-- .../scripts/maven/RetrieveLicenseTextsTest.kt | 4 +- .../regex/RegexPatternValidationCheckTest.kt | 4 +- .../scripts/testfile/TestFileCheckTest.kt | 4 +- .../scripts/testing/TestBazelWorkspaceTest.kt | 4 +- .../scripts/testing/TestGitRepositoryTest.kt | 22 +++-- .../android/scripts/todo/TodoCollectorTest.kt | 4 +- .../scripts/todo/TodoIssueCommentCheckTest.kt | 4 +- .../todo/TodoIssueResolvedCheckTest.kt | 4 +- .../android/scripts/todo/TodoOpenCheckTest.kt | 4 +- .../xml/StringLanguageTranslationCheckTest.kt | 2 +- .../xml/StringResourceValidationCheckTest.kt | 2 +- .../android/scripts/xml/XmlSyntaxCheckTest.kt | 4 +- .../scripts/xml/XmlSyntaxErrorHandlerTest.kt | 4 +- 40 files changed, 590 insertions(+), 245 deletions(-) create mode 100644 scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt create mode 100644 scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt diff --git a/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt b/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt index 4fde91e42eb..96095ee2925 100644 --- a/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt +++ b/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt @@ -1,6 +1,8 @@ package org.oppia.android.scripts.build +import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.GitClient +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.w3c.dom.Document import org.w3c.dom.NodeList import java.io.File @@ -62,21 +64,24 @@ fun main(args: Array) { check(args.size >= 9) { USAGE_STRING } val repoRoot = File(args[0]).also { if (!it.exists()) error("File doesn't exist: ${args[0]}") } - TransformAndroidManifest( - repoRoot = repoRoot, - sourceManifestFile = File(args[1]).also { - if (!it.exists()) { - error("File doesn't exist: ${args[1]}") - } - }, - outputManifestFile = File(args[2]), - buildFlavor = args[3], - majorVersion = args[4].toIntOrNull() ?: error(USAGE_STRING), - minorVersion = args[5].toIntOrNull() ?: error(USAGE_STRING), - versionCode = args[6].toIntOrNull() ?: error(USAGE_STRING), - relativelyQualifiedApplicationClass = args[7], - baseDevelopBranchReference = args[8] - ).generateAndOutputNewManifest() + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + TransformAndroidManifest( + repoRoot = repoRoot, + sourceManifestFile = File(args[1]).also { + if (!it.exists()) { + error("File doesn't exist: ${args[1]}") + } + }, + outputManifestFile = File(args[2]), + buildFlavor = args[3], + majorVersion = args[4].toIntOrNull() ?: error(USAGE_STRING), + minorVersion = args[5].toIntOrNull() ?: error(USAGE_STRING), + versionCode = args[6].toIntOrNull() ?: error(USAGE_STRING), + relativelyQualifiedApplicationClass = args[7], + baseDevelopBranchReference = args[8], + scriptBgDispatcher + ).generateAndOutputNewManifest() + } } private class TransformAndroidManifest( @@ -88,11 +93,11 @@ private class TransformAndroidManifest( private val minorVersion: Int, private val versionCode: Int, private val relativelyQualifiedApplicationClass: String, - private val baseDevelopBranchReference: String + private val baseDevelopBranchReference: String, + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher ) { - private val gitClient by lazy { - GitClient(repoRoot, baseDevelopBranchReference) - } + private val commandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } + private val gitClient by lazy { GitClient(repoRoot, baseDevelopBranchReference, commandExecutor) } private val documentBuilderFactory by lazy { DocumentBuilderFactory.newInstance() } private val transformerFactory by lazy { TransformerFactory.newInstance() } diff --git a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt index f7cc482c72a..915b506ce0f 100644 --- a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt +++ b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt @@ -1,11 +1,15 @@ package org.oppia.android.scripts.ci import org.oppia.android.scripts.common.BazelClient +import org.oppia.android.scripts.common.CommandExecutor +import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.GitClient import org.oppia.android.scripts.common.ProtoStringEncoder.Companion.toCompressedBase64 +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.AffectedTestsBucket import java.io.File import java.util.Locale +import java.util.concurrent.TimeUnit import kotlin.system.exitProcess private const val COMPUTE_ALL_TESTS_PREFIX = "compute_all_tests=" @@ -25,19 +29,20 @@ private const val MAX_TEST_COUNT_PER_SMALL_SHARD = 15 * Arguments: * - path_to_directory_root: directory path to the root of the Oppia Android repository. * - path_to_output_file: path to the file in which the affected test targets will be printed. - * - base_develop_branch_reference: the reference to the local develop branch that should be use. - * Generally, this is 'origin/develop'. + * - merge_base_commit: the base commit against which the local changes will be compared when + * determining which tests to run. When running outside of CI you can use the result of running: + * 'git merge-base develop HEAD' * - compute_all_tests: whether to compute a list of all tests to run. * * Example: * bazel run //scripts:compute_affected_tests -- $(pwd) /tmp/affected_test_buckets.proto64 \\ - * origin/develop compute_all_tests=false + * abcdef0123456789 compute_all_tests=false */ fun main(args: Array) { if (args.size < 4) { println( "Usage: bazel run //scripts:compute_affected_tests --" + - " " + + " " + " " ) exitProcess(1) @@ -45,7 +50,7 @@ fun main(args: Array) { val pathToRoot = args[0] val pathToOutputFile = args[1] - val baseDevelopBranchReference = args[2] + val baseCommit = args[2] val computeAllTestsSetting = args[3].let { check(it.startsWith(COMPUTE_ALL_TESTS_PREFIX)) { "Expected last argument to start with '$COMPUTE_ALL_TESTS_PREFIX'" @@ -57,9 +62,10 @@ fun main(args: Array) { " '$computeAllTestsValue'" ) } - ComputeAffectedTests().compute( - pathToRoot, pathToOutputFile, baseDevelopBranchReference, computeAllTestsSetting - ) + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + ComputeAffectedTests(scriptBgDispatcher) + .compute(pathToRoot, pathToOutputFile, baseCommit, computeAllTestsSetting) + } } // Needed since the codebase isn't yet using Kotlin 1.5, so this function isn't available. @@ -73,9 +79,14 @@ private fun String.toBooleanStrictOrNull(): Boolean? { /** Utility used to compute affected test targets. */ class ComputeAffectedTests( + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, val maxTestCountPerLargeShard: Int = MAX_TEST_COUNT_PER_LARGE_SHARD, val maxTestCountPerMediumShard: Int = MAX_TEST_COUNT_PER_MEDIUM_SHARD, - val maxTestCountPerSmallShard: Int = MAX_TEST_COUNT_PER_SMALL_SHARD + val maxTestCountPerSmallShard: Int = MAX_TEST_COUNT_PER_SMALL_SHARD, + val commandExecutor: CommandExecutor = + CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) ) { private companion object { private const val GENERIC_TEST_BUCKET_NAME = "generic" @@ -87,28 +98,28 @@ class ComputeAffectedTests( * @param pathToRoot the absolute path to the working root directory * @param pathToOutputFile the absolute path to the file in which the encoded Base64 test bucket * protos should be printed - * @param baseDevelopBranchReference see [GitClient] + * @param baseCommit see [GitClient] * @param computeAllTestsSetting whether all tests should be outputted versus only the ones which * are affected by local changes in the repository */ fun compute( pathToRoot: String, pathToOutputFile: String, - baseDevelopBranchReference: String, + baseCommit: String, computeAllTestsSetting: Boolean ) { val rootDirectory = File(pathToRoot).absoluteFile check(rootDirectory.isDirectory) { "Expected '$pathToRoot' to be a directory" } - check(rootDirectory.list().contains("WORKSPACE")) { + check(rootDirectory.list()?.contains("WORKSPACE") == true) { "Expected script to be run from the workspace's root directory" } - println("Running from directory root: $rootDirectory") + println("Running from directory root: $rootDirectory.") - val gitClient = GitClient(rootDirectory, baseDevelopBranchReference) - val bazelClient = BazelClient(rootDirectory) - println("Current branch: ${gitClient.currentBranch}") - println("Most recent common commit: ${gitClient.branchMergeBase}") + val gitClient = GitClient(rootDirectory, baseCommit, commandExecutor) + val bazelClient = BazelClient(rootDirectory, commandExecutor) + println("Current branch: ${gitClient.currentBranch}.") + println("Most recent common commit: ${gitClient.branchMergeBase}.") val currentBranch = gitClient.currentBranch.toLowerCase(Locale.US) val affectedTestTargets = if (computeAllTestsSetting || currentBranch == "develop") { @@ -133,7 +144,7 @@ class ComputeAffectedTests( } private fun computeAllTestTargets(bazelClient: BazelClient): List { - println("Computing all test targets") + println("Computing all test targets...") return bazelClient.retrieveAllTestTargets() } @@ -147,7 +158,7 @@ class ComputeAffectedTests( val changedFiles = gitClient.changedFiles.filter { filepath -> File(rootDirectory, filepath).exists() }.toSet() - println("Changed files (per Git): $changedFiles") + println("Changed files (per Git, ${changedFiles.size} total): $changedFiles.") // Compute the changed targets 100 files at a time to avoid unnecessarily long-running Bazel // commands. @@ -155,7 +166,7 @@ class ComputeAffectedTests( changedFiles.chunked(size = 100).fold(initial = setOf()) { allTargets, filesChunk -> allTargets + bazelClient.retrieveBazelTargets(filesChunk).toSet() } - println("Changed Bazel file targets: $changedFileTargets") + println("Changed Bazel file targets (${changedFileTargets.size} total): $changedFileTargets.") // Similarly, compute the affect test targets list 100 file targets at a time. val affectedTestTargets = @@ -163,7 +174,9 @@ class ComputeAffectedTests( .fold(initial = setOf()) { allTargets, targetChunk -> allTargets + bazelClient.retrieveRelatedTestTargets(targetChunk).toSet() } - println("Affected Bazel test targets: $affectedTestTargets") + println( + "Affected Bazel test targets (${affectedTestTargets.size} total): $affectedTestTargets." + ) // Compute the list of Bazel files that were changed. val changedBazelFiles = changedFiles.filter { file -> @@ -171,14 +184,19 @@ class ComputeAffectedTests( file.endsWith(".bazel", ignoreCase = true) || file == "WORKSPACE" } - println("Changed Bazel-specific support files: $changedBazelFiles") + println( + "Changed Bazel-specific support files (${changedBazelFiles.size} total): $changedBazelFiles." + ) // Compute the list of affected tests based on BUILD/Bazel/WORKSPACE files. These are generally // framed as: if a BUILD file changes, run all tests transitively connected to it. val transitiveTestTargets = bazelClient.retrieveTransitiveTestTargets(changedBazelFiles) - println("Affected test targets due to transitive build deps: $transitiveTestTargets") + println( + "Affected test targets due to transitive build deps (${transitiveTestTargets.size} total):" + + " $transitiveTestTargets." + ) - return (affectedTestTargets + transitiveTestTargets).toSet().toList() + return (affectedTestTargets + transitiveTestTargets).distinct() } private fun filterTargets(testTargets: List): List { @@ -315,7 +333,7 @@ class ComputeAffectedTests( private val EXTRACT_BUCKET_REGEX = "^//([^(/|:)]+?)[/:].+?\$".toRegex() /** Returns the [TestBucket] that corresponds to the specific [testTarget]. */ - fun retrieveCorrespondingTestBucket(testTarget: String): TestBucket? { + fun retrieveCorrespondingTestBucket(testTarget: String): TestBucket { return EXTRACT_BUCKET_REGEX.matchEntire(testTarget) ?.groupValues ?.maybeSecond() diff --git a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel index 3a94254e9fc..6b26dd4f49f 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel @@ -36,6 +36,10 @@ kt_jvm_library( "CommandResult.kt", ], visibility = ["//scripts:oppia_script_library_visibility"], + deps = [ + ":script_background_coroutine_dispatcher", + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + ], ) kt_jvm_library( @@ -57,3 +61,12 @@ kt_jvm_library( "//third_party:org_jetbrains_kotlin_kotlin-stdlib-jdk8_jar", ], ) + +kt_jvm_library( + name = "script_background_coroutine_dispatcher", + srcs = ["ScriptBackgroundCoroutineDispatcher.kt"], + visibility = ["//scripts:oppia_script_library_visibility"], + deps = [ + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + ], +) diff --git a/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt b/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt index b6071d86b76..01d59a6f505 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt @@ -8,10 +8,7 @@ import java.util.Locale * Utility class to query & interact with a Bazel workspace on the local filesystem (residing within * the specified root directory). */ -class BazelClient( - private val rootDirectory: File, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() -) { +class BazelClient(private val rootDirectory: File, private val commandExecutor: CommandExecutor) { /** Returns all Bazel test targets in the workspace. */ fun retrieveAllTestTargets(): List { return correctPotentiallyBrokenTargetNames( @@ -57,16 +54,19 @@ class BazelClient( // Note that this check is needed since rbuildfiles() doesn't like taking an empty list. return if (buildFileList.isNotEmpty()) { val referencingBuildFiles = - executeBazelCommand( - "query", + runPotentiallyShardedQueryCommand( + "filter('^[^@]', rbuildfiles(%s))", // Use a filter to limit the search space. + buildFiles, "--noshow_progress", "--universe_scope=//...", "--order_output=no", - "rbuildfiles($buildFileList)" + delimiter = "," ) // Compute only test & library siblings for each individual build file. While this is both // much slower than a fully combined query & can potentially miss targets, it runs - // substantially faster per query and helps to avoid potential hanging in CI. + // substantially faster per query and helps to avoid potential hanging in CI. Note also that + // this is more correct than a combined query since it ensures that siblings checks are + // properly unique for each file being considered (vs. searching for common siblings). val relevantSiblings = referencingBuildFiles.flatMap { buildFileTarget -> retrieveFilteredSiblings(filterRuleType = "test", buildFileTarget) + retrieveFilteredSiblings(filterRuleType = "android_library", buildFileTarget) @@ -77,7 +77,7 @@ class BazelClient( relevantSiblings, "--noshow_progress", "--universe_scope=//...", - "--order_output=no", + "--order_output=no" ) ) } else listOf() @@ -142,6 +142,7 @@ class BazelClient( queryFormatStr: String, values: Iterable, vararg prefixArgs: String, + delimiter: String = " ", allowPartialFailures: Boolean = false ): List { // Split up values into partitions to ensure that the argument calls don't over-run the limit. @@ -154,7 +155,7 @@ class BazelClient( // Fragment the query across the partitions to ensure all values can be considered. return partitions.flatMap { partition -> - val lastArgument = queryFormatStr.format(Locale.US, partition.joinToString(" ")) + val lastArgument = queryFormatStr.format(Locale.US, partition.joinToString(delimiter)) val allArguments = prefixArgs.toList() + lastArgument executeBazelCommand( "query", *allArguments.toTypedArray(), allowPartialFailures = allowPartialFailures diff --git a/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt b/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt index 44817344a8f..01476cbf3cd 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt @@ -1,6 +1,19 @@ package org.oppia.android.scripts.common +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.TimeoutCancellationException +import kotlinx.coroutines.async +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.consumeAsFlow +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import kotlinx.coroutines.withTimeout import java.io.File +import java.io.InputStream import java.util.concurrent.TimeUnit /** @@ -11,6 +24,7 @@ const val WAIT_PROCESS_TIMEOUT_MS = 60_000L /** Default implementation of [CommandExecutor]. */ class CommandExecutorImpl( + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, private val processTimeout: Long = WAIT_PROCESS_TIMEOUT_MS, private val processTimeoutUnit: TimeUnit = TimeUnit.MILLISECONDS ) : CommandExecutor { @@ -29,13 +43,57 @@ class CommandExecutorImpl( .directory(workingDir) .redirectErrorStream(includeErrorOutput) .start() + + // Consume the input & error streams individually, and separately from waiting for the process + // to complete (since consuming the output channels may be required for the process to actually + // finish executing properly). + val stdoutLinesDeferred = process.inputStream.readAllLinesAsync() + val stderrLinesDeferred = process.errorStream.readAllLinesAsync() + val finished = process.waitFor(processTimeout, processTimeoutUnit) + val (standardOutputLines, standardErrorLines) = try { + runBlocking { + withTimeout(processTimeoutUnit.toMillis(processTimeout)) { + stdoutLinesDeferred.await() to stderrLinesDeferred.await() + } + } + } catch (e: TimeoutCancellationException) { + throw IllegalStateException("Process did not finish within the expected timeout", e) + } check(finished) { "Process did not finish within the expected timeout" } return CommandResult( - process.exitValue(), - process.inputStream.bufferedReader().readLines(), - if (!includeErrorOutput) process.errorStream.bufferedReader().readLines() else listOf(), - assembledCommand, + process.exitValue(), standardOutputLines, standardErrorLines, assembledCommand ) } + + private fun InputStream.readAllLinesAsync(): Deferred> { + return CoroutineScope(scriptBgDispatcher).async { + mutableListOf().also { lines -> convertToAsyncLineFlow().collect { lines += it } } + } + } + + private fun InputStream.convertToAsyncLineFlow(): Flow { + return Channel().also { inputChannel -> + @Suppress("DeferredResultUnused") // Can be ignored since the channel result is watched. + CoroutineScope(scriptBgDispatcher).async { + this@convertToAsyncLineFlow.writeTo(inputChannel) + } + }.consumeAsFlow() + } + + private suspend fun InputStream.writeTo(channel: Channel) { + // Use I/O dispatchers for blocking I/O operations to avoid potentially running out of threads + // in the background dispatcher (that may be doing other things elsewhere in scripts). + withContext(Dispatchers.IO) { + // See https://stackoverflow.com/a/3285479 for context. Some processes require stdout/stderr + // to be consumed to progress. + try { + for (line in this@writeTo.bufferedReader().lineSequence()) { + channel.send(line) + } + } finally { + channel.close() + } + } + } } diff --git a/scripts/src/java/org/oppia/android/scripts/common/GitClient.kt b/scripts/src/java/org/oppia/android/scripts/common/GitClient.kt index 797d345bbf2..159401bb81c 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/GitClient.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/GitClient.kt @@ -4,15 +4,14 @@ import java.io.File /** * General utility for interfacing with a Git repository located at the specified working directory - * and using the specified relative branch reference that should be used when computing changes from - * the develop branch. + * and using the specified base commit hash reference that should be used when computing changes + * from the local branch. */ class GitClient( private val workingDirectory: File, - private val baseDevelopBranchReference: String + private val baseCommit: String, + private val commandExecutor: CommandExecutor ) { - private val commandExecutor by lazy { CommandExecutorImpl() } - /** The commit hash of the HEAD of the local Git repository. */ val currentCommit: String by lazy { retrieveCurrentCommit() } @@ -37,7 +36,11 @@ class GitClient( } private fun retrieveBranchMergeBase(): String { - return executeGitCommandWithOneLineOutput("merge-base $baseDevelopBranchReference HEAD") + return executeGitCommandWithOneLineOutput("merge-base $baseCommit HEAD").also { + if (baseCommit != it) { + println("WARNING: Provided base commit $baseCommit doesn't match merge-base: $it.") + } + } } private fun retrieveChangedFilesWithPotentialDuplicates(): List = diff --git a/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt b/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt new file mode 100644 index 00000000000..52bb21c0a0f --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt @@ -0,0 +1,86 @@ +package org.oppia.android.scripts.common + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Runnable +import kotlinx.coroutines.asCoroutineDispatcher +import java.io.Closeable +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit +import kotlin.coroutines.CoroutineContext + +/** + * A [CoroutineDispatcher] that's [Closeable] and particularly tailored to be easily used in scripts + * that need to perform parallel tasks for expensive IO. It's highly recommended to exclusively use + * this dispatcher over any others, and to ensure that [close] is called at the end of the script to + * avoid any potential threads hanging (causing the script to not actually close). + * + * Note that the dispatcher attempts to finish any ongoing tasks when [close] is called, but it will + * reject new tasks from being scheduled and it will force terminate if any pending tasks at the + * time of closing don't end within the configured [closeTimeout] provided. + * + * A simple example for using this dispatcher: + * ```kotlin + * ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + * val deferred = CoroutineScope(scriptBgDispatcher).async { + * // Expensive task... + * } + * // IMPORTANT: The operation must be observed before use{} ends, otherwise the dispatcher will + * // close and terminate any pending tasks. + * runBlocking { deferred.await() } + * } + * ``` + * + * A more complex example for I/O operations: + * ```kotlin + * ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + * val deferred = CoroutineScope(scriptBgDispatcher).async { + * withContext(Dispatchers.IO) { + * // Perform I/O using Kotlin's highly parallelized I/O dispatcher, but wait for the result + * // using the background script dispatcher (since execution could continue if other I/O + * // operations need to be kicked off, or if other work can be done alongside the I/O). + * } + * } + * // IMPORTANT: The operation must be observed before use{} ends, otherwise the dispatcher will + * // close and terminate any pending tasks. + * runBlocking { deferred.await() } + * } + * ``` + * + * @property closeTimeout the amount of time, in [closeTimeoutUnit] units, that should be waited + * when [close]ing this dispatcher before force-ending ongoing tasks + * @property closeTimeoutUnit the unit of time used for [closeTimeout] + */ +class ScriptBackgroundCoroutineDispatcher( + private val closeTimeout: Long = 5, + private val closeTimeoutUnit: TimeUnit = TimeUnit.SECONDS +) : CoroutineDispatcher(), Closeable { + private val threadPool by lazy { Executors.newCachedThreadPool() } + private val coroutineDispatcher by lazy { threadPool.asCoroutineDispatcher() } + + override fun dispatch(context: CoroutineContext, block: Runnable) { + coroutineDispatcher.dispatch(context, block) + } + + override fun close() { + threadPool.tryShutdownFully(timeout = closeTimeout, unit = closeTimeoutUnit) + coroutineDispatcher.close() + } + + private companion object { + private fun ExecutorService.tryShutdownFully(timeout: Long, unit: TimeUnit) { + // Try to fully shutdown the executor service per https://stackoverflow.com/a/33690603 and + // https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html. + shutdown() + try { + if (!awaitTermination(timeout, unit)) { + shutdownNow() + check(awaitTermination(timeout, unit)) { "ExecutorService didn't fully shutdown: $this." } + } + } catch (e: InterruptedException) { + shutdownNow() + Thread.currentThread().interrupt() + } + } + } +} diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt index 1632c3c9068..d8f178c7b21 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt @@ -3,6 +3,7 @@ package org.oppia.android.scripts.license import com.google.protobuf.TextFormat import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.MavenDependency /** @@ -24,7 +25,9 @@ import org.oppia.android.scripts.proto.MavenDependency * third_party/maven_install.json scripts/assets/maven_dependencies.pb */ fun main(args: Array) { - MavenDependenciesListCheck(LicenseFetcherImpl()).main(args) + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + MavenDependenciesListCheck(LicenseFetcherImpl(), scriptBgDispatcher).main(args) + } } /** @@ -33,7 +36,8 @@ fun main(args: Array) { */ class MavenDependenciesListCheck( private val licenseFetcher: LicenseFetcher, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() + scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, + private val commandExecutor: CommandExecutor = CommandExecutorImpl(scriptBgDispatcher) ) { /** diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt index 3b67d51a751..e37c188bac5 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt @@ -5,7 +5,6 @@ import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import org.oppia.android.scripts.common.BazelClient import org.oppia.android.scripts.common.CommandExecutor -import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.maven.model.MavenListDependency import org.oppia.android.scripts.maven.model.MavenListDependencyTree import org.oppia.android.scripts.proto.License @@ -24,7 +23,7 @@ private const val MAVEN_PREFIX = "@maven//:" class MavenDependenciesRetriever( private val rootPath: String, private val licenseFetcher: LicenseFetcher, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() + private val commandExecutor: CommandExecutor ) { private val bazelClient by lazy { diff --git a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt index 8829a55a475..f0f4e4576e1 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt +++ b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt @@ -2,6 +2,7 @@ package org.oppia.android.scripts.maven import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.license.LicenseFetcher import org.oppia.android.scripts.license.LicenseFetcherImpl import org.oppia.android.scripts.license.MavenDependenciesRetriever @@ -27,13 +28,16 @@ import org.oppia.android.scripts.proto.MavenDependencyList * scripts/assets/maven_dependencies.pb */ fun main(args: Array) { - GenerateMavenDependenciesList(LicenseFetcherImpl()).main(args) + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + GenerateMavenDependenciesList(LicenseFetcherImpl(), scriptBgDispatcher).main(args) + } } /** Wrapper class to pass dependencies to be utilized by the the main method. */ class GenerateMavenDependenciesList( private val licenseFetcher: LicenseFetcher, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() + scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, + private val commandExecutor: CommandExecutor = CommandExecutorImpl(scriptBgDispatcher) ) { /** * Compiles a list of third-party maven dependencies along with their license links on @@ -48,45 +52,46 @@ class GenerateMavenDependenciesList( val pathToMavenDependenciesTextProto = "$pathToRoot/${args[2]}" val pathToMavenDependenciesPb = args[3] - val MavenDependenciesRetriever = MavenDependenciesRetriever(pathToRoot, licenseFetcher) + val mavenDependenciesRetriever = + MavenDependenciesRetriever(pathToRoot, licenseFetcher, commandExecutor) val bazelQueryDepsList = - MavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() - val mavenInstallDepsList = MavenDependenciesRetriever.getDependencyListFromMavenInstall( + mavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() + val mavenInstallDepsList = mavenDependenciesRetriever.getDependencyListFromMavenInstall( pathToMavenInstallJson, bazelQueryDepsList ) val dependenciesListFromPom = - MavenDependenciesRetriever + mavenDependenciesRetriever .retrieveDependencyListFromPom(mavenInstallDepsList) .mavenDependencyList val dependenciesListFromTextProto = - MavenDependenciesRetriever.retrieveMavenDependencyList(pathToMavenDependenciesPb) + mavenDependenciesRetriever.retrieveMavenDependencyList(pathToMavenDependenciesPb) - val updatedDependenciesList = MavenDependenciesRetriever.addChangesFromTextProto( + val updatedDependenciesList = mavenDependenciesRetriever.addChangesFromTextProto( dependenciesListFromPom, dependenciesListFromTextProto ) val manuallyUpdatedLicenses = - MavenDependenciesRetriever.retrieveManuallyUpdatedLicensesSet(updatedDependenciesList) + mavenDependenciesRetriever.retrieveManuallyUpdatedLicensesSet(updatedDependenciesList) - val finalDependenciesList = MavenDependenciesRetriever.updateMavenDependenciesList( + val finalDependenciesList = mavenDependenciesRetriever.updateMavenDependenciesList( updatedDependenciesList, manuallyUpdatedLicenses ) - MavenDependenciesRetriever.writeTextProto( + mavenDependenciesRetriever.writeTextProto( pathToMavenDependenciesTextProto, MavenDependencyList.newBuilder().addAllMavenDependency(finalDependenciesList).build() ) val licensesToBeFixed = - MavenDependenciesRetriever.getAllBrokenLicenses(finalDependenciesList) + mavenDependenciesRetriever.getAllBrokenLicenses(finalDependenciesList) if (licensesToBeFixed.isNotEmpty()) { - val licenseToDependencyMap = MavenDependenciesRetriever + val licenseToDependencyMap = mavenDependenciesRetriever .findFirstDependenciesWithBrokenLicenses( finalDependenciesList, licensesToBeFixed @@ -150,7 +155,7 @@ class GenerateMavenDependenciesList( } val dependenciesWithoutAnyLinks = - MavenDependenciesRetriever.getDependenciesThatNeedIntervention(finalDependenciesList) + mavenDependenciesRetriever.getDependenciesThatNeedIntervention(finalDependenciesList) if (dependenciesWithoutAnyLinks.isNotEmpty()) { println( """ diff --git a/scripts/src/javatests/org/oppia/android/scripts/build/FilterPerLanguageResourcesTest.kt b/scripts/src/javatests/org/oppia/android/scripts/build/FilterPerLanguageResourcesTest.kt index 4b12a0ee953..8e617f232df 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/build/FilterPerLanguageResourcesTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/build/FilterPerLanguageResourcesTest.kt @@ -66,7 +66,7 @@ class FilterPerLanguageResourcesTest { createSupportedLanguages(ENGLISH, BRAZILIAN_PORTUGUESE, SWAHILI) private val SUPPORTED_LANGUAGES_EN_AR = createSupportedLanguages(ENGLISH, ARABIC) - @field:[Rule JvmField] var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out diff --git a/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt b/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt index 424d22b661f..c8fe872bdde 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt @@ -1,11 +1,13 @@ package org.oppia.android.scripts.build import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.testing.TestGitRepository import org.oppia.android.testing.assertThrows import java.io.File @@ -54,16 +56,20 @@ class TransformAndroidManifestTest { private val VERSION_CODE = "23" private val APPLICATION_RELATIVE_QUALIFIED_CLASS = ".example.CustomApplication" - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() - private val commandExecutor by lazy { CommandExecutorImpl() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val commandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } private lateinit var testGitRepository: TestGitRepository @Before fun setUp() { - testGitRepository = TestGitRepository(tempFolder, CommandExecutorImpl()) + testGitRepository = TestGitRepository(tempFolder, commandExecutor) + } + + @After + fun tearDown() { + scriptBgDispatcher.close() } @Test diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt index 654e42425c8..8762c5793f9 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt @@ -6,8 +6,11 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.GitClient import org.oppia.android.scripts.common.ProtoStringEncoder.Companion.mergeFromCompressedBase64 +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.AffectedTestsBucket import org.oppia.android.scripts.testing.TestBazelWorkspace import org.oppia.android.scripts.testing.TestGitRepository @@ -28,20 +31,21 @@ import java.io.PrintStream // Function name: test names are conventionally named with underscores. @Suppress("SameParameterValue", "FunctionName") class ComputeAffectedTestsTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + + private lateinit var commandExecutor: CommandExecutor private lateinit var testBazelWorkspace: TestBazelWorkspace private lateinit var testGitRepository: TestGitRepository - private lateinit var pendingOutputStream: ByteArrayOutputStream private lateinit var originalStandardOutputStream: OutputStream @Before fun setUp() { + commandExecutor = CommandExecutorImpl(scriptBgDispatcher) testBazelWorkspace = TestBazelWorkspace(tempFolder) - testGitRepository = TestGitRepository(tempFolder, CommandExecutorImpl()) + testGitRepository = TestGitRepository(tempFolder, commandExecutor) // Redirect script output for testing purposes. pendingOutputStream = ByteArrayOutputStream() @@ -58,6 +62,8 @@ class ComputeAffectedTestsTest { // and to help manually verify the expect git state at the end of each test. println("git status (at end of test):") println(testGitRepository.status()) + + scriptBgDispatcher.close() } @Test @@ -133,7 +139,7 @@ class ComputeAffectedTestsTest { @Test fun testUtility_emptyDirectory_throwsException() { - val exception = assertThrows(IllegalStateException::class) { runScript() } + val exception = assertThrows(IllegalStateException::class) { runScript(currentHeadHash = "ad") } assertThat(exception).hasMessageThat().contains("run from the workspace's root directory") } @@ -523,7 +529,9 @@ class ComputeAffectedTestsTest { createBasicTests("AppTest1", "AppTest2", "AppTest3", subpackage = "app") val reportedTargets = runScriptWithShardLimits( - maxTestCountPerLargeShard = 3, maxTestCountPerMediumShard = 2, maxTestCountPerSmallShard = 1 + maxTestCountPerLargeShard = 3, + maxTestCountPerMediumShard = 2, + maxTestCountPerSmallShard = 1 ) // App module tests partition eagerly, so there should be 3 groups. Also, the code below @@ -544,7 +552,9 @@ class ComputeAffectedTestsTest { createBasicTests("DataTest1", "DataTest2", "DataTest3", subpackage = "data") val reportedTargets = runScriptWithShardLimits( - maxTestCountPerLargeShard = 3, maxTestCountPerMediumShard = 2, maxTestCountPerSmallShard = 1 + maxTestCountPerLargeShard = 3, + maxTestCountPerMediumShard = 2, + maxTestCountPerSmallShard = 1 ) // Data tests are partitioned such that they are combined into one partition. @@ -560,7 +570,9 @@ class ComputeAffectedTestsTest { createBasicTests("DomainTest1", "DomainTest2", "DomainTest3", subpackage = "domain") val reportedTargets = runScriptWithShardLimits( - maxTestCountPerLargeShard = 3, maxTestCountPerMediumShard = 2, maxTestCountPerSmallShard = 1 + maxTestCountPerLargeShard = 3, + maxTestCountPerMediumShard = 2, + maxTestCountPerSmallShard = 1 ) // Domain tests are partitioned such that they are combined into one partition. @@ -579,7 +591,9 @@ class ComputeAffectedTestsTest { ) val reportedTargets = runScriptWithShardLimits( - maxTestCountPerLargeShard = 3, maxTestCountPerMediumShard = 2, maxTestCountPerSmallShard = 1 + maxTestCountPerLargeShard = 3, + maxTestCountPerMediumShard = 2, + maxTestCountPerSmallShard = 1 ) // Instrumentation tests are partitioned such that they are combined into one partition. @@ -598,7 +612,9 @@ class ComputeAffectedTestsTest { createBasicTests("ScriptsTest1", "ScriptsTest2", "ScriptsTest3", subpackage = "scripts") val reportedTargets = runScriptWithShardLimits( - maxTestCountPerLargeShard = 3, maxTestCountPerMediumShard = 2, maxTestCountPerSmallShard = 1 + maxTestCountPerLargeShard = 3, + maxTestCountPerMediumShard = 2, + maxTestCountPerSmallShard = 1 ) // See app module test above for specifics. Scripts tests are medium partitioned which means 3 @@ -618,7 +634,9 @@ class ComputeAffectedTestsTest { createBasicTests("TestingTest1", "TestingTest2", "TestingTest3", subpackage = "testing") val reportedTargets = runScriptWithShardLimits( - maxTestCountPerLargeShard = 3, maxTestCountPerMediumShard = 2, maxTestCountPerSmallShard = 1 + maxTestCountPerLargeShard = 3, + maxTestCountPerMediumShard = 2, + maxTestCountPerSmallShard = 1 ) // Testing tests are partitioned such that they are combined into one partition. @@ -634,7 +652,9 @@ class ComputeAffectedTestsTest { createBasicTests("UtilityTest1", "UtilityTest2", "UtilityTest3", subpackage = "utility") val reportedTargets = runScriptWithShardLimits( - maxTestCountPerLargeShard = 3, maxTestCountPerMediumShard = 2, maxTestCountPerSmallShard = 1 + maxTestCountPerLargeShard = 3, + maxTestCountPerMediumShard = 2, + maxTestCountPerSmallShard = 1 ) // Utility tests are partitioned such that they are combined into one partition. @@ -692,14 +712,20 @@ class ComputeAffectedTestsTest { .containsExactly("//scripts:ScriptsTest1", "//scripts:ScriptsTest2") } - private fun runScriptWithTextOutput(computeAllTargets: Boolean = false): List { + private fun runScriptWithTextOutput( + currentHeadHash: String = computeMergeBase("develop"), + computeAllTargets: Boolean = false + ): List { val outputLog = tempFolder.newFile("output.log") - main( - arrayOf( - tempFolder.root.absolutePath, outputLog.absolutePath, "develop", - "compute_all_tests=$computeAllTargets" + val currentHeadHash = + main( + arrayOf( + tempFolder.root.absolutePath, + outputLog.absolutePath, + currentHeadHash, + "compute_all_tests=$computeAllTargets" + ) ) - ) return outputLog.readLines() } @@ -708,27 +734,33 @@ class ComputeAffectedTestsTest { * here is that which is saved directly to the output file, not debug lines printed to the * console. */ - private fun runScript(computeAllTargets: Boolean = false): List { - return parseOutputLogLines(runScriptWithTextOutput(computeAllTargets = computeAllTargets)) + private fun runScript( + currentHeadHash: String = computeMergeBase("develop"), + computeAllTargets: Boolean = false + ): List { + return parseOutputLogLines(runScriptWithTextOutput(currentHeadHash, computeAllTargets)) } private fun runScriptWithShardLimits( + baseBranch: String = "develop", maxTestCountPerLargeShard: Int, maxTestCountPerMediumShard: Int, maxTestCountPerSmallShard: Int ): List { val outputLog = tempFolder.newFile("output.log") + val currentHeadHash = computeMergeBase(baseBranch) // Note that main() can't be used since the shard counts need to be overwritten. Dagger would // be a nicer means to do this, but it's not set up currently for scripts. ComputeAffectedTests( + scriptBgDispatcher, maxTestCountPerLargeShard = maxTestCountPerLargeShard, maxTestCountPerMediumShard = maxTestCountPerMediumShard, maxTestCountPerSmallShard = maxTestCountPerSmallShard ).compute( pathToRoot = tempFolder.root.absolutePath, pathToOutputFile = outputLog.absolutePath, - baseDevelopBranchReference = "develop", + baseCommit = currentHeadHash, computeAllTestsSetting = false ) @@ -862,4 +894,7 @@ class ComputeAffectedTestsTest { testGitRepository.stageFileForCommit(libFile) testGitRepository.commit(message = "Modified library $name") } + + private fun computeMergeBase(referenceBranch: String): String = + GitClient(tempFolder.root, referenceBranch, commandExecutor).branchMergeBase } diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/RetrieveAffectedTestsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/ci/RetrieveAffectedTestsTest.kt index d43a7055f51..0eda69938ce 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/RetrieveAffectedTestsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/RetrieveAffectedTestsTest.kt @@ -18,9 +18,7 @@ import java.io.PrintStream // FunctionName: test names are conventionally named with underscores. @Suppress("FunctionName") class RetrieveAffectedTestsTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() private lateinit var pendingOutputStream: ByteArrayOutputStream private lateinit var originalStandardOutputStream: OutputStream diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel index e47fc741ab6..bd1ef437389 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel @@ -60,3 +60,14 @@ kt_jvm_test( "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) + +kt_jvm_test( + name = "ScriptBackgroundCoroutineDispatcherTest", + srcs = ["ScriptBackgroundCoroutineDispatcherTest.kt"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/common:script_background_coroutine_dispatcher", + "//testing:assertion_helpers", + "//third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//third_party:org_mockito_mockito-core", + ], +) diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt index f2e7914682c..0d09363712d 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt @@ -1,6 +1,7 @@ package org.oppia.android.scripts.common import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -25,19 +26,20 @@ import java.util.concurrent.TimeUnit // Function name: test names are conventionally named with underscores. @Suppress("SameParameterValue", "FunctionName") class BazelClientTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + @field:[Rule JvmField] val mockitoRule: MockitoRule = MockitoJUnit.rule() - @Rule - @JvmField - val mockitoRule: MockitoRule = MockitoJUnit.rule() - - private val commandExecutor by lazy { initiazeCommandExecutorWithLongProcessWaitTime() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val commandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } + private val longCommandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } private lateinit var testBazelWorkspace: TestBazelWorkspace - @Mock - lateinit var mockCommandExecutor: CommandExecutor + @Mock lateinit var mockCommandExecutor: CommandExecutor + + @After + fun tearDown() { + scriptBgDispatcher.close() + } @Before fun setUp() { @@ -46,7 +48,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_emptyFolder_fails() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) val exception = assertThrows(IllegalStateException::class) { bazelClient.retrieveAllTestTargets() @@ -59,7 +61,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_emptyWorkspace_fails() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() val exception = assertThrows(IllegalStateException::class) { @@ -73,7 +75,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_workspaceWithTest_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("ExampleTest") @@ -84,7 +86,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_workspaceWithMultipleTests_returnsTestTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest") @@ -106,7 +108,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forFileNotInBuildGraph_returnsEmptyList() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() tempFolder.newFile("filenotingraph") @@ -117,7 +119,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forTestFile_returnsBazelTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") @@ -128,7 +130,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forMultipleMixedFiles_returnsBazelTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", withGeneratedDependency = true) @@ -157,7 +159,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forTargetWithNoTestDependency_returnsNoTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary("SomeDependency") testBazelWorkspace.createTest("FirstTest") @@ -170,7 +172,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forTestFileTarget_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") @@ -181,7 +183,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forDependentFileTarget_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest", withGeneratedDependency = true) @@ -192,7 +194,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forMixedFileTargets_returnsRelatedTestTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary("ExtraDep") testBazelWorkspace.createTest("FirstTest", withExtraDependency = "//:ExtraDep_lib") @@ -227,7 +229,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forNoFiles_returnsEmptyList() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() val testTargets = bazelClient.retrieveTransitiveTestTargets(listOf()) @@ -238,7 +240,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forBuildFile_returnsAllTestsInThatBuildFile() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest") @@ -253,7 +255,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forMultipleBuildFiles_returnsAllRelatedTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", subpackage = "two") @@ -269,7 +271,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forBzlFile_returnsRelatedTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() // Generate tests. testBazelWorkspace.createTest("FirstTest") @@ -298,7 +300,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forWorkspace_returnsAllTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", subpackage = "two") @@ -341,7 +343,7 @@ class BazelClientTest { artifactName = "com.android.support:support-annotations:28.0.0", buildFile = thirdPartyBuild ) - val bazelClient = BazelClient(tempFolder.root, commandExecutor) + val bazelClient = BazelClient(tempFolder.root, longCommandExecutor) val thirdPartyDependenciesList = bazelClient.retrieveThirdPartyMavenDepsListForBinary("//:test_oppia") @@ -371,7 +373,7 @@ class BazelClientTest { artifactName = "com.android.support:support-annotations:28.0.0", buildFile = testBazelWorkspace.rootBuildFile ) - val bazelClient = BazelClient(tempFolder.root, commandExecutor) + val bazelClient = BazelClient(tempFolder.root, longCommandExecutor) val thirdPartyDependenciesList = bazelClient.retrieveThirdPartyMavenDepsListForBinary("//:test_oppia") @@ -463,8 +465,10 @@ class BazelClientTest { return secondNewFile } - private fun initiazeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { - return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + private fun initializeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { + return CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) } private fun updateBuildFileToUseCustomJvmTestRule(bazelFile: File, buildFile: File) { diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt index e04c0954b85..aeb7c3782dc 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt @@ -1,6 +1,7 @@ package org.oppia.android.scripts.common import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder @@ -19,13 +20,18 @@ import java.util.concurrent.TimeUnit // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class CommandExecutorImplTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + + @After + fun tearDown() { + scriptBgDispatcher.close() + } @Test fun testExecute_echo_oneArgument_succeedsWithOutput() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "echo", "value") @@ -35,7 +41,7 @@ class CommandExecutorImplTest { @Test fun testExecute_echo_invalidDirectory_throwsException() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val exception = assertThrows(IllegalStateException::class) { commandExecutor.executeCommand(File("invaliddirectory"), "echo", "value") @@ -47,7 +53,7 @@ class CommandExecutorImplTest { @Test fun testExecute_echo_largeOutput_insufficientTimeout_throwsException() { val commandExecutor = CommandExecutorImpl( - processTimeout = 0L, processTimeoutUnit = TimeUnit.MILLISECONDS + scriptBgDispatcher, processTimeout = 0L, processTimeoutUnit = TimeUnit.MILLISECONDS ) // Produce a large output so that echo takes a bit longer to reduce the likelihood of this test @@ -63,7 +69,7 @@ class CommandExecutorImplTest { @Test fun testExecute_nonexistentCommand_throwsException() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val exception = assertThrows(IOException::class) { commandExecutor.executeCommand(tempFolder.root, "commanddoesnotexist") @@ -74,7 +80,7 @@ class CommandExecutorImplTest { @Test fun testExecute_echo_multipleArguments_succeedsWithOutput() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "echo", "first", "second", "third") @@ -84,7 +90,7 @@ class CommandExecutorImplTest { @Test fun testExecute_echo_multipleArguments_resultHasCorrectCommand() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "echo", "first", "second", "third") @@ -93,7 +99,7 @@ class CommandExecutorImplTest { @Test fun testExecute_defaultErrorOutput_rmdir_failed_failsWithCombinedOutput() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "rmdir", "filethatdoesnotexist") @@ -105,7 +111,7 @@ class CommandExecutorImplTest { @Test fun testExecute_splitErrorOutput_rmdir_failed_failsWithErrorOutput() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand( @@ -121,7 +127,7 @@ class CommandExecutorImplTest { @Test fun testExecute_removeDirectoryInLocalDirectory_succeeds() { val newFolder = tempFolder.newFolder("newfolder") - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "rmdir", "./newfolder") @@ -135,7 +141,7 @@ class CommandExecutorImplTest { fun testExecute_removeUnknownDirectoryInOtherDirectory_fails() { val newFolder = tempFolder.newFolder("newfolder") val alternateRoot = tempFolder.newFolder("alternateroot") - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(alternateRoot, "rmdir", "./newfolder") diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt index 9362d7dd006..4def38ae59f 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt @@ -20,12 +20,11 @@ import java.lang.IllegalStateException // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class GitClientTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() private lateinit var testGitRepository: TestGitRepository - private val commandExecutor by lazy { CommandExecutorImpl() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val commandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } @Before fun setUp() { @@ -38,11 +37,12 @@ class GitClientTest { // and to help manually verify the expect git state at the end of each test. println("git status (at end of test):") println(testGitRepository.status()) + scriptBgDispatcher.close() } @Test fun testCurrentCommit_forNonRepository_throwsException() { - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val exception = assertThrows(IllegalStateException::class) { gitClient.currentCommit } @@ -55,7 +55,7 @@ class GitClientTest { initializeRepoWithDevelopBranch() val developHash = getMostRecentCommitOnCurrentBranch() - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val currentCommit = gitClient.currentCommit assertThat(currentCommit).isEqualTo(developHash) @@ -69,7 +69,7 @@ class GitClientTest { testGitRepository.commit(message = "Test empty commit", allowEmpty = true) val featureBranchHash = getMostRecentCommitOnCurrentBranch() - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val currentCommit = gitClient.currentCommit assertThat(currentCommit).isNotEqualTo(developHash) @@ -78,7 +78,7 @@ class GitClientTest { @Test fun testCurrentBranch_forNonRepository_throwsException() { - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val exception = assertThrows(IllegalStateException::class) { gitClient.currentBranch } @@ -90,7 +90,7 @@ class GitClientTest { fun testCurrentBranch_forValidRepository_returnsCorrectBranch() { initializeRepoWithDevelopBranch() - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val currentBranch = gitClient.currentBranch assertThat(currentBranch).isEqualTo("develop") @@ -101,7 +101,7 @@ class GitClientTest { initializeRepoWithDevelopBranch() testGitRepository.checkoutNewBranch("introduce-feature") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val currentBranch = gitClient.currentBranch assertThat(currentBranch).isEqualTo("introduce-feature") @@ -112,7 +112,7 @@ class GitClientTest { initializeRepoWithDevelopBranch() val developHash = getMostRecentCommitOnCurrentBranch() - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val mergeBase = gitClient.branchMergeBase assertThat(mergeBase).isEqualTo(developHash) @@ -124,7 +124,7 @@ class GitClientTest { val developHash = getMostRecentCommitOnCurrentBranch() testGitRepository.checkoutNewBranch("introduce-feature") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val mergeBase = gitClient.branchMergeBase assertThat(mergeBase).isEqualTo(developHash) @@ -137,7 +137,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") commitNewFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val mergeBase = gitClient.branchMergeBase // The merge base is the latest common hash between this & the develop branch. @@ -149,7 +149,7 @@ class GitClientTest { initializeRepoWithDevelopBranch() testGitRepository.checkoutNewBranch("introduce-feature") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).isEmpty() @@ -161,7 +161,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") createNewFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("example_file") @@ -173,7 +173,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") stageNewFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("example_file") @@ -185,7 +185,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") commitNewFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("example_file") @@ -197,7 +197,7 @@ class GitClientTest { commitNewFile("develop_file") testGitRepository.checkoutNewBranch("introduce-feature") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles // Committed files to the develop branch are not included since they aren't part of the feature @@ -212,7 +212,7 @@ class GitClientTest { commitNewFile("example_file") modifyFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("example_file") @@ -225,7 +225,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") deleteFile("develop_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("develop_file") @@ -244,7 +244,7 @@ class GitClientTest { modifyFile("develop_branch_file_changed_not_staged") deleteFile("develop_branch_file_removed") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly( diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt index b03c106500a..78907885bc7 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt @@ -16,9 +16,7 @@ import java.util.zip.ZipException // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class ProtoStringEncoderTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Test fun testEncode_defaultProto_producesString() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/RepositoryFileTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/RepositoryFileTest.kt index 99049bd675d..4aa35d33e2e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/RepositoryFileTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/RepositoryFileTest.kt @@ -9,9 +9,7 @@ import java.io.File /** Tests for [RepositoryFile]. */ class RepositoryFileTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt new file mode 100644 index 00000000000..dce99691bcb --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt @@ -0,0 +1,79 @@ +package org.oppia.android.scripts.common + +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.async +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import org.junit.Rule +import org.junit.Test +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule +import org.oppia.android.testing.assertThrows +import java.util.concurrent.TimeUnit + +/** Tests for [ScriptBackgroundCoroutineDispatcher]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +class ScriptBackgroundCoroutineDispatcherTest { + @field:[Rule JvmField] val mockitoRule: MockitoRule = MockitoJUnit.rule() + + @Mock lateinit var mockRunnable: Runnable + + @Test + fun testDispatchTask_taskIsRun() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + + runBlocking { withContext(dispatcher) { mockRunnable.run() } } + + verify(mockRunnable).run() + } + + @Test + fun testClose_noExceptionThrown() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + + dispatcher.close() + + // The verification is that no exception is thrown (otherwise the test should fail). + } + + @Test + fun testDispatch_afterClosing_throwsException() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + dispatcher.close() + + // The task should fail to schedule since the dispatcher has been closed. + assertThrows(CancellationException::class) { + runBlocking { withContext(dispatcher) { mockRunnable.run() } } + } + } + + @Test + fun testClose_pendingTaskLongerThanCloseTimeout_taskIsNotRun() { + val dispatcher = + ScriptBackgroundCoroutineDispatcher( + closeTimeout = 50L, closeTimeoutUnit = TimeUnit.MILLISECONDS + ) + val taskStartedChannel = Channel() + // Schedule a task but make sure that the attempt to close the dispatcher happens exactly + // between the task starting and ending (to verify close timeout flows). + @Suppress("DeferredResultUnused") + CoroutineScope(dispatcher).async { + taskStartedChannel.send(true) + delay(1_000L) + mockRunnable.run() + } + runBlocking { taskStartedChannel.receive() } + + dispatcher.close() + + // The task should not have run since it was cancelled, but no exception will be thrown. + verifyNoMoreInteractions(mockRunnable) + } +} diff --git a/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt index d3724157c6e..27b2e66808e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt @@ -24,9 +24,7 @@ class KdocValidityCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#kdoc-validity-check for more details on how to fix this." - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/label/AccessibilityLabelCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/label/AccessibilityLabelCheckTest.kt index a1410b3ead2..79d1c1dc0bc 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/label/AccessibilityLabelCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/label/AccessibilityLabelCheckTest.kt @@ -23,9 +23,7 @@ class AccessibilityLabelCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#accessibility-label-check for more details on how to fix this." - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/LicenseTextsCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/LicenseTextsCheckTest.kt index 8a70436c6c7..8541513042b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/LicenseTextsCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/LicenseTextsCheckTest.kt @@ -21,9 +21,7 @@ class LicenseTextsCheckTest { private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt index f30b261f53a..6786bca2113 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt @@ -10,6 +10,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink import org.oppia.android.scripts.proto.License @@ -79,16 +80,16 @@ class MavenDependenciesListCheckTest { private val UNAVAILABLE_OR_INVALID_LICENSE_LINKS_FAILURE = "License links are invalid or not available for some dependencies" + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } private val mockLicenseFetcher by lazy { initializeLicenseFetcher() } private val commandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } - private lateinit var testBazelWorkspace: TestBazelWorkspace - @Rule - @JvmField - var tempFolder = TemporaryFolder() + private lateinit var testBazelWorkspace: TestBazelWorkspace @Before fun setUp() { @@ -101,6 +102,7 @@ class MavenDependenciesListCheckTest { @After fun restoreStreams() { System.setOut(originalOut) + scriptBgDispatcher.close() } @Test @@ -113,6 +115,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -189,6 +192,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -253,6 +257,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -329,6 +334,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -408,6 +414,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -484,6 +491,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -562,6 +570,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -640,6 +649,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -720,6 +730,7 @@ class MavenDependenciesListCheckTest { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -773,6 +784,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -822,6 +834,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -877,6 +890,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows(Exception::class) { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -1024,7 +1038,9 @@ class MavenDependenciesListCheckTest { } private fun initializeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { - return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + return CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) } /** Returns a mock for the [LicenseFetcher]. */ diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt index 5dd8baec8b3..c815941f42b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt @@ -11,6 +11,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.maven.model.MavenListDependency import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink @@ -81,12 +82,11 @@ class MavenDependenciesRetrieverTest { private val mavenDependenciesRetriever by lazy { initializeMavenDependenciesRetriever() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } private lateinit var testBazelWorkspace: TestBazelWorkspace - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { @@ -99,6 +99,7 @@ class MavenDependenciesRetrieverTest { @After fun restoreStreams() { System.setOut(originalOut) + scriptBgDispatcher.close() } @Test @@ -1226,7 +1227,9 @@ class MavenDependenciesRetrieverTest { } private fun initializeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { - return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + return CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) } /** Returns a mock for the [LicenseFetcher]. */ diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt index 6d63a6e9c6d..4544c62c84b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt @@ -11,6 +11,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.license.LicenseFetcher import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink @@ -64,17 +65,16 @@ class GenerateMavenDependenciesListTest { private val SCRIPT_PASSED_MESSAGE = "Script executed succesfully: maven_dependencies.textproto updated successfully." + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } private val mockLicenseFetcher by lazy { initializeLicenseFetcher() } private val commandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } private lateinit var testBazelWorkspace: TestBazelWorkspace - @Rule - @JvmField - var tempFolder = TemporaryFolder() - @Before fun setUp() { tempFolder.newFolder("scripts", "assets") @@ -86,6 +86,7 @@ class GenerateMavenDependenciesListTest { @After fun restoreStreams() { System.setOut(originalOut) + scriptBgDispatcher.close() } @Test @@ -99,6 +100,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -183,6 +185,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -207,6 +210,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -249,6 +253,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -316,6 +321,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -358,6 +364,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -426,6 +433,7 @@ class GenerateMavenDependenciesListTest { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -519,6 +527,7 @@ class GenerateMavenDependenciesListTest { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -617,6 +626,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -680,6 +690,7 @@ class GenerateMavenDependenciesListTest { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -793,6 +804,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -918,6 +930,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -1031,6 +1044,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows(Exception::class) { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -1150,6 +1164,7 @@ class GenerateMavenDependenciesListTest { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -1400,7 +1415,9 @@ class GenerateMavenDependenciesListTest { } private fun initializeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { - return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + return CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) } /** Returns a mock for the [LicenseFetcher]. */ diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt index 6be3f9c0d71..2d81300e43c 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt @@ -45,9 +45,7 @@ class RetrieveLicenseTextsTest { private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt index b004d1181b7..3fe47dd6cd7 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt @@ -172,9 +172,7 @@ class RegexPatternValidationCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#regexpatternvalidation-check for more details on how to fix this." - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt index a0fc700b720..2cfb55ed690 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt @@ -21,9 +21,7 @@ class TestFileCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#test-file-presence-check for more details on how to fix this." - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt index 9bec557f4ac..f6f2f1e83b7 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt @@ -23,9 +23,7 @@ import java.lang.IllegalStateException // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class TestBazelWorkspaceTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Test fun testCreateTestUtility_doesNotImmediatelyCreateAnyFiles() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt index 59aa28bdc84..8fb29905250 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt @@ -1,12 +1,14 @@ package org.oppia.android.scripts.testing import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.CommandResult +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.testing.assertThrows import java.io.File import java.util.UUID @@ -31,11 +33,15 @@ import java.util.UUID // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class TestGitRepositoryTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() - private val commandExecutorInterceptor by lazy { CommandExecutorInterceptor() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val commandExecutorInterceptor by lazy { CommandExecutorInterceptor(scriptBgDispatcher) } + + @After + fun restoreStreams() { + scriptBgDispatcher.close() + } @Test fun testCreateTestUtility_doesNotImmediatelyCreateAnyFiles() { @@ -52,7 +58,7 @@ class TestGitRepositoryTest { testGitRepository.init() - assertThat(tempFolder.root.list().toList()).containsExactly(".git") + assertThat(tempFolder.root.list()?.toList()).containsExactly(".git") } @Test @@ -476,9 +482,11 @@ class TestGitRepositoryTest { return file } - private class CommandExecutorInterceptor : CommandExecutor { + private class CommandExecutorInterceptor( + scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher + ) : CommandExecutor { private val commandResults = mutableListOf() - private val realCommandExecutor by lazy { CommandExecutorImpl() } + private val realCommandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } override fun executeCommand( workingDir: File, diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt index a357ee517e7..c81c4708d36 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt @@ -9,9 +9,7 @@ import org.oppia.android.scripts.todo.model.Todo /** Tests for [TodoCollector]. */ class TodoCollectorTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueCommentCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueCommentCheckTest.kt index 6c4d5fb8a8c..8baa1ea0bdf 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueCommentCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueCommentCheckTest.kt @@ -18,9 +18,7 @@ class TodoIssueCommentCheckTest { private val dummySha1 = "51ab6a0341cfb86d95a387438fc993b5eb977b83" private val dummySha2 = "74cd6a0341cfb86d95a387438fc993b5eb977b83" - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt index ae273159b92..c8bf7517bf9 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt @@ -23,9 +23,7 @@ class TodoIssueResolvedCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#todo-issue-resolved-check for more details on how to fix this." - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index 23f42c53f2c..1ca601de16e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -24,9 +24,7 @@ class TodoOpenCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#todo-open-checks for more details on how to fix this." - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/StringLanguageTranslationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/StringLanguageTranslationCheckTest.kt index ebf36a61a72..7ee270c86ab 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/StringLanguageTranslationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/StringLanguageTranslationCheckTest.kt @@ -38,7 +38,7 @@ class StringLanguageTranslationCheckTest { private val SWAHILI_STRINGS_EXTRAS = mapOf("swahili_only_string" to "Badili Wasifu") } - @field:[Rule JvmField] var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() private val originalOut: PrintStream = System.out private val documentBuilderFactory by lazy { DocumentBuilderFactory.newInstance() } diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceValidationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceValidationCheckTest.kt index c7fc526f687..6776047533b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceValidationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceValidationCheckTest.kt @@ -37,7 +37,7 @@ class StringResourceValidationCheckTest { private const val SW_STRING_TWO_NEWLINES = "\\nMsaada\\n" } - @field:[Rule JvmField] var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() private val originalOut: PrintStream = System.out private val documentBuilderFactory by lazy { DocumentBuilderFactory.newInstance() } diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt index 2e988cf0663..cc1dd9293a3 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt @@ -24,9 +24,7 @@ class XmlSyntaxCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#xml-syntax-check for more details on how to fix this." - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxErrorHandlerTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxErrorHandlerTest.kt index ec3e896517d..708db0f4a74 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxErrorHandlerTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxErrorHandlerTest.kt @@ -14,9 +14,7 @@ import javax.xml.parsers.DocumentBuilderFactory class XmlSyntaxErrorHandlerTest { private val builderFactory = DocumentBuilderFactory.newInstance() - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { From c325bc9beba5d21324a351c0f469c68abe95d9c6 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 29 Mar 2023 11:53:49 -0700 Subject: [PATCH 05/63] Use base SHA for computing affected tests. This prepares for merge queues (but doesn't quite configure the workflow for them--that will happen in a different PR), and improves how tests are computed for stacked PRs. --- .github/workflows/unit_tests.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 34884d696a2..ecc0ffa5804 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -76,10 +76,12 @@ jobs: id: compute-test-matrix env: compute_all_targets: ${{ contains(github.event.pull_request.title, '[RunAllTests]') }} + # See: https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#pull_request. + base_commit_hash: ${{ github.event.pull_request.base.sha }} # https://unix.stackexchange.com/a/338124 for reference on creating a JSON-friendly # comma-separated list of test targets for the matrix. run: | - bazel run //scripts:compute_affected_tests -- $(pwd) $(pwd)/affected_targets.log origin/develop compute_all_tests=$compute_all_targets + bazel run //scripts:compute_affected_tests -- $(pwd) $(pwd)/affected_targets.log $base_commit_hash compute_all_tests=$compute_all_targets TEST_BUCKET_LIST=$(cat ./affected_targets.log | sed 's/^\|$/"/g' | paste -sd, -) echo "Affected tests (note that this might be all tests if configured to run all or on the develop branch): $TEST_BUCKET_LIST" echo "::set-output name=matrix::{\"affected-tests-bucket-base64-encoded-shard\":[$TEST_BUCKET_LIST]}" From 47f9c023f563913b1935276ba8eebfdede79ec68 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 29 Mar 2023 12:33:06 -0700 Subject: [PATCH 06/63] Post-merge lint fix. --- .../android/scripts/maven/GenerateMavenDependenciesListTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt index 532e4ff6fc9..8e89212a6e5 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt @@ -11,8 +11,8 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl -import org.oppia.android.scripts.license.MavenArtifactPropertyFetcher import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher +import org.oppia.android.scripts.license.MavenArtifactPropertyFetcher import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink import org.oppia.android.scripts.proto.License From 8ae5aa8c99dfcf1e06ed62a66be564054ddfd2a3 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 29 Mar 2023 15:26:48 -0700 Subject: [PATCH 07/63] Fix updated TODOs. Also, update TODO check script to have nicer output, and support generating the exemption textproto file for easier updates in the future. --- scripts/assets/todo_open_exemptions.textproto | 452 +++++++++--------- .../android/scripts/common/RepositoryFile.kt | 47 +- .../oppia/android/scripts/docs/BUILD.bazel | 2 +- .../oppia/android/scripts/label/BUILD.bazel | 2 +- .../oppia/android/scripts/proto/BUILD.bazel | 4 +- .../android/scripts/testfile/BUILD.bazel | 2 +- .../oppia/android/scripts/todo/BUILD.bazel | 2 +- .../android/scripts/todo/TodoCollector.kt | 13 +- .../scripts/todo/TodoIssueResolvedCheck.kt | 29 +- .../android/scripts/todo/TodoOpenCheck.kt | 86 ++-- .../oppia/android/scripts/todo/model/Todo.kt | 6 +- .../android/scripts/todo/TodoCollectorTest.kt | 116 ++--- .../todo/TodoIssueResolvedCheckTest.kt | 42 +- .../android/scripts/todo/TodoOpenCheckTest.kt | 140 ++++-- 14 files changed, 525 insertions(+), 418 deletions(-) diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index 34352a5fca0..7c656a07836 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -3,42 +3,17 @@ todo_open_exemption { line_number: 9 } todo_open_exemption { - exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" - line_number: 67 - line_number: 68 - line_number: 74 - line_number: 76 - line_number: 98 - line_number: 99 - line_number: 100 - line_number: 101 - line_number: 102 - line_number: 136 - line_number: 137 - line_number: 140 - line_number: 173 - line_number: 174 - line_number: 175 - line_number: 180 - line_number: 182 - line_number: 221 - line_number: 222 - line_number: 223 - line_number: 228 - line_number: 230 - line_number: 236 - line_number: 275 - line_number: 279 - line_number: 317 - line_number: 318 - line_number: 322 - line_number: 371 - line_number: 372 - line_number: 373 - line_number: 377 + exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt" + line_number: 79 +} +todo_open_exemption { + exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt" + line_number: 12 } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt" + line_number: 31 + line_number: 32 line_number: 33 line_number: 34 line_number: 35 @@ -62,127 +37,127 @@ todo_open_exemption { line_number: 53 line_number: 54 line_number: 55 - line_number: 56 - line_number: 57 - line_number: 63 - line_number: 64 - line_number: 73 - line_number: 76 - line_number: 80 - line_number: 83 - line_number: 87 - line_number: 90 - line_number: 94 - line_number: 97 - line_number: 101 - line_number: 104 - line_number: 108 - line_number: 111 - line_number: 115 - line_number: 118 - line_number: 122 - line_number: 125 - line_number: 129 - line_number: 132 - line_number: 136 - line_number: 139 - line_number: 143 - line_number: 146 - line_number: 150 - line_number: 153 - line_number: 157 - line_number: 160 - line_number: 164 - line_number: 167 - line_number: 171 - line_number: 174 - line_number: 178 - line_number: 181 - line_number: 185 - line_number: 188 - line_number: 192 - line_number: 195 - line_number: 199 - line_number: 202 - line_number: 206 - line_number: 209 - line_number: 213 - line_number: 216 - line_number: 220 - line_number: 223 - line_number: 227 - line_number: 230 - line_number: 234 - line_number: 237 - line_number: 241 - line_number: 244 - line_number: 248 - line_number: 255 - line_number: 258 - line_number: 262 - line_number: 265 - line_number: 274 - line_number: 275 - line_number: 279 - line_number: 283 - line_number: 284 - line_number: 296 - line_number: 299 - line_number: 303 - line_number: 306 - line_number: 310 - line_number: 313 - line_number: 317 - line_number: 320 - line_number: 324 - line_number: 327 + line_number: 61 + line_number: 62 + line_number: 71 + line_number: 74 + line_number: 78 + line_number: 81 + line_number: 85 + line_number: 88 + line_number: 92 + line_number: 95 + line_number: 99 + line_number: 102 + line_number: 106 + line_number: 109 + line_number: 113 + line_number: 116 + line_number: 120 + line_number: 123 + line_number: 127 + line_number: 130 + line_number: 134 + line_number: 137 + line_number: 141 + line_number: 144 + line_number: 148 + line_number: 151 + line_number: 155 + line_number: 158 + line_number: 162 + line_number: 165 + line_number: 169 + line_number: 172 + line_number: 176 + line_number: 179 + line_number: 183 + line_number: 186 + line_number: 190 + line_number: 193 + line_number: 197 + line_number: 200 + line_number: 204 + line_number: 207 + line_number: 211 + line_number: 214 + line_number: 218 + line_number: 221 + line_number: 225 + line_number: 228 + line_number: 232 + line_number: 235 + line_number: 239 + line_number: 242 + line_number: 246 + line_number: 253 + line_number: 256 + line_number: 260 + line_number: 263 + line_number: 272 + line_number: 273 + line_number: 277 + line_number: 281 + line_number: 282 + line_number: 294 + line_number: 297 + line_number: 301 + line_number: 304 + line_number: 308 + line_number: 311 + line_number: 315 + line_number: 318 + line_number: 322 + line_number: 325 + line_number: 334 + line_number: 335 line_number: 336 line_number: 337 - line_number: 338 - line_number: 339 - line_number: 344 - line_number: 349 - line_number: 352 - line_number: 365 - line_number: 368 - line_number: 372 - line_number: 375 - line_number: 379 - line_number: 382 - line_number: 386 - line_number: 389 - line_number: 393 - line_number: 396 - line_number: 400 - line_number: 403 - line_number: 407 - line_number: 410 + line_number: 342 + line_number: 347 + line_number: 350 + line_number: 363 + line_number: 366 + line_number: 370 + line_number: 373 + line_number: 377 + line_number: 380 + line_number: 384 + line_number: 387 + line_number: 391 + line_number: 394 + line_number: 398 + line_number: 401 + line_number: 405 + line_number: 408 + line_number: 417 + line_number: 418 line_number: 419 line_number: 420 - line_number: 421 - line_number: 422 - line_number: 426 - line_number: 430 - line_number: 433 - line_number: 446 - line_number: 449 - line_number: 453 - line_number: 456 - line_number: 460 - line_number: 463 - line_number: 467 - line_number: 470 - line_number: 474 - line_number: 477 - line_number: 481 - line_number: 484 - line_number: 488 - line_number: 491 + line_number: 424 + line_number: 428 + line_number: 431 + line_number: 444 + line_number: 447 + line_number: 451 + line_number: 454 + line_number: 458 + line_number: 461 + line_number: 465 + line_number: 468 + line_number: 472 + line_number: 475 + line_number: 479 + line_number: 482 + line_number: 486 + line_number: 489 + line_number: 530 + line_number: 531 line_number: 532 - line_number: 533 - line_number: 534 - line_number: 539 - line_number: 544 + line_number: 537 + line_number: 542 + line_number: 545 + line_number: 546 line_number: 547 line_number: 548 line_number: 549 @@ -204,98 +179,125 @@ todo_open_exemption { line_number: 565 line_number: 566 line_number: 567 - line_number: 568 - line_number: 569 - line_number: 575 - line_number: 588 - line_number: 591 - line_number: 595 - line_number: 598 - line_number: 602 - line_number: 605 - line_number: 609 - line_number: 612 - line_number: 616 - line_number: 619 - line_number: 627 - line_number: 636 - line_number: 645 - line_number: 654 - line_number: 663 - line_number: 672 - line_number: 681 - line_number: 690 - line_number: 699 - line_number: 708 - line_number: 717 - line_number: 726 - line_number: 735 - line_number: 744 - line_number: 753 - line_number: 762 - line_number: 771 - line_number: 780 - line_number: 789 - line_number: 798 - line_number: 807 - line_number: 816 + line_number: 573 + line_number: 586 + line_number: 589 + line_number: 593 + line_number: 596 + line_number: 600 + line_number: 603 + line_number: 607 + line_number: 610 + line_number: 614 + line_number: 617 + line_number: 625 + line_number: 634 + line_number: 643 + line_number: 652 + line_number: 661 + line_number: 670 + line_number: 679 + line_number: 688 + line_number: 697 + line_number: 706 + line_number: 715 + line_number: 724 + line_number: 733 + line_number: 742 + line_number: 751 + line_number: 760 + line_number: 769 + line_number: 778 + line_number: 787 + line_number: 796 + line_number: 805 + line_number: 814 + line_number: 824 + line_number: 825 line_number: 826 - line_number: 827 - line_number: 828 - line_number: 836 - line_number: 839 - line_number: 843 - line_number: 846 - line_number: 850 - line_number: 853 + line_number: 834 + line_number: 837 + line_number: 841 + line_number: 844 + line_number: 848 + line_number: 851 + line_number: 860 + line_number: 861 line_number: 862 - line_number: 863 - line_number: 864 - line_number: 873 - line_number: 876 - line_number: 880 - line_number: 883 - line_number: 887 - line_number: 890 + line_number: 871 + line_number: 874 + line_number: 878 + line_number: 881 + line_number: 885 + line_number: 888 + line_number: 897 + line_number: 898 line_number: 899 - line_number: 900 - line_number: 901 } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt" - line_number: 71 - line_number: 73 - line_number: 79 - line_number: 95 - line_number: 97 - line_number: 103 + line_number: 70 + line_number: 72 + line_number: 78 + line_number: 94 + line_number: 96 + line_number: 102 + line_number: 129 line_number: 131 - line_number: 133 - line_number: 139 + line_number: 137 + line_number: 141 line_number: 143 - line_number: 145 - line_number: 146 - line_number: 177 - line_number: 179 + line_number: 144 + line_number: 173 + line_number: 175 + line_number: 181 line_number: 185 - line_number: 189 - line_number: 191 - line_number: 192 -} -todo_open_exemption { - exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt" - line_number: 82 + line_number: 187 + line_number: 188 } todo_open_exemption { - exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt" - line_number: 10 + exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" + line_number: 68 + line_number: 69 + line_number: 75 + line_number: 77 + line_number: 99 + line_number: 100 + line_number: 101 + line_number: 102 + line_number: 103 + line_number: 139 + line_number: 140 + line_number: 143 + line_number: 178 + line_number: 179 + line_number: 180 + line_number: 185 + line_number: 187 + line_number: 228 + line_number: 229 + line_number: 230 + line_number: 235 + line_number: 237 + line_number: 243 + line_number: 284 + line_number: 288 + line_number: 326 + line_number: 327 + line_number: 331 + line_number: 383 + line_number: 384 + line_number: 385 + line_number: 389 + line_number: 443 + line_number: 444 + line_number: 445 + line_number: 449 } - todo_open_exemption { exempted_file_path: "wiki/Coding-style-guide.md" line_number: 33 } - todo_open_exemption { exempted_file_path: "wiki/Static-Analysis-Checks.md" line_number: 155 diff --git a/scripts/src/java/org/oppia/android/scripts/common/RepositoryFile.kt b/scripts/src/java/org/oppia/android/scripts/common/RepositoryFile.kt index 14962f3ee0b..09f437629da 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/RepositoryFile.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/RepositoryFile.kt @@ -6,10 +6,10 @@ import java.nio.file.Path import kotlin.streams.asSequence /** Helper class for managing & accessing files within the project repository. */ -class RepositoryFile() { +class RepositoryFile { companion object { /** A list of directories which should be excluded for every script check. */ - private val alwaysExcludeDirectoryList = listOf( + private val alwaysExcludeDirectoryList = listOf( ".git", ".gitsecret", ".idea", @@ -19,12 +19,12 @@ class RepositoryFile() { "bazel-oppia-android", "bazel-out", "bazel-testlogs", - "app/build/", - "data/build/", - "domain/build/", - "model/build/", - "testing/build/", - "utility/build/", + "app/build", + "data/build", + "domain/build", + "model/build", + "testing/build", + "utility/build", ) /** @@ -42,33 +42,25 @@ class RepositoryFile() { fun collectSearchFiles( repoPath: String, expectedExtension: String = "", - exemptionsList: List = listOf() + exemptionsList: List = listOf() ): List { // Note that Files.walk() is used instead of Kotlin's walk() function since the latter follows // symbolic links which is almost 10x slower than not following them (due to very deep Bazel // build directories), and it's not necessary to follow the symlinks. - return Files.walk(File(repoPath).toPath()).asSequence().map(Path::toFile).filter { file -> - val isProhibited = checkIfProhibitedFile(retrieveRelativeFilePath(file, repoPath)) - !isProhibited && + val repoRoot = File(repoPath).absoluteFile.normalize() + return Files.walk(repoRoot.toPath()).asSequence().map(Path::toFile).map { file -> + file.absoluteFile.normalize() + }.filter { file -> + !checkIfProhibitedFile(repoRoot, file) && file.isFile && file.name.endsWith(expectedExtension) && - retrieveRelativeFilePath(file, repoPath) !in exemptionsList + file.toRelativeString(repoRoot) !in exemptionsList }.toList() } - /** - * Checks if a file/directory is prohibited to be analyzed for the check. - * - * @param pathString the path of the repo - * @return whether the specified path should be analyzed per allow rules - */ - private fun checkIfProhibitedFile(pathString: String): Boolean { - return alwaysExcludeDirectoryList.any { - if (it.endsWith("/")) { - pathString.startsWith("$it") - } else { - pathString.startsWith("$it/") - } + private fun checkIfProhibitedFile(repoRoot: File, consideredFile: File): Boolean { + return alwaysExcludeDirectoryList.any { dirPath -> + consideredFile.hasBase(File(repoRoot, dirPath)) } } @@ -82,5 +74,8 @@ class RepositoryFile() { fun retrieveRelativeFilePath(file: File, repoPath: String): String { return file.toString().removePrefix(repoPath) } + + private fun File.hasBase(possibleBase: File): Boolean = + relativeToOrNull(possibleBase)?.path?.let { ".." !in it } ?: false } } diff --git a/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel index f342da5ec2b..72ff0c07474 100644 --- a/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel @@ -11,7 +11,7 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:repository_file", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", "//third_party:org_jetbrains_kotlin_kotlin-compiler-embeddable", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel index 01524932353..7ad9a92714b 100644 --- a/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel @@ -12,6 +12,6 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:repository_file", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/proto/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/proto/BUILD.bazel index 60f6588f1a0..41568b8f259 100644 --- a/scripts/src/java/org/oppia/android/scripts/proto/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/proto/BUILD.bazel @@ -50,8 +50,8 @@ oppia_proto_library( visibility = ["//scripts:oppia_script_binary_visibility"], ) -java_lite_proto_library( - name = "script_exemptions_java_proto_lite", +java_proto_library( + name = "script_exemptions_java_proto", visibility = ["//scripts:oppia_script_library_visibility"], deps = [":script_exemptions_proto"], ) diff --git a/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel index dbcb1023446..6777296ae26 100644 --- a/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel @@ -12,6 +12,6 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:repository_file", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel index a099106c2cb..d0d52d801e5 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel @@ -23,7 +23,7 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ ":todo_collector", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", "//scripts/src/java/org/oppia/android/scripts/todo/model:issue", "//scripts/src/java/org/oppia/android/scripts/todo/model:todo", ], diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt index d7b8271f544..5bdff78163c 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt @@ -2,6 +2,7 @@ package org.oppia.android.scripts.todo import org.oppia.android.scripts.common.RepositoryFile import org.oppia.android.scripts.todo.model.Todo +import java.io.File /** Collects code lines containing the 'todo' keyword (case-insensitive). */ class TodoCollector { @@ -26,11 +27,7 @@ class TodoCollector { file.bufferedReader() .lineSequence() .mapIndexedNotNull { lineIndex, lineContent -> - checkIfContainsTodo( - filePath = file.toString(), - lineContent = lineContent, - lineIndex = lineIndex - ) + checkIfContainsTodo(file.absoluteFile.normalize(), lineContent, lineIndex) } } } @@ -72,14 +69,14 @@ class TodoCollector { /** * Computes whether a line of code contains the 'todo' keyword. * - * @param filePath the path of the file + * @param file the file being checked * @param lineContent the line string * @param lineIndex the index of the line sequence which is to be searched for a TODO * @return a Todo instance if the todo detector regex matches, else returns null */ - private fun checkIfContainsTodo(filePath: String, lineContent: String, lineIndex: Int): Todo? { + private fun checkIfContainsTodo(file: File, lineContent: String, lineIndex: Int): Todo? { if (todoDetectorRegex.containsMatchIn(lineContent)) { - return Todo(filePath = filePath, lineNumber = lineIndex + 1, lineContent = lineContent) + return Todo(file, lineNumber = lineIndex + 1, lineContent = lineContent) } return null } diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoIssueResolvedCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoIssueResolvedCheck.kt index d0f9a1db331..0719d3afc56 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoIssueResolvedCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoIssueResolvedCheck.kt @@ -22,8 +22,9 @@ import java.io.File * NOTE TO DEVELOPERS: The script is executed in the CI enviornment. */ fun main(vararg args: String) { - // Path of the repo to be analyzed. - val repoPath = "${args[0]}/" + // The first argument is the path of the repo to be analyzed. + val repoRoot = File("${args[0]}/").absoluteFile.normalize() + val repoPath = repoRoot.path // Issue number of the closed issue. val closedIssueNumber = args[1] @@ -42,6 +43,7 @@ fun main(vararg args: String) { } logFailures( + repoRoot, todoIssueResolvedFailures = todoIssueResolvedFailures, failureMessage = "The following TODOs are unresolved for the closed issue:" ) @@ -54,7 +56,7 @@ fun main(vararg args: String) { } if (todoIssueResolvedFailures.isNotEmpty()) { - generateTodoListFile(repoPath, todoIssueResolvedFailures, githubPermalinkUrl) + generateTodoListFile(repoRoot, todoIssueResolvedFailures, githubPermalinkUrl) throw Exception("TODO ISSUE RESOLVED CHECK FAILED") } else { println("TODO ISSUE RESOLVED CHECK PASSED") @@ -75,22 +77,22 @@ private fun checkIfTodoIssueResolvedFailure(codeLine: String, closedIssueNumber: /** * Generates a file containing all the todos corresponding to the closed issue. * - * @param repoPath path of the repo to be analyzed + * @param repoRoot the root directory of the repository * @param todoIssueResolvedFailures list of all the unresolved todos corresponding to the closed * issue. * @param githubPermalinkUrl the GitHub url for the permalinks */ private fun generateTodoListFile( - repoPath: String, + repoRoot: File, todoIssueResolvedFailures: List, githubPermalinkUrl: String ) { - val todoListFile = File(repoPath + "script_failures.txt") + val todoListFile = File(repoRoot, "script_failures.txt") todoListFile.appendText("The issue is reopened because of the following unresolved TODOs:\n") - todoIssueResolvedFailures.sortedWith(compareBy({ it.filePath }, { it.lineNumber })) + todoIssueResolvedFailures.sortedWith(compareBy({ it.file.path }, { it.lineNumber })) .forEach { todo -> todoListFile.appendText( - "$githubPermalinkUrl/${(todo.filePath).removePrefix(repoPath)}#L${todo.lineNumber}\n" + "$githubPermalinkUrl/${(todo.file.toRelativeString(repoRoot))}#L${todo.lineNumber}\n" ) } } @@ -98,14 +100,19 @@ private fun generateTodoListFile( /** * Logs the TODO issue resolved check failures. * + * @param repoRoot the root directory of the repository * @param todoIssueResolvedFailures list of all the unresolved todos for the closed issue * @param failureMessage the failure message to be logged */ -private fun logFailures(todoIssueResolvedFailures: List, failureMessage: String) { +private fun logFailures( + repoRoot: File, + todoIssueResolvedFailures: List, + failureMessage: String +) { if (todoIssueResolvedFailures.isNotEmpty()) { println(failureMessage) - todoIssueResolvedFailures.sortedWith(compareBy({ it.filePath }, { it.lineNumber })).forEach { - println("- ${it.filePath}:${it.lineNumber}") + todoIssueResolvedFailures.sortedWith(compareBy({ it.file.path }, { it.lineNumber })).forEach { + println("- ${it.file.toRelativeString(repoRoot)}:${it.lineNumber}") } println() } diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt index 65fc87faa0b..c5c095a8c35 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt @@ -1,5 +1,6 @@ package org.oppia.android.scripts.todo +import com.google.protobuf.TextFormat import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import com.squareup.moshi.Types @@ -40,15 +41,18 @@ import java.io.FileInputStream * --json number > $(pwd)/open_issues.json */ fun main(vararg args: String) { - // Path of the repo to be analyzed. - val repoPath = "${args[0]}/" + // The first argument is the path of the repo to be analyzed. + val repoRoot = File("${args[0]}/").absoluteFile.normalize() + val repoPath = repoRoot.path val pathToProtoBinary = args[1] // Path to the JSON file containing the list of open issues. - val openIssuesJsonFile = File(repoPath, args[2]) + val openIssuesJsonFile = File(repoRoot, args[2]) - check(openIssuesJsonFile.exists()) { "$repoPath${args[2]}: No such file exists" } + check(openIssuesJsonFile.exists()) { "${openIssuesJsonFile.path}: No such file exists" } + + val regenerateFile = args.getOrNull(3).toBoolean() val todoExemptionTextProtoFilePath = "scripts/assets/todo_exemptions" @@ -71,32 +75,26 @@ fun main(vararg args: String) { } val redundantExemptions = retrieveRedundantExemptions( - todos = poorlyFormattedTodos + openIssueFailureTodos, - todoExemptionList = todoExemptionList, - repoPath = repoPath + todos = poorlyFormattedTodos + openIssueFailureTodos, todoExemptionList, repoRoot ) - val poorlyFormattedTodosAfterExemption = retrieveTodosAfterExemption( - todos = poorlyFormattedTodos, - todoExemptionList = todoExemptionList, - repoPath = repoPath - ) + val poorlyFormattedTodosAfterExemption = + retrieveTodosAfterExemption(todos = poorlyFormattedTodos, todoExemptionList, repoRoot) - val openIssueFailureTodosAfterExemption = retrieveTodosAfterExemption( - todos = openIssueFailureTodos, - todoExemptionList = todoExemptionList, - repoPath = repoPath - ) + val openIssueFailureTodosAfterExemption = + retrieveTodosAfterExemption(todos = openIssueFailureTodos, todoExemptionList, repoRoot) logRedundantExemptions(redundantExemptions, todoExemptionTextProtoFilePath) logFailures( invalidTodos = poorlyFormattedTodosAfterExemption, + repoRoot, failureMessage = "TODOs not in correct format:", ) logFailures( invalidTodos = openIssueFailureTodosAfterExemption, + repoRoot, failureMessage = "TODOs not corresponding to open issues on GitHub:", ) @@ -114,6 +112,19 @@ fun main(vararg args: String) { poorlyFormattedTodosAfterExemption.isNotEmpty() || openIssueFailureTodosAfterExemption.isNotEmpty() ) { + if (regenerateFile) { + println("Regenerated exemptions:") + println() + val allProblematicTodos = poorlyFormattedTodos + openIssueFailureTodos + val newExemptions = allProblematicTodos.convertToExemptions(repoRoot) + println(newExemptions.convertToExemptionTextProto()) + } else { + println( + "There were failures. Re-run the command with \"true\" at the end to regenerate the" + + " exemption file with all failures as exempted." + ) + } + println() throw Exception("TODO CHECK FAILED") } else { println("TODO CHECK PASSED") @@ -125,18 +136,18 @@ fun main(vararg args: String) { * * @param todos the list of all the failure causing TODOs * @param todoExemptionList the list contating the TODO exemptions - * @param repoPath path of the repo to be analyzed + * @param repoRoot the root directory of the repository * @return list obtained after filtering the exemptions */ private fun retrieveTodosAfterExemption( todos: List, todoExemptionList: List, - repoPath: String + repoRoot: File ): List { return todos.filter { todo -> - todoExemptionList.none { it -> - it.exemptedFilePath == todo.filePath.removePrefix(repoPath) && - todo.lineNumber in it.getLineNumberList() + todoExemptionList.none { + it.exemptedFilePath == todo.file.toRelativeString(repoRoot) && + todo.lineNumber in it.lineNumberList } } } @@ -146,18 +157,18 @@ private fun retrieveTodosAfterExemption( * * @param todos the list of all the failure causing TODOs * @param todoExemptionList the list contating the TODO exemptions - * @param repoPath path of the repo to be analyzed + * @param repoRoot the root directory of the repository * @return a list of all the redundant exemptions */ private fun retrieveRedundantExemptions( todos: List, todoExemptionList: List, - repoPath: String + repoRoot: File ): List> { return todoExemptionList.flatMap { exemption -> - exemption.getLineNumberList().mapNotNull { exemptedLineNumber -> + exemption.lineNumberList.mapNotNull { exemptedLineNumber -> val isRedundantExemption = todos.none { - it.filePath.removePrefix(repoPath) == exemption.exemptedFilePath && + it.file.toRelativeString(repoRoot) == exemption.exemptedFilePath && it.lineNumber == exemptedLineNumber } if (isRedundantExemption) { @@ -212,18 +223,35 @@ private fun logRedundantExemptions( * @param invalidTodos a list of all the invalid TODOs present in the repository. A TODO is * considered to be invalid if it is poorly formatted or if it does not corresponds to open * issues on GitHub. + * @param repoRoot the root directory of the repository * @param failureMessage the failure message to be logged */ -private fun logFailures(invalidTodos: List, failureMessage: String) { +private fun logFailures(invalidTodos: List, repoRoot: File, failureMessage: String) { if (invalidTodos.isNotEmpty()) { println(failureMessage) - invalidTodos.sortedWith(compareBy({ it.filePath }, { it.lineNumber })).forEach { - println("- ${it.filePath}:${it.lineNumber}") + invalidTodos.sortedWith(compareBy({ it.file.path }, { it.lineNumber })).forEach { + println("- ${it.file.toRelativeString(repoRoot)}:${it.lineNumber}") } println() } } +private fun List.convertToExemptions(repoRoot: File): List { + return groupBy { it.file.path }.map { (_, todos) -> + TodoOpenExemption.newBuilder().apply { + exemptedFilePath = todos.first().file.toRelativeString(repoRoot) + addAllLineNumber(todos.map { it.lineNumber }.sorted()) + }.build() + }.sortedBy { it.exemptedFilePath } +} + +private fun List.convertToExemptionTextProto(): String { + val baseProto = TodoOpenExemptions.newBuilder().apply { + addAllTodoOpenExemption(this@convertToExemptionTextProto) + }.build() + return TextFormat.printer().printToString(baseProto) +} + /** * Retrieves the list of all open issues on GitHub by parsing the JSON file generated by the GitHub * API. diff --git a/scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt b/scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt index 4a4bd66dae3..855ade490a4 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt @@ -1,10 +1,12 @@ package org.oppia.android.scripts.todo.model +import java.io.File + /** * Represents the structure of TODO. * - * @property filePath the path of the file + * @property file the file containing a TODO * @property lineNumber the line number of the line of code * @property lineContent the content of the line of code */ -data class Todo(val filePath: String, val lineNumber: Int, val lineContent: String) +data class Todo(val file: File, val lineNumber: Int, val lineContent: String) diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt index c81c4708d36..65d5191fc54 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt @@ -69,196 +69,196 @@ class TodoCollectorTest { assertThat(collectedTodos).hasSize(28) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 3, lineContent = "# TODO(#457741): test description 1" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 4, lineContent = "# TODO (#457742): test description 2" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 5, lineContent = "# TODO(#457743) : test description 3" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 6, lineContent = "# TODO(457744): test description 4" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 7, lineContent = "// TODO(#457741)" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 8, lineContent = "// TODO(#457745):" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 9, lineContent = "// TODO(#457747) test description 5" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 10, lineContent = "// some comment which has a TODO(#12182992): some description" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 11, lineContent = "// TODO(test description 7)" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 12, lineContent = "// Todo(#4577413): test description 8" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 13, lineContent = "// Todo (#4577423): test description 9" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 14, lineContent = "// Todo(#4577433) : test description 10" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 15, lineContent = "// Todo(4577443): test description 11" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 16, lineContent = "// Todo(#4577413)" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 17, lineContent = "// Todo(#4577453):" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 18, lineContent = "// Todo(#4577473) test description 12" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 19, lineContent = "// some comment which has a Todo(#12182999): some description" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 20, lineContent = "// todo(#4577413): test description 14" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 21, lineContent = "// todo (#4577423): test description 15" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 22, lineContent = "// todo(#4577433) : test description 16" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 23, lineContent = "// todo(4577443): test description 17" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 24, lineContent = "// todo(#4577413)" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 25, lineContent = "// todo(#4577453):" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 26, lineContent = "// todo(#4577473) test description 18" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 27, lineContent = "// some comment which has a todo(#12182999): some description" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 30, lineContent = "todo" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 33, lineContent = "TODO(#ISSUE_NUMBER): Revert ownership to @USERNAME after YYYY-MM-DD." ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 34, lineContent = "//TODO(#161614): some another test description" ) @@ -292,35 +292,35 @@ class TodoCollectorTest { assertThat(collectedTodos).hasSize(5) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "# TODO (#121): test todo." ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile2.toString(), + file = tempFile2, lineNumber = 1, lineContent = "# TODO(#10500): Test description" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 1, lineContent = "// TODO(#17800): test todo." ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 2, lineContent = "// TODO( 210)" ) @@ -361,49 +361,49 @@ class TodoCollectorTest { assertThat(poorlyFormattedTodos).hasSize(7) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "//TODO(#1215545): test todo." ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "# TODO( 110)" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "//todo(#15444)" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 4, lineContent = "" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile2.toString(), + file = tempFile2, lineNumber = 2, lineContent = "TODO(# 105)" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 1, lineContent = "// TODO (#178): test todo." ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 4, lineContent = "# TODO( 210)" ) @@ -442,49 +442,49 @@ class TodoCollectorTest { assertThat(poorlyFormattedTodos).hasSize(7) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "// Todo(#1215157): test content 1" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "# todo(#110484844): test content 2" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "// TODo(#15444): test content 3" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 4, lineContent = "" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile2.toString(), + file = tempFile2, lineNumber = 1, lineContent = "" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 1, lineContent = "// ToDo(#17878788): test content 6" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 4, lineContent = "# some todo(#21084884): test content 7" ) @@ -584,35 +584,35 @@ class TodoCollectorTest { assertThat(correctlyFormattedTodos).hasSize(5) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "// TODO(#12111): some description 1." ) ) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "# TODO(#110000): some description 2." ) ) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "" ) ) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 1, lineContent = "// TODO(#1788888): some description 5." ) ) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 4, lineContent = "# TODO(#210000): some description 6." ) @@ -832,21 +832,21 @@ class TodoCollectorTest { assertThat(collectedTodos).hasSize(3) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "// TODO(#1234478" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "// Todo(#1234478" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "// todo(#1234478" ) @@ -869,21 +869,21 @@ class TodoCollectorTest { assertThat(poorlyFormattedTodos).hasSize(3) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "// TODO(#1234478" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "// Todo(#1234478" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "// todo(#1234478" ) diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt index c8bf7517bf9..b89a690e63e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt @@ -23,7 +23,8 @@ class TodoIssueResolvedCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#todo-issue-resolved-check for more details on how to fix this." - @field:[Rule JvmField] val tempFolder = TemporaryFolder() + @field:[Rule JvmField] + val tempFolder = TemporaryFolder() @Before fun setUp() { @@ -55,7 +56,7 @@ class TodoIssueResolvedCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - main(retrieveTestFilesDirectoryPath(), "1200", "abmzuyt") + runScript(1200, "abmzuyt") assertThat(outContent.toString().trim()).isEqualTo(CLOSED_ISSUE_CHECK_PASSED_OUTPUT_INDICATOR) } @@ -79,7 +80,7 @@ class TodoIssueResolvedCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - main(retrieveTestFilesDirectoryPath(), "1200", "abmzuyt") + runScript(1200, "abmzuyt") assertThat(outContent.toString().trim()).isEqualTo(CLOSED_ISSUE_CHECK_PASSED_OUTPUT_INDICATOR) } @@ -103,16 +104,14 @@ class TodoIssueResolvedCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - val exception = assertThrows(Exception::class) { - main(retrieveTestFilesDirectoryPath(), "169877", "abmzuyt") - } + val exception = assertThrows(Exception::class) { runScript(169877, "abmzuyt") } assertThat(exception).hasMessageThat().contains(CLOSED_ISSUE_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ The following TODOs are unresolved for the closed issue: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile2.bazel:3 + - TempFile1.kt:1 + - TempFile2.bazel:3 $wikiReferenceNote """.trimIndent() @@ -121,9 +120,10 @@ class TodoIssueResolvedCheckTest { @Test fun testClosedIssueCheck_todosCorrespondsToClosedIssue_logsShouldBeLexicographicallySorted() { + tempFolder.newFolder("testfiles/extra_dir") val tempFile3 = tempFolder.newFile("testfiles/TempFile3.xml") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.bazel") - val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") + val tempFile1 = tempFolder.newFile("testfiles/extra_dir/TempFile1.kt") val testContent1 = """ // TODO(#169877): test description 1 @@ -147,18 +147,16 @@ class TodoIssueResolvedCheckTest { tempFile2.writeText(testContent2) tempFile3.writeText(testContent3) - val exception = assertThrows(Exception::class) { - main(retrieveTestFilesDirectoryPath(), "169877", "abmzuyt") - } + val exception = assertThrows(Exception::class) { runScript(169877, "abmzuyt") } assertThat(exception).hasMessageThat().contains(CLOSED_ISSUE_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ The following TODOs are unresolved for the closed issue: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile2.bazel:3 - - ${retrieveTestFilesDirectoryPath()}/TempFile3.xml:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile3.xml:4 + - TempFile2.bazel:3 + - TempFile3.xml:1 + - TempFile3.xml:4 + - extra_dir/TempFile1.kt:1 $wikiReferenceNote """.trimIndent() @@ -193,11 +191,8 @@ class TodoIssueResolvedCheckTest { tempFile2.writeText(testContent2) tempFile3.writeText(testContent3) - val exception = assertThrows(Exception::class) { - main(retrieveTestFilesDirectoryPath(), "169877", "abmzuyt") - } - val fileContentList = - File("${retrieveTestFilesDirectoryPath()}/script_failures.txt").readLines() + assertThrows(Exception::class) { runScript(169877, "abmzuyt") } + val fileContentList = File("${tempFolder.root}/testfiles/script_failures.txt").readLines() assertThat(fileContentList).containsExactly( "The issue is reopened because of the following unresolved TODOs:", "https://github.com/oppia/oppia-android/blob/abmzuyt/TempFile1.kt#L1", @@ -207,8 +202,7 @@ class TodoIssueResolvedCheckTest { ).inOrder() } - /** Retrieves the absolute path of testfiles directory. */ - private fun retrieveTestFilesDirectoryPath(): String { - return "${tempFolder.root}/testfiles" + private fun runScript(closedIssueNumber: Int, latestCommitHash: String) { + main("${tempFolder.root}/testfiles", closedIssueNumber.toString(), latestCommitHash) } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index 1ca601de16e..e2d21c955bc 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -23,6 +23,9 @@ class TodoOpenCheckTest { private val wikiReferenceNote = "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#todo-open-checks for more details on how to fix this." + private val reRunNote = + "There were failures. Re-run the command with \"true\" at the end to regenerate the exemption" + + " file with all failures as exempted." @field:[Rule JvmField] val tempFolder = TemporaryFolder() @@ -46,7 +49,7 @@ class TodoOpenCheckTest { } assertThat(exception).hasMessageThat().contains( - "${retrieveTestFilesDirectoryPath()}/open_issues.json: No such file exists" + "open_issues.json: No such file exists" ) } @@ -109,13 +112,15 @@ class TodoOpenCheckTest { val failureMessage = """ TODOs not in correct format: - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:2 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:3 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:4 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:5 + - TempFile.txt:1 + - TempFile.txt:2 + - TempFile.txt:3 + - TempFile.txt:4 + - TempFile.txt:5 $wikiReferenceNote + + $reRunNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @@ -147,11 +152,13 @@ class TodoOpenCheckTest { val failureMessage = """ TODOs not corresponding to open issues on GitHub: - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:2 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:5 + - TempFile.txt:1 + - TempFile.txt:2 + - TempFile.txt:5 $wikiReferenceNote + + $reRunNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @@ -191,14 +198,16 @@ class TodoOpenCheckTest { val failureMessage = """ TODOs not in correct format: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:2 - - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:1 + - TempFile1.kt:2 + - TempFile2.kt:1 TODOs not corresponding to open issues on GitHub: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:3 + - TempFile1.kt:1 + - TempFile2.kt:3 $wikiReferenceNote + + $reRunNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @@ -245,15 +254,17 @@ class TodoOpenCheckTest { val failureMessage = """ TODOs not in correct format: - - ${retrieveTestFilesDirectoryPath()}/Activity.kt:2 - - ${retrieveTestFilesDirectoryPath()}/Fragment.kt:1 - - ${retrieveTestFilesDirectoryPath()}/Presenter.kt:2 + - Activity.kt:2 + - Fragment.kt:1 + - Presenter.kt:2 TODOs not corresponding to open issues on GitHub: - - ${retrieveTestFilesDirectoryPath()}/Fragment.kt:3 - - ${retrieveTestFilesDirectoryPath()}/Presenter.kt:1 + - Fragment.kt:3 + - Presenter.kt:1 $wikiReferenceNote + + $reRunNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @@ -350,6 +361,8 @@ class TodoOpenCheckTest { - TempFile1.kt:2 - TempFile2.kt:1 Please remove them from scripts/assets/todo_exemptions.textproto + + $reRunNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @@ -362,7 +375,8 @@ class TodoOpenCheckTest { """.trimIndent() val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") testJSONFile.writeText(testJSONContent) - val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") + tempFolder.newFolder("testfiles/extra_dir") + val tempFile1 = tempFolder.newFile("testfiles/extra_dir/TempFile1.kt") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") val testContent1 = """ @@ -381,7 +395,7 @@ class TodoOpenCheckTest { this.addAllTodoOpenExemption( listOf( TodoOpenExemption.newBuilder().apply { - this.exemptedFilePath = "TempFile1.kt" + this.exemptedFilePath = "extra_dir/TempFile1.kt" this.addAllLineNumber(listOf(1, 2)).build() }.build() ) @@ -397,31 +411,99 @@ class TodoOpenCheckTest { val failureMessage = """ Redundant exemptions (there are no TODOs corresponding to these lines): - - TempFile1.kt:2 + - extra_dir/TempFile1.kt:2 Please remove them from scripts/assets/todo_exemptions.textproto TODOs not in correct format: - - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:1 + - TempFile2.kt:1 TODOs not corresponding to open issues on GitHub: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:3 + - extra_dir/TempFile1.kt:3 $wikiReferenceNote + + $reRunNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } - /** Retrieves the absolute path of testfiles directory. */ - private fun retrieveTestFilesDirectoryPath(): String { - return "${tempFolder.root}/testfiles" + @Test + fun testTodoCheck_multipleFailureTypes_withRegenerationEnabled_outputsUpdatedTextProto() { + val testJSONContent = + """ + [{"number":1000000},{"number":152440222},{"number":152440223},{"number":11001}] + """.trimIndent() + val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") + testJSONFile.writeText(testJSONContent) + tempFolder.newFolder("testfiles/extra_dir") + val tempFile1 = tempFolder.newFile("testfiles/extra_dir/TempFile1.kt") + val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") + val testContent1 = + """ + // TODO(#15244): test content 1 + // TODO(#152440223): test description 1 + // TODO(#10000000000000): test description 2 + """.trimIndent() + val testContent2 = + """ + # test content TODO(#11001): test description 2 + """.trimIndent() + tempFile1.writeText(testContent1) + tempFile2.writeText(testContent2) + val exemptionFile = File("${tempFolder.root}/$pathToProtoBinary") + val exemptions = TodoOpenExemptions.newBuilder().apply { + this.addAllTodoOpenExemption( + listOf( + TodoOpenExemption.newBuilder().apply { + this.exemptedFilePath = "extra_dir/TempFile1.kt" + this.addAllLineNumber(listOf(1, 2)).build() + }.build() + ) + ) + }.build() + exemptions.writeTo(exemptionFile.outputStream()) + + val exception = assertThrows(Exception::class) { + runScript(regenerateFile = true) + } + + assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) + val failureMessage = + """ + Redundant exemptions (there are no TODOs corresponding to these lines): + - extra_dir/TempFile1.kt:2 + Please remove them from scripts/assets/todo_exemptions.textproto + + TODOs not in correct format: + - TempFile2.kt:1 + + TODOs not corresponding to open issues on GitHub: + - extra_dir/TempFile1.kt:3 + + $wikiReferenceNote + + Regenerated exemptions: + + todo_open_exemption { + exempted_file_path: "TempFile2.kt" + line_number: 1 + } + todo_open_exemption { + exempted_file_path: "extra_dir/TempFile1.kt" + line_number: 1 + line_number: 3 + } + """.trimIndent() + assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } /** Runs the todo_open_check. */ - private fun runScript() { + private fun runScript(regenerateFile: Boolean = false) { main( - retrieveTestFilesDirectoryPath(), + "${tempFolder.root}/testfiles", "${tempFolder.root}/$pathToProtoBinary", - "open_issues.json" + "open_issues.json", + regenerateFile.toString() ) } } From b2ca68b161cbd82d54fe34bc69a20a0c0310aee0 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 29 Mar 2023 17:09:47 -0700 Subject: [PATCH 08/63] Fix Dagger structure. This moves the codebase to using the recommended single top-level Dagger library rather than replicating it in a bunch of different places. --- BUILD.bazel | 3 +++ app/BUILD.bazel | 10 +--------- .../oppia/android/app/activity/route/BUILD.bazel | 5 +---- .../org/oppia/android/app/application/BUILD.bazel | 4 ---- .../oppia/android/app/application/alpha/BUILD.bazel | 7 ++----- .../android/app/application/alphakenya/BUILD.bazel | 5 +---- .../oppia/android/app/application/beta/BUILD.bazel | 5 +---- .../oppia/android/app/application/dev/BUILD.bazel | 5 +---- .../oppia/android/app/application/ga/BUILD.bazel | 5 +---- .../android/app/application/testing/BUILD.bazel | 5 +---- .../oppia/android/app/notice/testing/BUILD.bazel | 3 --- .../app/player/exploration/testing/BUILD.bazel | 3 --- .../java/org/oppia/android/app/shim/BUILD.bazel | 5 ----- .../org/oppia/android/app/translation/BUILD.bazel | 10 ++-------- .../android/app/translation/testing/BUILD.bazel | 9 +++------ .../oppia/android/app/utility/datetime/BUILD.bazel | 4 ---- .../oppia/android/app/utility/lifecycle/BUILD.bazel | 3 --- .../org/oppia/android/app/utility/math/BUILD.bazel | 4 ---- .../learneranalytics/BUILD.bazel | 5 ----- .../android/app/customview/interaction/BUILD.bazel | 4 ---- .../org/oppia/android/app/databinding/BUILD.bazel | 12 ------------ .../app/devoptions/mathexpressionparser/BUILD.bazel | 5 ----- .../java/org/oppia/android/app/notice/BUILD.bazel | 5 ----- .../android/app/player/exploration/BUILD.bazel | 5 ----- .../org/oppia/android/app/player/state/BUILD.bazel | 4 ---- .../java/org/oppia/android/app/splash/BUILD.bazel | 4 ---- .../java/org/oppia/android/app/activity/BUILD.bazel | 4 ---- .../oppia/android/app/activity/route/BUILD.bazel | 5 ----- .../oppia/android/app/application/alpha/BUILD.bazel | 4 ---- .../oppia/android/app/application/beta/BUILD.bazel | 4 ---- .../oppia/android/app/application/dev/BUILD.bazel | 4 ---- .../oppia/android/app/application/ga/BUILD.bazel | 4 ---- .../android/app/application/testing/BUILD.bazel | 4 ---- .../oppia/android/app/testing/activity/BUILD.bazel | 4 ---- .../org/oppia/android/app/translation/BUILD.bazel | 6 ------ .../android/app/translation/testing/BUILD.bazel | 4 ---- .../org/oppia/android/app/utility/math/BUILD.bazel | 4 ---- data/BUILD.bazel | 4 ---- .../org/oppia/android/data/backends/gae/BUILD.bazel | 7 ++----- .../oppia/android/data/backends/gae/api/BUILD.bazel | 3 --- .../android/data/backends/gae/model/BUILD.bazel | 3 --- .../org/oppia/android/data/persistence/BUILD.bazel | 4 ---- .../org/oppia/android/data/persistence/BUILD.bazel | 4 ---- domain/BUILD.bazel | 6 +----- .../org/oppia/android/domain/classify/BUILD.bazel | 5 +---- .../oppia/android/domain/classify/rules/BUILD.bazel | 3 --- .../rules/algebraicexpressioninput/BUILD.bazel | 6 +----- .../classify/rules/continueinteraction/BUILD.bazel | 5 +---- .../classify/rules/dragAndDropSortInput/BUILD.bazel | 6 +----- .../domain/classify/rules/fractioninput/BUILD.bazel | 6 +----- .../classify/rules/imageClickInput/BUILD.bazel | 6 +----- .../classify/rules/itemselectioninput/BUILD.bazel | 6 +----- .../classify/rules/mathequationinput/BUILD.bazel | 6 +----- .../classify/rules/multiplechoiceinput/BUILD.bazel | 6 +----- .../classify/rules/numberwithunits/BUILD.bazel | 6 +----- .../rules/numericexpressioninput/BUILD.bazel | 6 +----- .../domain/classify/rules/numericinput/BUILD.bazel | 6 +----- .../domain/classify/rules/ratioinput/BUILD.bazel | 6 +----- .../domain/classify/rules/textinput/BUILD.bazel | 6 +----- .../org/oppia/android/domain/clipboard/BUILD.bazel | 4 ---- .../android/domain/exploration/testing/BUILD.bazel | 5 +---- .../android/domain/feedbackreporting/BUILD.bazel | 5 +---- .../org/oppia/android/domain/locale/BUILD.bazel | 5 ----- .../org/oppia/android/domain/onboarding/BUILD.bazel | 5 +---- .../android/domain/onboarding/testing/BUILD.bazel | 5 +---- .../oppia/android/domain/oppialogger/BUILD.bazel | 5 +---- .../domain/oppialogger/analytics/BUILD.bazel | 13 ++----------- .../oppialogger/analytics/testing/BUILD.bazel | 5 +---- .../domain/oppialogger/exceptions/BUILD.bazel | 5 +---- .../domain/oppialogger/logscheduler/BUILD.bazel | 5 +---- .../domain/oppialogger/loguploader/BUILD.bazel | 5 +---- .../org/oppia/android/domain/profile/BUILD.bazel | 3 --- .../org/oppia/android/domain/spotlight/BUILD.bazel | 3 --- .../testing/oppialogger/loguploader/BUILD.bazel | 5 +---- .../oppia/android/domain/translation/BUILD.bazel | 3 --- .../rules/algebraicexpressioninput/BUILD.bazel | 7 ------- .../classify/rules/mathequationinput/BUILD.bazel | 7 ------- .../rules/numericexpressioninput/BUILD.bazel | 7 ------- .../org/oppia/android/domain/clipboard/BUILD.bazel | 4 ---- .../oppia/android/domain/exploration/BUILD.bazel | 6 ------ .../lightweightcheckpointing/BUILD.bazel | 4 ---- .../android/domain/exploration/testing/BUILD.bazel | 5 ----- .../android/domain/hintsandsolution/BUILD.bazel | 7 ------- .../org/oppia/android/domain/locale/BUILD.bazel | 9 +-------- .../org/oppia/android/domain/onboarding/BUILD.bazel | 4 ---- .../domain/oppialogger/analytics/BUILD.bazel | 11 ----------- .../oppialogger/analytics/testing/BUILD.bazel | 4 ---- .../domain/oppialogger/loguploader/BUILD.bazel | 5 ----- .../org/oppia/android/domain/question/BUILD.bazel | 5 ----- .../oppia/android/domain/translation/BUILD.bazel | 4 ---- .../android/instrumentation/application/BUILD.bazel | 4 ---- .../android/instrumentation/application/BUILD.bazel | 6 ------ testing/BUILD.bazel | 5 ----- .../java/org/oppia/android/testing/data/BUILD.bazel | 4 ---- .../org/oppia/android/testing/espresso/BUILD.bazel | 4 ---- .../org/oppia/android/testing/logging/BUILD.bazel | 6 +----- .../org/oppia/android/testing/network/BUILD.bazel | 5 +---- .../android/testing/platformparameter/BUILD.bazel | 5 +---- .../oppia/android/testing/robolectric/BUILD.bazel | 5 +---- .../org/oppia/android/testing/threading/BUILD.bazel | 5 +---- .../java/org/oppia/android/testing/time/BUILD.bazel | 5 +---- .../java/org/oppia/android/testing/data/BUILD.bazel | 4 ---- .../org/oppia/android/testing/junit/BUILD.bazel | 6 ------ .../org/oppia/android/testing/logging/BUILD.bazel | 5 ----- .../oppia/android/testing/networking/BUILD.bazel | 4 ---- .../oppia/android/testing/robolectric/BUILD.bazel | 5 +---- .../org/oppia/android/testing/threading/BUILD.bazel | 7 ------- utility/BUILD.bazel | 5 ----- .../oppia/android/util/accessibility/BUILD.bazel | 7 ++----- .../java/org/oppia/android/util/caching/BUILD.bazel | 8 ++------ .../oppia/android/util/caching/testing/BUILD.bazel | 10 +++------- .../java/org/oppia/android/util/data/BUILD.bazel | 5 +---- .../org/oppia/android/util/gcsresource/BUILD.bazel | 5 +---- .../java/org/oppia/android/util/locale/BUILD.bazel | 9 +++------ .../oppia/android/util/locale/testing/BUILD.bazel | 6 +----- .../java/org/oppia/android/util/logging/BUILD.bazel | 9 +++------ .../oppia/android/util/logging/firebase/BUILD.bazel | 7 ++----- .../util/logging/performancemetrics/BUILD.bazel | 7 ++----- .../org/oppia/android/util/networking/BUILD.bazel | 9 +++------ .../org/oppia/android/util/parser/html/BUILD.bazel | 5 +---- .../org/oppia/android/util/parser/image/BUILD.bazel | 8 +++----- .../java/org/oppia/android/util/profile/BUILD.bazel | 3 --- .../java/org/oppia/android/util/system/BUILD.bazel | 5 +---- .../org/oppia/android/util/threading/BUILD.bazel | 5 +---- .../java/org/oppia/android/util/caching/BUILD.bazel | 4 ---- .../oppia/android/util/caching/testing/BUILD.bazel | 5 ----- .../java/org/oppia/android/util/data/BUILD.bazel | 7 ------- .../java/org/oppia/android/util/locale/BUILD.bazel | 11 +---------- .../oppia/android/util/locale/testing/BUILD.bazel | 5 ----- .../java/org/oppia/android/util/logging/BUILD.bazel | 9 --------- .../oppia/android/util/logging/firebase/BUILD.bazel | 4 ---- .../util/logging/performancemetrics/BUILD.bazel | 6 ------ .../org/oppia/android/util/networking/BUILD.bazel | 7 ------- .../java/org/oppia/android/util/profile/BUILD.bazel | 4 ---- 134 files changed, 84 insertions(+), 648 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 5177d895f27..6e6d3356c5c 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,5 +1,6 @@ # TODO(#1532): Rename file to 'BUILD' post-Gradle. +load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:build_flavors.bzl", "AVAILABLE_FLAVORS", "define_oppia_aab_binary_flavor", "transform_android_manifest") load("//:version.bzl", "MAJOR_VERSION", "MINOR_VERSION", "OPPIA_DEV_KITKAT_VERSION_CODE", "OPPIA_DEV_VERSION_CODE") @@ -136,3 +137,5 @@ package_group( define_oppia_aab_binary_flavor(flavor = flavor) for flavor in AVAILABLE_FLAVORS ] + +dagger_rules() diff --git a/app/BUILD.bazel b/app/BUILD.bazel index 594feecc970..fbc3e101bf4 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -10,7 +10,6 @@ order to build with Bazel. - All binding adapters must be written in Java. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") load("@tools_android//tools/crashlytics:defs.bzl", "crashlytics_android_library") load("@tools_android//tools/googleservices:defs.bzl", "google_services_xml") @@ -617,7 +616,6 @@ kt_android_library( srcs = LISTENERS, custom_package = "org.oppia.android.app", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/audio:cellular_audio_dialog_controller", "//model/src/main/proto:arguments_java_proto_lite", "//model/src/main/proto:question_java_proto_lite", @@ -662,7 +660,6 @@ kt_android_library( srcs = ANNOTATIONS, custom_package = "org.oppia.android.app", deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/activity:activity_scope", "//app/src/main/java/org/oppia/android/app/fragment:fragment_scope", ], @@ -680,7 +677,6 @@ kt_android_library( ], deps = [ ":annotations", - ":dagger", ":listeners", ":resources", "//app/src/main/java/org/oppia/android/app/shim:intent_factory_shim", @@ -724,7 +720,6 @@ android_library( enable_data_binding = True, manifest = "src/main/DatabindingAdaptersManifest.xml", deps = [ - ":dagger", ":resources", ":view_models", "//app/src/main/java/org/oppia/android/app/translation:app_language_activity_injector_provider", @@ -763,11 +758,11 @@ kt_android_library( visibility = ["//visibility:public"], deps = [ ":binding_adapters", - ":dagger", ":databinding_resources", ":resources", ":view_models", ":views", + "//:dagger", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", "//app/src/main/java/org/oppia/android/app/activity:injectable_app_compat_activity", "//app/src/main/java/org/oppia/android/app/activity/route:activity_router", @@ -840,7 +835,6 @@ kt_android_library( # keep sorted TEST_DEPS = [ ":app", - ":dagger", ":resources", ":test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -1000,5 +994,3 @@ android_library( "//third_party:io_fabric_sdk_android_fabric", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/activity/route/BUILD.bazel b/app/src/main/java/org/oppia/android/app/activity/route/BUILD.bazel index 4700674d4c2..5b248b75ef9 100644 --- a/app/src/main/java/org/oppia/android/app/activity/route/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/activity/route/BUILD.bazel @@ -2,7 +2,6 @@ Constructs for setting up activity routing support in the Dagger graph. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") # TODO(#59): Define these exported files as separate libraries from top-level targets. @@ -19,11 +18,9 @@ kt_android_library( ], visibility = ["//:oppia_api_visibility"], deps = [ - ":dagger", + "//:dagger", "//model/src/main/proto:arguments_java_proto_lite", "//third_party:androidx_appcompat_appcompat", "//utility/src/main/java/org/oppia/android/util/logging:console_logger", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/application/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/BUILD.bazel index b91f953bfa1..0d857c76241 100644 --- a/app/src/main/java/org/oppia/android/app/application/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/BUILD.bazel @@ -5,7 +5,6 @@ Dagger graph. Specific application implementations can be found in subpackages. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -82,7 +81,6 @@ kt_android_library( "ApplicationStartupListenerModule.kt", ], deps = [ - ":dagger", "//app", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", ], @@ -134,5 +132,3 @@ android_library( "//utility/src/main/java/org/oppia/android/util/parser/image:repository_glide_module", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/application/alpha/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/alpha/BUILD.bazel index 9c410695450..775224bbdf0 100644 --- a/app/src/main/java/org/oppia/android/app/application/alpha/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/alpha/BUILD.bazel @@ -2,7 +2,6 @@ This package contains the root application definitions for alpha builds of the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,7 @@ kt_android_library( visibility = ["//:oppia_binary_visibility"], deps = [ ":alpha_build_flavor_module", - ":dagger", + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:abstract_application", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -35,9 +34,7 @@ kt_android_library( "//app/src/test/java/org/oppia/android/app/application/alpha:__pkg__", ], deps = [ - ":dagger", + "//:dagger", "//model/src/main/proto:version_java_proto_lite", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/application/alphakenya/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/alphakenya/BUILD.bazel index 538d47308dc..afd6f56c2a0 100644 --- a/app/src/main/java/org/oppia/android/app/application/alphakenya/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/alphakenya/BUILD.bazel @@ -3,7 +3,6 @@ This package contains the root application definitions for a Kenya user study sp of the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,7 @@ kt_android_library( ], visibility = ["//:oppia_binary_visibility"], deps = [ - ":dagger", + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:abstract_application", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -25,5 +24,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/networking:prod_module", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/application/beta/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/beta/BUILD.bazel index db532533d41..86a427c1e16 100644 --- a/app/src/main/java/org/oppia/android/app/application/beta/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/beta/BUILD.bazel @@ -2,7 +2,6 @@ This package contains the root application definitions for beta builds of the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -17,7 +16,7 @@ kt_android_library( "//app/src/test/java/org/oppia/android/app/application/beta:__pkg__", ], deps = [ - ":dagger", + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:abstract_application", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -27,5 +26,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/networking:prod_module", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/application/dev/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/dev/BUILD.bazel index 53841df1c37..3c9087d800c 100644 --- a/app/src/main/java/org/oppia/android/app/application/dev/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/dev/BUILD.bazel @@ -6,7 +6,6 @@ there are specially defined top-level build flavors which will select their corr application configuration. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -21,7 +20,7 @@ kt_android_library( "//app/src/test/java/org/oppia/android/app/application/dev:__pkg__", ], deps = [ - ":dagger", + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:abstract_application", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -31,5 +30,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/application/ga/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/ga/BUILD.bazel index 5421f374f20..6557345d8b5 100644 --- a/app/src/main/java/org/oppia/android/app/application/ga/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/ga/BUILD.bazel @@ -2,7 +2,6 @@ This package contains the root application definitions for general availability builds of the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -17,7 +16,7 @@ kt_android_library( "//app/src/test/java/org/oppia/android/app/application/ga:__pkg__", ], deps = [ - ":dagger", + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:abstract_application", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -27,5 +26,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/networking:prod_module", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/application/testing/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/testing/BUILD.bazel index f55e5d15b86..4ebecb8b338 100644 --- a/app/src/main/java/org/oppia/android/app/application/testing/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/testing/BUILD.bazel @@ -3,7 +3,6 @@ This package contains testing utilities that may be needed to set up the root ap testing environments. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,9 +13,7 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", + "//:dagger", "//model/src/main/proto:version_java_proto_lite", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel b/app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel index 92f1a0ae62b..0d683f0feea 100644 --- a/app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel @@ -2,7 +2,6 @@ Test-only utilities corresponding to app notices. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -30,5 +29,3 @@ kt_android_library( "//app/src/main/java/org/oppia/android/app/testing/activity:test_activity", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/testing/BUILD.bazel b/app/src/main/java/org/oppia/android/app/player/exploration/testing/BUILD.bazel index fafe72ad714..6879af440e7 100644 --- a/app/src/main/java/org/oppia/android/app/player/exploration/testing/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/player/exploration/testing/BUILD.bazel @@ -2,7 +2,6 @@ Test-only utilities corresponding to BottomSheetOptionsMenu. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -17,5 +16,3 @@ kt_android_library( "//app/src/main/java/org/oppia/android/app/testing/activity:test_activity", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/shim/BUILD.bazel b/app/src/main/java/org/oppia/android/app/shim/BUILD.bazel index e316b01485a..88b2ec6e9a1 100644 --- a/app/src/main/java/org/oppia/android/app/shim/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/shim/BUILD.bazel @@ -3,7 +3,6 @@ Temporary shims for providing indirection in the Bazel build graph to unblock mo parts of the app layer. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") IMPL_FILES = [ @@ -59,7 +58,6 @@ kt_android_library( name = "impl", srcs = UPDATED_IMPL_FILES, deps = [ - ":dagger", ":intent_factory_shim", ":view_binding_shim", "//app:databinding_resources", @@ -76,11 +74,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":impl", ":intent_factory_shim", ":view_binding_shim", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/translation/BUILD.bazel b/app/src/main/java/org/oppia/android/app/translation/BUILD.bazel index 0e6bf561ab0..6a3d228ff3c 100644 --- a/app/src/main/java/org/oppia/android/app/translation/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/translation/BUILD.bazel @@ -2,7 +2,6 @@ UI utilities for for managing languages & locales. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -15,7 +14,6 @@ kt_android_library( "//testing/src/test/java/org/oppia/android/testing/junit:__pkg__", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/locale:locale_controller", ], ) @@ -28,7 +26,6 @@ kt_android_library( visibility = ["//app:app_visibility"], deps = [ ":app_language_locale_handler", - ":dagger", "//model/src/main/proto:profile_java_proto_lite", "//third_party:androidx_appcompat_appcompat", "//utility/src/main/java/org/oppia/android/util/locale:oppia_locale", @@ -44,7 +41,6 @@ kt_android_library( deps = [ ":activity_recreator", ":app_language_locale_handler", - ":dagger", "//domain/src/main/java/org/oppia/android/domain/translation:translation_controller", ], ) @@ -69,7 +65,7 @@ kt_android_library( ], deps = [ ":activity_recreator", - ":dagger", + "//third_party:javax_inject_javax_inject", ], ) @@ -81,8 +77,8 @@ kt_android_library( visibility = ["//:oppia_prod_module_visibility"], deps = [ ":activity_recreator", - ":dagger", ":impl", + "//:dagger", ], ) @@ -141,5 +137,3 @@ kt_android_library( ":app_language_application_injector", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/translation/testing/BUILD.bazel b/app/src/main/java/org/oppia/android/app/translation/testing/BUILD.bazel index 380efd3d894..eb7f84bda27 100644 --- a/app/src/main/java/org/oppia/android/app/translation/testing/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/translation/testing/BUILD.bazel @@ -2,7 +2,6 @@ Testing utilities for languages & locales. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -15,8 +14,8 @@ kt_android_library( "//app:app_testing_visibility", ], deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/translation:activity_recreator", + "//third_party:javax_inject_javax_inject", ], ) @@ -28,10 +27,8 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", + ":test_activity_recreator", + "//:dagger", "//app/src/main/java/org/oppia/android/app/translation:activity_recreator", - "//app/src/main/java/org/oppia/android/app/translation/testing:test_activity_recreator", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/utility/datetime/BUILD.bazel b/app/src/main/java/org/oppia/android/app/utility/datetime/BUILD.bazel index c65b5547153..3c21abb2cb0 100644 --- a/app/src/main/java/org/oppia/android/app/utility/datetime/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/utility/datetime/BUILD.bazel @@ -2,7 +2,6 @@ General purposes utilities to manage date and time in user-facing strings. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") # Resource shim needed so that DateTimeUtil can build in both Gradle & Bazel. @@ -23,7 +22,6 @@ kt_android_library( ], visibility = ["//app:__subpackages__"], deps = [ - ":dagger", "//app:resources", "//app/src/main/java/org/oppia/android/app/translation:app_language_resource_handler", "//third_party:javax_inject_javax_inject", @@ -31,5 +29,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/utility/lifecycle/BUILD.bazel b/app/src/main/java/org/oppia/android/app/utility/lifecycle/BUILD.bazel index 9e47fd3ff48..67d532a6a9b 100644 --- a/app/src/main/java/org/oppia/android/app/utility/lifecycle/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/utility/lifecycle/BUILD.bazel @@ -2,7 +2,6 @@ Constructs for setting up lifecycle safe timer factory for injection in the Dagger graph. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -18,5 +17,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/threading:annotations", ], ) - -dagger_rules() diff --git a/app/src/main/java/org/oppia/android/app/utility/math/BUILD.bazel b/app/src/main/java/org/oppia/android/app/utility/math/BUILD.bazel index 12d6ae08213..fa068ab78ea 100644 --- a/app/src/main/java/org/oppia/android/app/utility/math/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/utility/math/BUILD.bazel @@ -2,7 +2,6 @@ General purposes utilities corresponding to displaying math expressions & constructs. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") # Resource shim needed so that MathExpressionAccessibilityUtil can build in both Gradle & Bazel. @@ -23,7 +22,6 @@ kt_android_library( ], visibility = ["//app:app_visibility"], deps = [ - ":dagger", "//app:resources", "//app/src/main/java/org/oppia/android/app/translation:app_language_resource_handler", "//model/src/main/proto:languages_java_proto_lite", @@ -31,5 +29,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/math:extensions", ], ) - -dagger_rules() diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel index f98a384b911..4e3c294886e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel @@ -1,4 +1,3 @@ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//app:app_test.bzl", "app_test") load("//app:test_with_resources.bzl", "test_with_resources") @@ -7,7 +6,6 @@ app_test( processed_src = test_with_resources("ProfileAndDeviceIdActivityTest.kt"), test_class = "org.oppia.android.app.administratorcontrols.learneranalytics.ProfileAndDeviceIdActivityTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -40,7 +38,6 @@ app_test( processed_src = test_with_resources("ProfileAndDeviceIdFragmentTest.kt"), test_class = "org.oppia.android.app.administratorcontrols.learneranalytics.ProfileAndDeviceIdFragmentTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -70,5 +67,3 @@ app_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel index 16a33d5d0ea..babb0d3d2ca 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel @@ -2,7 +2,6 @@ Tests for custom interaction views. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//app:app_test.bzl", "app_test") load("//app:test_with_resources.bzl", "test_with_resources") @@ -11,7 +10,6 @@ app_test( processed_src = test_with_resources("MathExpressionInteractionsViewTest.kt"), test_class = "org.oppia.android.app.customview.interaction.MathExpressionInteractionsViewTest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -40,5 +38,3 @@ app_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel index b387ee2b7d5..caeb919e29b 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel @@ -2,7 +2,6 @@ Tests for UI databinding utilities and adapters. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//app:app_test.bzl", "app_test") load("//app:test_with_resources.bzl", "test_with_resources") @@ -46,7 +45,6 @@ app_test( processed_src = test_with_resources("AppCompatCheckBoxBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.AppCompatCheckBoxBindingAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -82,7 +80,6 @@ app_test( processed_src = test_with_resources("CircularProgressIndicatorAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.CircularProgressIndicatorAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -118,7 +115,6 @@ app_test( processed_src = "DrawableBindingAdaptersTest_updated.kt", test_class = "org.oppia.android.app.databinding.DrawableBindingAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -154,7 +150,6 @@ app_test( processed_src = "ImageViewBindingAdaptersTest_updated.kt", test_class = "org.oppia.android.app.databinding.ImageViewBindingAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -190,7 +185,6 @@ app_test( processed_src = test_with_resources("MarginBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.MarginBindingAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -226,7 +220,6 @@ app_test( processed_src = test_with_resources("StateAssemblerMarginBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.StateAssemblerMarginBindingAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -262,7 +255,6 @@ app_test( processed_src = test_with_resources("StateAssemblerPaddingBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.StateAssemblerPaddingBindingAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -298,7 +290,6 @@ app_test( processed_src = "TextViewBindingAdaptersTest_updated.kt", test_class = "org.oppia.android.app.databinding.TextViewBindingAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -334,7 +325,6 @@ app_test( processed_src = test_with_resources("ViewBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.ViewBindingAdaptersTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -364,5 +354,3 @@ app_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel index 1cf6d50f745..873bc778639 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel @@ -2,7 +2,6 @@ Tests for the math expression parser developer options UI flows. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//app:app_test.bzl", "app_test") load("//app:test_with_resources.bzl", "test_with_resources") @@ -11,7 +10,6 @@ app_test( processed_src = test_with_resources("MathExpressionParserActivityTest.kt"), test_class = "org.oppia.android.app.devoptions.mathexpressionparser.MathExpressionParserActivityTest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -43,7 +41,6 @@ app_test( processed_src = test_with_resources("MathExpressionParserFragmentTest.kt"), test_class = "org.oppia.android.app.devoptions.mathexpressionparser.MathExpressionParserFragmentTest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -70,5 +67,3 @@ app_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel index 20d4828910e..5a992e72d33 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel @@ -2,7 +2,6 @@ Tests for notices shown in the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//app:app_test.bzl", "app_test") load("//app:test_with_resources.bzl", "test_with_resources") @@ -11,7 +10,6 @@ app_test( processed_src = test_with_resources("BetaNoticeDialogFragmentTest.kt"), test_class = "org.oppia.android.app.notice.BetaNoticeDialogFragmentTest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -48,7 +46,6 @@ app_test( processed_src = test_with_resources("GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt"), test_class = "org.oppia.android.app.notice.GeneralAvailabilityUpgradeNoticeDialogFragmentTest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -79,5 +76,3 @@ app_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", ], ) - -dagger_rules() diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel index ce1e1576313..3384500f459 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel @@ -2,7 +2,6 @@ Tests for exploration player. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//app:app_test.bzl", "app_test") load("//app:test_with_resources.bzl", "test_with_resources") @@ -11,7 +10,6 @@ app_test( processed_src = test_with_resources("BottomSheetOptionsMenuTest.kt"), test_class = "org.oppia.android.app.player.exploration.BottomSheetOptionsMenuTest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -48,7 +46,6 @@ app_test( processed_src = test_with_resources("ExplorationActivityTest.kt"), test_class = "org.oppia.android.app.player.exploration.ExplorationActivityTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -101,5 +98,3 @@ app_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", ], ) - -dagger_rules() diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/state/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/player/state/BUILD.bazel index 8b340d5c065..7259fda5089 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/state/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/player/state/BUILD.bazel @@ -2,7 +2,6 @@ Tests for the core state player experience. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//app:app_test.bzl", "app_test") load("//app:test_with_resources.bzl", "test_with_resources") @@ -11,7 +10,6 @@ app_test( processed_src = test_with_resources("StateFragmentTest.kt"), test_class = "org.oppia.android.app.player.state.StateFragmentTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -52,5 +50,3 @@ app_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", ], ) - -dagger_rules() diff --git a/app/src/sharedTest/java/org/oppia/android/app/splash/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/splash/BUILD.bazel index a5c0352eb1e..3268663d019 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/splash/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/splash/BUILD.bazel @@ -2,7 +2,6 @@ Tests for the splash/app UI initialization process. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//app:app_test.bzl", "app_test") load("//app:test_with_resources.bzl", "test_with_resources") @@ -11,7 +10,6 @@ app_test( processed_src = test_with_resources("SplashActivityTest.kt"), test_class = "org.oppia.android.app.splash.SplashActivityTest", deps = [ - ":dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -51,5 +49,3 @@ app_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel b/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel index db0a93ddfc3..b88df383c49 100644 --- a/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel @@ -2,7 +2,6 @@ Tests for general activity routing functionality. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.activity.ActivityIntentFactoriesTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -43,5 +41,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel b/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel index cb29f885f98..41514a19b51 100644 --- a/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel @@ -2,7 +2,6 @@ Tests for general activity routing functionality. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.activity.route.ActivityRouterTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -54,7 +52,6 @@ oppia_android_test( test_class = "org.oppia.android.app.activity.route.ActivityRouterModuleTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -86,5 +83,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/application/alpha/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/alpha/BUILD.bazel index 900715a50e6..2076ab7fbc9 100644 --- a/app/src/test/java/org/oppia/android/app/application/alpha/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/alpha/BUILD.bazel @@ -2,7 +2,6 @@ Tests for alpha-specific top-level application configurations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.application.alpha.AlphaBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/application/alpha:alpha_build_flavor_module", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", @@ -22,5 +20,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/application/beta/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/beta/BUILD.bazel index 4706b193b26..3dfb64b5191 100644 --- a/app/src/test/java/org/oppia/android/app/application/beta/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/beta/BUILD.bazel @@ -2,7 +2,6 @@ Tests for beta-specific top-level application configurations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.application.beta.BetaBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/application/beta:beta_application", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", @@ -22,5 +20,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/application/dev/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/dev/BUILD.bazel index c6566c6f2a6..6830879bc9e 100644 --- a/app/src/test/java/org/oppia/android/app/application/dev/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/dev/BUILD.bazel @@ -2,7 +2,6 @@ Tests for developer-specific top-level application configurations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.application.dev.DeveloperBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/application/dev:developer_application", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", @@ -22,5 +20,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/application/ga/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/ga/BUILD.bazel index c3ce6168c22..d1513c48919 100644 --- a/app/src/test/java/org/oppia/android/app/application/ga/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/ga/BUILD.bazel @@ -2,7 +2,6 @@ Tests for general availability-specific top-level application configurations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.application.ga.GaBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/application/ga:general_availability_application", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", @@ -22,5 +20,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/application/testing/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/testing/BUILD.bazel index 2168366aeb4..cfa890cc623 100644 --- a/app/src/test/java/org/oppia/android/app/application/testing/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/testing/BUILD.bazel @@ -2,7 +2,6 @@ Tests for testing-specific top-level application configurations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.application.testing.TestingBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/application/testing:testing_build_flavor_module", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", @@ -22,5 +20,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel b/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel index 26313703901..00438f383a6 100644 --- a/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel @@ -2,7 +2,6 @@ Tests for generic activity & fragment test utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.testing.activity.TestActivityTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -46,5 +44,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel b/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel index 83de617710d..c688110b9b8 100644 --- a/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel @@ -2,7 +2,6 @@ Tests for language & locale UI utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.translation.AppLanguageLocaleHandlerTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/translation:app_language_locale_handler", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain", @@ -49,7 +47,6 @@ oppia_android_test( test_class = "org.oppia.android.app.translation.AppLanguageResourceHandlerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -99,7 +96,6 @@ oppia_android_test( test_class = "org.oppia.android.app.translation.AppLanguageWatcherMixinTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -138,5 +134,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/translation/testing/BUILD.bazel b/app/src/test/java/org/oppia/android/app/translation/testing/BUILD.bazel index 71bad81a590..47ec2b9c5e7 100644 --- a/app/src/test/java/org/oppia/android/app/translation/testing/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/translation/testing/BUILD.bazel @@ -2,7 +2,6 @@ Tests for language & locale UI testing utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.translation.testing.TestActivityRecreatorTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app/src/main/java/org/oppia/android/app/translation/testing:test_activity_recreator", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -25,5 +23,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/data:data_providers", ], ) - -dagger_rules() diff --git a/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel b/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel index 0678f0fb9bd..027d251df15 100644 --- a/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel @@ -2,7 +2,6 @@ Tests for UI-specific math utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.app.utility.math.MathExpressionAccessibilityUtilTest", test_manifest = "//app:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -51,5 +49,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", ], ) - -dagger_rules() diff --git a/data/BUILD.bazel b/data/BUILD.bazel index 8189af63a2f..a1a292dbe76 100644 --- a/data/BUILD.bazel +++ b/data/BUILD.bazel @@ -3,7 +3,6 @@ This library provides data to the rest of the application. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//data:data_test.bzl", "data_test") filegroup( @@ -14,7 +13,6 @@ filegroup( # keep sorted TEST_DEPS = [ - ":dagger", "//data/src/main/java/org/oppia/android/data/backends/gae:network_config_prod_module", "//data/src/main/java/org/oppia/android/data/backends/gae:oppia_retrofit", "//data/src/main/java/org/oppia/android/data/backends/gae:prod_module", @@ -53,5 +51,3 @@ MIGRATED_TESTS = [ filtered_tests = MIGRATED_TESTS, deps = TEST_DEPS, ) for test_file_path in glob(["src/test/java/org/oppia/android/data/**/*Test.kt"])] - -dagger_rules() diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel b/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel index c5859673b0f..27929113a96 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel @@ -3,7 +3,6 @@ Library for providing top-level HTTP networking support for Oppia's App Engine backend. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -31,8 +30,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":network_config_annotations", + "//:dagger", ], ) @@ -73,14 +72,12 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":network_config_annotations", ":network_interceptors", ":oppia_retrofit", + "//:dagger", "//data/src/main/java/org/oppia/android/data/backends/gae/api", "//third_party:com_google_guava_guava", "//third_party:com_squareup_retrofit2_converter-moshi", ], ) - -dagger_rules() diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/api/BUILD.bazel b/data/src/main/java/org/oppia/android/data/backends/gae/api/BUILD.bazel index 4dd54d21272..d7088cf7935 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/api/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/backends/gae/api/BUILD.bazel @@ -3,7 +3,6 @@ Library for providing a network API interface with Oppia's App Engine backend. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -26,5 +25,3 @@ kt_android_library( "//third_party:com_squareup_retrofit2_retrofit", ], ) - -dagger_rules() diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/model/BUILD.bazel b/data/src/main/java/org/oppia/android/data/backends/gae/model/BUILD.bazel index 5923a1c1233..485e0124e60 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/model/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/backends/gae/model/BUILD.bazel @@ -3,7 +3,6 @@ Library for providing model definitions for Oppia's App Engine backend endpoints. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -54,5 +53,3 @@ kt_android_library( "//third_party:moshi", ], ) - -dagger_rules() diff --git a/data/src/main/java/org/oppia/android/data/persistence/BUILD.bazel b/data/src/main/java/org/oppia/android/data/persistence/BUILD.bazel index 2137ddc1f86..8d4b3a4f783 100644 --- a/data/src/main/java/org/oppia/android/data/persistence/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/persistence/BUILD.bazel @@ -2,7 +2,6 @@ This package provides persistence to the rest of the application. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -11,7 +10,6 @@ kt_android_library( custom_package = "org.oppia.android.data.persistence", visibility = ["//:oppia_api_visibility"], deps = [ - ":dagger", "//model/src/main/proto:profile_java_proto_lite", "//third_party:androidx_annotation_annotation", "//utility/src/main/java/org/oppia/android/util/data:async_data_subscription_manager", @@ -21,5 +19,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/profile:directory_management_util", ], ) - -dagger_rules() diff --git a/data/src/test/java/org/oppia/android/data/persistence/BUILD.bazel b/data/src/test/java/org/oppia/android/data/persistence/BUILD.bazel index 9a0686181ab..ca1d9dd07ef 100644 --- a/data/src/test/java/org/oppia/android/data/persistence/BUILD.bazel +++ b/data/src/test/java/org/oppia/android/data/persistence/BUILD.bazel @@ -2,7 +2,6 @@ Tests for infrastructure that provides data persistence support for the rest of the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.data.persistence.PersistentCacheStoreTest", test_manifest = "//data:test_manifest", deps = [ - ":dagger", "//data/src/main/java/org/oppia/android/data/persistence:cache_store", "//model/src/main/proto:test_models", "//testing", @@ -28,5 +26,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index 0ed3083821d..151f0028ab9 100755 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -3,7 +3,6 @@ This library contains the frontend controller and business service logic for the application. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") load("//domain:domain_assets.bzl", "generate_assets_list_from_text_protos") load("//domain:domain_test.bzl", "domain_test") @@ -115,7 +114,7 @@ kt_android_library( manifest = "src/main/AndroidManifest.xml", visibility = ["//visibility:public"], deps = [ - ":dagger", + "//:dagger", "//data/src/main/java/org/oppia/android/data/backends/gae/api", "//data/src/main/java/org/oppia/android/data/persistence:cache_store", "//domain/src/main/java/org/oppia/android/domain/classify:answer_classification_controller", @@ -170,7 +169,6 @@ kt_android_library( # keep sorted TEST_DEPS = [ - ":dagger", ":domain", ":interaction_object_test_builder", "//app:crashlytics", @@ -257,5 +255,3 @@ MIGRATED_TESTS = [ filtered_tests = MIGRATED_TESTS, deps = TEST_DEPS, ) for test_file_path in glob(["src/test/java/org/oppia/android/domain/**/*Test.kt"])] - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/BUILD.bazel index 7c523f15e2f..30be62200c9 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/BUILD.bazel @@ -2,7 +2,6 @@ Domain components for answer classification. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -75,9 +74,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":generic_interaction_classifier", ":interaction_classifier", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", "//domain/src/main/java/org/oppia/android/domain/onboarding:exploration_meta_data_retriever", "//third_party:javax_inject_javax_inject", @@ -96,5 +95,3 @@ kt_android_library( "//model/src/main/proto:translation_java_proto_lite", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/BUILD.bazel index f581741e245..c9a0c8ed31e 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/BUILD.bazel @@ -2,7 +2,6 @@ Rule classifier providers for classify domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -34,5 +33,3 @@ kt_android_library( "//third_party:javax_inject_javax_inject", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel index c59365719f5..9f24847da82 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'AlgebraicExpressionInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,6 @@ kt_android_library( ], visibility = ["//domain:domain_testing_visibility"], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -38,10 +36,8 @@ kt_android_library( visibility = ["//:oppia_prod_module_visibility"], deps = [ ":algebraic_expression_input_providers", - ":dagger", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction/BUILD.bazel index 5cf7d3227c8..479424f099e 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'Continue' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -12,10 +11,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/BUILD.bazel index 5dadd526a23..d1ad2995f17 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'DragAndDropSortInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,6 @@ kt_android_library( "DragDropSortInputIsEqualToOrderingWithOneItemAtIncorrectPositionClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -33,11 +31,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":drag_and_drop_sort_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/fractioninput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/fractioninput/BUILD.bazel index 5da32a18e7c..87b0f38ec3e 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/fractioninput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/fractioninput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'FractionInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -20,7 +19,6 @@ kt_android_library( "FractionInputIsLessThanRuleClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -39,11 +37,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":fraction_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/imageClickInput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/imageClickInput/BUILD.bazel index eb216ecc013..691670a9741 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/imageClickInput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/imageClickInput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'ImageClickInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -11,7 +10,6 @@ kt_android_library( "ImageClickInputIsInRegionRuleClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -30,11 +28,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":image_click_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/itemselectioninput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/itemselectioninput/BUILD.bazel index b1ae3ef0a1f..6b4752ca5e1 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/itemselectioninput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/itemselectioninput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'ItemSelectionInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,6 @@ kt_android_library( "ItemSelectionInputIsProperSubsetOfRuleClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -33,11 +31,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":item_selection_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel index 0a70ea19348..3dcf2a57cdb 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'MathEquationInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,6 @@ kt_android_library( ], visibility = ["//domain:domain_testing_visibility"], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -37,11 +35,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":math_equation_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/BUILD.bazel index 19a34a097ca..ccbe9213512 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'MultipleChoiceInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -11,7 +10,6 @@ kt_android_library( "MultipleChoiceInputEqualsRuleClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -30,11 +28,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":multiple_choice_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/numberwithunits/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/numberwithunits/BUILD.bazel index 1954b42da92..eb4b0b00110 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/numberwithunits/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/numberwithunits/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'NumberWithUnits' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -12,7 +11,6 @@ kt_android_library( "NumberWithUnitsIsEquivalentToRuleClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -31,11 +29,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":number_with_units_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel index 5a11936c237..ded61c2a1dd 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'NumericExpressionInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,6 @@ kt_android_library( ], visibility = ["//domain:domain_testing_visibility"], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -37,11 +35,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":numeric_expression_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/numericinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/numericinput/BUILD.bazel index 2d8f8e7136e..a25efd74a6d 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/numericinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/numericinput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'NumericInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -17,7 +16,6 @@ kt_android_library( "NumericInputIsWithinToleranceRuleClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -36,11 +34,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":numeric_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput/BUILD.bazel index 6fb01de8afb..be367bfdc7f 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'RatioInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,6 @@ kt_android_library( "RatioInputIsEquivalentRuleClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -33,11 +31,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":ratio_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/textinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/textinput/BUILD.bazel index 4a8a59451fa..763bffacd05 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/textinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/textinput/BUILD.bazel @@ -2,7 +2,6 @@ Classifiers for the 'TextInput' interaction. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,6 @@ kt_android_library( "TextInputStartsWithRuleClassifierProvider.kt", ], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:classification_context", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:generic_rule_classifier", @@ -37,11 +35,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":text_input_providers", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:rule_classifier", "//domain/src/main/java/org/oppia/android/domain/classify/rules:rule_classifier_provider", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/clipboard/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/clipboard/BUILD.bazel index 9b485b17b05..4285df8c762 100644 --- a/domain/src/main/java/org/oppia/android/domain/clipboard/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/clipboard/BUILD.bazel @@ -3,7 +3,6 @@ Domain services & definitions corresponding to managing the system clipboard whe text. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -13,10 +12,7 @@ kt_android_library( ], visibility = ["//:oppia_api_visibility"], deps = [ - ":dagger", "//utility/src/main/java/org/oppia/android/util/data:data_provider", "//utility/src/main/java/org/oppia/android/util/data:data_providers", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/exploration/testing/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/exploration/testing/BUILD.bazel index aa24abd30f7..f2299ed6cd9 100644 --- a/domain/src/main/java/org/oppia/android/domain/exploration/testing/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/exploration/testing/BUILD.bazel @@ -2,7 +2,6 @@ Test-only utilities for exploration management & loading domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -25,9 +24,7 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":fake_exploration_retriever", + "//:dagger", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/feedbackreporting/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/feedbackreporting/BUILD.bazel index ee80b564682..3a142430a7f 100644 --- a/domain/src/main/java/org/oppia/android/domain/feedbackreporting/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/feedbackreporting/BUILD.bazel @@ -2,7 +2,6 @@ Domain services & definitions corresponding to user feedback reporting. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -12,8 +11,8 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":report_schema_version", + "//:dagger", ], ) @@ -27,5 +26,3 @@ kt_android_library( "//third_party:javax_inject_javax_inject", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/locale/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/locale/BUILD.bazel index bfa81c3fcb7..5db57463f86 100644 --- a/domain/src/main/java/org/oppia/android/domain/locale/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/locale/BUILD.bazel @@ -2,7 +2,6 @@ Domain definitions for managing languages & locales. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -13,7 +12,6 @@ kt_android_library( visibility = ["//:oppia_api_visibility"], deps = [ ":content_locale_impl", - ":dagger", ":language_config_retriever", "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", "//model/src/main/proto:languages_java_proto_lite", @@ -49,7 +47,6 @@ kt_android_library( "//domain:domain_testing_visibility", ], deps = [ - ":dagger", "//model/src/main/proto:languages_java_proto_lite", "//utility/src/main/java/org/oppia/android/util/caching:annotations", "//utility/src/main/java/org/oppia/android/util/caching:asset_repository", @@ -83,5 +80,3 @@ kt_android_library( ":locale_application_injector", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/onboarding/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/onboarding/BUILD.bazel index f3ba2025c05..de14cb3a32a 100644 --- a/domain/src/main/java/org/oppia/android/domain/onboarding/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/onboarding/BUILD.bazel @@ -2,7 +2,6 @@ Utilities for onboarding domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -30,9 +29,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":exploration_meta_data_retriever", ":impl", + "//:dagger", ], ) @@ -54,5 +53,3 @@ kt_android_library( "//third_party:javax_inject_javax_inject", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/onboarding/testing/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/onboarding/testing/BUILD.bazel index 540172f4f86..be23c119989 100644 --- a/domain/src/main/java/org/oppia/android/domain/onboarding/testing/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/onboarding/testing/BUILD.bazel @@ -2,7 +2,6 @@ Test-only utilities for onboarding domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -13,8 +12,8 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":fake_exploration_meta_data_retriever", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/onboarding:exploration_meta_data_retriever", ], ) @@ -31,5 +30,3 @@ kt_android_library( "//third_party:javax_inject_javax_inject", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel index 9126d713ce0..6180098f779 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel @@ -2,7 +2,6 @@ Package for providing logging support. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -66,9 +65,7 @@ kt_android_library( ], deps = [ ":application_id_seed", - ":dagger", + "//:dagger", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel index 316439404f7..7cac578f443 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel @@ -2,7 +2,6 @@ Library for providing logging analytics to the Oppia android app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -23,7 +22,6 @@ kt_android_library( ], visibility = ["//domain/src/main/java/org/oppia/android/domain/oppialogger:__subpackages__"], deps = [ - ":dagger", "//data/src/main/java/org/oppia/android/data/persistence:cache_store", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/translation:translation_controller", @@ -45,7 +43,6 @@ kt_android_library( ], visibility = ["//domain/src/main/java/org/oppia/android/domain/oppialogger:__subpackages__"], deps = [ - ":dagger", "//data/src/main/java/org/oppia/android/data/persistence:cache_store", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", @@ -65,7 +62,6 @@ kt_android_library( ], visibility = ["//:oppia_api_visibility"], deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:logging_identifier_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:controller", @@ -81,7 +77,6 @@ kt_android_library( ], visibility = ["//:oppia_api_visibility"], deps = [ - ":dagger", ":performance_metrics_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:logging_identifier_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", @@ -123,7 +118,6 @@ kt_android_library( visibility = ["//:oppia_api_visibility"], deps = [ ":cpu_performance_snapshotter", - ":dagger", ":learner_analytics_inactivity_limit_millis", ":performance_metrics_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:logging_identifier_controller", @@ -145,8 +139,8 @@ kt_android_library( visibility = ["//:oppia_prod_module_visibility"], deps = [ ":application_lifecycle_observer", - ":dagger", ":learner_analytics_inactivity_limit_millis", + "//:dagger", ], ) @@ -158,7 +152,6 @@ kt_android_library( visibility = ["//:oppia_testing_visibility"], deps = [ ":cpu_performance_logging_time_period_millis", - ":dagger", ":learner_analytics_inactivity_limit_millis", ":performance_metrics_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:logging_identifier_controller", @@ -181,9 +174,7 @@ kt_android_library( visibility = ["//:oppia_prod_module_visibility"], deps = [ ":cpu_performance_snapshotter", - ":dagger", ":learner_analytics_inactivity_limit_millis", + "//:dagger", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel index a92a8aa723a..1f5645eed60 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel @@ -2,7 +2,6 @@ Package for testing utilities for log uploading functionality. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -13,10 +12,8 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", + "//third_party:javax_inject_javax_inject", "//utility/src/main/java/org/oppia/android/util/logging:log_uploader", "//utility/src/main/java/org/oppia/android/util/logging:metric_log_scheduler", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/BUILD.bazel index 3d479108604..d0805571dbd 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/BUILD.bazel @@ -2,7 +2,6 @@ Package for providing logging support for exceptions. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -30,8 +29,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":startup_listener", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", ], ) @@ -48,5 +47,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/logging:console_logger", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel index 8b62f56b4ac..2f8c93f1c40 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel @@ -2,7 +2,6 @@ Library for providing log scheduling functionality to the Oppia android app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -54,11 +53,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":performance_metrics_log_scheduler", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", "//utility/src/main/java/org/oppia/android/util/logging:metric_log_scheduler", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel index ac5d1338364..4b12cc7f95d 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel @@ -2,7 +2,6 @@ Library for providing log uploading functionality to the Oppia android app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -66,10 +65,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":initializer", + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/profile/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/profile/BUILD.bazel index 559ed5175d5..23a3ba5f821 100644 --- a/domain/src/main/java/org/oppia/android/domain/profile/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/profile/BUILD.bazel @@ -2,7 +2,6 @@ Domain definitions and controllers for managing profiles. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -29,5 +28,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/spotlight/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/spotlight/BUILD.bazel index e9c1bb9fcc3..a472d8e814d 100644 --- a/domain/src/main/java/org/oppia/android/domain/spotlight/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/spotlight/BUILD.bazel @@ -2,7 +2,6 @@ Domain definitions and controllers for managing spotlights. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -21,5 +20,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/data:data_providers", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader/BUILD.bazel index 8b7fcd64eca..241c5879b68 100644 --- a/domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader/BUILD.bazel @@ -2,7 +2,6 @@ Package for testing utilities for log uploading functionality. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -13,9 +12,7 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", + "//third_party:javax_inject_javax_inject", "//utility/src/main/java/org/oppia/android/util/logging:log_uploader", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/translation/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/translation/BUILD.bazel index 700a8b0ad15..b2eaa4e29b6 100644 --- a/domain/src/main/java/org/oppia/android/domain/translation/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/translation/BUILD.bazel @@ -2,7 +2,6 @@ Domain definitions for managing translations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -25,5 +24,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/locale:oppia_locale", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel index 786cd962d4d..d48fe6e1535 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel @@ -2,7 +2,6 @@ Tests for algebraic expression input classifiers. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputIsEquivalentToRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -38,7 +36,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputMatchesExactlyWithRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -64,7 +61,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputMatchesUpToTrivialManipulationsRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -90,7 +86,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -105,5 +100,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/logging:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel index 88686b47484..b9402e87c91 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel @@ -2,7 +2,6 @@ Tests for math equation input classifiers. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.mathequationinput.MathEquationInputIsEquivalentToRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput:math_equation_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -38,7 +36,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.mathequationinput.MathEquationInputMatchesExactlyWithRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput:math_equation_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -64,7 +61,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.mathequationinput.MathEquationInputMatchesUpToTrivialManipulationsRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput:math_equation_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -90,7 +86,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.mathequationinput.MathEquationInputModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput:math_equation_input_rule_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -105,5 +100,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/logging:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel index 7755b5ca94a..ebea2375007 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel @@ -2,7 +2,6 @@ Tests for numeric expression input classifiers. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.numericexpressioninput.NumericExpressionInputIsEquivalentToRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput:numeric_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -38,7 +36,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.numericexpressioninput.NumericExpressionInputMatchesExactlyWithRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput:numeric_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -64,7 +61,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.numericexpressioninput.NumericExpressionInputMatchesUpToTrivialManipulationsRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput:numeric_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -90,7 +86,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.numericexpressioninput.NumericExpressionInputModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput:numeric_expression_input_rule_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -105,5 +100,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/logging:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel index 6d6534cf9bf..7c13fb4535a 100644 --- a/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel @@ -2,7 +2,6 @@ Tests for clipboard management domain services & definitions. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.clipboard.ClipboardControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/clipboard:clipboard_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -32,5 +30,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel index eb8fd34b76e..5c2396264e7 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel @@ -2,7 +2,6 @@ Tests for lightweight exploration player domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.ExplorationDataControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", @@ -56,7 +54,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.ExplorationProgressControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", @@ -103,7 +100,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.ExplorationStorageModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", @@ -123,5 +119,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel index af942107187..a22aa05ad80 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel @@ -2,7 +2,6 @@ Tests for lightweight checkpointing domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.lightweightcheckpointing.ExplorationCheckpointControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction:continue_module", @@ -47,5 +45,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel index 23bed07b229..f01e2f2d6ae 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel @@ -2,7 +2,6 @@ Tests for test-only exploration domain utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.testing.ExplorationStorageTestModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:fake_exploration_retriever", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:test_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", @@ -40,7 +38,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.testing.FakeExplorationRetrieverTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:fake_exploration_retriever", "//testing", @@ -58,5 +55,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/logging:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/hintsandsolution/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/hintsandsolution/BUILD.bazel index 1dc2c093e59..7bcf8fc1e23 100644 --- a/domain/src/test/java/org/oppia/android/domain/hintsandsolution/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/hintsandsolution/BUILD.bazel @@ -2,7 +2,6 @@ Tests for hints and solution domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -28,7 +27,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HintHandlerDebugImplTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:test_module", "//testing", @@ -54,7 +52,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HintHandlerProdImplTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:test_module", "//testing", @@ -80,7 +77,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HintsAndSolutionDebugModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -100,7 +96,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -112,5 +107,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel index b631b4f16e3..3e8265202ac 100644 --- a/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel @@ -2,7 +2,6 @@ Tests for language & locale domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.ContentLocaleImplTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", + "//:dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:content_locale_impl", "//model/src/main/proto:languages_java_proto_lite", @@ -32,7 +31,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.LanguageConfigRetrieverTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:language_config_retriever", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -57,7 +55,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.LanguageConfigRetrieverProductionTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//config/src/java/org/oppia/android/config:production_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:language_config_retriever", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -82,7 +79,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.LanguageConfigRetrieverWithoutAssetsTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:language_config_retriever", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -104,7 +100,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.LocaleControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:locale_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", @@ -129,5 +124,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel index 85124495fd0..37589c9e20b 100644 --- a/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel @@ -2,7 +2,6 @@ Tests for domain components pertaining to onboarding the user to the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.onboarding.AppStartupStateControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/onboarding:retriever_prod_module", "//domain/src/main/java/org/oppia/android/domain/onboarding:state_controller", @@ -35,5 +33,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel index 346231f3738..17d63f73ab1 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel @@ -2,7 +2,6 @@ Tests for app analytics logging support. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.AnalyticsControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -44,7 +42,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -73,7 +70,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleObserverTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -102,7 +98,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModuleTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -131,7 +126,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -161,7 +155,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.LearnerAnalyticsLoggerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction:continue_module", @@ -205,7 +198,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler:metric_log_scheduler_module", @@ -236,7 +228,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsLoggerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -258,5 +249,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel index 0d317321c64..b7a9cf27ea9 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel @@ -2,7 +2,6 @@ Tests for test-only app analytics logging support components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.testing.FakeLogSchedulerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing:fake_log_scheduler", @@ -37,5 +35,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel index da6cd042dea..cd915d96c83 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel @@ -2,7 +2,6 @@ Tests for app-wide log uploading functionality. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.loguploader.LogReportWorkManagerInitializerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", @@ -46,7 +44,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader:worker", @@ -73,5 +70,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:network_connection_debug_util", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel index 3989ef637a4..ab50d8d9dd1 100644 --- a/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel @@ -2,7 +2,6 @@ Tests for lightweight exploration player domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.question.QuestionAssessmentProgressControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", @@ -58,7 +56,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.question.QuestionTrainingControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", @@ -94,5 +91,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel index 1336cab8f7a..1a1810dde5a 100644 --- a/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel @@ -2,7 +2,6 @@ Tests for domain components pertaining to managing translations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.domain.translation.TranslationControllerTest", test_manifest = "//domain:test_manifest", deps = [ - ":dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:locale_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", @@ -38,5 +36,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) - -dagger_rules() diff --git a/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel b/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel index 97be8252f41..8fd6f3bbadb 100644 --- a/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel +++ b/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel @@ -2,7 +2,6 @@ This library contains the test application and modules used to build the test app for end-to-end tests. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -17,7 +16,6 @@ kt_android_library( ], visibility = ["//:oppia_e2e_testing_visibility"], deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:abstract_application", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -31,5 +29,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/instrumentation/src/javatests/org/oppia/android/instrumentation/application/BUILD.bazel b/instrumentation/src/javatests/org/oppia/android/instrumentation/application/BUILD.bazel index 43b0a009e54..8a4e4b60037 100644 --- a/instrumentation/src/javatests/org/oppia/android/instrumentation/application/BUILD.bazel +++ b/instrumentation/src/javatests/org/oppia/android/instrumentation/application/BUILD.bazel @@ -2,7 +2,6 @@ This library contains the Robolectric tests for the e2e test modules. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.instrumentation.application.EndToEndTestGcsResourceModuleTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//instrumentation/src/java/org/oppia/android/instrumentation/application:oppia_test_application", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_runner", @@ -29,7 +27,6 @@ oppia_android_test( test_class = "org.oppia.android.instrumentation.application.EndToEndTestImageParsingModuleTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//instrumentation/src/java/org/oppia/android/instrumentation/application:oppia_test_application", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_runner", @@ -46,7 +43,6 @@ oppia_android_test( test_class = "org.oppia.android.instrumentation.application.EndToEndTestNetworkConfigModuleTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//instrumentation/src/java/org/oppia/android/instrumentation/application:oppia_test_application", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_runner", @@ -55,5 +51,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/testing/BUILD.bazel b/testing/BUILD.bazel index 9bed8754f08..c87ba397d38 100644 --- a/testing/BUILD.bazel +++ b/testing/BUILD.bazel @@ -3,7 +3,6 @@ This library contains fake objects used for testing as well as tests for these objects. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") load("//testing:testing_test.bzl", "testing_test") @@ -33,7 +32,6 @@ kt_android_library( manifest = "src/main/AndroidManifest.xml", visibility = ["//visibility:public"], deps = [ - ":dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/profile:profile_management_controller", @@ -75,7 +73,6 @@ kt_android_library( # keep sorted TEST_DEPS = [ ":assertion_helpers", - ":dagger", ":testing", "//data/src/main/java/org/oppia/android/data/backends/gae:network_config_prod_module", "//domain", @@ -164,5 +161,3 @@ filegroup( srcs = ["src/test/AndroidManifest.xml"], visibility = ["//:oppia_testing_visibility"], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/data/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/data/BUILD.bazel index 67f93f5d11b..23574d297fa 100644 --- a/testing/src/main/java/org/oppia/android/testing/data/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/data/BUILD.bazel @@ -3,7 +3,6 @@ Package for common test utilities corresponding to data processing & data providers. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -29,7 +28,6 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/data:async_result_subject", "//testing/src/main/java/org/oppia/android/testing/mockito", "//testing/src/main/java/org/oppia/android/testing/threading:test_coroutine_dispatchers", @@ -39,5 +37,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/data:data_providers", ], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/espresso/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/espresso/BUILD.bazel index 95f138cd1c3..31f17410282 100644 --- a/testing/src/main/java/org/oppia/android/testing/espresso/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/espresso/BUILD.bazel @@ -3,7 +3,6 @@ Package for common Espresso matchers & other test utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -14,7 +13,6 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/threading:test_coroutine_dispatchers", "//third_party:androidx_test_espresso_espresso-core", ], @@ -69,5 +67,3 @@ kt_android_library( "//third_party:com_google_android_material_material", ], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/logging/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/logging/BUILD.bazel index 328f36948d5..01b0bded674 100644 --- a/testing/src/main/java/org/oppia/android/testing/logging/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/logging/BUILD.bazel @@ -2,7 +2,6 @@ Test utilities for broad logging functionality. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -27,7 +26,6 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", "//utility/src/main/java/org/oppia/android/util/logging:sync_status_manager", "//utility/src/main/java/org/oppia/android/util/logging:sync_status_manager_impl", ], @@ -41,10 +39,8 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":test_sync_status_manager", + "//:dagger", "//utility/src/main/java/org/oppia/android/util/logging:sync_status_manager", ], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/network/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/network/BUILD.bazel index fdf6a36523f..8d9f2088328 100644 --- a/testing/src/main/java/org/oppia/android/testing/network/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/network/BUILD.bazel @@ -3,7 +3,6 @@ Library for providing test-only HTTP mocks for the app's networking layer. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -51,11 +50,9 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", + "//:dagger", "//data/src/main/java/org/oppia/android/data/backends/gae:oppia_retrofit", "//data/src/main/java/org/oppia/android/data/backends/gae:prod_module", "//third_party:com_squareup_retrofit2_retrofit-mock", ], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel index 1b6b8298bf5..c9fa8bf1381 100644 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel @@ -3,7 +3,6 @@ Package for test-specific platform parameter utilities and helpers. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -32,10 +31,8 @@ kt_android_library( "//:oppia_testing_visibility", ], deps = [ - ":dagger", ":test_constants", + "//:dagger", "//utility", ], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel index 15870e33871..a9a9b0a3143 100644 --- a/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel @@ -3,7 +3,6 @@ Package for Robolectric-specific utilities and configurations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -26,8 +25,8 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":is_on_robolectric", + "//:dagger", ], ) @@ -73,5 +72,3 @@ kt_android_library( "//third_party:org_robolectric_robolectric", ], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/threading/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/threading/BUILD.bazel index 2b084f0de00..6877cfa3e4c 100644 --- a/testing/src/main/java/org/oppia/android/testing/threading/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/threading/BUILD.bazel @@ -4,7 +4,6 @@ Package for test-only threading utilities, including classes to coordinate cross in a way that can improve test reliability, correctness, and performance. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -105,11 +104,9 @@ kt_android_library( visibility = ["//:oppia_testing_visibility"], deps = [ ":annotations", - ":dagger", ":espresso_impl", ":robolectric_impl", + "//:dagger", "//utility/src/main/java/org/oppia/android/util/threading:annotations", ], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/time/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/time/BUILD.bazel index 0c0958f1f93..a4d62682fe5 100644 --- a/testing/src/main/java/org/oppia/android/testing/time/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/time/BUILD.bazel @@ -4,7 +4,6 @@ Package for test-only utilities for coordinating time, particularly in simulated environments (i.e. Robolectric). """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -41,9 +40,7 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":fake_oppia_clock", + "//:dagger", ], ) - -dagger_rules() diff --git a/testing/src/test/java/org/oppia/android/testing/data/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/data/BUILD.bazel index 2152aed1832..48173e66ef9 100644 --- a/testing/src/test/java/org/oppia/android/testing/data/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/data/BUILD.bazel @@ -3,7 +3,6 @@ Tests for data processing test utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -13,7 +12,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.data.DataProviderTestMonitorTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//domain/src/main/java/org/oppia/android/domain/locale:locale_controller", "//domain/src/main/java/org/oppia/android/domain/translation:translation_controller", "//model/src/main/proto:languages_java_proto_lite", @@ -34,5 +32,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/testing/src/test/java/org/oppia/android/testing/junit/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/junit/BUILD.bazel index 1b4bcc4dc08..74c2366c6b7 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/junit/BUILD.bazel @@ -2,7 +2,6 @@ Tests for generic activity & fragment test utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.junit.InitializeDefaultLocaleRuleCustomContextTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -67,7 +65,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.junit.InitializeDefaultLocaleRuleOmissionTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -121,7 +118,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.junit.InitializeDefaultLocaleRuleTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -168,5 +164,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", ], ) - -dagger_rules() diff --git a/testing/src/test/java/org/oppia/android/testing/logging/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/logging/BUILD.bazel index 740f52ae5f9..c129a737807 100644 --- a/testing/src/test/java/org/oppia/android/testing/logging/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/logging/BUILD.bazel @@ -2,7 +2,6 @@ Tests for broad logging functionality test utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.logging.TestSyncStatusManagerTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", @@ -39,7 +37,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.logging.SyncStatusTestModuleTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/logging:sync_status_test_module", @@ -58,5 +55,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/testing/src/test/java/org/oppia/android/testing/networking/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/networking/BUILD.bazel index 99403b6dee1..4846ae7f590 100644 --- a/testing/src/test/java/org/oppia/android/testing/networking/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/networking/BUILD.bazel @@ -2,7 +2,6 @@ Tests for networking-specific test utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.networking.NetworkConnectionTestUtilTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -26,5 +24,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:prod_module", ], ) - -dagger_rules() diff --git a/testing/src/test/java/org/oppia/android/testing/robolectric/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/robolectric/BUILD.bazel index 144e4f00c59..a569473150f 100644 --- a/testing/src/test/java/org/oppia/android/testing/robolectric/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/robolectric/BUILD.bazel @@ -2,7 +2,6 @@ Tests for Robolectric-specific utilities and configurations. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.robolectric.ShadowBidiFormatterTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/robolectric:shadow_bidi_formatter", "//third_party:androidx_core_core", "//third_party:androidx_test_ext_junit", @@ -22,5 +21,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel index 08c073d5e32..356e47f8a3f 100644 --- a/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel @@ -3,7 +3,6 @@ Tests for threading-specific test utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") load("//:oppia_android_test.bzl", "oppia_android_test") @@ -26,7 +25,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.threading.CoroutineExecutorServiceTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:coroutine_executor_service", @@ -43,7 +41,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.threading.TestCoroutineDispatcherEspressoImplTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", ":test_coroutine_dispatcher_test_base", "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -59,7 +56,6 @@ oppia_android_test( test_class = "org.oppia.android.testing.threading.TestCoroutineDispatcherRobolectricImplTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", ":test_coroutine_dispatcher_test_base", "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -75,12 +71,9 @@ oppia_android_test( test_class = "org.oppia.android.testing.threading.TestCoroutineDispatcherTest", test_manifest = "//testing:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:robolectric_android-all", "//utility", ], ) - -dagger_rules() diff --git a/utility/BUILD.bazel b/utility/BUILD.bazel index aff05e104d5..f09f59aae6f 100644 --- a/utility/BUILD.bazel +++ b/utility/BUILD.bazel @@ -3,7 +3,6 @@ This library contains utilities that all other modules, minus model, depend on. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") load("//utility:utility_test.bzl", "utility_test") @@ -65,7 +64,6 @@ kt_android_library( ), visibility = ["//visibility:public"], deps = [ - ":dagger", ":resources", "//app:crashlytics", "//app:crashlytics_deps", @@ -102,7 +100,6 @@ filegroup( # keep sorted TEST_DEPS = [ - ":dagger", ":test_resources", ":utility", "//app:crashlytics", @@ -160,5 +157,3 @@ MIGRATED_TESTS = [ filtered_tests = MIGRATED_TESTS, deps = TEST_DEPS, ) for test_file_path in glob(["src/test/java/org/oppia/android/util/**/*Test.kt"])] - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/accessibility/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/accessibility/BUILD.bazel index 334c946e4a9..33f4143f887 100644 --- a/utility/src/main/java/org/oppia/android/util/accessibility/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/accessibility/BUILD.bazel @@ -2,7 +2,6 @@ General purposes utilities for Android accessibility checking. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -44,8 +43,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":impl", + "//:dagger", ], ) @@ -57,9 +56,7 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":testing", + "//:dagger", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/caching/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/caching/BUILD.bazel index 28d5943b78d..1a9ed34db7b 100644 --- a/utility/src/main/java/org/oppia/android/util/caching/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/caching/BUILD.bazel @@ -2,7 +2,6 @@ Utilities corresponding to caching. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -39,7 +38,6 @@ kt_android_library( ], deps = [ ":asset_repository", - ":dagger", "//third_party:com_google_protobuf_protobuf-javalite", "//utility/src/main/java/org/oppia/android/util/logging:console_logger", ], @@ -54,8 +52,8 @@ kt_android_library( deps = [ ":annotations", ":asset_repository", - ":dagger", ":topic_list_to_cache", + "//:dagger", ], ) @@ -66,8 +64,8 @@ kt_android_library( ], visibility = ["//:oppia_api_visibility"], deps = [ - ":dagger", ":impl", + "//:dagger", ], ) @@ -81,5 +79,3 @@ kt_android_library( "//third_party:javax_inject_javax_inject", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/caching/testing/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/caching/testing/BUILD.bazel index cf17e2459dc..524a5c7e53a 100644 --- a/utility/src/main/java/org/oppia/android/util/caching/testing/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/caching/testing/BUILD.bazel @@ -2,7 +2,6 @@ Testing utilities corresponding asset caching utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -13,7 +12,7 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", + "//:dagger", "//utility/src/main/java/org/oppia/android/util/caching:annotations", "//utility/src/main/java/org/oppia/android/util/caching:topic_list_to_cache", ], @@ -27,8 +26,8 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":test_asset_repository", + "//:dagger", ], ) @@ -40,7 +39,6 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", "//third_party:com_google_protobuf_protobuf-javalite", "//utility/src/main/java/org/oppia/android/util/caching:asset_repository", "//utility/src/main/java/org/oppia/android/util/caching:impl", @@ -55,9 +53,7 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", + "//third_party:javax_inject_javax_inject", "//utility/src/main/java/org/oppia/android/util/caching:asset_repository", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/data/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/data/BUILD.bazel index fa19e2b393e..46290b3b89c 100644 --- a/utility/src/main/java/org/oppia/android/util/data/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/data/BUILD.bazel @@ -2,7 +2,6 @@ Utilities corresponding to data. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -48,8 +47,8 @@ kt_android_library( deps = [ ":async_data_subscription_manager", ":async_result", - ":dagger", ":data_provider", + "//:dagger", "//third_party:androidx_lifecycle_lifecycle-livedata-core", "//third_party:javax_inject_javax_inject", "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", @@ -70,5 +69,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/threading:annotations", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/gcsresource/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/gcsresource/BUILD.bazel index a08e5bee6f6..40b791ffc55 100644 --- a/utility/src/main/java/org/oppia/android/util/gcsresource/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/gcsresource/BUILD.bazel @@ -2,7 +2,6 @@ Utilities for interacting with GCS backend resources. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -24,8 +23,6 @@ kt_android_library( visibility = ["//:oppia_prod_module_visibility"], deps = [ ":annotations", - ":dagger", + "//:dagger", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/locale/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/locale/BUILD.bazel index dcec5fbc2c9..3a162a1ed94 100644 --- a/utility/src/main/java/org/oppia/android/util/locale/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/locale/BUILD.bazel @@ -2,7 +2,6 @@ Generic utilities for managing languages & locales. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -55,10 +54,10 @@ kt_android_library( ], deps = [ ":android_locale_factory", - ":dagger", ":oppia_bidi_formatter", ":oppia_locale", "//third_party:androidx_core_core", + "//third_party:javax_inject_javax_inject", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", ], @@ -74,7 +73,7 @@ kt_android_library( ], deps = [ ":android_locale_profile", - ":dagger", + "//third_party:javax_inject_javax_inject", ], ) @@ -95,10 +94,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":impl", ":oppia_locale", + "//:dagger", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/locale/testing/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/locale/testing/BUILD.bazel index 15136e7c69e..fa840ff6152 100644 --- a/utility/src/main/java/org/oppia/android/util/locale/testing/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/locale/testing/BUILD.bazel @@ -2,7 +2,6 @@ Testing utilities for language & locale general utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -13,7 +12,6 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", "//utility/src/main/java/org/oppia/android/util/locale:impl", "//utility/src/main/java/org/oppia/android/util/locale:oppia_bidi_formatter", ], @@ -27,10 +25,8 @@ kt_android_library( ], visibility = ["//:oppia_testing_visibility"], deps = [ - ":dagger", ":test_oppia_bidi_formatter", + "//:dagger", "//utility/src/main/java/org/oppia/android/util/locale:impl", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel index 40eb95675a2..81ff50f70c1 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel @@ -2,7 +2,6 @@ General purpose utilities for logging. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -128,9 +127,9 @@ kt_android_library( visibility = ["//:oppia_prod_module_visibility"], deps = [ ":annotations", - ":dagger", ":log_level", ":sync_status_manager_impl", + "//:dagger", "//third_party:javax_inject_javax_inject", ], ) @@ -143,8 +142,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":event_type_to_human_readable_name_converter", + "//:dagger", ], ) @@ -156,8 +155,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":event_type_to_human_readable_name_converter", + "//:dagger", ], ) @@ -211,5 +210,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/networking:network_connection_util", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel index be07e37c2d8..bf4700beabb 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel @@ -2,7 +2,6 @@ Logging utility implementations backed by Firebase. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -46,9 +45,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":firebase_exception_logger", ":prod_impl", + "//:dagger", "//third_party:com_google_firebase_firebase-analytics", "//third_party:com_google_firebase_firebase-crashlytics", "//third_party:javax_inject_javax_inject", @@ -80,10 +79,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":debug_event_logger", ":firebase_exception_logger", + "//:dagger", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel index ff353d105be..f2b674020e6 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel @@ -2,7 +2,6 @@ General purpose utilities for performance metrics logging. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -34,8 +33,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":performance_metrics_assessor_impl", + "//:dagger", "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//third_party:javax_inject_javax_inject", ], @@ -64,11 +63,9 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", + "//:dagger", "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//third_party:javax_inject_javax_inject", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/networking/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/networking/BUILD.bazel index 9d2801a3001..382ebf75f64 100644 --- a/utility/src/main/java/org/oppia/android/util/networking/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/networking/BUILD.bazel @@ -2,7 +2,6 @@ Package for networking utilities """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -64,8 +63,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":prod_impl", + "//:dagger", ], ) @@ -76,8 +75,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":debug_impl", + "//:dagger", ], ) @@ -90,9 +89,7 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":network_connection_debug_util", + "//:dagger", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/parser/html/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/parser/html/BUILD.bazel index 47dab3398be..adb9af41640 100644 --- a/utility/src/main/java/org/oppia/android/util/parser/html/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/parser/html/BUILD.bazel @@ -2,7 +2,6 @@ General-purpose utilities for parsing & rendering HTML within the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -105,10 +104,8 @@ kt_android_library( ], deps = [ ":custom_html_content_handler", - ":dagger", ":exploration_html_parser_entity_type", ":tag_handlers", + "//:dagger", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/parser/image/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/parser/image/BUILD.bazel index bdc56d21a08..e88fe61795f 100644 --- a/utility/src/main/java/org/oppia/android/util/parser/image/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/parser/image/BUILD.bazel @@ -2,7 +2,6 @@ General-purpose utilities for image loading and processing. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -60,9 +59,9 @@ kt_android_library( "//:oppia_prod_module_visibility", ], deps = [ - ":dagger", ":glide_image_loader", ":image_loader", + "//:dagger", ], ) @@ -112,8 +111,8 @@ kt_android_library( "//:oppia_testing_visibility", ], deps = [ - ":dagger", ":image_parsing_annonations", + "//:dagger", "//third_party:javax_inject_javax_inject", ], ) @@ -149,6 +148,7 @@ kt_android_library( deps = [ ":image_asset_fetcher", ":repository_model_loader", + "//:dagger", "//third_party:glide_compiler", "//utility/src/main/java/org/oppia/android/util/caching:annotations", "//utility/src/main/java/org/oppia/android/util/caching:asset_repository", @@ -222,5 +222,3 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/parser/svg:block_picture_drawable", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/profile/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/profile/BUILD.bazel index 84dc1073a62..1d98a6aa872 100644 --- a/utility/src/main/java/org/oppia/android/util/profile/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/profile/BUILD.bazel @@ -2,7 +2,6 @@ General purposes utilities to manage directories. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -26,5 +25,3 @@ kt_android_library( "//third_party:javax_inject_javax_inject", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/system/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/system/BUILD.bazel index 76e15d8f17d..6b423da811c 100644 --- a/utility/src/main/java/org/oppia/android/util/system/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/system/BUILD.bazel @@ -2,7 +2,6 @@ Utilities corresponding to system utilities such as the system clock. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -31,8 +30,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - ":dagger", ":oppia_clock_impl", + "//:dagger", ], ) @@ -57,5 +56,3 @@ kt_android_library( ":oppia_clock_injector", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/threading/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/threading/BUILD.bazel index bb5b44721bc..19d3ea5ad0c 100644 --- a/utility/src/main/java/org/oppia/android/util/threading/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/threading/BUILD.bazel @@ -2,7 +2,6 @@ General purpose utilities for multi-threading and concurrency. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -52,10 +51,8 @@ kt_android_library( visibility = ["//:oppia_prod_module_visibility"], deps = [ ":annotations", - ":dagger", + "//:dagger", "//third_party:javax_inject_javax_inject", "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-android", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/caching/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/caching/BUILD.bazel index cadafded7a4..14d2bd670e5 100644 --- a/utility/src/test/java/org/oppia/android/util/caching/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/caching/BUILD.bazel @@ -2,7 +2,6 @@ Tests for caching utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.caching.AssetModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -27,5 +25,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/logging:prod_module", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/caching/testing/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/caching/testing/BUILD.bazel index f9cf0e1a190..084699a4e6b 100644 --- a/utility/src/test/java/org/oppia/android/util/caching/testing/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/caching/testing/BUILD.bazel @@ -2,7 +2,6 @@ Tests for testing utilities corresponding asset caching utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.caching.testing.AssetTestNoOpModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", "//third_party:junit_junit", @@ -30,7 +28,6 @@ oppia_android_test( test_class = "org.oppia.android.util.caching.testing.TestNoOpAssetRepositoryTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//model/src/main/proto:test_models", "//testing", "//third_party:androidx_test_ext_junit", @@ -43,5 +40,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/caching/testing:asset_test_no_op_module", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/data/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/data/BUILD.bazel index b2890356c40..47801a10f98 100644 --- a/utility/src/test/java/org/oppia/android/util/data/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/data/BUILD.bazel @@ -2,7 +2,6 @@ Tests for lightweight exploration player domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.data.AsyncDataSubscriptionManagerTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -31,7 +29,6 @@ oppia_android_test( test_class = "org.oppia.android.util.data.AsyncResultTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -51,7 +48,6 @@ oppia_android_test( test_class = "org.oppia.android.util.data.DataProvidersTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:async_result_subject", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", @@ -72,7 +68,6 @@ oppia_android_test( test_class = "org.oppia.android.util.data.InMemoryBlockingCacheTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -83,5 +78,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/locale/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/locale/BUILD.bazel index 850e0d05370..573ed8f8ccd 100644 --- a/utility/src/test/java/org/oppia/android/util/locale/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/locale/BUILD.bazel @@ -2,7 +2,6 @@ Tests for language & locale utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.AndroidLocaleFactoryTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", @@ -32,7 +30,6 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.AndroidLocaleProfileTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -51,7 +48,6 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.LocaleProdModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -69,7 +65,6 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.DisplayLocaleImplTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//model/src/main/proto:languages_java_proto_lite", "//testing", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -93,7 +88,6 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.MachineLocaleImplTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -111,7 +105,6 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.OppiaBidiFormatterImplTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/robolectric:shadow_bidi_formatter", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -130,7 +123,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.OppiaLocaleContextExtensionsTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", + "//:dagger", "//model/src/main/proto:languages_java_proto_lite", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_extensions_truth-liteproto-extension", @@ -140,5 +133,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/locale:oppia_locale", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/locale/testing/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/locale/testing/BUILD.bazel index e8457492b52..1a8f0328576 100644 --- a/utility/src/test/java/org/oppia/android/util/locale/testing/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/locale/testing/BUILD.bazel @@ -2,7 +2,6 @@ Tests for testing utilities for language & locale general utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.testing.LocaleTestModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -30,7 +28,6 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.testing.TestOppiaBidiFormatterTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:shadow_bidi_formatter", "//third_party:androidx_test_ext_junit", @@ -42,5 +39,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/locale/testing:test_oppia_bidi_formatter", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel index 46094493ecf..23a9d80ad5b 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel @@ -2,7 +2,6 @@ Tests for logging utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") load("//:oppia_android_test.bzl", "oppia_android_test") @@ -30,7 +29,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.EventBundleCreatorTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", @@ -51,7 +49,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.EventLoggingConfigurationModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", @@ -69,7 +66,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.KenyaAlphaEventBundleCreatorTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", @@ -88,7 +84,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.KenyaAlphaEventLoggingConfigurationModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", @@ -106,7 +101,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.StandardEventTypeToHumanReadableNameConverterImplTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -123,7 +117,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.SyncStatusManagerImplTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", ":sync_status_manager_test_base", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", @@ -139,5 +132,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel index 7d96eebedab..63a0dfbd081 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel @@ -2,7 +2,6 @@ Tests for logging utility implementations backed by Firebase. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.firebase.LogReportingModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -28,5 +26,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel index 9719a59c057..19ba413991f 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel @@ -2,7 +2,6 @@ Tests for general-purpose utilities for performance metrics logging. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorImplTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", @@ -40,7 +38,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -63,7 +60,6 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -77,5 +73,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/networking/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/networking/BUILD.bazel index 6d2c1dc4bf8..21dcde84dd9 100644 --- a/utility/src/test/java/org/oppia/android/util/networking/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/networking/BUILD.bazel @@ -2,7 +2,6 @@ Tests for networking-specific utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.networking.NetworkConnectionUtilProdModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -34,7 +32,6 @@ oppia_android_test( test_class = "org.oppia.android.util.networking.NetworkConnectionUtilProdImplTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -56,7 +53,6 @@ oppia_android_test( test_class = "org.oppia.android.util.networking.NetworkConnectionUtilDebugModuleTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -78,7 +74,6 @@ oppia_android_test( test_class = "org.oppia.android.util.networking.NetworkConnectionUtilDebugImplTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -92,5 +87,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/utility/src/test/java/org/oppia/android/util/profile/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/profile/BUILD.bazel index 83e10b86f43..f5c8cf342ac 100644 --- a/utility/src/test/java/org/oppia/android/util/profile/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/profile/BUILD.bazel @@ -2,7 +2,6 @@ Tests for profile utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -12,7 +11,6 @@ oppia_android_test( test_class = "org.oppia.android.util.profile.ProfileNameValidatorTest", test_manifest = "//utility:test_manifest", deps = [ - ":dagger", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -28,5 +26,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/profile:profile_name_validator", ], ) - -dagger_rules() From 839be0fe1473f65585c5420da944e728e953fe53 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 29 Mar 2023 17:14:40 -0700 Subject: [PATCH 09/63] Upgrade Dagger version. This is needed for downstream work. It also includes ensuring that Guava JRE can never be used (since only Android should ever be referenced by the production app build). --- WORKSPACE | 23 ++- third_party/BUILD.bazel | 15 ++ third_party/maven_install.json | 339 ++++++++++++++++++++++++++++----- third_party/versions.bzl | 20 +- 4 files changed, 336 insertions(+), 61 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index a2b94e1e625..79e415ee1a6 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -4,7 +4,7 @@ This file lists and imports all external dependencies needed to build Oppia Andr load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_jar") -load("//third_party:versions.bzl", "HTTP_DEPENDENCY_VERSIONS", "get_maven_dependencies") +load("//third_party:versions.bzl", "HTTP_DEPENDENCY_VERSIONS", "MAVEN_REPOSITORIES", "get_maven_dependencies") # Android SDK configuration. For more details, see: # https://docs.bazel.build/versions/master/be/android.html#android_sdk_repository @@ -191,14 +191,25 @@ maven_install( duplicate_version_warning = "error", fail_if_repin_required = True, maven_install_json = "//third_party:maven_install.json", - repositories = DAGGER_REPOSITORIES + [ - "https://maven.fabric.io/public", - "https://maven.google.com", - "https://repo1.maven.org/maven2", - ], + override_targets = { + "com.google.guava:guava": "@//third_party:com_google_guava_guava", + }, + repositories = DAGGER_REPOSITORIES + MAVEN_REPOSITORIES, strict_visibility = True, ) load("@maven//:defs.bzl", "pinned_maven_install") pinned_maven_install() + +http_jar( + name = "guava_android", + sha256 = HTTP_DEPENDENCY_VERSIONS["guava_android"]["sha"], + urls = [ + "{0}/com/google/guava/guava/{1}-android/guava-{1}-android.jar".format( + url_base, + HTTP_DEPENDENCY_VERSIONS["guava_android"]["version"], + ) + for url_base in DAGGER_REPOSITORIES + MAVEN_REPOSITORIES + ], +) diff --git a/third_party/BUILD.bazel b/third_party/BUILD.bazel index d9183949907..1957d9a54eb 100644 --- a/third_party/BUILD.bazel +++ b/third_party/BUILD.bazel @@ -90,6 +90,21 @@ android_library( ], ) +# Creates an alias for Guava Android to support maven_install's override of Guava. This ensures that +# Guava-Android is always used in builds, even if dependencies request a newer version of Guava-JRE. +android_library( + name = "com_google_guava_guava", + visibility = ["//visibility:public"], + exports = [ + "//third_party:com_google_errorprone_error_prone_annotations", + "//third_party:com_google_guava_failureaccess", + "//third_party:com_google_j2objc_j2objc-annotations", + "//third_party:org_checkerframework_checker-compat-qual", + "//third_party:org_checkerframework_checker-qual", + "@guava_android//jar", + ], +) + # Define a separate target for the Glide annotation processor compiler. Unfortunately, this library # can't encapsulate all of Glide (i.e. by exporting the main Glide dependency) since that includes # Android assets which java_library targets do not export. diff --git a/third_party/maven_install.json b/third_party/maven_install.json index 5ca106d5463..c805c07e858 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,17 +1,16 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -18032934, - "__RESOLVED_ARTIFACTS_HASH": -568966258, + "__INPUT_ARTIFACTS_HASH": 1775302140, + "__RESOLVED_ARTIFACTS_HASH": 362653858, "conflict_resolution": { "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", "androidx.recyclerview:recyclerview:1.0.0": "androidx.recyclerview:recyclerview:1.1.0", "androidx.test:core:1.0.0": "androidx.test:core:1.4.0", - "com.google.guava:guava:28.1-android": "com.google.guava:guava:30.1.1-android", "com.google.truth:truth:0.43": "com.google.truth:truth:1.1.3", "junit:junit:4.12": "junit:junit:4.13.2", "org.jetbrains.kotlin:kotlin-reflect:1.3.41": "org.jetbrains.kotlin:kotlin-reflect:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.32", "org.mockito:mockito-core:2.19.0": "org.mockito:mockito-core:3.9.0" }, "artifacts": { @@ -725,33 +724,39 @@ }, "com.google.dagger:dagger": { "shasums": { - "jar": "c2a09540677b6ffeeb5911c5d8e69738718004e875a10c176e84ed8c997739a7" + "jar": "bb0600d2dd9669cbd5a2e40e7d3fbc4692f57fb7d59509d26b380398e20f5739" }, - "version": "2.28.1" + "version": "2.41" }, "com.google.dagger:dagger-compiler": { "shasums": { - "jar": "379d4fce6d11234c3814aca1676aa34f5dd0f0ec5155c44de2d5e49cacee573c" + "jar": "b53edab184655a0de6bacfb9551849de7b6bf0c688a4771321b4cf6f548ac80e" }, - "version": "2.28.1" + "version": "2.41" }, "com.google.dagger:dagger-producers": { "shasums": { - "jar": "7c44499d5717cf6fdc3d026e5440c6bac9cabc98226d28715ca0eda90e68f7b2" + "jar": "8fe89dc042654fdf38a5be19bfe7f1d61a512225495a9379d52e5c28bc3f4521" }, - "version": "2.28.1" + "version": "2.41" }, "com.google.dagger:dagger-spi": { "shasums": { - "jar": "aae2a23d0bce8bae6d6c0e302b048c389d0f2354adc14fd80366c2913e3c5f07" + "jar": "960d8a3ea526e53f4a47e025bce84c714cdec9b84d29fc29d348bbb58406d8ea" }, - "version": "2.28.1" + "version": "2.41" + }, + "com.google.devtools.ksp:symbol-processing-api": { + "shasums": { + "jar": "bf4a6875af46917174b087d03840456685e115954d926ce88fd04b9d2f254df3" + }, + "version": "1.5.30-1.0.0" }, "com.google.errorprone:error_prone_annotations": { "shasums": { - "jar": "cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3" + "jar": "721cb91842b46fa056847d104d5225c8b8e1e8b62263b993051e1e5a0137b7ec" }, - "version": "2.7.1" + "version": "2.11.0" }, "com.google.errorprone:javac-shaded": { "shasums": { @@ -839,9 +844,9 @@ }, "com.google.guava:guava": { "shasums": { - "jar": "355f79352f8c252f2bdaa06c687c4836a38016caccfc4c28d16ae77ecfdffa2f" + "jar": "d5be94d65e87bd219fb3193ad1517baa55a3b88fc91d21cf735826ab5af087b9" }, - "version": "30.1.1-android" + "version": "31.0.1-jre" }, "com.google.guava:listenablefuture": { "shasums": { @@ -947,9 +952,9 @@ }, "com.squareup:javapoet": { "shasums": { - "jar": "9cbf2107be499ec6e95afd36b58e3ca122a24166cdd375732e51267d64058e90" + "jar": "4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291" }, - "version": "1.11.1" + "version": "1.13.0" }, "com.squareup:javawriter": { "shasums": { @@ -993,12 +998,6 @@ }, "version": "1.3.2" }, - "javax.annotation:jsr250-api": { - "shasums": { - "jar": "a1a922d0d9b6d183ed3800dfac01d1e1eb159f0e8c6f94736931c1def54a941f" - }, - "version": "1.0" - }, "javax.inject:javax.inject": { "shasums": { "jar": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" @@ -1061,9 +1060,9 @@ }, "org.checkerframework:checker-qual": { "shasums": { - "jar": "3ea0dcd73b4d6cb2fb34bd7ed4dad6db327a01ebad7db05eb7894076b3d64491" + "jar": "63d474e16948b0a5aabd12c18bdc3d6f47ac2efc4c7ee08da76dba4658138f95" }, - "version": "3.13.0" + "version": "3.21.3" }, "org.hamcrest:hamcrest-core": { "shasums": { @@ -1115,27 +1114,27 @@ }, "org.jetbrains.kotlin:kotlin-stdlib": { "shasums": { - "jar": "52283996fe4067cd7330288b96ae67ecd463614dc741172c54d9d349ab6a9cd7" + "jar": "452d205f54a1f08673de273cb3d0148fbf9cd95275e5b0068fa1b001f48aee0a" }, - "version": "1.5.0" + "version": "1.5.32" }, "org.jetbrains.kotlin:kotlin-stdlib-common": { "shasums": { - "jar": "c14ce6720a487b5e238f1b0c30ac3ad73e45b90a40731ca0b1cfddec1a37682f" + "jar": "dc2fb23e280a39c9abde2cbf4c1567b66840f1f1ece6c7bb78d58d38076b5def" }, - "version": "1.5.0" + "version": "1.5.32" }, "org.jetbrains.kotlin:kotlin-stdlib-jdk7": { "shasums": { - "jar": "f9566380c08722c780ce33ceee23e98ddf765ca98fabd3e2fabae7975c8d232b" + "jar": "bc954cd528b97cc25b8110686bda8af95cfcdb0dba0f3f68d0bb7c2d30d2c504" }, - "version": "1.4.10" + "version": "1.5.32" }, "org.jetbrains.kotlin:kotlin-stdlib-jdk8": { "shasums": { - "jar": "39b7a9442d7a3865e0f4a732c56c1d5da0e11ffb3bb82a461d32deb0c0ca7673" + "jar": "fe6837926a93a36f76550631d552dcf98046d96888a4ffd0c939e33296a3d9e5" }, - "version": "1.4.10" + "version": "1.5.32" }, "org.jetbrains.kotlin:kotlin-test": { "shasums": { @@ -1187,9 +1186,9 @@ }, "org.jetbrains.kotlinx:kotlinx-metadata-jvm": { "shasums": { - "jar": "9753bb39efef35957c5c15df9a3cb769aabf2cdfa74b47afcb7760e5146be3b5" + "jar": "fdaf7ba158465f6b6e9ce5762e0300fd681a976fbfeb5ed50fa5a2b26868cec8" }, - "version": "0.1.0" + "version": "0.3.0" }, "org.jetbrains:annotations": { "shasums": { @@ -1851,11 +1850,11 @@ "com.google.guava:failureaccess", "com.google.guava:guava", "com.squareup:javapoet", - "javax.annotation:jsr250-api", "javax.inject:javax.inject", "net.ltgt.gradle.incap:incap", "org.checkerframework:checker-compat-qual", "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", "org.jetbrains.kotlinx:kotlinx-metadata-jvm" ], "com.google.dagger:dagger-producers": [ @@ -1869,10 +1868,16 @@ "com.google.code.findbugs:jsr305", "com.google.dagger:dagger", "com.google.dagger:dagger-producers", + "com.google.devtools.ksp:symbol-processing-api", "com.google.guava:failureaccess", "com.google.guava:guava", "com.squareup:javapoet", - "javax.inject:javax.inject" + "javax.inject:javax.inject", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.google.devtools.ksp:symbol-processing-api": [ + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" ], "com.google.firebase:firebase-analytics:aar": [ "com.google.android.gms:play-services-measurement-api:aar", @@ -1948,7 +1953,7 @@ "com.google.guava:failureaccess", "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", - "org.checkerframework:checker-compat-qual" + "org.checkerframework:checker-qual" ], "com.google.truth.extensions:truth-liteproto-extension": [ "com.google.auto.value:auto-value-annotations", @@ -2303,6 +2308,7 @@ ], "com.google.dagger:dagger": [ "dagger", + "dagger.assisted", "dagger.internal", "dagger.multibindings" ], @@ -2312,14 +2318,12 @@ "dagger.internal.codegen.binding", "dagger.internal.codegen.bindinggraphvalidation", "dagger.internal.codegen.compileroption", + "dagger.internal.codegen.componentgenerator", "dagger.internal.codegen.javapoet", "dagger.internal.codegen.kotlin", "dagger.internal.codegen.langmodel", - "dagger.internal.codegen.statistics", "dagger.internal.codegen.validation", - "dagger.internal.codegen.writing", - "dagger.model", - "dagger.shaded.auto.common" + "dagger.internal.codegen.writing" ], "com.google.dagger:dagger-producers": [ "dagger.producers", @@ -2329,9 +2333,24 @@ ], "com.google.dagger:dagger-spi": [ "dagger.internal.codegen.extension", + "dagger.internal.codegen.xprocessing", "dagger.model", - "dagger.shaded.auto.common", - "dagger.spi" + "dagger.spi", + "dagger.spi.model", + "dagger.spi.shaded.androidx.room.compiler.processing", + "dagger.spi.shaded.androidx.room.compiler.processing.compat", + "dagger.spi.shaded.androidx.room.compiler.processing.javac", + "dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin", + "dagger.spi.shaded.androidx.room.compiler.processing.ksp", + "dagger.spi.shaded.androidx.room.compiler.processing.ksp.synthetic", + "dagger.spi.shaded.androidx.room.compiler.processing.util", + "dagger.spi.shaded.auto.common" + ], + "com.google.devtools.ksp:symbol-processing-api": [ + "com.google.devtools.ksp", + "com.google.devtools.ksp.processing", + "com.google.devtools.ksp.symbol", + "com.google.devtools.ksp.visitor" ], "com.google.errorprone:error_prone_annotations": [ "com.google.errorprone.annotations", @@ -2558,10 +2577,6 @@ "javax.annotation.security", "javax.annotation.sql" ], - "javax.annotation:jsr250-api": [ - "javax.annotation", - "javax.annotation.security" - ], "javax.inject:javax.inject": [ "javax.inject" ], @@ -2866,6 +2881,7 @@ "org.checkerframework.checker.initialization.qual", "org.checkerframework.checker.interning.qual", "org.checkerframework.checker.lock.qual", + "org.checkerframework.checker.mustcall.qual", "org.checkerframework.checker.nullness.qual", "org.checkerframework.checker.optional.qual", "org.checkerframework.checker.propkey.qual", @@ -3762,6 +3778,7 @@ ], "org.jetbrains.kotlin:kotlin-stdlib-jdk7": [ "kotlin.internal.jdk7", + "kotlin.io.path", "kotlin.jdk7" ], "org.jetbrains.kotlin:kotlin-stdlib-jdk8": [ @@ -4154,6 +4171,7 @@ "com.google.dagger:dagger-compiler", "com.google.dagger:dagger-producers", "com.google.dagger:dagger-spi", + "com.google.devtools.ksp:symbol-processing-api", "com.google.errorprone:error_prone_annotations", "com.google.errorprone:javac-shaded", "com.google.firebase:firebase-analytics:aar", @@ -4195,7 +4213,6 @@ "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", "javax.annotation:javax.annotation-api", - "javax.annotation:jsr250-api", "javax.inject:javax.inject", "junit:junit", "net.bytebuddy:byte-buddy", @@ -4372,6 +4389,225 @@ "com.google.dagger:dagger-compiler", "com.google.dagger:dagger-producers", "com.google.dagger:dagger-spi", + "com.google.devtools.ksp:symbol-processing-api", + "com.google.errorprone:error_prone_annotations", + "com.google.errorprone:javac-shaded", + "com.google.firebase:firebase-analytics:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-crashlytics:aar", + "com.google.firebase:firebase-encoders-json:aar", + "com.google.firebase:firebase-iid-interop:aar", + "com.google.firebase:firebase-iid:aar", + "com.google.firebase:firebase-installations-interop:aar", + "com.google.firebase:firebase-installations:aar", + "com.google.firebase:firebase-measurement-connector:aar", + "com.google.gms:google-services", + "com.google.googlejavaformat:google-java-format", + "com.google.guava:failureaccess", + "com.google.guava:guava", + "com.google.guava:listenablefuture", + "com.google.j2objc:j2objc-annotations", + "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-javalite", + "com.google.truth.extensions:truth-liteproto-extension", + "com.google.truth:truth", + "com.googlecode.juniversalchardet:juniversalchardet", + "com.ibm.icu:icu4j", + "com.squareup.moshi:moshi", + "com.squareup.moshi:moshi-kotlin", + "com.squareup.moshi:moshi-kotlin-codegen", + "com.squareup.okhttp3:mockwebserver", + "com.squareup.okhttp3:okhttp", + "com.squareup.okio:okio", + "com.squareup.retrofit2:converter-moshi", + "com.squareup.retrofit2:retrofit", + "com.squareup.retrofit2:retrofit-mock", + "com.squareup:javapoet", + "com.squareup:javawriter", + "com.squareup:kotlinpoet", + "commons-codec:commons-codec", + "commons-io:commons-io", + "de.hdodenhof:circleimageview:aar", + "io.fabric.sdk.android:fabric:aar", + "javax.annotation:javax.annotation-api", + "javax.inject:javax.inject", + "junit:junit", + "net.bytebuddy:byte-buddy", + "net.bytebuddy:byte-buddy-agent", + "net.ltgt.gradle.incap:incap", + "net.sf.kxml:kxml2", + "nl.dionsegijn:konfetti:aar", + "org.antlr:antlr4", + "org.bouncycastle:bcprov-jdk15on", + "org.checkerframework:checker-compat-qual", + "org.checkerframework:checker-qual", + "org.hamcrest:hamcrest-core", + "org.hamcrest:hamcrest-integration", + "org.hamcrest:hamcrest-library", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.kotlin:kotlin-compiler-embeddable", + "org.jetbrains.kotlin:kotlin-daemon-embeddable", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-script-runtime", + "org.jetbrains.kotlin:kotlin-stdlib", + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlin:kotlin-test", + "org.jetbrains.kotlin:kotlin-test-annotations-common", + "org.jetbrains.kotlin:kotlin-test-common", + "org.jetbrains.kotlin:kotlin-test-junit", + "org.jetbrains.kotlinx:kotlinx-coroutines-android", + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-debug", + "org.jetbrains.kotlinx:kotlinx-coroutines-test", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm", + "org.jetbrains:annotations", + "org.mockito.kotlin:mockito-kotlin", + "org.mockito:mockito-core", + "org.objenesis:objenesis", + "org.ow2.asm:asm", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-tree", + "org.ow2.asm:asm-util", + "org.robolectric:annotations", + "org.robolectric:junit", + "org.robolectric:pluginapi", + "org.robolectric:plugins-maven-dependency-resolver", + "org.robolectric:resources", + "org.robolectric:robolectric", + "org.robolectric:sandbox", + "org.robolectric:shadowapi", + "org.robolectric:shadows-framework", + "org.robolectric:utils", + "org.robolectric:utils-reflector" + ], + "https://oss.sonatype.org/content/repositories/snapshots/": [ + "android.arch.core:common", + "android.arch.core:core-testing:aar", + "android.arch.core:runtime:aar", + "androidx.activity:activity:aar", + "androidx.annotation:annotation", + "androidx.annotation:annotation-experimental:aar", + "androidx.appcompat:appcompat-resources:aar", + "androidx.appcompat:appcompat:aar", + "androidx.arch.core:core-common", + "androidx.arch.core:core-runtime:aar", + "androidx.arch.core:core-testing:aar", + "androidx.cardview:cardview:aar", + "androidx.collection:collection", + "androidx.constraintlayout:constraintlayout-solver", + "androidx.constraintlayout:constraintlayout:aar", + "androidx.coordinatorlayout:coordinatorlayout:aar", + "androidx.core:core-ktx:aar", + "androidx.core:core:aar", + "androidx.cursoradapter:cursoradapter:aar", + "androidx.customview:customview:aar", + "androidx.databinding:databinding-adapters:aar", + "androidx.databinding:databinding-common", + "androidx.databinding:databinding-compiler", + "androidx.databinding:databinding-compiler-common", + "androidx.databinding:databinding-runtime:aar", + "androidx.documentfile:documentfile:aar", + "androidx.drawerlayout:drawerlayout:aar", + "androidx.dynamicanimation:dynamicanimation:aar", + "androidx.exifinterface:exifinterface:aar", + "androidx.fragment:fragment:aar", + "androidx.interpolator:interpolator:aar", + "androidx.legacy:legacy-support-core-utils:aar", + "androidx.lifecycle:lifecycle-common", + "androidx.lifecycle:lifecycle-extensions:aar", + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar", + "androidx.lifecycle:lifecycle-livedata-core:aar", + "androidx.lifecycle:lifecycle-livedata-ktx:aar", + "androidx.lifecycle:lifecycle-livedata:aar", + "androidx.lifecycle:lifecycle-process:aar", + "androidx.lifecycle:lifecycle-runtime:aar", + "androidx.lifecycle:lifecycle-service:aar", + "androidx.lifecycle:lifecycle-viewmodel-ktx:aar", + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.loader:loader:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "androidx.multidex:multidex-instrumentation:aar", + "androidx.multidex:multidex:aar", + "androidx.navigation:navigation-common-ktx:aar", + "androidx.navigation:navigation-common:aar", + "androidx.navigation:navigation-fragment-ktx:aar", + "androidx.navigation:navigation-fragment:aar", + "androidx.navigation:navigation-runtime-ktx:aar", + "androidx.navigation:navigation-runtime:aar", + "androidx.navigation:navigation-ui-ktx:aar", + "androidx.navigation:navigation-ui:aar", + "androidx.print:print:aar", + "androidx.recyclerview:recyclerview:aar", + "androidx.room:room-common", + "androidx.room:room-runtime:aar", + "androidx.savedstate:savedstate:aar", + "androidx.sqlite:sqlite-framework:aar", + "androidx.sqlite:sqlite:aar", + "androidx.test.espresso:espresso-accessibility:aar", + "androidx.test.espresso:espresso-contrib:aar", + "androidx.test.espresso:espresso-core:aar", + "androidx.test.espresso:espresso-idling-resource:aar", + "androidx.test.espresso:espresso-intents:aar", + "androidx.test.ext:junit:aar", + "androidx.test.ext:truth:aar", + "androidx.test.uiautomator:uiautomator:aar", + "androidx.test:core:aar", + "androidx.test:monitor:aar", + "androidx.test:rules:aar", + "androidx.test:runner:aar", + "androidx.transition:transition:aar", + "androidx.vectordrawable:vectordrawable-animated:aar", + "androidx.vectordrawable:vectordrawable:aar", + "androidx.versionedparcelable:versionedparcelable:aar", + "androidx.viewpager2:viewpager2:aar", + "androidx.viewpager:viewpager:aar", + "androidx.work:work-runtime-ktx:aar", + "androidx.work:work-runtime:aar", + "androidx.work:work-testing:aar", + "com.almworks.sqlite4java:sqlite4java", + "com.android.databinding:baseLibrary", + "com.android.support:support-annotations", + "com.android.tools.build.jetifier:jetifier-core", + "com.android.tools.build:aapt2-proto", + "com.android.tools:annotations", + "com.github.bumptech.glide:annotations", + "com.github.bumptech.glide:compiler", + "com.github.bumptech.glide:disklrucache", + "com.github.bumptech.glide:gifdecoder:aar", + "com.github.bumptech.glide:glide:aar", + "com.github.bumptech.glide:mocks:aar", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework", + "com.google.android.datatransport:transport-api:aar", + "com.google.android.datatransport:transport-backend-cct:aar", + "com.google.android.datatransport:transport-runtime:aar", + "com.google.android.flexbox:flexbox:aar", + "com.google.android.gms:play-services-ads-identifier:aar", + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-measurement-api:aar", + "com.google.android.gms:play-services-measurement-base:aar", + "com.google.android.gms:play-services-measurement-impl:aar", + "com.google.android.gms:play-services-measurement-sdk-api:aar", + "com.google.android.gms:play-services-measurement-sdk:aar", + "com.google.android.gms:play-services-measurement:aar", + "com.google.android.gms:play-services-stats:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.android.gms:strict-version-matcher-plugin", + "com.google.android.material:material:aar", + "com.google.auto.service:auto-service-annotations", + "com.google.auto.value:auto-value-annotations", + "com.google.code.findbugs:jsr305", + "com.google.code.gson:gson", + "com.google.dagger:dagger", + "com.google.dagger:dagger-compiler", + "com.google.dagger:dagger-producers", + "com.google.dagger:dagger-spi", + "com.google.devtools.ksp:symbol-processing-api", "com.google.errorprone:error_prone_annotations", "com.google.errorprone:javac-shaded", "com.google.firebase:firebase-analytics:aar", @@ -4413,7 +4649,6 @@ "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", "javax.annotation:javax.annotation-api", - "javax.annotation:jsr250-api", "javax.inject:javax.inject", "junit:junit", "net.bytebuddy:byte-buddy", @@ -4590,6 +4825,7 @@ "com.google.dagger:dagger-compiler", "com.google.dagger:dagger-producers", "com.google.dagger:dagger-spi", + "com.google.devtools.ksp:symbol-processing-api", "com.google.errorprone:error_prone_annotations", "com.google.errorprone:javac-shaded", "com.google.firebase:firebase-analytics:aar", @@ -4631,7 +4867,6 @@ "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", "javax.annotation:javax.annotation-api", - "javax.annotation:jsr250-api", "javax.inject:javax.inject", "junit:junit", "net.bytebuddy:byte-buddy", diff --git a/third_party/versions.bzl b/third_party/versions.bzl index ec3c4e561ca..2d60c725c4f 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -53,11 +53,13 @@ MAVEN_PRODUCTION_DEPENDENCY_VERSIONS = { "com.github.bumptech.glide:glide": "4.11.0", "com.google.android.flexbox:flexbox": "3.0.0", "com.google.android.material:material": "1.3.0", + "com.google.errorprone:error_prone_annotations": "2.11.0", "com.google.firebase:firebase-analytics": "17.5.0", "com.google.firebase:firebase-common": "19.3.0", "com.google.firebase:firebase-crashlytics": "17.1.1", "com.google.gms:google-services": "4.3.3", - "com.google.guava:guava": "28.1-android", + "com.google.guava:failureaccess": "1.0.1", + "com.google.j2objc:j2objc-annotations": "1.3", "com.google.protobuf:protobuf-javalite": "3.17.3", "com.squareup.moshi:moshi-kotlin": "1.11.0", "com.squareup.moshi:moshi-kotlin-codegen": "1.11.0", @@ -69,6 +71,8 @@ MAVEN_PRODUCTION_DEPENDENCY_VERSIONS = { "javax.annotation:javax.annotation-api:jar": "1.3.2", "javax.inject:javax.inject": "1", "nl.dionsegijn:konfetti": "1.2.5", + "org.checkerframework:checker-compat-qual": "2.5.5", + "org.checkerframework:checker-qual": "3.21.3", "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar": "1.3.72", "org.jetbrains.kotlinx:kotlinx-coroutines-android": "1.4.1", "org.jetbrains.kotlinx:kotlinx-coroutines-core": "1.4.1", @@ -114,8 +118,12 @@ HTTP_DEPENDENCY_VERSIONS = { "version": "1.8.0", }, "dagger": { - "sha": "9e69ab2f9a47e0f74e71fe49098bea908c528aa02fa0c5995334447b310d0cdd", - "version": "2.28.1", + "sha": "5c2b22e88e52110178afebda100755f31f5dd505c317be0bfb4f7ad88a88db86", + "version": "2.41", + }, + "guava_android": { + "sha": "9425a423a4cb9d9db0356300722d9bd8e634cf539f29d97bb84f457cccd16eb8", + "version": "31.0.1", }, "protobuf_tools": { "sha": "efcb0b9004200fce79de23be796072a055105273905a5a441dbb5a979d724d20", @@ -143,6 +151,12 @@ HTTP_DEPENDENCY_VERSIONS = { }, } +MAVEN_REPOSITORIES = [ + "https://maven.fabric.io/public", + "https://maven.google.com", + "https://repo1.maven.org/maven2", +] + def get_maven_dependencies(): """ Returns a list of maven dependencies to install to fulfill third-party dependencies. From c2fe337c160bdb46e56d5e53dba7e006ac526501 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 29 Mar 2023 17:42:06 -0700 Subject: [PATCH 10/63] Fix test builds that depend on Dagger generation. --- app/BUILD.bazel | 1 + .../administratorcontrols/learneranalytics/BUILD.bazel | 2 ++ .../oppia/android/app/customview/interaction/BUILD.bazel | 1 + .../java/org/oppia/android/app/databinding/BUILD.bazel | 9 +++++++++ .../app/devoptions/mathexpressionparser/BUILD.bazel | 2 ++ .../java/org/oppia/android/app/notice/BUILD.bazel | 2 ++ .../org/oppia/android/app/player/exploration/BUILD.bazel | 2 ++ .../java/org/oppia/android/app/player/state/BUILD.bazel | 1 + .../java/org/oppia/android/app/splash/BUILD.bazel | 1 + .../test/java/org/oppia/android/app/activity/BUILD.bazel | 1 + .../org/oppia/android/app/activity/route/BUILD.bazel | 2 ++ .../org/oppia/android/app/application/alpha/BUILD.bazel | 1 + .../org/oppia/android/app/application/beta/BUILD.bazel | 1 + .../org/oppia/android/app/application/dev/BUILD.bazel | 1 + .../org/oppia/android/app/application/ga/BUILD.bazel | 1 + .../oppia/android/app/application/testing/BUILD.bazel | 1 + .../app/devoptions/devoptionsitemviewmodel/BUILD.bazel | 1 + .../org/oppia/android/app/testing/activity/BUILD.bazel | 1 + .../java/org/oppia/android/app/translation/BUILD.bazel | 3 +++ .../oppia/android/app/translation/testing/BUILD.bazel | 1 + .../java/org/oppia/android/app/utility/math/BUILD.bazel | 1 + data/BUILD.bazel | 1 + .../java/org/oppia/android/data/persistence/BUILD.bazel | 1 + domain/BUILD.bazel | 1 + .../classify/rules/algebraicexpressioninput/BUILD.bazel | 4 ++++ .../domain/classify/rules/mathequationinput/BUILD.bazel | 4 ++++ .../classify/rules/numericexpressioninput/BUILD.bazel | 4 ++++ .../java/org/oppia/android/domain/clipboard/BUILD.bazel | 1 + .../org/oppia/android/domain/exploration/BUILD.bazel | 3 +++ .../exploration/lightweightcheckpointing/BUILD.bazel | 1 + .../oppia/android/domain/exploration/testing/BUILD.bazel | 2 ++ .../oppia/android/domain/hintsandsolution/BUILD.bazel | 5 +++++ .../java/org/oppia/android/domain/locale/BUILD.bazel | 4 ++++ .../java/org/oppia/android/domain/onboarding/BUILD.bazel | 1 + .../android/domain/oppialogger/analytics/BUILD.bazel | 8 ++++++++ .../domain/oppialogger/analytics/testing/BUILD.bazel | 1 + .../android/domain/oppialogger/loguploader/BUILD.bazel | 2 ++ .../java/org/oppia/android/domain/question/BUILD.bazel | 2 ++ .../org/oppia/android/domain/translation/BUILD.bazel | 1 + .../android/instrumentation/application/BUILD.bazel | 3 +++ testing/BUILD.bazel | 1 + .../test/java/org/oppia/android/testing/data/BUILD.bazel | 1 + .../java/org/oppia/android/testing/junit/BUILD.bazel | 3 +++ .../java/org/oppia/android/testing/logging/BUILD.bazel | 2 ++ .../org/oppia/android/testing/networking/BUILD.bazel | 1 + .../java/org/oppia/android/testing/threading/BUILD.bazel | 4 ++++ utility/BUILD.bazel | 1 + .../test/java/org/oppia/android/util/caching/BUILD.bazel | 1 + .../org/oppia/android/util/caching/testing/BUILD.bazel | 2 ++ .../test/java/org/oppia/android/util/data/BUILD.bazel | 4 ++++ .../test/java/org/oppia/android/util/locale/BUILD.bazel | 6 ++++++ .../org/oppia/android/util/locale/testing/BUILD.bazel | 2 ++ .../test/java/org/oppia/android/util/logging/BUILD.bazel | 6 ++++++ .../org/oppia/android/util/logging/firebase/BUILD.bazel | 1 + .../android/util/logging/performancemetrics/BUILD.bazel | 3 +++ .../java/org/oppia/android/util/networking/BUILD.bazel | 4 ++++ .../test/java/org/oppia/android/util/profile/BUILD.bazel | 1 + 57 files changed, 128 insertions(+) diff --git a/app/BUILD.bazel b/app/BUILD.bazel index fbc3e101bf4..c275ad1c92c 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -837,6 +837,7 @@ TEST_DEPS = [ ":app", ":resources", ":test_deps", + "//:dagger", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", "//app/src/main/java/org/oppia/android/app/application:application_injector_provider", diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel index 4e3c294886e..32e78baa131 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel @@ -6,6 +6,7 @@ app_test( processed_src = test_with_resources("ProfileAndDeviceIdActivityTest.kt"), test_class = "org.oppia.android.app.administratorcontrols.learneranalytics.ProfileAndDeviceIdActivityTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -38,6 +39,7 @@ app_test( processed_src = test_with_resources("ProfileAndDeviceIdFragmentTest.kt"), test_class = "org.oppia.android.app.administratorcontrols.learneranalytics.ProfileAndDeviceIdFragmentTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", diff --git a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel index babb0d3d2ca..c30d27bb755 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/BUILD.bazel @@ -10,6 +10,7 @@ app_test( processed_src = test_with_resources("MathExpressionInteractionsViewTest.kt"), test_class = "org.oppia.android.app.customview.interaction.MathExpressionInteractionsViewTest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel index caeb919e29b..96d6c339ede 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/BUILD.bazel @@ -45,6 +45,7 @@ app_test( processed_src = test_with_resources("AppCompatCheckBoxBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.AppCompatCheckBoxBindingAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -80,6 +81,7 @@ app_test( processed_src = test_with_resources("CircularProgressIndicatorAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.CircularProgressIndicatorAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -115,6 +117,7 @@ app_test( processed_src = "DrawableBindingAdaptersTest_updated.kt", test_class = "org.oppia.android.app.databinding.DrawableBindingAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -150,6 +153,7 @@ app_test( processed_src = "ImageViewBindingAdaptersTest_updated.kt", test_class = "org.oppia.android.app.databinding.ImageViewBindingAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -185,6 +189,7 @@ app_test( processed_src = test_with_resources("MarginBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.MarginBindingAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -220,6 +225,7 @@ app_test( processed_src = test_with_resources("StateAssemblerMarginBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.StateAssemblerMarginBindingAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -255,6 +261,7 @@ app_test( processed_src = test_with_resources("StateAssemblerPaddingBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.StateAssemblerPaddingBindingAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -290,6 +297,7 @@ app_test( processed_src = "TextViewBindingAdaptersTest_updated.kt", test_class = "org.oppia.android.app.databinding.TextViewBindingAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", @@ -325,6 +333,7 @@ app_test( processed_src = test_with_resources("ViewBindingAdaptersTest.kt"), test_class = "org.oppia.android.app.databinding.ViewBindingAdaptersTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel index 873bc778639..0a49195e96c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/BUILD.bazel @@ -10,6 +10,7 @@ app_test( processed_src = test_with_resources("MathExpressionParserActivityTest.kt"), test_class = "org.oppia.android.app.devoptions.mathexpressionparser.MathExpressionParserActivityTest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -41,6 +42,7 @@ app_test( processed_src = test_with_resources("MathExpressionParserFragmentTest.kt"), test_class = "org.oppia.android.app.devoptions.mathexpressionparser.MathExpressionParserFragmentTest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel index 5a992e72d33..3b00d82a812 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/BUILD.bazel @@ -10,6 +10,7 @@ app_test( processed_src = test_with_resources("BetaNoticeDialogFragmentTest.kt"), test_class = "org.oppia.android.app.notice.BetaNoticeDialogFragmentTest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -46,6 +47,7 @@ app_test( processed_src = test_with_resources("GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt"), test_class = "org.oppia.android.app.notice.GeneralAvailabilityUpgradeNoticeDialogFragmentTest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel index 3384500f459..4ba1c3f5b56 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BUILD.bazel @@ -10,6 +10,7 @@ app_test( processed_src = test_with_resources("BottomSheetOptionsMenuTest.kt"), test_class = "org.oppia.android.app.player.exploration.BottomSheetOptionsMenuTest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -46,6 +47,7 @@ app_test( processed_src = test_with_resources("ExplorationActivityTest.kt"), test_class = "org.oppia.android.app.player.exploration.ExplorationActivityTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/state/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/player/state/BUILD.bazel index 7259fda5089..1264e021c84 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/state/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/player/state/BUILD.bazel @@ -10,6 +10,7 @@ app_test( processed_src = test_with_resources("StateFragmentTest.kt"), test_class = "org.oppia.android.app.player.state.StateFragmentTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", diff --git a/app/src/sharedTest/java/org/oppia/android/app/splash/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/splash/BUILD.bazel index 3268663d019..387ee6650f4 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/splash/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/splash/BUILD.bazel @@ -10,6 +10,7 @@ app_test( processed_src = test_with_resources("SplashActivityTest.kt"), test_class = "org.oppia.android.app.splash.SplashActivityTest", deps = [ + "//:dagger", "//app", "//app:test_deps", "//app/src/main/java/org/oppia/android/app/application:application_component", diff --git a/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel b/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel index b88df383c49..48fed80cf67 100644 --- a/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/activity/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.activity.ActivityIntentFactoriesTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", "//app/src/main/java/org/oppia/android/app/application:application_component", diff --git a/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel b/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel index 41514a19b51..b10f9b90038 100644 --- a/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/activity/route/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.activity.route.ActivityRouterTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", "//app/src/main/java/org/oppia/android/app/application:application_component", @@ -52,6 +53,7 @@ oppia_android_test( test_class = "org.oppia.android.app.activity.route.ActivityRouterModuleTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", "//app/src/main/java/org/oppia/android/app/application:application_component", diff --git a/app/src/test/java/org/oppia/android/app/application/alpha/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/alpha/BUILD.bazel index 2076ab7fbc9..e8cc91483e3 100644 --- a/app/src/test/java/org/oppia/android/app/application/alpha/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/alpha/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.application.alpha.AlphaBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app/src/main/java/org/oppia/android/app/application/alpha:alpha_build_flavor_module", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", diff --git a/app/src/test/java/org/oppia/android/app/application/beta/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/beta/BUILD.bazel index 3dfb64b5191..16a2e88e15c 100644 --- a/app/src/test/java/org/oppia/android/app/application/beta/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/beta/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.application.beta.BetaBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app/src/main/java/org/oppia/android/app/application/beta:beta_application", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", diff --git a/app/src/test/java/org/oppia/android/app/application/dev/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/dev/BUILD.bazel index 6830879bc9e..47e7ca2b31b 100644 --- a/app/src/test/java/org/oppia/android/app/application/dev/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/dev/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.application.dev.DeveloperBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app/src/main/java/org/oppia/android/app/application/dev:developer_application", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", diff --git a/app/src/test/java/org/oppia/android/app/application/ga/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/ga/BUILD.bazel index d1513c48919..a15268016f6 100644 --- a/app/src/test/java/org/oppia/android/app/application/ga/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/ga/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.application.ga.GaBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app/src/main/java/org/oppia/android/app/application/ga:general_availability_application", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", diff --git a/app/src/test/java/org/oppia/android/app/application/testing/BUILD.bazel b/app/src/test/java/org/oppia/android/app/application/testing/BUILD.bazel index cfa890cc623..20c624701ff 100644 --- a/app/src/test/java/org/oppia/android/app/application/testing/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/application/testing/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.application.testing.TestingBuildFlavorModuleTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app/src/main/java/org/oppia/android/app/application/testing:testing_build_flavor_module", "//model/src/main/proto:version_java_proto_lite", "//third_party:androidx_test_ext_junit", diff --git a/app/src/test/java/org/oppia/android/app/devoptions/devoptionsitemviewmodel/BUILD.bazel b/app/src/test/java/org/oppia/android/app/devoptions/devoptionsitemviewmodel/BUILD.bazel index 55d5000dbd8..c2648795ecd 100644 --- a/app/src/test/java/org/oppia/android/app/devoptions/devoptionsitemviewmodel/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/devoptions/devoptionsitemviewmodel/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.devoptions.devoptionsitemviewmodel.DeveloperOptionsTestParsersViewModelTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", diff --git a/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel b/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel index 00438f383a6..6ee76e3e337 100644 --- a/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/testing/activity/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.testing.activity.TestActivityTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", diff --git a/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel b/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel index c688110b9b8..6e89874ce2b 100644 --- a/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/translation/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.translation.AppLanguageLocaleHandlerTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app/src/main/java/org/oppia/android/app/translation:app_language_locale_handler", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain", @@ -47,6 +48,7 @@ oppia_android_test( test_class = "org.oppia.android.app.translation.AppLanguageResourceHandlerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -96,6 +98,7 @@ oppia_android_test( test_class = "org.oppia.android.app.translation.AppLanguageWatcherMixinTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", diff --git a/app/src/test/java/org/oppia/android/app/translation/testing/BUILD.bazel b/app/src/test/java/org/oppia/android/app/translation/testing/BUILD.bazel index 47ec2b9c5e7..96f5bedbacb 100644 --- a/app/src/test/java/org/oppia/android/app/translation/testing/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/translation/testing/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.translation.testing.TestActivityRecreatorTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app/src/main/java/org/oppia/android/app/translation/testing:test_activity_recreator", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", diff --git a/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel b/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel index 027d251df15..672944d46ec 100644 --- a/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel +++ b/app/src/test/java/org/oppia/android/app/utility/math/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.app.utility.math.MathExpressionAccessibilityUtilTest", test_manifest = "//app:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", diff --git a/data/BUILD.bazel b/data/BUILD.bazel index a1a292dbe76..9f3e32a8f56 100644 --- a/data/BUILD.bazel +++ b/data/BUILD.bazel @@ -13,6 +13,7 @@ filegroup( # keep sorted TEST_DEPS = [ + "//:dagger", "//data/src/main/java/org/oppia/android/data/backends/gae:network_config_prod_module", "//data/src/main/java/org/oppia/android/data/backends/gae:oppia_retrofit", "//data/src/main/java/org/oppia/android/data/backends/gae:prod_module", diff --git a/data/src/test/java/org/oppia/android/data/persistence/BUILD.bazel b/data/src/test/java/org/oppia/android/data/persistence/BUILD.bazel index ca1d9dd07ef..8412556066a 100644 --- a/data/src/test/java/org/oppia/android/data/persistence/BUILD.bazel +++ b/data/src/test/java/org/oppia/android/data/persistence/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.data.persistence.PersistentCacheStoreTest", test_manifest = "//data:test_manifest", deps = [ + "//:dagger", "//data/src/main/java/org/oppia/android/data/persistence:cache_store", "//model/src/main/proto:test_models", "//testing", diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index 151f0028ab9..a3067818ab8 100755 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -171,6 +171,7 @@ kt_android_library( TEST_DEPS = [ ":domain", ":interaction_object_test_builder", + "//:dagger", "//app:crashlytics", "//app:crashlytics_deps", "//app/src/main/java/org/oppia/android/app/application/testing:testing_build_flavor_module", diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel index d48fe6e1535..60ea68740a9 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputIsEquivalentToRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -36,6 +37,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputMatchesExactlyWithRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -61,6 +63,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputMatchesUpToTrivialManipulationsRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -86,6 +89,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.algebraicexpressioninput.AlgebraicExpressionInputModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel index b9402e87c91..8170eefb44e 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.mathequationinput.MathEquationInputIsEquivalentToRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput:math_equation_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -36,6 +37,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.mathequationinput.MathEquationInputMatchesExactlyWithRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput:math_equation_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -61,6 +63,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.mathequationinput.MathEquationInputMatchesUpToTrivialManipulationsRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput:math_equation_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -86,6 +89,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.mathequationinput.MathEquationInputModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput:math_equation_input_rule_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel index ebea2375007..aebbea64f41 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.numericexpressioninput.NumericExpressionInputIsEquivalentToRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput:numeric_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -36,6 +37,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.numericexpressioninput.NumericExpressionInputMatchesExactlyWithRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput:numeric_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -61,6 +63,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.numericexpressioninput.NumericExpressionInputMatchesUpToTrivialManipulationsRuleClassifierProviderTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput:numeric_expression_input_providers", "//model/src/main/proto:interaction_object_java_proto_lite", @@ -86,6 +89,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.classify.rules.numericexpressioninput.NumericExpressionInputModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput:numeric_expression_input_rule_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", diff --git a/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel index 7c13fb4535a..2a9d2c82b26 100644 --- a/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/clipboard/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.clipboard.ClipboardControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/clipboard:clipboard_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel index 5c2396264e7..68b927466e1 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.ExplorationDataControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", @@ -54,6 +55,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.ExplorationProgressControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", @@ -100,6 +102,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.ExplorationStorageModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel index a22aa05ad80..49c83ca1450 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.lightweightcheckpointing.ExplorationCheckpointControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction:continue_module", diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel index f01e2f2d6ae..858cfe267a1 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/exploration/testing/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.testing.ExplorationStorageTestModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:fake_exploration_retriever", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:test_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", @@ -38,6 +39,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.exploration.testing.FakeExplorationRetrieverTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:fake_exploration_retriever", "//testing", diff --git a/domain/src/test/java/org/oppia/android/domain/hintsandsolution/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/hintsandsolution/BUILD.bazel index 7bcf8fc1e23..9ed11d7c15d 100644 --- a/domain/src/test/java/org/oppia/android/domain/hintsandsolution/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/hintsandsolution/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HelpIndexExtensionsTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -27,6 +28,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HintHandlerDebugImplTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:test_module", "//testing", @@ -52,6 +54,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HintHandlerProdImplTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/exploration/testing:test_module", "//testing", @@ -77,6 +80,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HintsAndSolutionDebugModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -96,6 +100,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.hintsandsolution.HintsAndSolutionProdModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", diff --git a/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel index 3e8265202ac..7b02bf08e9c 100644 --- a/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/locale/BUILD.bazel @@ -31,6 +31,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.LanguageConfigRetrieverTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:language_config_retriever", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -55,6 +56,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.LanguageConfigRetrieverProductionTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//config/src/java/org/oppia/android/config:production_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:language_config_retriever", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -79,6 +81,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.LanguageConfigRetrieverWithoutAssetsTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:language_config_retriever", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", @@ -100,6 +103,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.locale.LocaleControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:locale_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", diff --git a/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel index 37589c9e20b..b29d21eb61f 100644 --- a/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/onboarding/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.onboarding.AppStartupStateControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/onboarding:retriever_prod_module", "//domain/src/main/java/org/oppia/android/domain/onboarding:state_controller", diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel index 17d63f73ab1..948c38b79c9 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.AnalyticsControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -42,6 +43,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -70,6 +72,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleObserverTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -98,6 +101,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterModuleTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -126,6 +130,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.CpuPerformanceSnapshotterTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", @@ -155,6 +160,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.LearnerAnalyticsLoggerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction:continue_module", @@ -198,6 +204,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler:metric_log_scheduler_module", @@ -228,6 +235,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.PerformanceMetricsLoggerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//testing", diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel index b7a9cf27ea9..533770e2c80 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.analytics.testing.FakeLogSchedulerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing:fake_log_scheduler", diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel index cd915d96c83..a6e4f4d9620 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.loguploader.LogReportWorkManagerInitializerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:cpu_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", @@ -44,6 +45,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.oppialogger.loguploader.LogUploadWorkerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", "//domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader:worker", diff --git a/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel index ab50d8d9dd1..db85b223c11 100644 --- a/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/question/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.question.QuestionAssessmentProgressControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", @@ -56,6 +57,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.question.QuestionTrainingControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", "//domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput:algebraic_expression_input_rule_module", diff --git a/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel index 1a1810dde5a..8c5617bb171 100644 --- a/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/translation/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.domain.translation.TranslationControllerTest", test_manifest = "//domain:test_manifest", deps = [ + "//:dagger", "//config/src/java/org/oppia/android/config:all_languages_config", "//domain/src/main/java/org/oppia/android/domain/locale:locale_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", diff --git a/instrumentation/src/javatests/org/oppia/android/instrumentation/application/BUILD.bazel b/instrumentation/src/javatests/org/oppia/android/instrumentation/application/BUILD.bazel index 8a4e4b60037..56bcf6097bf 100644 --- a/instrumentation/src/javatests/org/oppia/android/instrumentation/application/BUILD.bazel +++ b/instrumentation/src/javatests/org/oppia/android/instrumentation/application/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.instrumentation.application.EndToEndTestGcsResourceModuleTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//instrumentation/src/java/org/oppia/android/instrumentation/application:oppia_test_application", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_runner", @@ -27,6 +28,7 @@ oppia_android_test( test_class = "org.oppia.android.instrumentation.application.EndToEndTestImageParsingModuleTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//instrumentation/src/java/org/oppia/android/instrumentation/application:oppia_test_application", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_runner", @@ -43,6 +45,7 @@ oppia_android_test( test_class = "org.oppia.android.instrumentation.application.EndToEndTestNetworkConfigModuleTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//instrumentation/src/java/org/oppia/android/instrumentation/application:oppia_test_application", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_runner", diff --git a/testing/BUILD.bazel b/testing/BUILD.bazel index c87ba397d38..abb3bf946b8 100644 --- a/testing/BUILD.bazel +++ b/testing/BUILD.bazel @@ -74,6 +74,7 @@ kt_android_library( TEST_DEPS = [ ":assertion_helpers", ":testing", + "//:dagger", "//data/src/main/java/org/oppia/android/data/backends/gae:network_config_prod_module", "//domain", "//domain/src/main/java/org/oppia/android/domain/classify:interactions_module", diff --git a/testing/src/test/java/org/oppia/android/testing/data/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/data/BUILD.bazel index 48173e66ef9..f56cf1bf1b9 100644 --- a/testing/src/test/java/org/oppia/android/testing/data/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/data/BUILD.bazel @@ -12,6 +12,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.data.DataProviderTestMonitorTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//domain/src/main/java/org/oppia/android/domain/locale:locale_controller", "//domain/src/main/java/org/oppia/android/domain/translation:translation_controller", "//model/src/main/proto:languages_java_proto_lite", diff --git a/testing/src/test/java/org/oppia/android/testing/junit/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/junit/BUILD.bazel index 74c2366c6b7..69c6c6cbdca 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/junit/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.junit.InitializeDefaultLocaleRuleCustomContextTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -65,6 +66,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.junit.InitializeDefaultLocaleRuleOmissionTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", @@ -118,6 +120,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.junit.InitializeDefaultLocaleRuleTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:application_component", "//app/src/main/java/org/oppia/android/app/application:application_injector", diff --git a/testing/src/test/java/org/oppia/android/testing/logging/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/logging/BUILD.bazel index c129a737807..27b564b46fa 100644 --- a/testing/src/test/java/org/oppia/android/testing/logging/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/logging/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.logging.TestSyncStatusManagerTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", @@ -37,6 +38,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.logging.SyncStatusTestModuleTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/logging:sync_status_test_module", diff --git a/testing/src/test/java/org/oppia/android/testing/networking/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/networking/BUILD.bazel index 4846ae7f590..f4e43827563 100644 --- a/testing/src/test/java/org/oppia/android/testing/networking/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/networking/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.networking.NetworkConnectionTestUtilTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", diff --git a/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel index 356e47f8a3f..2c962fd3cd2 100644 --- a/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel @@ -25,6 +25,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.threading.CoroutineExecutorServiceTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:coroutine_executor_service", @@ -42,6 +43,7 @@ oppia_android_test( test_manifest = "//testing:test_manifest", deps = [ ":test_coroutine_dispatcher_test_base", + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:robolectric_android-all", @@ -57,6 +59,7 @@ oppia_android_test( test_manifest = "//testing:test_manifest", deps = [ ":test_coroutine_dispatcher_test_base", + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:robolectric_android-all", @@ -71,6 +74,7 @@ oppia_android_test( test_class = "org.oppia.android.testing.threading.TestCoroutineDispatcherTest", test_manifest = "//testing:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:robolectric_android-all", diff --git a/utility/BUILD.bazel b/utility/BUILD.bazel index f09f59aae6f..ebbf44fe1a4 100644 --- a/utility/BUILD.bazel +++ b/utility/BUILD.bazel @@ -102,6 +102,7 @@ filegroup( TEST_DEPS = [ ":test_resources", ":utility", + "//:dagger", "//app:crashlytics", "//app:crashlytics_deps", "//model/src/main/proto:test_models", diff --git a/utility/src/test/java/org/oppia/android/util/caching/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/caching/BUILD.bazel index 14d2bd670e5..e733344f2d0 100644 --- a/utility/src/test/java/org/oppia/android/util/caching/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/caching/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.caching.AssetModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", diff --git a/utility/src/test/java/org/oppia/android/util/caching/testing/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/caching/testing/BUILD.bazel index 084699a4e6b..013c0b633ec 100644 --- a/utility/src/test/java/org/oppia/android/util/caching/testing/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/caching/testing/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.caching.testing.AssetTestNoOpModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", "//third_party:junit_junit", @@ -28,6 +29,7 @@ oppia_android_test( test_class = "org.oppia.android.util.caching.testing.TestNoOpAssetRepositoryTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//model/src/main/proto:test_models", "//testing", "//third_party:androidx_test_ext_junit", diff --git a/utility/src/test/java/org/oppia/android/util/data/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/data/BUILD.bazel index 47801a10f98..1b11bf47e94 100644 --- a/utility/src/test/java/org/oppia/android/util/data/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/data/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.data.AsyncDataSubscriptionManagerTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -29,6 +30,7 @@ oppia_android_test( test_class = "org.oppia.android.util.data.AsyncResultTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -48,6 +50,7 @@ oppia_android_test( test_class = "org.oppia.android.util.data.DataProvidersTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:async_result_subject", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", @@ -68,6 +71,7 @@ oppia_android_test( test_class = "org.oppia.android.util.data.InMemoryBlockingCacheTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", diff --git a/utility/src/test/java/org/oppia/android/util/locale/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/locale/BUILD.bazel index 573ed8f8ccd..0a38f0f4685 100644 --- a/utility/src/test/java/org/oppia/android/util/locale/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/locale/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.AndroidLocaleFactoryTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", @@ -30,6 +31,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.AndroidLocaleProfileTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -48,6 +50,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.LocaleProdModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -65,6 +68,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.DisplayLocaleImplTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//model/src/main/proto:languages_java_proto_lite", "//testing", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -88,6 +92,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.MachineLocaleImplTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -105,6 +110,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.OppiaBidiFormatterImplTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/robolectric:shadow_bidi_formatter", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", diff --git a/utility/src/test/java/org/oppia/android/util/locale/testing/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/locale/testing/BUILD.bazel index 1a8f0328576..7d91ef52f46 100644 --- a/utility/src/test/java/org/oppia/android/util/locale/testing/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/locale/testing/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.testing.LocaleTestModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/time:test_module", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -28,6 +29,7 @@ oppia_android_test( test_class = "org.oppia.android.util.locale.testing.TestOppiaBidiFormatterTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:shadow_bidi_formatter", "//third_party:androidx_test_ext_junit", diff --git a/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel index 23a9d80ad5b..2df4e704621 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel @@ -29,6 +29,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.EventBundleCreatorTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", @@ -49,6 +50,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.EventLoggingConfigurationModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", @@ -66,6 +68,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.KenyaAlphaEventBundleCreatorTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", @@ -84,6 +87,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.KenyaAlphaEventLoggingConfigurationModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", @@ -101,6 +105,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.StandardEventTypeToHumanReadableNameConverterImplTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -118,6 +123,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ ":sync_status_manager_test_base", + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", diff --git a/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel index 63a0dfbd081..c28d54c6d90 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/firebase/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.firebase.LogReportingModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", diff --git a/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel index 19ba413991f..58eb7dfd8a0 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorImplTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", @@ -38,6 +39,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", @@ -60,6 +62,7 @@ oppia_android_test( test_class = "org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", diff --git a/utility/src/test/java/org/oppia/android/util/networking/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/networking/BUILD.bazel index 21dcde84dd9..c76aa778976 100644 --- a/utility/src/test/java/org/oppia/android/util/networking/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/networking/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.networking.NetworkConnectionUtilProdModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -32,6 +33,7 @@ oppia_android_test( test_class = "org.oppia.android.util.networking.NetworkConnectionUtilProdImplTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -53,6 +55,7 @@ oppia_android_test( test_class = "org.oppia.android.util.networking.NetworkConnectionUtilDebugModuleTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", @@ -74,6 +77,7 @@ oppia_android_test( test_class = "org.oppia.android.util.networking.NetworkConnectionUtilDebugImplTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/time:test_module", diff --git a/utility/src/test/java/org/oppia/android/util/profile/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/profile/BUILD.bazel index f5c8cf342ac..4ee39e3515c 100644 --- a/utility/src/test/java/org/oppia/android/util/profile/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/profile/BUILD.bazel @@ -11,6 +11,7 @@ oppia_android_test( test_class = "org.oppia.android.util.profile.ProfileNameValidatorTest", test_manifest = "//utility:test_manifest", deps = [ + "//:dagger", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_robolectric_test_runner", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", From a5435006fd5816efd246dc8479f0bf4ba7cb951d Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 29 Mar 2023 17:45:36 -0700 Subject: [PATCH 11/63] Update Maven dependency licenses. --- scripts/assets/maven_dependencies.textproto | 56 +++++++++------------ 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/scripts/assets/maven_dependencies.textproto b/scripts/assets/maven_dependencies.textproto index b4b49ff013f..d34ba0fc81b 100644 --- a/scripts/assets/maven_dependencies.textproto +++ b/scripts/assets/maven_dependencies.textproto @@ -890,19 +890,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "com.google.code.findbugs:jsr305:3.0.2" - artifact_version: "3.0.2" - license { - license_name: "The Apache Software License, Version 2.0" - original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" - scrapable_link { - url: "https://www.apache.org/licenses/LICENSE-2.0.txt" - } - } -} -maven_dependency { - artifact_name: "com.google.dagger:dagger:2.28.1" - artifact_version: "2.28.1" + artifact_name: "com.google.dagger:dagger:2.41" + artifact_version: "2.41" license { license_name: "Apache 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -912,8 +901,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "com.google.errorprone:error_prone_annotations:2.7.1" - artifact_version: "2.7.1" + artifact_name: "com.google.errorprone:error_prone_annotations:2.11.0" + artifact_version: "2.11.0" license { license_name: "Apache 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -1042,16 +1031,6 @@ maven_dependency { } } } -maven_dependency { - artifact_name: "com.google.guava:guava:30.1.1-android" - artifact_version: "30.1.1-android" - license { - license_name: "The Apache Software License, Version 2.0" - scrapable_link { - url: "https://www.apache.org/licenses/LICENSE-2.0.txt" - } - } -} maven_dependency { artifact_name: "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava" artifact_version: "9999.0-empty-to-avoid-conflict-with-guava" @@ -1262,6 +1241,17 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "org.checkerframework:checker-qual:3.21.3" + artifact_version: "3.21.3" + license { + license_name: "The MIT License" + original_link: "https://opensource.org/licenses/MIT" + extracted_copy_link { + url: "https://raw.githubusercontent.com/oppia/oppia-android-licenses/develop/mit-license.txt" + } + } +} maven_dependency { artifact_name: "org.jetbrains.kotlin:kotlin-reflect:1.5.0" artifact_version: "1.5.0" @@ -1274,8 +1264,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" - artifact_version: "1.5.0" + artifact_name: "org.jetbrains.kotlin:kotlin-stdlib:1.5.32" + artifact_version: "1.5.32" license { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -1285,8 +1275,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" - artifact_version: "1.5.0" + artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.32" + artifact_version: "1.5.32" license { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -1296,8 +1286,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10" - artifact_version: "1.4.10" + artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.32" + artifact_version: "1.5.32" license { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -1307,8 +1297,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10" - artifact_version: "1.4.10" + artifact_name: "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.32" + artifact_version: "1.5.32" license { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" From b8828320fe8ddba3725046b5ba350f1aeabbbc20 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 29 Mar 2023 18:58:03 -0700 Subject: [PATCH 12/63] Fix broken test & binary builds. --- config/proguard/kotlin-proguard-rules.pro | 4 ++++ .../org/oppia/android/instrumentation/application/BUILD.bazel | 1 + 2 files changed, 5 insertions(+) diff --git a/config/proguard/kotlin-proguard-rules.pro b/config/proguard/kotlin-proguard-rules.pro index 0ed1a7d6a17..3503b267482 100644 --- a/config/proguard/kotlin-proguard-rules.pro +++ b/config/proguard/kotlin-proguard-rules.pro @@ -23,3 +23,7 @@ -dontwarn sun.misc.SignalHandler -dontwarn sun.misc.Signal -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement + +# TODO(#4120): Reevaluate if these exemptions are needed long-term. +-dontwarn kotlin.text.Regex$splitToSequence* +-dontwarn kotlin.time.jdk8.DurationConversionsJDK8Kt diff --git a/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel b/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel index 8fd6f3bbadb..b7ce3da8b7b 100644 --- a/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel +++ b/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel @@ -16,6 +16,7 @@ kt_android_library( ], visibility = ["//:oppia_e2e_testing_visibility"], deps = [ + "//:dagger", "//app", "//app/src/main/java/org/oppia/android/app/application:abstract_application", "//app/src/main/java/org/oppia/android/app/application:application_component", From 773f7ff8ec6ed0f287d96d71806f03d38883ceb7 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 11 May 2023 15:54:45 -0700 Subject: [PATCH 13/63] Fix breakage from develop. The new proto target isn't used anywhere so this was missed. --- model/src/main/proto/BUILD.bazel | 1 + 1 file changed, 1 insertion(+) diff --git a/model/src/main/proto/BUILD.bazel b/model/src/main/proto/BUILD.bazel index cff43615bf0..2a595d3b4d9 100644 --- a/model/src/main/proto/BUILD.bazel +++ b/model/src/main/proto/BUILD.bazel @@ -329,6 +329,7 @@ oppia_proto_library( name = "survey_proto", srcs = ["survey.proto"], visibility = ["//:oppia_api_visibility"], + deps = [":languages_proto"], ) java_lite_proto_library( From 327114dfce408aa0377d4fc6b67dca5adec82d88 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Mon, 5 Jun 2023 22:50:03 -0700 Subject: [PATCH 14/63] Post-merge fixes. --- third_party/maven_install.json | 106 ++++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 7 deletions(-) diff --git a/third_party/maven_install.json b/third_party/maven_install.json index 5ca106d5463..7add7c2be9b 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -18032934, - "__RESOLVED_ARTIFACTS_HASH": -568966258, + "__INPUT_ARTIFACTS_HASH": 867003543, + "__RESOLVED_ARTIFACTS_HASH": -376849256, "conflict_resolution": { "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", @@ -719,9 +719,9 @@ }, "com.google.code.gson:gson": { "shasums": { - "jar": "233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81" + "jar": "c8fb4839054d280b3033f800d1f5a97de2f028eb8ba2eb458ad287e536f3f25f" }, - "version": "2.8.5" + "version": "2.8.6" }, "com.google.dagger:dagger": { "shasums": { @@ -861,6 +861,12 @@ }, "version": "3.17.3" }, + "com.google.protobuf:protobuf-java-util": { + "shasums": { + "jar": "bf320ed076000e1d8c7cbf7601b056acaecab80f75b9a659b9f6398d0d7e3f79" + }, + "version": "3.17.3" + }, "com.google.protobuf:protobuf-javalite": { "shasums": { "jar": "dc643901cc9d95998a1e45ab11e75d4237a7e1947bcbca0b7eca569aaf5e714d" @@ -987,6 +993,18 @@ }, "version": "1.4.7" }, + "io.xlate:yaml-json": { + "shasums": { + "jar": "713e1d0c4f0f7c4c93a6b366b361dd1493f406cc532986784c884c205e049558" + }, + "version": "0.1.0" + }, + "jakarta.json:jakarta.json-api": { + "shasums": { + "jar": "f2472507ad2cc12f2aef08a2f7a628cd1c3f855668a6dcb2aa9a30d9b909b998" + }, + "version": "2.1.2" + }, "javax.annotation:javax.annotation-api": { "shasums": { "jar": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b" @@ -1065,6 +1083,12 @@ }, "version": "3.13.0" }, + "org.eclipse.parsson:parsson": { + "shasums": { + "jar": "0a0d5fef906ddbbddae6e894f6cf42e7b952d24952f1df09adb0a2426f496bf6" + }, + "version": "1.1.2" + }, "org.hamcrest:hamcrest-core": { "shasums": { "jar": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9" @@ -1310,6 +1334,12 @@ "jar": "91f9e5f9eacd6a2f308473b39d473f3edd205365fe3c4188f8c4c11191c6d914" }, "version": "4.5" + }, + "org.snakeyaml:snakeyaml-engine": { + "shasums": { + "jar": "2652199af40c9aa2f1782400d2dfbbf4e5226208c4e05ddd4059c3d6d9cd1505" + }, + "version": "2.6" } }, "dependencies": { @@ -1950,6 +1980,12 @@ "com.google.j2objc:j2objc-annotations", "org.checkerframework:checker-compat-qual" ], + "com.google.protobuf:protobuf-java-util": [ + "com.google.code.gson:gson", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java" + ], "com.google.truth.extensions:truth-liteproto-extension": [ "com.google.auto.value:auto-value-annotations", "com.google.errorprone:error_prone_annotations", @@ -2014,6 +2050,9 @@ "nl.dionsegijn:konfetti:aar": [ "org.jetbrains.kotlin:kotlin-stdlib" ], + "org.eclipse.parsson:parsson": [ + "jakarta.json:jakarta.json-api" + ], "org.hamcrest:hamcrest-integration": [ "org.hamcrest:hamcrest-library" ], @@ -2413,6 +2452,9 @@ "com.google.protobuf", "com.google.protobuf.compiler" ], + "com.google.protobuf:protobuf-java-util": [ + "com.google.protobuf.util" + ], "com.google.protobuf:protobuf-javalite": [ "com.google.protobuf" ], @@ -2553,6 +2595,14 @@ "org.apache.commons.io.monitor", "org.apache.commons.io.output" ], + "io.xlate:yaml-json": [ + "io.xlate.yamljson" + ], + "jakarta.json:jakarta.json-api": [ + "jakarta.json", + "jakarta.json.spi", + "jakarta.json.stream" + ], "javax.annotation:javax.annotation-api": [ "javax.annotation", "javax.annotation.security", @@ -2884,6 +2934,10 @@ "org.checkerframework.dataflow.qual", "org.checkerframework.framework.qual" ], + "org.eclipse.parsson:parsson": [ + "org.eclipse.parsson", + "org.eclipse.parsson.api" + ], "org.hamcrest:hamcrest-core": [ "org.hamcrest", "org.hamcrest.core", @@ -4028,6 +4082,29 @@ ], "org.robolectric:utils-reflector": [ "org.robolectric.util.reflector" + ], + "org.snakeyaml:snakeyaml-engine": [ + "org.snakeyaml.engine.external.com.google.gdata.util.common.base", + "org.snakeyaml.engine.v2.api", + "org.snakeyaml.engine.v2.api.lowlevel", + "org.snakeyaml.engine.v2.comments", + "org.snakeyaml.engine.v2.common", + "org.snakeyaml.engine.v2.composer", + "org.snakeyaml.engine.v2.constructor", + "org.snakeyaml.engine.v2.constructor.core", + "org.snakeyaml.engine.v2.constructor.json", + "org.snakeyaml.engine.v2.emitter", + "org.snakeyaml.engine.v2.env", + "org.snakeyaml.engine.v2.events", + "org.snakeyaml.engine.v2.exceptions", + "org.snakeyaml.engine.v2.nodes", + "org.snakeyaml.engine.v2.parser", + "org.snakeyaml.engine.v2.representer", + "org.snakeyaml.engine.v2.resolver", + "org.snakeyaml.engine.v2.scanner", + "org.snakeyaml.engine.v2.schema", + "org.snakeyaml.engine.v2.serializer", + "org.snakeyaml.engine.v2.tokens" ] }, "repositories": { @@ -4173,6 +4250,7 @@ "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", "com.google.protobuf:protobuf-javalite", "com.google.truth.extensions:truth-liteproto-extension", "com.google.truth:truth", @@ -4194,6 +4272,8 @@ "commons-io:commons-io", "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", + "io.xlate:yaml-json", + "jakarta.json:jakarta.json-api", "javax.annotation:javax.annotation-api", "javax.annotation:jsr250-api", "javax.inject:javax.inject", @@ -4207,6 +4287,7 @@ "org.bouncycastle:bcprov-jdk15on", "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", + "org.eclipse.parsson:parsson", "org.hamcrest:hamcrest-core", "org.hamcrest:hamcrest-integration", "org.hamcrest:hamcrest-library", @@ -4247,7 +4328,8 @@ "org.robolectric:shadowapi", "org.robolectric:shadows-framework", "org.robolectric:utils", - "org.robolectric:utils-reflector" + "org.robolectric:utils-reflector", + "org.snakeyaml:snakeyaml-engine" ], "https://repo1.maven.org/maven2/": [ "android.arch.core:common", @@ -4391,6 +4473,7 @@ "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", "com.google.protobuf:protobuf-javalite", "com.google.truth.extensions:truth-liteproto-extension", "com.google.truth:truth", @@ -4412,6 +4495,8 @@ "commons-io:commons-io", "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", + "io.xlate:yaml-json", + "jakarta.json:jakarta.json-api", "javax.annotation:javax.annotation-api", "javax.annotation:jsr250-api", "javax.inject:javax.inject", @@ -4425,6 +4510,7 @@ "org.bouncycastle:bcprov-jdk15on", "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", + "org.eclipse.parsson:parsson", "org.hamcrest:hamcrest-core", "org.hamcrest:hamcrest-integration", "org.hamcrest:hamcrest-library", @@ -4465,7 +4551,8 @@ "org.robolectric:shadowapi", "org.robolectric:shadows-framework", "org.robolectric:utils", - "org.robolectric:utils-reflector" + "org.robolectric:utils-reflector", + "org.snakeyaml:snakeyaml-engine" ], "https://maven.fabric.io/public/": [ "android.arch.core:common", @@ -4609,6 +4696,7 @@ "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", "com.google.protobuf:protobuf-javalite", "com.google.truth.extensions:truth-liteproto-extension", "com.google.truth:truth", @@ -4630,6 +4718,8 @@ "commons-io:commons-io", "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", + "io.xlate:yaml-json", + "jakarta.json:jakarta.json-api", "javax.annotation:javax.annotation-api", "javax.annotation:jsr250-api", "javax.inject:javax.inject", @@ -4643,6 +4733,7 @@ "org.bouncycastle:bcprov-jdk15on", "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", + "org.eclipse.parsson:parsson", "org.hamcrest:hamcrest-core", "org.hamcrest:hamcrest-integration", "org.hamcrest:hamcrest-library", @@ -4683,7 +4774,8 @@ "org.robolectric:shadowapi", "org.robolectric:shadows-framework", "org.robolectric:utils", - "org.robolectric:utils-reflector" + "org.robolectric:utils-reflector", + "org.snakeyaml:snakeyaml-engine" ] }, "version": "2" From 5d924f499be4d10b62f0839593b3a62b2a48206d Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Mon, 5 Jun 2023 22:52:27 -0700 Subject: [PATCH 15/63] Post-merge fixes. --- third_party/maven_install.json | 113 ++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 8 deletions(-) diff --git a/third_party/maven_install.json b/third_party/maven_install.json index c805c07e858..652c5d9eb50 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": 1775302140, - "__RESOLVED_ARTIFACTS_HASH": 362653858, + "__INPUT_ARTIFACTS_HASH": 802237353, + "__RESOLVED_ARTIFACTS_HASH": 1622704083, "conflict_resolution": { "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", @@ -718,9 +718,9 @@ }, "com.google.code.gson:gson": { "shasums": { - "jar": "233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81" + "jar": "c8fb4839054d280b3033f800d1f5a97de2f028eb8ba2eb458ad287e536f3f25f" }, - "version": "2.8.5" + "version": "2.8.6" }, "com.google.dagger:dagger": { "shasums": { @@ -866,6 +866,12 @@ }, "version": "3.17.3" }, + "com.google.protobuf:protobuf-java-util": { + "shasums": { + "jar": "bf320ed076000e1d8c7cbf7601b056acaecab80f75b9a659b9f6398d0d7e3f79" + }, + "version": "3.17.3" + }, "com.google.protobuf:protobuf-javalite": { "shasums": { "jar": "dc643901cc9d95998a1e45ab11e75d4237a7e1947bcbca0b7eca569aaf5e714d" @@ -992,6 +998,18 @@ }, "version": "1.4.7" }, + "io.xlate:yaml-json": { + "shasums": { + "jar": "713e1d0c4f0f7c4c93a6b366b361dd1493f406cc532986784c884c205e049558" + }, + "version": "0.1.0" + }, + "jakarta.json:jakarta.json-api": { + "shasums": { + "jar": "f2472507ad2cc12f2aef08a2f7a628cd1c3f855668a6dcb2aa9a30d9b909b998" + }, + "version": "2.1.2" + }, "javax.annotation:javax.annotation-api": { "shasums": { "jar": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b" @@ -1064,6 +1082,12 @@ }, "version": "3.21.3" }, + "org.eclipse.parsson:parsson": { + "shasums": { + "jar": "0a0d5fef906ddbbddae6e894f6cf42e7b952d24952f1df09adb0a2426f496bf6" + }, + "version": "1.1.2" + }, "org.hamcrest:hamcrest-core": { "shasums": { "jar": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9" @@ -1309,6 +1333,12 @@ "jar": "91f9e5f9eacd6a2f308473b39d473f3edd205365fe3c4188f8c4c11191c6d914" }, "version": "4.5" + }, + "org.snakeyaml:snakeyaml-engine": { + "shasums": { + "jar": "2652199af40c9aa2f1782400d2dfbbf4e5226208c4e05ddd4059c3d6d9cd1505" + }, + "version": "2.6" } }, "dependencies": { @@ -1955,6 +1985,12 @@ "com.google.j2objc:j2objc-annotations", "org.checkerframework:checker-qual" ], + "com.google.protobuf:protobuf-java-util": [ + "com.google.code.gson:gson", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java" + ], "com.google.truth.extensions:truth-liteproto-extension": [ "com.google.auto.value:auto-value-annotations", "com.google.errorprone:error_prone_annotations", @@ -2019,6 +2055,9 @@ "nl.dionsegijn:konfetti:aar": [ "org.jetbrains.kotlin:kotlin-stdlib" ], + "org.eclipse.parsson:parsson": [ + "jakarta.json:jakarta.json-api" + ], "org.hamcrest:hamcrest-integration": [ "org.hamcrest:hamcrest-library" ], @@ -2432,6 +2471,9 @@ "com.google.protobuf", "com.google.protobuf.compiler" ], + "com.google.protobuf:protobuf-java-util": [ + "com.google.protobuf.util" + ], "com.google.protobuf:protobuf-javalite": [ "com.google.protobuf" ], @@ -2572,6 +2614,14 @@ "org.apache.commons.io.monitor", "org.apache.commons.io.output" ], + "io.xlate:yaml-json": [ + "io.xlate.yamljson" + ], + "jakarta.json:jakarta.json-api": [ + "jakarta.json", + "jakarta.json.spi", + "jakarta.json.stream" + ], "javax.annotation:javax.annotation-api": [ "javax.annotation", "javax.annotation.security", @@ -2900,6 +2950,10 @@ "org.checkerframework.dataflow.qual", "org.checkerframework.framework.qual" ], + "org.eclipse.parsson:parsson": [ + "org.eclipse.parsson", + "org.eclipse.parsson.api" + ], "org.hamcrest:hamcrest-core": [ "org.hamcrest", "org.hamcrest.core", @@ -4045,6 +4099,29 @@ ], "org.robolectric:utils-reflector": [ "org.robolectric.util.reflector" + ], + "org.snakeyaml:snakeyaml-engine": [ + "org.snakeyaml.engine.external.com.google.gdata.util.common.base", + "org.snakeyaml.engine.v2.api", + "org.snakeyaml.engine.v2.api.lowlevel", + "org.snakeyaml.engine.v2.comments", + "org.snakeyaml.engine.v2.common", + "org.snakeyaml.engine.v2.composer", + "org.snakeyaml.engine.v2.constructor", + "org.snakeyaml.engine.v2.constructor.core", + "org.snakeyaml.engine.v2.constructor.json", + "org.snakeyaml.engine.v2.emitter", + "org.snakeyaml.engine.v2.env", + "org.snakeyaml.engine.v2.events", + "org.snakeyaml.engine.v2.exceptions", + "org.snakeyaml.engine.v2.nodes", + "org.snakeyaml.engine.v2.parser", + "org.snakeyaml.engine.v2.representer", + "org.snakeyaml.engine.v2.resolver", + "org.snakeyaml.engine.v2.scanner", + "org.snakeyaml.engine.v2.schema", + "org.snakeyaml.engine.v2.serializer", + "org.snakeyaml.engine.v2.tokens" ] }, "repositories": { @@ -4191,6 +4268,7 @@ "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", "com.google.protobuf:protobuf-javalite", "com.google.truth.extensions:truth-liteproto-extension", "com.google.truth:truth", @@ -4212,6 +4290,8 @@ "commons-io:commons-io", "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", + "io.xlate:yaml-json", + "jakarta.json:jakarta.json-api", "javax.annotation:javax.annotation-api", "javax.inject:javax.inject", "junit:junit", @@ -4224,6 +4304,7 @@ "org.bouncycastle:bcprov-jdk15on", "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", + "org.eclipse.parsson:parsson", "org.hamcrest:hamcrest-core", "org.hamcrest:hamcrest-integration", "org.hamcrest:hamcrest-library", @@ -4264,7 +4345,8 @@ "org.robolectric:shadowapi", "org.robolectric:shadows-framework", "org.robolectric:utils", - "org.robolectric:utils-reflector" + "org.robolectric:utils-reflector", + "org.snakeyaml:snakeyaml-engine" ], "https://repo1.maven.org/maven2/": [ "android.arch.core:common", @@ -4409,6 +4491,7 @@ "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", "com.google.protobuf:protobuf-javalite", "com.google.truth.extensions:truth-liteproto-extension", "com.google.truth:truth", @@ -4430,6 +4513,8 @@ "commons-io:commons-io", "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", + "io.xlate:yaml-json", + "jakarta.json:jakarta.json-api", "javax.annotation:javax.annotation-api", "javax.inject:javax.inject", "junit:junit", @@ -4442,6 +4527,7 @@ "org.bouncycastle:bcprov-jdk15on", "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", + "org.eclipse.parsson:parsson", "org.hamcrest:hamcrest-core", "org.hamcrest:hamcrest-integration", "org.hamcrest:hamcrest-library", @@ -4482,7 +4568,8 @@ "org.robolectric:shadowapi", "org.robolectric:shadows-framework", "org.robolectric:utils", - "org.robolectric:utils-reflector" + "org.robolectric:utils-reflector", + "org.snakeyaml:snakeyaml-engine" ], "https://oss.sonatype.org/content/repositories/snapshots/": [ "android.arch.core:common", @@ -4627,6 +4714,7 @@ "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", "com.google.protobuf:protobuf-javalite", "com.google.truth.extensions:truth-liteproto-extension", "com.google.truth:truth", @@ -4648,6 +4736,8 @@ "commons-io:commons-io", "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", + "io.xlate:yaml-json", + "jakarta.json:jakarta.json-api", "javax.annotation:javax.annotation-api", "javax.inject:javax.inject", "junit:junit", @@ -4660,6 +4750,7 @@ "org.bouncycastle:bcprov-jdk15on", "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", + "org.eclipse.parsson:parsson", "org.hamcrest:hamcrest-core", "org.hamcrest:hamcrest-integration", "org.hamcrest:hamcrest-library", @@ -4700,7 +4791,8 @@ "org.robolectric:shadowapi", "org.robolectric:shadows-framework", "org.robolectric:utils", - "org.robolectric:utils-reflector" + "org.robolectric:utils-reflector", + "org.snakeyaml:snakeyaml-engine" ], "https://maven.fabric.io/public/": [ "android.arch.core:common", @@ -4845,6 +4937,7 @@ "com.google.guava:listenablefuture", "com.google.j2objc:j2objc-annotations", "com.google.protobuf:protobuf-java", + "com.google.protobuf:protobuf-java-util", "com.google.protobuf:protobuf-javalite", "com.google.truth.extensions:truth-liteproto-extension", "com.google.truth:truth", @@ -4866,6 +4959,8 @@ "commons-io:commons-io", "de.hdodenhof:circleimageview:aar", "io.fabric.sdk.android:fabric:aar", + "io.xlate:yaml-json", + "jakarta.json:jakarta.json-api", "javax.annotation:javax.annotation-api", "javax.inject:javax.inject", "junit:junit", @@ -4878,6 +4973,7 @@ "org.bouncycastle:bcprov-jdk15on", "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", + "org.eclipse.parsson:parsson", "org.hamcrest:hamcrest-core", "org.hamcrest:hamcrest-integration", "org.hamcrest:hamcrest-library", @@ -4918,7 +5014,8 @@ "org.robolectric:shadowapi", "org.robolectric:shadows-framework", "org.robolectric:utils", - "org.robolectric:utils-reflector" + "org.robolectric:utils-reflector", + "org.snakeyaml:snakeyaml-engine" ] }, "version": "2" From 667bf89a8fe8eb5eb8d1abe606a14370d7a7793b Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Tue, 22 Aug 2023 01:30:00 +0000 Subject: [PATCH 16/63] Fix a variety of dev platform-specific issues. These issues were found after I started using a new development environment. --- .../ProfileAndDeviceIdFragmentTest.kt | 855 +++++++++--------- .../DeveloperOptionsFragmentTest.kt | 4 +- .../app/parser/StringToRatioParserTest.kt | 2 +- .../AppLanguageLocaleHandlerTest.kt | 8 +- .../AppLanguageResourceHandlerTest.kt | 14 +- .../LoggingIdentifierController.kt | 14 +- .../domain/audio/AudioPlayerControllerTest.kt | 8 +- .../AnswerClassificationControllerTest.kt | 4 +- ...tXAtPositionYRuleClassifierProviderTest.kt | 12 +- ...eforeElementYRuleClassifierProviderTest.kt | 12 +- ...IsEqualToOrderingClassifierProviderTest.kt | 2 +- ...IncorrectPositionClassifierProviderTest.kt | 4 +- ...inatorEqualToRuleClassifierProviderTest.kt | 4 +- ...xactlyEqualToRuleClassifierProviderTest.kt | 4 +- ...erPartEqualToRuleClassifierProviderTest.kt | 4 +- ...eratorEqualToRuleClassifierProviderTest.kt | 4 +- ...nSimplestFormRuleClassifierProviderTest.kt | 6 +- ...sEquivalentToRuleClassifierProviderTest.kt | 2 +- ...xactlyEqualToRuleClassifierProviderTest.kt | 4 +- ...IsGreaterThanRuleClassifierProviderTest.kt | 4 +- ...putIsLessThanRuleClassifierProviderTest.kt | 4 +- ...putIsInRegionRuleClassifierProviderTest.kt | 4 +- ...nAtLeastOneOfRuleClassifierProviderTest.kt | 6 +- ...onInputEqualsRuleClassifierProviderTest.kt | 2 +- ...roperSubsetOfRuleClassifierProviderTest.kt | 6 +- ...ceInputEqualsRuleClassifierProviderTest.kt | 6 +- ...nitsIsEqualToRuleClassifierProviderTest.kt | 2 +- ...sEquivalentToRuleClassifierProviderTest.kt | 4 +- ...icInputEqualsRuleClassifierProviderTest.kt | 4 +- ...ThanOrEqualToRuleClassifierProviderTest.kt | 4 +- ...IsGreaterThanRuleClassifierProviderTest.kt | 4 +- ...sivelyBetweenRuleClassifierProviderTest.kt | 16 +- ...ThanOrEqualToRuleClassifierProviderTest.kt | 8 +- ...putIsLessThanRuleClassifierProviderTest.kt | 8 +- ...thinToleranceRuleClassifierProviderTest.kt | 20 +- ...ioInputEqualsRuleClassifierProviderTest.kt | 4 +- ...berOfTermsEqualToClassifierProviderTest.kt | 4 +- ...icTermEqualToRuleClassifierProviderTest.kt | 10 +- ...tIsEquivalentRuleClassifierProviderTest.kt | 4 +- ...InputContainsRuleClassifierProviderTest.kt | 4 +- ...xtInputEqualsRuleClassifierProviderTest.kt | 4 +- ...utFuzzyEqualsRuleClassifierProviderTest.kt | 2 +- ...putStartsWithRuleClassifierProviderTest.kt | 4 +- .../ExplorationActiveTimeControllerTest.kt | 2 +- .../ExplorationProgressControllerTest.kt | 2 +- .../testing/FakeExplorationRetrieverTest.kt | 10 +- .../HintHandlerProdImplTest.kt | 18 +- .../domain/locale/LocaleControllerTest.kt | 2 +- .../LoggingIdentifierControllerTest.kt | 38 +- .../CpuPerformanceSnapshotterTest.kt | 2 +- .../analytics/LearnerAnalyticsLoggerTest.kt | 2 +- .../ProfileManagementControllerTest.kt | 8 +- ...uestionAssessmentProgressControllerTest.kt | 2 +- model/src/main/proto/BUILD.bazel | 5 +- .../scripts/testing/TestGitRepository.kt | 64 +- .../build/FilterPerLanguageResourcesTest.kt | 12 +- .../build/TransformAndroidManifestTest.kt | 30 +- .../org/oppia/android/scripts/ci/BUILD.bazel | 2 +- .../scripts/ci/ComputeAffectedTestsTest.kt | 18 +- .../scripts/ci/RetrieveAffectedTestsTest.kt | 8 +- .../oppia/android/scripts/common/BUILD.bazel | 1 + .../android/scripts/common/BazelClientTest.kt | 4 +- .../scripts/common/CommandExecutorImplTest.kt | 6 +- .../android/scripts/common/GitClientTest.kt | 6 +- .../scripts/common/ProtoStringEncoderTest.kt | 4 +- .../scripts/docs/KdocValidityCheckTest.kt | 36 +- .../label/AccessibilityLabelCheckTest.kt | 12 +- .../scripts/license/LicenseTextsCheckTest.kt | 8 +- .../license/MavenDependenciesListCheckTest.kt | 22 +- .../GenerateMavenDependenciesListTest.kt | 20 +- .../scripts/maven/RetrieveLicenseTextsTest.kt | 10 +- .../regex/RegexPatternValidationCheckTest.kt | 186 ++-- .../scripts/testfile/TestFileCheckTest.kt | 6 +- .../scripts/testing/TestBazelWorkspaceTest.kt | 16 +- .../scripts/testing/TestGitRepositoryTest.kt | 52 +- .../scripts/todo/TodoIssueCommentCheckTest.kt | 6 +- .../todo/TodoIssueResolvedCheckTest.kt | 6 +- .../android/scripts/todo/TodoOpenCheckTest.kt | 14 +- .../xml/StringLanguageTranslationCheckTest.kt | 4 +- .../scripts/xml/StringResourceParserTest.kt | 18 +- .../xml/StringResourceValidationCheckTest.kt | 14 +- .../android/scripts/xml/XmlSyntaxCheckTest.kt | 6 +- .../oppia/android/testing/AssertionHelpers.kt | 39 +- .../testing/FakeAnalyticsEventLoggerTest.kt | 10 +- .../testing/FakeExceptionLoggerTest.kt | 4 +- .../FakePerformanceMetricsEventLoggerTest.kt | 10 +- .../data/DataProviderTestMonitorTest.kt | 77 +- ...InitializeDefaultLocaleRuleOmissionTest.kt | 2 +- .../threading/CoroutineExecutorServiceTest.kt | 34 +- .../testing/time/FakeOppiaClockTest.kt | 8 +- .../testing/TestNoOpAssetRepositoryTest.kt | 12 +- .../data/AsyncDataSubscriptionManagerTest.kt | 6 +- .../util/data/InMemoryBlockingCacheTest.kt | 8 +- .../util/locale/AndroidLocaleFactoryTest.kt | 14 +- .../util/locale/DisplayLocaleImplTest.kt | 16 +- .../testing/TestOppiaBidiFormatterTest.kt | 2 +- .../util/logging/SyncStatusManagerTestBase.kt | 2 +- .../util/math/FractionExtensionsTest.kt | 10 +- .../android/util/math/FractionParserTest.kt | 4 +- .../android/util/math/PeekableIteratorTest.kt | 2 +- .../android/util/math/RealExtensionsTest.kt | 24 +- 101 files changed, 1075 insertions(+), 996 deletions(-) diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt index 632098510b5..f1caf58e449 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt @@ -9,6 +9,7 @@ import android.view.View import androidx.annotation.IdRes import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView +import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.onView import androidx.test.espresso.ViewInteraction @@ -23,7 +24,6 @@ import androidx.test.espresso.matcher.ViewMatchers.isEnabled import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText -import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.truth.content.IntentSubject.assertThat import androidx.work.Configuration @@ -62,6 +62,7 @@ import org.oppia.android.app.recyclerview.RecyclerViewMatcher.Companion.atPositi import org.oppia.android.app.recyclerview.RecyclerViewMatcher.Companion.hasItemCount import org.oppia.android.app.shim.ViewBindingShimModule import org.oppia.android.app.testing.activity.TestActivity +import org.oppia.android.app.testing.activity.TestActivity.Companion.createIntent import org.oppia.android.app.translation.testing.ActivityRecreatorTestModule import org.oppia.android.app.utility.OrientationChangeAction.Companion.orientationLandscape import org.oppia.android.data.backends.gae.NetworkConfigProdModule @@ -147,12 +148,6 @@ import javax.inject.Singleton class ProfileAndDeviceIdFragmentTest { @get:Rule val initializeDefaultLocaleRule = InitializeDefaultLocaleRule() @get:Rule val oppiaTestRule = OppiaTestRule() - @get:Rule - var activityRule = - ActivityScenarioRule( - TestActivity.createIntent(ApplicationProvider.getApplicationContext()) - ) - @Inject lateinit var profileTestHelper: ProfileTestHelper @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers @Inject lateinit var context: Context @@ -193,559 +188,587 @@ class ProfileAndDeviceIdFragmentTest { @Test fun testFragment_withOnlyAdminProfile_hasThreeItems() { - initializeActivityAndAddFragment() - - // There should be three items: a header, a profile, and the sync status. - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 4)) + runInTestActivityAndAddFragment { + // There should be three items: a header, a profile, and the sync status. + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 4)) + } } @Test fun testFragment_withOnlyAdminProfile_hasDeviceIdHeader() { - initializeActivityAndAddFragment() - - onDeviceIdLabelAt(position = 0).check(matches(isDisplayed())) + runInTestActivityAndAddFragment { + onDeviceIdLabelAt(position = 0).check(matches(isDisplayed())) + } } @Test fun testFragment_hasDeviceId() { - initializeActivityAndAddFragment() - - onDeviceIdLabelAt(position = 0).check(matches(withText(containsString("0347439ebe8b")))) + runInTestActivityAndAddFragment { + onDeviceIdLabelAt(position = 0).check(matches(withText(containsString("113e04cc09a3")))) + } } @Test fun testFragment_deviceId_hasCopyButton() { - initializeActivityAndAddFragment() - - onDeviceIdCopyButtonAt(position = 0).check(matches(isDisplayed())) + runInTestActivityAndAddFragment { + onDeviceIdCopyButtonAt(position = 0).check(matches(isDisplayed())) + } } @Test fun testFragment_deviceId_clickCopyButton_copiesDeviceIdToClipboard() { - initializeActivityAndAddFragment() - - onDeviceIdCopyButtonAt(position = 0).perform(click()) - testCoroutineDispatchers.runCurrent() - - val clipData = getCurrentClipData() - assertThat(clipData?.description?.label).isEqualTo("Oppia installation ID") - assertThat(clipData?.itemCount).isEqualTo(1) - assertThat(clipData?.getItemAt(0)?.text).isEqualTo("0347439ebe8b") + runInTestActivityAndAddFragment { + onDeviceIdCopyButtonAt(position = 0).perform(click()) + testCoroutineDispatchers.runCurrent() + + val clipData = getCurrentClipData() + assertThat(clipData?.description?.label).isEqualTo("Oppia installation ID") + assertThat(clipData?.itemCount).isEqualTo(1) + assertThat(clipData?.getItemAt(0)?.text).isEqualTo("113e04cc09a3") + } } @Test fun testFragment_withOnlyAdminProfile_hasOneProfileListed() { - initializeActivityAndAddFragment() - - onProfileNameAt(position = 1).check(matches(isDisplayed())) + runInTestActivityAndAddFragment { + onProfileNameAt(position = 1).check(matches(isDisplayed())) + } } @Test fun testFragment_profileEntry_hasProfileName() { - initializeActivityAndAddFragment() - - onProfileNameAt(position = 1).check(matches(withText("Admin"))) + runInTestActivityAndAddFragment { + onProfileNameAt(position = 1).check(matches(withText("Admin"))) + } } @Test fun testFragment_profileEntry_hasLearnerId() { - initializeActivityAndAddFragment() - - onLearnerIdAt(position = 1).check(matches(withText("a9fe66ab"))) + runInTestActivityAndAddFragment { + onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) + } } @Test fun testFragment_profileEntry_hasCopyButton() { - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 1).check(matches(isDisplayed())) + runInTestActivityAndAddFragment { + onLearnerIdCopyButtonAt(position = 1).check(matches(isDisplayed())) + } } @Test fun testFragment_profileEntry_clickFirstCopyButton_copiesAdminLearnerIdToClipboard() { - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() - - val clipData = getCurrentClipData() - assertThat(clipData?.description?.label).isEqualTo("Admin's learner ID") - assertThat(clipData?.itemCount).isEqualTo(1) - assertThat(clipData?.getItemAt(0)?.text).isEqualTo("a9fe66ab") + runInTestActivityAndAddFragment { + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() + + val clipData = getCurrentClipData() + assertThat(clipData?.description?.label).isEqualTo("Admin's learner ID") + assertThat(clipData?.itemCount).isEqualTo(1) + assertThat(clipData?.getItemAt(0)?.text).isEqualTo("8dcbbd21") + } } @Test fun testFragment_multipleProfiles_listsAllProfiles() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - // Header + admin + 5 new profiles + sync status = 8 items. - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) + runInTestActivityAndAddFragment { + // Header + admin + 5 new profiles + sync status = 8 items. + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) + } } @Test fun testFragment_multipleProfiles_adminIsFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - onProfileNameAt(position = 1).check(matches(withText("Admin"))) + runInTestActivityAndAddFragment { + onProfileNameAt(position = 1).check(matches(withText("Admin"))) + } } @Test fun testFragment_multipleProfiles_secondEntryHasDifferentName() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - // The second entry is not the admin. - onProfileNameAt(position = 2).check(matches(withText("A"))) + runInTestActivityAndAddFragment { + // The second entry is not the admin. + onProfileNameAt(position = 2).check(matches(withText("A"))) + } } @Test fun testFragment_multipleProfiles_secondEntryHasDifferentLearnerIdThanFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - // The second profile has a different learner ID. - onLearnerIdAt(position = 1).check(matches(withText("a9fe66ab"))) - onLearnerIdAt(position = 2).check(matches(withText("6e563e2f"))) + runInTestActivityAndAddFragment { + // The second profile has a different learner ID. + onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) + onLearnerIdAt(position = 2).check(matches(withText("208663b0"))) + } } @Test fun testFragment_multipleProfiles_copySecondEntry_copiesDifferentLearnerIdThanFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 2).perform(click()) - testCoroutineDispatchers.runCurrent() + runInTestActivityAndAddFragment { + onLearnerIdCopyButtonAt(position = 2).perform(click()) + testCoroutineDispatchers.runCurrent() - val clipData = getCurrentClipData() - assertThat(clipData?.description?.label).isEqualTo("A's learner ID") - assertThat(clipData?.itemCount).isEqualTo(1) - assertThat(clipData?.getItemAt(0)?.text).isEqualTo("6e563e2f") + val clipData = getCurrentClipData() + assertThat(clipData?.description?.label).isEqualTo("A's learner ID") + assertThat(clipData?.itemCount).isEqualTo(1) + assertThat(clipData?.getItemAt(0)?.text).isEqualTo("208663b0") + } } @Test fun testFragment_initialState_deviceIdCopyButtonHasCopyLabel() { - initializeActivityAndAddFragment() - - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + runInTestActivityAndAddFragment { + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + } } @Test fun testFragment_adminProfile_initialState_learnerIdCopyButtonHasCopyLabel() { - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + runInTestActivityAndAddFragment { + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + } } @Test fun testFragment_adminProfile_clickDeviceIdCopyButton_deviceIdIsCopiedButNotLearnerId() { - initializeActivityAndAddFragment() - - onDeviceIdCopyButtonAt(position = 0).perform(click()) - testCoroutineDispatchers.runCurrent() + runInTestActivityAndAddFragment { + onDeviceIdCopyButtonAt(position = 0).perform(click()) + testCoroutineDispatchers.runCurrent() - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copied"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copied"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + } } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_learnerIdIsCopiedButNotDeviceId() { - initializeActivityAndAddFragment() + runInTestActivityAndAddFragment { + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() - - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) + } } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_copyInOtherApp_nothingIsCopied() { - initializeActivityAndAddFragment() - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + runInTestActivityAndAddFragment { + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() - updateClipDataAsThoughFromAnotherApp() + updateClipDataAsThoughFromAnotherApp() - // Changing the clipboard in a different app should reset the labels. - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + // Changing the clipboard in a different app should reset the labels. + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + } } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_rotate_learnerIdStillCopied() { - initializeActivityAndAddFragment() - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + runInTestActivityAndAddFragment { + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - // The button label should be restored after a rotation. - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) + // The button label should be restored after a rotation. + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) + } } @Test fun testFragment_multipleProfiles_rotate_profilesStillPresent() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + runInTestActivityAndAddFragment { + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) + } } @Test fun testFragment_firstEntry_noAdminEvents_hasZeroAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + runInTestActivityAndAddFragment { + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_firstEntry_adminEvents_notUploaded_hasSomeAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events. - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + // Log a couple of events. + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - // Two are awaiting upload, but neither have been uploaded yet. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + // Two are awaiting upload, but neither have been uploaded yet. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_firstEntry_adminEvents_uploaded_hasSomeAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event. - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + // Log a couple of events, upload them, then log one more event. + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - // Two should be uploaded, and one waiting upload. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + // Two should be uploaded, and one waiting upload. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + } } @Test fun testFragment_firstEntry_noGenericEvents_hasZeroGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + runInTestActivityAndAddFragment { + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_firstEntry_genericEvents_notUploaded_hasSomeGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events off of the admin profile. - logTwoAnalyticsEvents(profileId = null) + // Log a couple of events off of the admin profile. + logTwoAnalyticsEvents(profileId = null) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_firstEntry_genericEvents_uploaded_hasSomeGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event, off of the admin profile. - logTwoAnalyticsEvents(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) + // Log a couple of events, upload them, then log one more event, off of the admin profile. + logTwoAnalyticsEvents(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) + } } @Test fun testFragment_firstEntry_mixOfAdminAndGenericEvents_someUploaded_reportsAllEvents() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Log & upload a mix of events with and without the admin profile. - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logThreeAnalyticsEvents(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - - // Event counts should be represented in the correct places. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("1"))) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("3"))) + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + + // Log & upload a mix of events with and without the admin profile. + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logThreeAnalyticsEvents(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + + // Event counts should be represented in the correct places. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("1"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("3"))) + } } @Test fun testFragment_secondEntry_noLearnerEvents_hasZeroLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + runInTestActivityAndAddFragment { + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + } } @Test fun testFragment_secondEntry_learnerEvents_notUploaded_hasSomeLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + // Log a couple of events. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - // Two are awaiting upload, but neither have been uploaded yet. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + // Two are awaiting upload, but neither have been uploaded yet. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + } } @Test fun testFragment_secondEntry_learnerEvents_uploaded_hasSomeLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + // Log a couple of events, upload them, then log one more event. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - // Two should be uploaded, and one waiting upload. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("1"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("2"))) + // Two should be uploaded, and one waiting upload. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("1"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("2"))) + } } @Test fun testFragment_secondEntry_learnerEvents_hasZeroAdminOrGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Log a couple of events, upload them, then log one more event, for a learner profile. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - - // The admin profile's event counts shouldn't change since the only logged events were for a - // specific learner profile. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + + // Log a couple of events, upload them, then log one more event, for a learner profile. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + + // The admin profile's event counts shouldn't change since the only logged events were for a + // specific learner profile. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_secondEntry_adminAndGenericEvents_uploaded_hasZeroLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Log a couple of events generically and for the admin profile. - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = null) - - // No events should be reported for the learner since it didn't have any events uploaded. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + + // Log a couple of events generically and for the admin profile. + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = null) + + // No events should be reported for the learner since it didn't have any events uploaded. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + } } @Test fun testFragment_initialState_profileDataHasYetToBeCollected() { - initializeActivityAndAddFragment() - - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) + runInTestActivityAndAddFragment { + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) + } } @Test fun testFragment_initialState_wait_profileDataHasYetToBeCollected() { - initializeActivityAndAddFragment() + runInTestActivityAndAddFragment { + testCoroutineDispatchers.advanceTimeBy(delayTimeMillis = TimeUnit.SECONDS.toMillis(1)) - testCoroutineDispatchers.advanceTimeBy(delayTimeMillis = TimeUnit.SECONDS.toMillis(1)) - - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) + } } @Test fun testFragment_eventLogged_waitingForUpload_indicatorTextMentionsWaiting() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Enqueue the event, but don't actually begin uploading it, then reconnect to the network. Note - // that the extra event log is a slight hack to force a refresh of the status indicator (since - // network changes are polled when there are other changes to represent rather than being - // actively "pushed" by the system). - logAnalyticsEvent() - connectNetwork() - logAnalyticsEvent() - - // The status indicator is suggesting that events can be uploaded (and there are some available - // to upload), they just haven't been scheduled yet. - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Waiting to schedule data uploading worker…")))) + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + + // Enqueue the event, but don't actually begin uploading it, then reconnect to the network. + // Note that the extra event log is a slight hack to force a refresh of the status indicator + // (since network changes are polled when there are other changes to represent rather than + // being actively "pushed" by the system). + logAnalyticsEvent() + connectNetwork() + logAnalyticsEvent() + + // The status indicator is suggesting that events can be uploaded (and there are some + // available to upload), they just haven't been scheduled yet. + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Waiting to schedule data uploading worker…")))) + } } @Test fun testFragment_eventLogged_waitingForUpload_uploadStarted_profileDataIsCurrentlyUploading() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - // Unfortunately, it's tricky to pause the actual upload worker so this is a hacky way to - // produce the same situation to ensure the label is correct. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) - testCoroutineDispatchers.runCurrent() + // Unfortunately, it's tricky to pause the actual upload worker so this is a hacky way to + // produce the same situation to ensure the label is correct. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Profile data is currently uploading")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Profile data is currently uploading")))) + } } @Test fun testFragment_noConnectivity_indicatorTextMentionsDataCannotBeUploaded() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Enqueue an event but don't reconnect to the network. - logAnalyticsEvent() - - // The status indicator is suggesting that internet connectivity needs to resume in order to - // upload events. - onSyncStatusAt(position = 2) - .check( - matches( - withText( - containsString( - "Please connect to a WiFi or Cellular network in order to upload profile data" + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + + // Enqueue an event but don't reconnect to the network. + logAnalyticsEvent() + + // The status indicator is suggesting that internet connectivity needs to resume in order to + // upload events. + onSyncStatusAt(position = 2) + .check( + matches( + withText( + containsString( + "Please connect to a WiFi or Cellular network in order to upload profile data" + ) ) ) ) - ) + } } @Test fun testFragment_eventLogged_waitForUpload_profileDataIsUploaded() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) + } } @Test fun testFragment_eventLogged_uploadError_profileDataHasError() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() - // An upload error can currently only be simulated by directly influencing the sync manager. - syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) - testCoroutineDispatchers.runCurrent() + // An upload error can currently only be simulated by directly influencing the sync manager. + syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Something went wrong when trying to upload events")))) + onSyncStatusAt(position = 2) + .check( + matches(withText(containsString("Something went wrong when trying to upload events"))) + ) + } } @Test fun testFragment_eventLogged_uploadError_anotherLogged_wait_profileDataIsUploading() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.reportUploadError() - testCoroutineDispatchers.runCurrent() - - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() - - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.reportUploadError() + testCoroutineDispatchers.runCurrent() + + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() + + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) + } } @Test fun testFragment_rotate_profileDataHasYetToBeCollected() { - initializeActivityAndAddFragment() - - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + runInTestActivityAndAddFragment { + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) + } } @Test fun testFragment_eventLogged_waitingForUpload_rotate_profileDataIsCurrentlyUploading() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) - testCoroutineDispatchers.runCurrent() + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) + testCoroutineDispatchers.runCurrent() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Profile data is currently uploading")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Profile data is currently uploading")))) + } } @Test fun testFragment_eventLogged_waitForUpload_rotate_profileDataIsUploaded() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) + } } @Test fun testFragment_eventsLogged_uploadError_rotate_profileDataHasError() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) - testCoroutineDispatchers.runCurrent() - - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() - - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Something went wrong when trying to upload events")))) + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) + testCoroutineDispatchers.runCurrent() + + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() + + onSyncStatusAt(position = 2) + .check( + matches(withText(containsString("Something went wrong when trying to upload events"))) + ) + } } @Test @@ -753,129 +776,141 @@ class ProfileAndDeviceIdFragmentTest { // Use fake time so that the generated event logs are consistent across runs. fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_FIXED_FAKE_TIME) profileTestHelper.addMoreProfiles(numProfiles = 2) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Log & upload some events, then enqueue others. - logThreeAnalyticsEvents(profileId = null) - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_1) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) - logThreeAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_1) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - - onShareIdsAndEventsButtonAt(position = 5).perform(click()) - testCoroutineDispatchers.runCurrent() - - val expectedShareText = - """ - Oppia app installation ID: 932459768f39 - - Profile name: Admin, learner ID: a9fe66ab - - Uploading learner events: 3 - - Uploaded learner events: 2 - - Uploading uncategorized events: 1 - - Uploaded uncategorized events: 4 - - Profile name: A, learner ID: 6e563e2f - - Uploading learner events: 2 - - Uploaded learner events: 1 - - Profile name: B, learner ID: 5c0710a2 - - Uploading learner events: 1 - - Uploaded learner events: 2 - Current sync status: Waiting to schedule data uploading worker…. - Event log encoding integrity checks: - - First 40 chars of encoded string: H4sIAAAAAAAAAOPSlGBUUj3FqMTFX5JaXBKfk5pY - - Last 40 chars of encoded string: BzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA - - SHA-1 hash (unwrapped event string): 76f7a26348b4034787982f9505c6b5697efc6567 - - Total event string length (unwrapped): 140 - Encoded event logs: - H4sIAAAAAAAAAOPSlGBUUj3FqMTFX5JaXBKfk5pYlJdaFJ+ZIgQRyMwrLknMyQEKcBkSrVSLwYjBisGJ - gU5ajEnVwsTBSDdNTELEBzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA - """.trimIndent() - val intents = getIntents() - assertThat(intents).hasSize(1) - assertThat(intents.single()).hasAction(Intent.ACTION_SEND) - assertThat(intents.single()).hasType("text/plain") - assertThat(intents.single()).extras().containsKey(Intent.EXTRA_TEXT) - assertThat(intents.single()).extras().string(Intent.EXTRA_TEXT).isEqualTo(expectedShareText) + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + + // Log & upload some events, then enqueue others. + logThreeAnalyticsEvents(profileId = null) + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_1) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) + logThreeAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_1) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + + onShareIdsAndEventsButtonAt(position = 5).perform(click()) + testCoroutineDispatchers.runCurrent() + + val expectedShareText = + """ + Oppia app installation ID: 113e04cc09a3 + - Profile name: Admin, learner ID: 8dcbbd21 + - Uploading learner events: 3 + - Uploaded learner events: 2 + - Uploading uncategorized events: 1 + - Uploaded uncategorized events: 4 + - Profile name: A, learner ID: 208663b0 + - Uploading learner events: 2 + - Uploaded learner events: 1 + - Profile name: B, learner ID: 92d0c6e2 + - Uploading learner events: 1 + - Uploaded learner events: 2 + Current sync status: Waiting to schedule data uploading worker…. + Event log encoding integrity checks: + - First 40 chars of encoded string: H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pY + - Last 40 chars of encoded string: BzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA + - SHA-1 hash (unwrapped event string): 1ee817dd58dcb25c9af4fbfc3c89c86b730f6680 + - Total event string length (unwrapped): 140 + Encoded event logs: + H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pYlJdaFJ+ZIgQRyMwrLknMyQEKcBkSrVSLwYjBisGJ + gU5ajEnVwsTBSDdNTELEBzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA + """.trimIndent() + val intents = getIntents() + assertThat(intents).hasSize(1) + assertThat(intents.single()).hasAction(Intent.ACTION_SEND) + assertThat(intents.single()).hasType("text/plain") + assertThat(intents.single()).extras().containsKey(Intent.EXTRA_TEXT) + assertThat(intents.single()).extras().string(Intent.EXTRA_TEXT).isEqualTo(expectedShareText) + } } @Test fun testFragment_noEventsPending_uploadLogsButtonDisabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - // The upload button should be disabled when there are no events to upload. - onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) + // The upload button should be disabled when there are no events to upload. + onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) + } } @Test fun testFragment_multipleEventsPending_noConnection_uploadLogsButtonDisabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - // The button is still disabled since there's no internet connection. - onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) + // The button is still disabled since there's no internet connection. + onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) + } } @Test fun testFragment_multipleEventsPending_uploadLogsButtonEnabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - // With events pending & connectivity, the upload button should now be available to press. - onUploadLogsButtonAt(position = 4).check(matches(isEnabled())) + // With events pending & connectivity, the upload button should now be available to press. + onUploadLogsButtonAt(position = 4).check(matches(isEnabled())) + } } @Test fun testFragment_multipleEventsPending_clickUploadLogs_wait_uploadsEventLogs() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - fakeAnalyticsEventLogger.clearAllEvents() - - // Click the 'upload logs' button and wait. - onUploadLogsButtonAt(position = 4).perform(click()) - testCoroutineDispatchers.runCurrent() - - // The events should be uploaded. - assertThat(fakeAnalyticsEventLogger.getEventListCount()).isEqualTo(3) + runInTestActivityAndAddFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + fakeAnalyticsEventLogger.clearAllEvents() + + // Click the 'upload logs' button and wait. + onUploadLogsButtonAt(position = 4).perform(click()) + testCoroutineDispatchers.runCurrent() + + // The events should be uploaded. + assertThat(fakeAnalyticsEventLogger.getEventListCount()).isEqualTo(3) + } } - private fun initializeActivityAndAddFragment() { - activityRule.scenario.onActivity { activity -> - activity.setContentView(R.layout.test_activity) + private fun runInTestActivityAndAddFragment(testBlock: () -> Unit) { + launchActivityAndAddFragment().use { scenario -> + scenario.onActivity { activity -> + activity.setContentView(R.layout.test_activity) + + activity.supportFragmentManager.beginTransaction() + .add(R.id.test_fragment_placeholder, ProfileAndDeviceIdFragment()) + .commitNow() + } + connectNetwork() // Start with internet connectivity. + testCoroutineDispatchers.runCurrent() - activity.supportFragmentManager.beginTransaction() - .add(R.id.test_fragment_placeholder, ProfileAndDeviceIdFragment()) - .commitNow() + testBlock() } - connectNetwork() // Start with internet connectivity. - testCoroutineDispatchers.runCurrent() } + private fun launchActivityAndAddFragment() = + ActivityScenario.launch(createIntent(ApplicationProvider.getApplicationContext())) + private fun scrollTo(position: Int) { onView(withId(R.id.profile_and_device_id_recycler_view)) .perform(actionOnItemAtPosition(position, scrollTo())) diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt index e0340041713..9833c9b75c4 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt @@ -417,7 +417,7 @@ class DeveloperOptionsFragmentTest { createDeveloperOptionsTestActivityIntent(internalProfileId) ).use { testCoroutineDispatchers.runCurrent() - val exception = assertThrows(RuntimeException::class) { + val exception = assertThrows() { scrollToPosition(position = 2) onView(withId(R.id.force_crash_text_view)).perform(click()) } @@ -432,7 +432,7 @@ class DeveloperOptionsFragmentTest { ).use { testCoroutineDispatchers.runCurrent() onView(isRoot()).perform(orientationLandscape()) - val exception = assertThrows(RuntimeException::class) { + val exception = assertThrows() { scrollToPosition(position = 2) onView(withId(R.id.force_crash_text_view)).perform(click()) } diff --git a/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt b/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt index 2b9845c78b8..2b8b3ae2296 100644 --- a/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt +++ b/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt @@ -231,7 +231,7 @@ class StringToRatioParserTest { @Test fun testParser_parseRatioOrThrow_ratioWithInvalidRatio_throwsException() { - val exception = assertThrows(IllegalArgumentException::class) { + val exception = assertThrows() { stringToRatioParser.parseRatioOrThrow("a:b:c") } assertThat(exception) diff --git a/app/src/test/java/org/oppia/android/app/translation/AppLanguageLocaleHandlerTest.kt b/app/src/test/java/org/oppia/android/app/translation/AppLanguageLocaleHandlerTest.kt index 942fb06d5b6..67846ded7ad 100644 --- a/app/src/test/java/org/oppia/android/app/translation/AppLanguageLocaleHandlerTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/AppLanguageLocaleHandlerTest.kt @@ -73,7 +73,7 @@ class AppLanguageLocaleHandlerTest { @Test fun testGetDisplayLocale_initialState_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { appLanguageLocaleHandler.getDisplayLocale() } @@ -103,7 +103,7 @@ class AppLanguageLocaleHandlerTest { fun testInitializeLocale_twice_throwsException() { appLanguageLocaleHandler.initializeLocale(computeNewAppLanguageLocale(ENGLISH)) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { appLanguageLocaleHandler.initializeLocale(retrieveAppLanguageLocale()) } @@ -117,7 +117,7 @@ class AppLanguageLocaleHandlerTest { fun testUpdateLocale_uninitialized_throwsException() { setAppLanguage(ENGLISH) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { appLanguageLocaleHandler.updateLocale(retrieveAppLanguageLocale()) } @@ -186,7 +186,7 @@ class AppLanguageLocaleHandlerTest { fun testInitializeLocaleForActivity_uninitialized_throwsException() { val configuration = Configuration() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { appLanguageLocaleHandler.initializeLocaleForActivity(configuration) } diff --git a/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt b/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt index 95db3cf4cd7..6206712d72d 100644 --- a/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt @@ -241,7 +241,7 @@ class AppLanguageResourceHandlerTest { updateAppLanguageTo(OppiaLanguage.ENGLISH) val handler = retrieveAppLanguageResourceHandler() - assertThrows(Resources.NotFoundException::class) { handler.getStringInLocale(-1) } + assertThrows() { handler.getStringInLocale(-1) } } @Test @@ -278,7 +278,7 @@ class AppLanguageResourceHandlerTest { updateAppLanguageTo(OppiaLanguage.ENGLISH) val handler = retrieveAppLanguageResourceHandler() - assertThrows(Resources.NotFoundException::class) { handler.getStringInLocaleWithWrapping(-1) } + assertThrows() { handler.getStringInLocaleWithWrapping(-1) } } @Test @@ -315,7 +315,7 @@ class AppLanguageResourceHandlerTest { updateAppLanguageTo(OppiaLanguage.ENGLISH) val handler = retrieveAppLanguageResourceHandler() - assertThrows(Resources.NotFoundException::class) { + assertThrows() { handler.getStringInLocaleWithoutWrapping(-1) } } @@ -335,7 +335,7 @@ class AppLanguageResourceHandlerTest { updateAppLanguageTo(OppiaLanguage.ENGLISH) val handler = retrieveAppLanguageResourceHandler() - assertThrows(Resources.NotFoundException::class) { handler.getStringArrayInLocale(-1) } + assertThrows() { handler.getStringArrayInLocale(-1) } } @Test @@ -365,7 +365,7 @@ class AppLanguageResourceHandlerTest { updateAppLanguageTo(OppiaLanguage.ENGLISH) val handler = retrieveAppLanguageResourceHandler() - assertThrows(Resources.NotFoundException::class) { handler.getQuantityStringInLocale(-1, 0) } + assertThrows() { handler.getQuantityStringInLocale(-1, 0) } } @Test @@ -396,7 +396,7 @@ class AppLanguageResourceHandlerTest { updateAppLanguageTo(OppiaLanguage.ENGLISH) val handler = retrieveAppLanguageResourceHandler() - assertThrows(Resources.NotFoundException::class) { + assertThrows() { handler.getQuantityStringInLocaleWithWrapping(-1, 0) } } @@ -431,7 +431,7 @@ class AppLanguageResourceHandlerTest { updateAppLanguageTo(OppiaLanguage.ENGLISH) val handler = retrieveAppLanguageResourceHandler() - assertThrows(Resources.NotFoundException::class) { + assertThrows() { handler.getQuantityStringInLocaleWithoutWrapping(-1, 0) } } diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/LoggingIdentifierController.kt b/domain/src/main/java/org/oppia/android/domain/oppialogger/LoggingIdentifierController.kt index 5ce84fc4bcf..f0e35b7d079 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/LoggingIdentifierController.kt +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/LoggingIdentifierController.kt @@ -28,7 +28,15 @@ class LoggingIdentifierController @Inject constructor( private val persistentCacheStoreFactory: PersistentCacheStore.Factory, private val oppiaLogger: OppiaLogger ) { - private val learnerIdRandom by lazy { Random(applicationIdSeed) } + // Use a base random to compute the per-ID random IDs in order so that test behaviors are + // consistent and deterministic when fixing the application ID seed. + private val baseRandom = Random(applicationIdSeed) + private val installationRandomSeed = baseRandom.nextLong() + private val sessionRandomSeed = baseRandom.nextLong() + private val learnerRandomSeed = baseRandom.nextLong() + private val installationIdRandom by lazy { Random(installationRandomSeed) } + private val sessionIdRandom by lazy { Random(sessionRandomSeed) } + private val learnerIdRandom by lazy { Random(learnerRandomSeed) } private val sessionId by lazy { MutableStateFlow(computeSessionId()) } private val sessionIdDataProvider by lazy { @@ -113,12 +121,12 @@ class LoggingIdentifierController @Inject constructor( sessionId.value = computeSessionId() } - private fun computeSessionId(): String = learnerIdRandom.randomUuid().toString() + private fun computeSessionId(): String = sessionIdRandom.randomUuid().toString() private fun computeInstallationId(): String { return machineLocale.run { MessageDigest.getInstance("SHA-1") - .digest(learnerIdRandom.randomUuid().toString().toByteArray()) + .digest(installationIdRandom.randomUuid().toString().toByteArray()) .joinToString("") { "%02x".formatForMachines(it) } .substring(startIndex = 0, endIndex = 12) } diff --git a/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt index 1730f091d1b..960cfb995e3 100644 --- a/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt @@ -433,7 +433,7 @@ class AudioPlayerControllerTest { @Test fun testController_notInitialized_releasePlayer_fails() { setUpMediaReadyApplication() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { audioPlayerController.releaseMediaPlayer() } @@ -444,7 +444,7 @@ class AudioPlayerControllerTest { @Test fun testError_notPrepared_invokePlay_fails() { setUpMediaReadyApplication() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { audioPlayerController.play(isPlayingFromAutoPlay = false, reloadingMainContent = false) } @@ -454,7 +454,7 @@ class AudioPlayerControllerTest { @Test fun testError_notPrepared_invokePause_fails() { setUpMediaReadyApplication() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { audioPlayerController.pause(isFromExplicitUserAction = true) } @@ -464,7 +464,7 @@ class AudioPlayerControllerTest { @Test fun testError_notPrepared_invokeSeekTo_fails() { setUpMediaReadyApplication() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { audioPlayerController.seekTo(500) } diff --git a/domain/src/test/java/org/oppia/android/domain/classify/AnswerClassificationControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/AnswerClassificationControllerTest.kt index 712ad585e86..8553d8d1f99 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/AnswerClassificationControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/AnswerClassificationControllerTest.kt @@ -152,7 +152,7 @@ class AnswerClassificationControllerTest { fun testClassify_forUnknownInteraction_throwsException() { val interaction = Interaction.getDefaultInstance() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { answerClassificationController.classify( interaction, TEST_STRING_0, @@ -170,7 +170,7 @@ class AnswerClassificationControllerTest { .addAnswerGroups(AnswerGroup.newBuilder().addRuleSpecs(RuleSpec.getDefaultInstance())) .build() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { answerClassificationController.classify( interaction, TEST_STRING_0, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest.kt index 53be477a285..c7d224753c4 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest.kt @@ -55,7 +55,7 @@ class DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest { // Reverse the x and y parameters to ensure both have the incorrect type. val inputs = mapOf("x" to NON_NEGATIVE_VALUE_1, "y" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXAtPositionYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -75,7 +75,7 @@ class DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest { "y" to NON_NEGATIVE_VALUE_1 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXAtPositionYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -92,7 +92,7 @@ class DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest { fun testAnswer_nonNegativeInput_testString_yInputWithIncorrectType_throwsException() { val inputs = mapOf("x" to VALID_CONTENT_ID_2, "y" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXAtPositionYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -109,7 +109,7 @@ class DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest { fun testAnswer_testString_missingInputX_throwsException() { val inputs = mapOf("y" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXAtPositionYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -126,7 +126,7 @@ class DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest { fun testAnswer_nonNegativeInput_missingInputY_throwsException() { val inputs = mapOf("x" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXAtPositionYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -143,7 +143,7 @@ class DragDropSortInputHasElementXAtPositionYRuleClassifierProviderTest { fun testAnswer_bothInputsMissing_throwsException() { val inputs = mapOf("z" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXAtPositionYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest.kt index c706db71f64..a40e47d06f4 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest.kt @@ -56,7 +56,7 @@ class DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest { "y" to NON_NEGATIVE_VALUE_1 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXBeforeElementYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -73,7 +73,7 @@ class DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest { fun testAnswer_nonNegativeInput_testString_xInputWithIncorrectType_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_1, "y" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXBeforeElementYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -90,7 +90,7 @@ class DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest { fun testAnswer_nonNegativeInput_testString_yInputWithIncorrectType_throwsException() { val inputs = mapOf("x" to VALID_CONTENT_ID_2, "y" to NON_NEGATIVE_VALUE_1) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXBeforeElementYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -107,7 +107,7 @@ class DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest { fun testAnswer_testString_missingInputX_throwsException() { val inputs = mapOf("y" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXBeforeElementYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -124,7 +124,7 @@ class DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest { fun testAnswer_nonNegativeInput_missingInputY_throwsException() { val inputs = mapOf("x" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXBeforeElementYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, @@ -141,7 +141,7 @@ class DragDropSortInputHasElementXBeforeElementYRuleClassifierProviderTest { fun testAnswer_bothInputsMissing_throwsException() { val inputs = mapOf("z" to VALID_CONTENT_ID_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasElementXBeforeElementYRuleClassifier.matches( answer = LIST_OF_SETS_OF_CONTENT_IDS, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputIsEqualToOrderingClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputIsEqualToOrderingClassifierProviderTest.kt index 2c65122884d..c6783f37ca1 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputIsEqualToOrderingClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputIsEqualToOrderingClassifierProviderTest.kt @@ -137,7 +137,7 @@ class DragDropSortInputIsEqualToOrderingClassifierProviderTest { fun testAnswer_testLisOfSetsOfHtmlString_incorrectInputMap_throwsException() { val inputs = mapOf("y" to LIST_OF_SETS_12_3_4) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isEqualToOrderingClassifierProvider.matches( answer = LIST_OF_SETS_12_3_4, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputIsEqualToOrderingWithOneItemAtIncorrectPositionClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputIsEqualToOrderingWithOneItemAtIncorrectPositionClassifierProviderTest.kt index d62690db395..9da1c50711e 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputIsEqualToOrderingWithOneItemAtIncorrectPositionClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/DragDropSortInputIsEqualToOrderingWithOneItemAtIncorrectPositionClassifierProviderTest.kt @@ -69,7 +69,7 @@ class DragDropSortInputIsEqualToOrderingWithOneItemAtIncorrectPositionClassifier fun testAnswer_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isEqualToOrderingWithOneItemIncorrectClassifier.matches( answer = LIST_OF_SETS_12_4_5, inputs = inputs, @@ -144,7 +144,7 @@ class DragDropSortInputIsEqualToOrderingWithOneItemAtIncorrectPositionClassifier fun testAnswer_testLisOfSetsOfHtmlString_incorrectInputMap_throwsException() { val inputs = mapOf("y" to LIST_OF_SETS_12_4_5) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isEqualToOrderingWithOneItemIncorrectClassifier.matches( answer = LIST_OF_SETS_12_4_5, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasDenominatorEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasDenominatorEqualToRuleClassifierProviderTest.kt index a4641cc64ad..c0be3182da6 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasDenominatorEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasDenominatorEqualToRuleClassifierProviderTest.kt @@ -124,7 +124,7 @@ class FractionInputHasDenominatorEqualToRuleClassifierProviderTest { fun testDenominatorEquals_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("x" to FRACTION_VALUE_TEST_2_OVER_4) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { denominatorIsEqualClassifierProvider.matches( answer = FRACTION_VALUE_TEST_2_OVER_4, inputs = inputs, @@ -143,7 +143,7 @@ class FractionInputHasDenominatorEqualToRuleClassifierProviderTest { fun testDenominatorEquals_missingInputF_throwsException() { val inputs = mapOf("y" to NON_NEGATIVE_VALUE_TEST_1) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { denominatorIsEqualClassifierProvider.matches( answer = FRACTION_VALUE_TEST_2_OVER_4, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasFractionalPartExactlyEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasFractionalPartExactlyEqualToRuleClassifierProviderTest.kt index 56212d736d9..d5d95ca9253 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasFractionalPartExactlyEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasFractionalPartExactlyEqualToRuleClassifierProviderTest.kt @@ -208,7 +208,7 @@ class FractionInputHasFractionalPartExactlyEqualToRuleClassifierProviderTest { fun testFractionalEquals_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("f" to NON_NEGATIVE_VALUE_TEST_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { fractionalPartIsExactlyEqualClassifierProvider.matches( answer = FRACTION_VALUE_TEST_2_OVER_4, inputs = inputs, @@ -227,7 +227,7 @@ class FractionInputHasFractionalPartExactlyEqualToRuleClassifierProviderTest { fun testFractionalEquals_missingInputF_throwsException() { val inputs = mapOf("y" to FRACTION_VALUE_TEST_2_OVER_4) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { fractionalPartIsExactlyEqualClassifierProvider.matches( answer = FRACTION_VALUE_TEST_2_OVER_4, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasIntegerPartEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasIntegerPartEqualToRuleClassifierProviderTest.kt index 3d58861f475..c1212a3a082 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasIntegerPartEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasIntegerPartEqualToRuleClassifierProviderTest.kt @@ -405,7 +405,7 @@ class FractionInputHasIntegerPartEqualToRuleClassifierProviderTest { fun testAnswer1Over2_inputMissing_throwsException() { val inputs = mapOf("y" to WHOLE_NUMBER_VALUE_TEST_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputHasIntegerPartEqualToRuleClassifier .matches( answer = FRACTION_VALUE_TEST_1_OVER_2, @@ -423,7 +423,7 @@ class FractionInputHasIntegerPartEqualToRuleClassifierProviderTest { fun testAnswer1Over2_inputString_throwsException() { val inputs = mapOf("x" to STRING_VALUE_TEST_LOWERCASE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputHasIntegerPartEqualToRuleClassifier .matches( answer = FRACTION_VALUE_TEST_1_OVER_2, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasNumeratorEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasNumeratorEqualToRuleClassifierProviderTest.kt index 647d37cbdd3..bc4bb343c03 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasNumeratorEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputHasNumeratorEqualToRuleClassifierProviderTest.kt @@ -145,7 +145,7 @@ class FractionInputHasNumeratorEqualToRuleClassifierProviderTest { fun testNumeratorEquals_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_TEST_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { numeratorIsEqualClassifierProvider.matches( answer = FRACTION_VALUE_TEST_2_OVER_4, inputs = inputs, @@ -164,7 +164,7 @@ class FractionInputHasNumeratorEqualToRuleClassifierProviderTest { fun testNumeratorEquals_missingInputF_throwsException() { val inputs = mapOf("y" to FRACTION_VALUE_TEST_2_OVER_4) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { numeratorIsEqualClassifierProvider.matches( answer = FRACTION_VALUE_TEST_2_OVER_4, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsEquivalentToAndInSimplestFormRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsEquivalentToAndInSimplestFormRuleClassifierProviderTest.kt index 1afbb516319..8a2d65bf340 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsEquivalentToAndInSimplestFormRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsEquivalentToAndInSimplestFormRuleClassifierProviderTest.kt @@ -288,7 +288,7 @@ class FractionInputIsEquivalentToAndInSimplestFormRuleClassifierProviderTest { val inputs = mapOf("y" to FRACTION_VALUE_TEST_1_OVER_2) val answer = FRACTION_VALUE_TEST_1_OVER_2 - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsEquivalentToAndInSimplestFormRuleClassifier.matches( answer = answer, inputs = inputs, @@ -306,7 +306,7 @@ class FractionInputIsEquivalentToAndInSimplestFormRuleClassifierProviderTest { val inputs = mapOf("f" to FRACTION_VALUE_TEST_1_OVER_2) val answer = STRING_VALUE_TEST - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsEquivalentToAndInSimplestFormRuleClassifier.matches( answer = answer, inputs = inputs, @@ -324,7 +324,7 @@ class FractionInputIsEquivalentToAndInSimplestFormRuleClassifierProviderTest { val inputs = mapOf("f" to STRING_VALUE_TEST) val answer = FRACTION_VALUE_TEST_1_OVER_2 - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsEquivalentToAndInSimplestFormRuleClassifier.matches( answer = answer, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsEquivalentToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsEquivalentToRuleClassifierProviderTest.kt index a61d6a03b41..4788fa0e9d9 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsEquivalentToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsEquivalentToRuleClassifierProviderTest.kt @@ -250,7 +250,7 @@ class FractionInputIsEquivalentToRuleClassifierProviderTest { fun testEquivalence_missingInput_throwsException() { val inputs = mapOf("y" to FRACTION_VALUE_TEST_2_OVER_8) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsEquivalentToRuleClassifier.matches( answer = FRACTION_VALUE_TEST_2_OVER_8, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsExactlyEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsExactlyEqualToRuleClassifierProviderTest.kt index 5280da48f8a..67f4cdba623 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsExactlyEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsExactlyEqualToRuleClassifierProviderTest.kt @@ -235,7 +235,7 @@ class FractionInputIsExactlyEqualToRuleClassifierProviderTest { fun testEquals_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("f" to NON_NEGATIVE_VALUE_TEST_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isExactlyEqualClassifierProvider.matches( answer = FRACTION_VALUE_TEST_2_OVER_4, inputs = inputs, @@ -254,7 +254,7 @@ class FractionInputIsExactlyEqualToRuleClassifierProviderTest { fun testEquals_missingInputF_throwsException() { val inputs = mapOf("y" to FRACTION_VALUE_TEST_2_OVER_4) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isExactlyEqualClassifierProvider.matches( answer = FRACTION_VALUE_TEST_2_OVER_4, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsGreaterThanRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsGreaterThanRuleClassifierProviderTest.kt index b14d9993e06..aecd631ac68 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsGreaterThanRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsGreaterThanRuleClassifierProviderTest.kt @@ -409,7 +409,7 @@ class FractionInputIsGreaterThanRuleClassifierProviderTest { fun testFractionalAnswer_missingInput_throwsException() { val inputs = mapOf("y" to FRACTION_VALUE_TEST_1_OVER_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputGreaterThanRuleClassifier .matches( answer = FRACTION_VALUE_TEST_1_OVER_2, @@ -427,7 +427,7 @@ class FractionInputIsGreaterThanRuleClassifierProviderTest { fun testFractionalAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE_TEST_LOWERCASE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputGreaterThanRuleClassifier .matches( answer = FRACTION_VALUE_TEST_1_OVER_2, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsLessThanRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsLessThanRuleClassifierProviderTest.kt index 1dda20b3d7c..03a00646b82 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsLessThanRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/fractioninput/FractionInputIsLessThanRuleClassifierProviderTest.kt @@ -409,7 +409,7 @@ class FractionInputIsLessThanRuleClassifierProviderTest { fun testAnswer1Over2_inputMissing_throwsException() { val inputs = mapOf("y" to FRACTION_VALUE_TEST_1_OVER_2) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputLessThanRuleClassifier .matches( answer = FRACTION_VALUE_TEST_1_OVER_2, @@ -427,7 +427,7 @@ class FractionInputIsLessThanRuleClassifierProviderTest { fun testAnswer1Over2_inputString_throwsException() { val inputs = mapOf("x" to STRING_VALUE_TEST_LOWERCASE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputLessThanRuleClassifier .matches( answer = FRACTION_VALUE_TEST_1_OVER_2, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/imageClickInput/ImageClickInputIsInRegionRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/imageClickInput/ImageClickInputIsInRegionRuleClassifierProviderTest.kt index 0694388d0c9..565da313100 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/imageClickInput/ImageClickInputIsInRegionRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/imageClickInput/ImageClickInputIsInRegionRuleClassifierProviderTest.kt @@ -89,7 +89,7 @@ class ImageClickInputIsInRegionRuleClassifierProviderTest { fun testAnswer_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isInRegionClassifierProvider.matches( answer = IMAGE_REGION_ABC_POSITION_1, inputs = inputs, @@ -108,7 +108,7 @@ class ImageClickInputIsInRegionRuleClassifierProviderTest { fun testAnswer_testString_missingInputX_throwsException() { val inputs = mapOf("y" to createString(ITEM_REGION_A)) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isInRegionClassifierProvider.matches( answer = IMAGE_REGION_ABC_POSITION_1, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputDoesNotContainAtLeastOneOfRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputDoesNotContainAtLeastOneOfRuleClassifierProviderTest.kt index 99be995d0bc..b6eedff3056 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputDoesNotContainAtLeastOneOfRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputDoesNotContainAtLeastOneOfRuleClassifierProviderTest.kt @@ -156,7 +156,7 @@ class ItemSelectionInputDoesNotContainAtLeastOneOfRuleClassifierProviderTest { fun testItemSet_inputIsMissing_throwsException() { val inputs = mapOf("y" to ITEM_SET_1) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputDoesNotContainAtLeastOneOfRuleClassifier.matches( answer = ITEM_SET_12345, inputs = inputs, @@ -173,7 +173,7 @@ class ItemSelectionInputDoesNotContainAtLeastOneOfRuleClassifierProviderTest { fun testItemSet_inputHasTheWrongType_throwsException() { val inputs = mapOf("x" to DIFFERENT_INTERACTION_OBJECT_TYPE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputDoesNotContainAtLeastOneOfRuleClassifier.matches( answer = ITEM_SET_12345, inputs = inputs, @@ -190,7 +190,7 @@ class ItemSelectionInputDoesNotContainAtLeastOneOfRuleClassifierProviderTest { fun testItemSet_answerHasTheWrongType_throwsException() { val inputs = mapOf("x" to ITEM_SET_12345) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputDoesNotContainAtLeastOneOfRuleClassifier.matches( answer = DIFFERENT_INTERACTION_OBJECT_TYPE, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputEqualsRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputEqualsRuleClassifierProviderTest.kt index 927dcdc5f3f..a3c467dcbdc 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputEqualsRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputEqualsRuleClassifierProviderTest.kt @@ -162,7 +162,7 @@ class ItemSelectionInputEqualsRuleClassifierProviderTest { fun testLowercaseAnswer_missingInput_throwsException() { val inputs = mapOf("y" to TEST_HTML_STRING_SET_LOWERCASE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputEqualsRuleClassifierProvider.matches( answer = TEST_HTML_STRING_SET_LOWERCASE, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputIsProperSubsetOfRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputIsProperSubsetOfRuleClassifierProviderTest.kt index 8997d85c434..a4d3a9fadb4 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputIsProperSubsetOfRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/itemselectioninput/ItemSelectionInputIsProperSubsetOfRuleClassifierProviderTest.kt @@ -169,7 +169,7 @@ class ItemSelectionInputIsProperSubsetOfRuleClassifierProviderTest() { fun testIsProperSubset_withInvalidInput_forAnswer12345_throwsException() { val inputs = mapOf("x" to ITEM_SELECTION_INVAILD) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputContainsAtLeastOneOfRuleClassifier.matches( answer = ITEM_SELECTION_12345, inputs = inputs, @@ -186,7 +186,7 @@ class ItemSelectionInputIsProperSubsetOfRuleClassifierProviderTest() { fun testIsProperSubset_withInput12345_forInvalidAnswer_throwsException() { val inputs = mapOf("x" to ITEM_SELECTION_12345) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputContainsAtLeastOneOfRuleClassifier.matches( answer = ITEM_SELECTION_INVAILD, inputs = inputs, @@ -203,7 +203,7 @@ class ItemSelectionInputIsProperSubsetOfRuleClassifierProviderTest() { fun testIsProperSubset_missingInputX_throwsException() { val inputs = mapOf("a" to ITEM_SELECTION_12345) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputContainsAtLeastOneOfRuleClassifier.matches( answer = ITEM_SELECTION_12345, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/MultipleChoiceInputEqualsRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/MultipleChoiceInputEqualsRuleClassifierProviderTest.kt index d193f4c795b..c66ab000848 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/MultipleChoiceInputEqualsRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/MultipleChoiceInputEqualsRuleClassifierProviderTest.kt @@ -72,7 +72,7 @@ class MultipleChoiceInputEqualsRuleClassifierProviderTest { fun testNonNegativeAnswer_missingInput_throwsException() { val inputs = mapOf("y" to NON_NEGATIVE_VALUE_TEST_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputEqualsRuleClassifier.matches( answer = NON_NEGATIVE_VALUE_TEST_0, inputs = inputs, @@ -89,7 +89,7 @@ class MultipleChoiceInputEqualsRuleClassifierProviderTest { fun testUnexpectedStringAnswer_nonNegativeIntInput_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_TEST_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputEqualsRuleClassifier.matches( answer = STRING_VALUE_TEST, inputs = inputs, @@ -106,7 +106,7 @@ class MultipleChoiceInputEqualsRuleClassifierProviderTest { fun testNonNegativeAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE_TEST) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputEqualsRuleClassifier.matches( answer = NON_NEGATIVE_VALUE_TEST_0, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numberwithunits/NumberWithUnitsIsEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numberwithunits/NumberWithUnitsIsEqualToRuleClassifierProviderTest.kt index 048e5574066..ee150667497 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numberwithunits/NumberWithUnitsIsEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numberwithunits/NumberWithUnitsIsEqualToRuleClassifierProviderTest.kt @@ -185,7 +185,7 @@ class NumberWithUnitsIsEqualToRuleClassifierProviderTest { fun testWholeNumberInputValue_withRealAnswerNumWithUnits_throwsException() { val inputs = mapOf("f" to WHOLE_NUMBER_VALUE_9) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { unitsIsEqualsRuleClassifier.matches( answer = DOUBLE_VALUE_TEST_DIFFERENT_TYPE, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numberwithunits/NumberWithUnitsIsEquivalentToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numberwithunits/NumberWithUnitsIsEquivalentToRuleClassifierProviderTest.kt index d53553b9d79..4e6ed68a7e7 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numberwithunits/NumberWithUnitsIsEquivalentToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numberwithunits/NumberWithUnitsIsEquivalentToRuleClassifierProviderTest.kt @@ -179,7 +179,7 @@ class NumberWithUnitsIsEquivalentToRuleClassifierProviderTest { fun testInputNumberWithUnits_testAnswer_inputWithIncorrectType_verifyThrowsException() { val inputs = mapOf("f" to INPUT_TEST_NUMBER_WITH_UNITS) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { unitIsEquivalentRuleClassifier.matches( answer = DOUBLE_VALUE_TEST_DIFFERENT_TYPE, inputs = inputs, @@ -198,7 +198,7 @@ class NumberWithUnitsIsEquivalentToRuleClassifierProviderTest { fun testInputNumberWithUnits_testAnswerNumberWithUnits_withXMapping_verifyThrowsException() { val inputs = mapOf("x" to INPUT_TEST_NUMBER_WITH_UNITS) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { unitIsEquivalentRuleClassifier.matches( answer = ANSWER_TEST_NUMBER_WITH_UNITS, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputEqualsRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputEqualsRuleClassifierProviderTest.kt index 1a4c4c8b07a..daa27f53145 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputEqualsRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputEqualsRuleClassifierProviderTest.kt @@ -144,7 +144,7 @@ class NumericInputEqualsRuleClassifierProviderTest { fun testRealAnswer_missingInput_throwsException() { val inputs = mapOf("y" to POSITIVE_REAL_VALUE_1_5) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputEqualsRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -161,7 +161,7 @@ class NumericInputEqualsRuleClassifierProviderTest { fun testRealAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputEqualsRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsGreaterThanOrEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsGreaterThanOrEqualToRuleClassifierProviderTest.kt index b7298602e46..95bab873ae0 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsGreaterThanOrEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsGreaterThanOrEqualToRuleClassifierProviderTest.kt @@ -199,7 +199,7 @@ class NumericInputIsGreaterThanOrEqualToRuleClassifierProviderTest { fun testRealAnswer_missingInput_throwsException() { val inputs = mapOf("y" to POSITIVE_REAL_VALUE_1_5) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsGreaterThanOrEqualToRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -216,7 +216,7 @@ class NumericInputIsGreaterThanOrEqualToRuleClassifierProviderTest { fun testRealAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsGreaterThanOrEqualToRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsGreaterThanRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsGreaterThanRuleClassifierProviderTest.kt index aa4f78a021d..d488eba6b5a 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsGreaterThanRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsGreaterThanRuleClassifierProviderTest.kt @@ -200,7 +200,7 @@ class NumericInputIsGreaterThanRuleClassifierProviderTest { fun testRealAnswer_missingInput_throwsException() { val inputs = mapOf("y" to POSITIVE_REAL_VALUE_1_5) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsGreaterThanRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -217,7 +217,7 @@ class NumericInputIsGreaterThanRuleClassifierProviderTest { fun testRealAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsGreaterThanRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsInclusivelyBetweenRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsInclusivelyBetweenRuleClassifierProviderTest.kt index 504117c488e..948327a4ec9 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsInclusivelyBetweenRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsInclusivelyBetweenRuleClassifierProviderTest.kt @@ -231,7 +231,7 @@ class NumericInputIsInclusivelyBetweenRuleClassifierProviderTest { "c" to NEGATIVE_REAL_VALUE_3_5, "b" to POSITIVE_REAL_VALUE_3_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsInclusivelyBetweenRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -250,7 +250,7 @@ class NumericInputIsInclusivelyBetweenRuleClassifierProviderTest { "a" to NEGATIVE_REAL_VALUE_3_5, "c" to POSITIVE_REAL_VALUE_1_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsInclusivelyBetweenRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -269,7 +269,7 @@ class NumericInputIsInclusivelyBetweenRuleClassifierProviderTest { "a" to STRING_VALUE_1, "b" to NEGATIVE_REAL_VALUE_3_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsInclusivelyBetweenRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -288,7 +288,7 @@ class NumericInputIsInclusivelyBetweenRuleClassifierProviderTest { "a" to POSITIVE_REAL_VALUE_1_5, "b" to STRING_VALUE_2 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsInclusivelyBetweenRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -307,7 +307,7 @@ class NumericInputIsInclusivelyBetweenRuleClassifierProviderTest { "c" to POSITIVE_INT_VALUE_1, "b" to POSITIVE_INT_VALUE_3 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsInclusivelyBetweenRuleClassifier.matches( answer = POSITIVE_INT_VALUE_2, inputs = inputs, @@ -326,7 +326,7 @@ class NumericInputIsInclusivelyBetweenRuleClassifierProviderTest { "a" to POSITIVE_INT_VALUE_1, "c" to POSITIVE_INT_VALUE_3 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsInclusivelyBetweenRuleClassifier.matches( answer = POSITIVE_INT_VALUE_2, inputs = inputs, @@ -345,7 +345,7 @@ class NumericInputIsInclusivelyBetweenRuleClassifierProviderTest { "a" to STRING_VALUE_1, "b" to POSITIVE_INT_VALUE_3 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsInclusivelyBetweenRuleClassifier.matches( answer = POSITIVE_INT_VALUE_1, inputs = inputs, @@ -364,7 +364,7 @@ class NumericInputIsInclusivelyBetweenRuleClassifierProviderTest { "a" to NEGATIVE_INT_VALUE_3, "b" to STRING_VALUE_2 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsInclusivelyBetweenRuleClassifier.matches( answer = POSITIVE_INT_VALUE_2, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsLessThanOrEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsLessThanOrEqualToRuleClassifierProviderTest.kt index 1bcc688f8c3..90cba1612af 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsLessThanOrEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsLessThanOrEqualToRuleClassifierProviderTest.kt @@ -199,7 +199,7 @@ class NumericInputIsLessThanOrEqualToRuleClassifierProviderTest { fun testRealAnswer_missingInput_throwsException() { val inputs = mapOf("y" to POSITIVE_REAL_VALUE_1_5) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsLessThanOrEqualToRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -216,7 +216,7 @@ class NumericInputIsLessThanOrEqualToRuleClassifierProviderTest { fun testRealAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsLessThanOrEqualToRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -233,7 +233,7 @@ class NumericInputIsLessThanOrEqualToRuleClassifierProviderTest { fun testIntAnswer_missingInput_throwsException() { val inputs = mapOf("y" to POSITIVE_INT_VALUE_1) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsLessThanOrEqualToRuleClassifier.matches( answer = POSITIVE_INT_VALUE_1, inputs = inputs, @@ -250,7 +250,7 @@ class NumericInputIsLessThanOrEqualToRuleClassifierProviderTest { fun testIntAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsLessThanOrEqualToRuleClassifier.matches( answer = POSITIVE_INT_VALUE_1, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsLessThanRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsLessThanRuleClassifierProviderTest.kt index 97d152ce3e4..e1819859a89 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsLessThanRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsLessThanRuleClassifierProviderTest.kt @@ -199,7 +199,7 @@ class NumericInputIsLessThanRuleClassifierProviderTest { fun testRealAnswer_missingInput_throwsException() { val inputs = mapOf("y" to POSITIVE_REAL_VALUE_1_5) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsLessThanRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -216,7 +216,7 @@ class NumericInputIsLessThanRuleClassifierProviderTest { fun testRealAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsLessThanRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -233,7 +233,7 @@ class NumericInputIsLessThanRuleClassifierProviderTest { fun testIntAnswer_missingInput_throwsException() { val inputs = mapOf("y" to POSITIVE_INT_VALUE_1) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsLessThanRuleClassifier.matches( answer = POSITIVE_INT_VALUE_3, inputs = inputs, @@ -250,7 +250,7 @@ class NumericInputIsLessThanRuleClassifierProviderTest { fun testIntAnswer_stringInput_throwsException() { val inputs = mapOf("x" to STRING_VALUE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsLessThanRuleClassifier.matches( answer = NEGATIVE_INT_VALUE_1, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsWithinToleranceRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsWithinToleranceRuleClassifierProviderTest.kt index d5481c0ac89..710210dcc39 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsWithinToleranceRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/numericinput/NumericInputIsWithinToleranceRuleClassifierProviderTest.kt @@ -393,7 +393,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { val inputs = mapOf( "tol" to POSITIVE_REAL_VALUE_3_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -411,7 +411,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { val inputs = mapOf( "x" to NEGATIVE_REAL_VALUE_3_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -430,7 +430,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { "c" to NEGATIVE_REAL_VALUE_3_5, "tol" to POSITIVE_REAL_VALUE_3_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -449,7 +449,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { "x" to NEGATIVE_REAL_VALUE_3_5, "c" to POSITIVE_REAL_VALUE_1_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -468,7 +468,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { "x" to STRING_VALUE_1, "tol" to NEGATIVE_REAL_VALUE_3_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_REAL_VALUE_1_5, inputs = inputs, @@ -486,7 +486,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { val inputs = mapOf( "tol" to POSITIVE_INT_VALUE_3 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_INT_VALUE_2, inputs = inputs, @@ -504,7 +504,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { val inputs = mapOf( "x" to POSITIVE_INT_VALUE_1 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_INT_VALUE_2, inputs = inputs, @@ -523,7 +523,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { "c" to POSITIVE_INT_VALUE_1, "tol" to POSITIVE_INT_VALUE_3 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_INT_VALUE_2, inputs = inputs, @@ -542,7 +542,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { "x" to POSITIVE_INT_VALUE_1, "c" to POSITIVE_INT_VALUE_3 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_INT_VALUE_2, inputs = inputs, @@ -561,7 +561,7 @@ class NumericInputIsWithinToleranceRuleClassifierProviderTest { "x" to STRING_VALUE_1, "tol" to POSITIVE_INT_VALUE_3 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputIsWithinToleranceRuleClassifier.matches( answer = POSITIVE_INT_VALUE_1, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputEqualsRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputEqualsRuleClassifierProviderTest.kt index 244cb981571..07945a20691 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputEqualsRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputEqualsRuleClassifierProviderTest.kt @@ -100,7 +100,7 @@ class RatioInputEqualsRuleClassifierProviderTest { fun testAnswer_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_TEST_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { equalsClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, @@ -119,7 +119,7 @@ class RatioInputEqualsRuleClassifierProviderTest { fun testAnswer_testRatio_missingInputX_throwsException() { val inputs = mapOf("y" to RATIO_VALUE_TEST_1_2_3) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { equalsClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputHasNumberOfTermsEqualToClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputHasNumberOfTermsEqualToClassifierProviderTest.kt index 2cbb3b324a4..a8c1b27243c 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputHasNumberOfTermsEqualToClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputHasNumberOfTermsEqualToClassifierProviderTest.kt @@ -82,7 +82,7 @@ class RatioInputHasNumberOfTermsEqualToClassifierProviderTest { fun testAnswer_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("y" to RATIO_VALUE_TEST_1_2_3) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasNumberOfTermsEqualToClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, @@ -101,7 +101,7 @@ class RatioInputHasNumberOfTermsEqualToClassifierProviderTest { fun testAnswer_testRatio_missingInputY_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_TEST_4) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasNumberOfTermsEqualToClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputHasSpecificTermEqualToRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputHasSpecificTermEqualToRuleClassifierProviderTest.kt index 81968647149..14101f1d79e 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputHasSpecificTermEqualToRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputHasSpecificTermEqualToRuleClassifierProviderTest.kt @@ -198,7 +198,7 @@ class RatioInputHasSpecificTermEqualToRuleClassifierProviderTest { fun testAnswer_threeTerms_indexInputWithIncorrectType_throwsException() { val inputs = mapOf("x" to STRING_VALUE, "y" to NON_NEGATIVE_VALUE_TEST_3) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasSpecificTermEqualToClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, @@ -215,7 +215,7 @@ class RatioInputHasSpecificTermEqualToRuleClassifierProviderTest { fun testAnswer_threeTerms_valueInputWithIncorrectType_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_TEST_4, "y" to STRING_VALUE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasSpecificTermEqualToClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, @@ -232,7 +232,7 @@ class RatioInputHasSpecificTermEqualToRuleClassifierProviderTest { fun testAnswer_threeTerms_missingIndexInput_throwsException() { val inputs = mapOf("y" to NON_NEGATIVE_VALUE_TEST_3) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasSpecificTermEqualToClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, @@ -249,7 +249,7 @@ class RatioInputHasSpecificTermEqualToRuleClassifierProviderTest { fun testAnswer_threeTerms_missingValueInput_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_TEST_4) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasSpecificTermEqualToClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, @@ -264,7 +264,7 @@ class RatioInputHasSpecificTermEqualToRuleClassifierProviderTest { @Test fun testAnswer_threeTerms_missingBothInputs_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hasSpecificTermEqualToClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = mapOf(), diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputIsEquivalentRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputIsEquivalentRuleClassifierProviderTest.kt index c93b44f8dc2..09fdeb952bb 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputIsEquivalentRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/ratioinput/RatioInputIsEquivalentRuleClassifierProviderTest.kt @@ -146,7 +146,7 @@ class RatioInputIsEquivalentRuleClassifierProviderTest { fun testAnswer_nonNegativeInput_inputWithIncorrectType_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_TEST_0) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isEquivalentClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, @@ -165,7 +165,7 @@ class RatioInputIsEquivalentRuleClassifierProviderTest { fun testAnswer_testRatio_missingInputX_throwsException() { val inputs = mapOf("y" to RATIO_VALUE_TEST_1_2_3) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { isEquivalentClassifierProvider.matches( answer = RATIO_VALUE_TEST_1_2_3, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputContainsRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputContainsRuleClassifierProviderTest.kt index 6f4fc9013b1..1c258aec94e 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputContainsRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputContainsRuleClassifierProviderTest.kt @@ -268,7 +268,7 @@ class TextInputContainsRuleClassifierProviderTest { fun testStringAnswer_missingInput_throwsException() { val inputs = mapOf("y" to STRING_VALUE_TEST_ANSWER_INPUT_SET) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputContainsRuleClassifier.matches( answer = STRING_VALUE_TEST_ANSWER, inputs = inputs, @@ -285,7 +285,7 @@ class TextInputContainsRuleClassifierProviderTest { fun testStringAnswer_nonNegativeIntInput_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_VALUE_TEST_1) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputContainsRuleClassifier.matches( answer = STRING_VALUE_TEST_ANSWER, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputEqualsRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputEqualsRuleClassifierProviderTest.kt index 3b658cca5df..6c5c53471c2 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputEqualsRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputEqualsRuleClassifierProviderTest.kt @@ -210,7 +210,7 @@ class TextInputEqualsRuleClassifierProviderTest { fun testStringAnswer_missingInput_throwsException() { val inputs = mapOf("y" to STRING_VALUE_TEST_LOWERCASE_INPUT_SET) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputEqualsRuleClassifier.matches( answer = STRING_VALUE_TEST_LOWERCASE, inputs = inputs, @@ -227,7 +227,7 @@ class TextInputEqualsRuleClassifierProviderTest { fun testStringAnswer_nonNegativeIntInput_throwsException() { val inputs = mapOf("x" to INT_VALUE_TEST_NON_NEGATIVE) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputEqualsRuleClassifier.matches( answer = STRING_VALUE_TEST_UPPERCASE, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputFuzzyEqualsRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputFuzzyEqualsRuleClassifierProviderTest.kt index 67c7874d515..3bb592d1499 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputFuzzyEqualsRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputFuzzyEqualsRuleClassifierProviderTest.kt @@ -267,7 +267,7 @@ class TextInputFuzzyEqualsRuleClassifierProviderTest { fun testStringAnswer_nonNegativeIntInput_verifyThrowsException() { val inputs = mapOf("x" to NON_NEGATIVE_TEST_VALUE_1) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputFuzzyEqualsRuleClassifier.matches( answer = STRING_VALUE_TEST_ANSWER_UPPERCASE, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputStartsWithRuleClassifierProviderTest.kt b/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputStartsWithRuleClassifierProviderTest.kt index c88983ed5fc..60ea011ad34 100644 --- a/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputStartsWithRuleClassifierProviderTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/classify/rules/textinput/TextInputStartsWithRuleClassifierProviderTest.kt @@ -292,7 +292,7 @@ class TextInputStartsWithRuleClassifierProviderTest { fun testStringAns_missingInput_throwsException() { val inputs = mapOf("y" to STRING_VALUE_TEST_STRING_LOWERCASE_INPUT_SET) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputStartsWithRuleClassifier.matches( answer = STRING_VALUE_TEST_STRING_LOWERCASE, inputs = inputs, @@ -309,7 +309,7 @@ class TextInputStartsWithRuleClassifierProviderTest { fun testStringAns_nonNegativeIntInput_throwsException() { val inputs = mapOf("x" to NON_NEGATIVE_TEST_VALUE_1) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { inputStartsWithRuleClassifier.matches( answer = STRING_VALUE_TEST_STRING_LOWERCASE, inputs = inputs, diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationActiveTimeControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationActiveTimeControllerTest.kt index 39414c42791..867da17b125 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationActiveTimeControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationActiveTimeControllerTest.kt @@ -223,7 +223,7 @@ class ExplorationActiveTimeControllerTest { fun testStopTimer_beforeStarting_isFailure() { setUpTestApplicationComponent() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { stopExploration() } assertThat(exception) diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt index ed37c3bc9b8..fc2985ec84e 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt @@ -165,7 +165,7 @@ class ExplorationProgressControllerTest { @Test fun testGetCurrentState_noExploration_throwsException() { // Can't retrieve the current state until the play session is started. - assertThrows(UninitializedPropertyAccessException::class) { + assertThrows() { explorationProgressController.getCurrentState() } } diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/testing/FakeExplorationRetrieverTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/testing/FakeExplorationRetrieverTest.kt index ae53ac8a2e0..6d8ed9c82fa 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/testing/FakeExplorationRetrieverTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/testing/FakeExplorationRetrieverTest.kt @@ -58,7 +58,7 @@ class FakeExplorationRetrieverTest { @Test fun testLoadExploration_noProxySet_fakeExpId_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runBlocking { fakeExplorationRetriever.loadExploration("fake_id") } } @@ -83,7 +83,7 @@ class FakeExplorationRetrieverTest { expIdToLoad = TEST_EXPLORATION_ID_2, expIdToLoadInstead = "fake_id" ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runBlocking { fakeExplorationRetriever.loadExploration(TEST_EXPLORATION_ID_2) } } @@ -120,7 +120,7 @@ class FakeExplorationRetrieverTest { expIdToLoad = "fake_id", expIdToLoadInstead = "other_fake_id" ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runBlocking { fakeExplorationRetriever.loadExploration("fake_id") } } @@ -133,7 +133,7 @@ class FakeExplorationRetrieverTest { expIdToLoad = TEST_EXPLORATION_ID_2, expIdToLoadInstead = TEST_EXPLORATION_ID_5 ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runBlocking { fakeExplorationRetriever.loadExploration("fake_id") } } @@ -175,7 +175,7 @@ class FakeExplorationRetrieverTest { ) fakeExplorationRetriever.clearExplorationProxy("fake_id") - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runBlocking { fakeExplorationRetriever.loadExploration("fake_id") } } diff --git a/domain/src/test/java/org/oppia/android/domain/hintsandsolution/HintHandlerProdImplTest.kt b/domain/src/test/java/org/oppia/android/domain/hintsandsolution/HintHandlerProdImplTest.kt index faa4e98c9f2..c66cc01efe6 100644 --- a/domain/src/test/java/org/oppia/android/domain/hintsandsolution/HintHandlerProdImplTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/hintsandsolution/HintHandlerProdImplTest.kt @@ -976,7 +976,7 @@ class HintHandlerProdImplTest { val state = expWithHintsAndSolution.getInitialState() hintHandler.startWatchingForHintsInNewStateSync(state) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewHintSync(hintIndex = 0) } @@ -1157,7 +1157,7 @@ class HintHandlerProdImplTest { hintHandler.startWatchingForHintsInNewStateSync(state) triggerAndRevealFirstHint() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewHintSync(hintIndex = 0) } @@ -1172,7 +1172,7 @@ class HintHandlerProdImplTest { triggerAndRevealFirstHint() triggerAndRevealSecondHint() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewHintSync(hintIndex = 0) } @@ -1188,7 +1188,7 @@ class HintHandlerProdImplTest { triggerAndRevealSecondHint() triggerAndRevealSolution() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewHintSync(hintIndex = 0) } @@ -1203,7 +1203,7 @@ class HintHandlerProdImplTest { val state = expWithHintsAndSolution.getInitialState() hintHandler.startWatchingForHintsInNewStateSync(state) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewSolutionSync() } @@ -1217,7 +1217,7 @@ class HintHandlerProdImplTest { hintHandler.startWatchingForHintsInNewStateSync(state) triggerFirstHint() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewSolutionSync() } @@ -1231,7 +1231,7 @@ class HintHandlerProdImplTest { hintHandler.startWatchingForHintsInNewStateSync(state) triggerAndRevealFirstHint() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewSolutionSync() } @@ -1247,7 +1247,7 @@ class HintHandlerProdImplTest { triggerAndRevealFirstHint() triggerAndRevealSecondHint() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewSolutionSync() } @@ -1344,7 +1344,7 @@ class HintHandlerProdImplTest { triggerAndRevealSecondHint() triggerAndRevealSolution() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { hintHandler.viewSolutionSync() } diff --git a/domain/src/test/java/org/oppia/android/domain/locale/LocaleControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/locale/LocaleControllerTest.kt index 098fcde27de..30467ee6263 100644 --- a/domain/src/test/java/org/oppia/android/domain/locale/LocaleControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/locale/LocaleControllerTest.kt @@ -775,7 +775,7 @@ class LocaleControllerTest { @Test fun testSetAsDefault_customLocaleImpl_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { localeController.setAsDefault(mockDisplayLocale, Configuration()) } diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/LoggingIdentifierControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/LoggingIdentifierControllerTest.kt index 6c30c8200d5..9e2178fc924 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/LoggingIdentifierControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/LoggingIdentifierControllerTest.kt @@ -54,7 +54,6 @@ import org.robolectric.annotation.LooperMode import java.io.File import java.io.FileOutputStream import java.lang.IllegalStateException -import java.util.Random import javax.inject.Inject import javax.inject.Singleton @@ -79,17 +78,6 @@ class LoggingIdentifierControllerTest { setUpTestApplicationComponent() } - @Test - fun testCreateLearnerId_verifyCreatesCorrectRandomValue() { - val randomLearnerId = loggingIdentifierController.createLearnerId() - - val testLearnerId = machineLocale.run { - "%08x".formatForMachines(Random(TestLoggingIdentifierModule.applicationIdSeed).nextInt()) - } - assertThat(randomLearnerId).isEqualTo(testLearnerId) - assertThat(randomLearnerId.length).isEqualTo(8) - } - @Test fun testCreateLearnerId_twice_bothAreDifferent() { val learnerId1 = loggingIdentifierController.createLearnerId() @@ -106,7 +94,7 @@ class LoggingIdentifierControllerTest { val installationId = monitorFactory.waitForNextSuccessfulResult(loggingIdentifierController.getInstallationId()) - assertThat(installationId).isEqualTo("bc1f80ab5d8c") + assertThat(installationId).isEqualTo("1d079efe67ee") assertThat(installationId.length).isEqualTo(12) } @@ -119,7 +107,7 @@ class LoggingIdentifierControllerTest { monitorFactory.waitForNextSuccessfulResult(loggingIdentifierController.getInstallationId()) // The same value should return for the second instance of the controller. - assertThat(installationId).isEqualTo("bc1f80ab5d8c") + assertThat(installationId).isEqualTo("1d079efe67ee") } @Test @@ -137,7 +125,7 @@ class LoggingIdentifierControllerTest { fun testFetchInstallationId_initialAppState_returnsNewInstallationIdValue() { val installationId = fetchSuccessfulAsyncValue(loggingIdentifierController::fetchInstallationId) - assertThat(installationId).isEqualTo("bc1f80ab5d8c") + assertThat(installationId).isEqualTo("1d079efe67ee") assertThat(installationId?.length).isEqualTo(12) } @@ -149,7 +137,7 @@ class LoggingIdentifierControllerTest { val installationId = fetchSuccessfulAsyncValue(loggingIdentifierController::fetchInstallationId) // The same value should return for the second instance of the controller. - assertThat(installationId).isEqualTo("bc1f80ab5d8c") + assertThat(installationId).isEqualTo("1d079efe67ee") } @Test @@ -167,7 +155,7 @@ class LoggingIdentifierControllerTest { val sessionIdProvider = loggingIdentifierController.getSessionId() val sessionId = monitorFactory.waitForNextSuccessfulResult(sessionIdProvider) - assertThat(sessionId).isEqualTo("1c46e9d5-5902-311a-bbba-a75973c3ccd2") + assertThat(sessionId).isEqualTo("4d0a66f3-82b6-3aa9-8f61-140bdd5f49d3") } @Test @@ -178,7 +166,7 @@ class LoggingIdentifierControllerTest { // The second call should return the same ID (since the ID doesn't automatically change). val sessionId = monitorFactory.waitForNextSuccessfulResult(sessionIdProvider) - assertThat(sessionId).isEqualTo("1c46e9d5-5902-311a-bbba-a75973c3ccd2") + assertThat(sessionId).isEqualTo("4d0a66f3-82b6-3aa9-8f61-140bdd5f49d3") } @Test @@ -186,7 +174,7 @@ class LoggingIdentifierControllerTest { val sessionIdFlow = loggingIdentifierController.getSessionIdFlow() val sessionId = sessionIdFlow.waitForLatestValue() - assertThat(sessionId).isEqualTo("1c46e9d5-5902-311a-bbba-a75973c3ccd2") + assertThat(sessionId).isEqualTo("4d0a66f3-82b6-3aa9-8f61-140bdd5f49d3") } @Test @@ -197,7 +185,7 @@ class LoggingIdentifierControllerTest { // The second call should return the same ID (since the ID doesn't automatically change). val sessionId = sessionIdFlow.waitForLatestValue() - assertThat(sessionId).isEqualTo("1c46e9d5-5902-311a-bbba-a75973c3ccd2") + assertThat(sessionId).isEqualTo("4d0a66f3-82b6-3aa9-8f61-140bdd5f49d3") } @Test @@ -209,7 +197,7 @@ class LoggingIdentifierControllerTest { // The session ID should be changed since updateSessionId() was called. val sessionId = monitorFactory.waitForNextSuccessfulResult(sessionIdProvider) - assertThat(sessionId).isEqualTo("8808493e-6576-3e26-9cbf-d1008051b253") + assertThat(sessionId).isEqualTo("59aea8d4-af4b-3249-b889-dfeba06d0495") } @Test @@ -223,7 +211,7 @@ class LoggingIdentifierControllerTest { // The existing provider should've been notified of the changed session ID. val sessionId = monitor.ensureNextResultIsSuccess() - assertThat(sessionId).isEqualTo("8808493e-6576-3e26-9cbf-d1008051b253") + assertThat(sessionId).isEqualTo("59aea8d4-af4b-3249-b889-dfeba06d0495") } @Test @@ -238,7 +226,7 @@ class LoggingIdentifierControllerTest { // The session ID should be changed yet again due to updateSessionId() being called twice. val sessionId = monitorFactory.waitForNextSuccessfulResult(sessionIdProvider) - assertThat(sessionId).isEqualTo("8aeabb00-af70-39e4-89b3-c47c9900ec4f") + assertThat(sessionId).isEqualTo("8cbd31f7-bb52-3129-9fac-78dcb5cb857a") } @Test @@ -250,7 +238,7 @@ class LoggingIdentifierControllerTest { // The session ID should be changed since updateSessionId() was called. val sessionId = sessionIdFlow.waitForLatestValue() - assertThat(sessionId).isEqualTo("8808493e-6576-3e26-9cbf-d1008051b253") + assertThat(sessionId).isEqualTo("59aea8d4-af4b-3249-b889-dfeba06d0495") } @Test @@ -262,7 +250,7 @@ class LoggingIdentifierControllerTest { testCoroutineDispatchers.runCurrent() // The current value of the exist flow should be changed now since the session ID was updated. - assertThat(sessionIdFlow.value).isEqualTo("8808493e-6576-3e26-9cbf-d1008051b253") + assertThat(sessionIdFlow.value).isEqualTo("59aea8d4-af4b-3249-b889-dfeba06d0495") } private fun writeFileCache(cacheName: String, value: T) { diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/CpuPerformanceSnapshotterTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/CpuPerformanceSnapshotterTest.kt index 1641eb00223..adf3376b77d 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/CpuPerformanceSnapshotterTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/CpuPerformanceSnapshotterTest.kt @@ -426,7 +426,7 @@ class CpuPerformanceSnapshotterTest { @Test fun testSnapshotter_initializeOnce_initializeAgain_throwsErrorOnReinitialization() { cpuPerformanceSnapshotter.initialiseSnapshotter() - val exception = assertThrows(IllegalArgumentException::class) { + val exception = assertThrows() { cpuPerformanceSnapshotter.initialiseSnapshotter() } diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt index 462dd3f04ad..3cc8a0e848a 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt @@ -86,7 +86,7 @@ class LearnerAnalyticsLoggerTest { private const val TEST_STORY_ID = "test_story_id" private const val TEST_EXP_5_STATE_THREE_NAME = "NumericExpressionInput.IsEquivalentTo" private const val TEST_EXP_5_STATE_FOUR_NAME = "AlgebraicExpressionInput.MatchesExactlyWith" - private const val DEFAULT_INITIAL_SESSION_ID = "e6eacc69-e636-3c90-ba29-32bf3dd17161" + private const val DEFAULT_INITIAL_SESSION_ID = "ab4532d6-476c-3727-bc5a-ad84e5dae60f" } @Inject diff --git a/domain/src/test/java/org/oppia/android/domain/profile/ProfileManagementControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/profile/ProfileManagementControllerTest.kt index 62733f8119c..6d782dbc3bc 100644 --- a/domain/src/test/java/org/oppia/android/domain/profile/ProfileManagementControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/profile/ProfileManagementControllerTest.kt @@ -156,7 +156,7 @@ class ProfileManagementControllerTest { val profileDatabase = readProfileDatabase() val profile = profileDatabase.profilesMap[0]!! - assertThat(profile.learnerId).isEqualTo("bb1ad573") + assertThat(profile.learnerId).isEqualTo("26504347") } @Test @@ -255,7 +255,7 @@ class ProfileManagementControllerTest { val profileProvider = profileManagementController.getProfile(profileId) val profile = monitorFactory.waitForNextSuccessfulResult(profileProvider) - assertThat(profile.learnerId).isEqualTo("68fb0e6f") + assertThat(profile.learnerId).isEqualTo("a625db55") } @Test @@ -430,7 +430,7 @@ class ProfileManagementControllerTest { val learnerId = fetchSuccessfulAsyncValue(profileManagementController::fetchCurrentLearnerId) - assertThat(learnerId).isEqualTo("19b89cd8") + assertThat(learnerId).isEqualTo("02308fa0") } @Test @@ -465,7 +465,7 @@ class ProfileManagementControllerTest { profileManagementController.fetchLearnerId(PROFILE_ID_2) } - assertThat(learnerId).isEqualTo("68fb0e6f") + assertThat(learnerId).isEqualTo("a625db55") } @Test diff --git a/domain/src/test/java/org/oppia/android/domain/question/QuestionAssessmentProgressControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/question/QuestionAssessmentProgressControllerTest.kt index f5aad0432a1..0c686230064 100644 --- a/domain/src/test/java/org/oppia/android/domain/question/QuestionAssessmentProgressControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/question/QuestionAssessmentProgressControllerTest.kt @@ -134,7 +134,7 @@ class QuestionAssessmentProgressControllerTest { setUpTestApplicationWithSeed(questionSeed = 0) // Can't retrieve the current question until the training session is started. - assertThrows(UninitializedPropertyAccessException::class) { + assertThrows() { questionAssessmentProgressController.getCurrentQuestion() } } diff --git a/model/src/main/proto/BUILD.bazel b/model/src/main/proto/BUILD.bazel index a168e981191..e512512b10f 100644 --- a/model/src/main/proto/BUILD.bazel +++ b/model/src/main/proto/BUILD.bazel @@ -273,7 +273,10 @@ java_lite_proto_library( oppia_proto_library( name = "feedback_reporting_proto", srcs = ["feedback_reporting.proto"], - deps = [":profile_proto"], + deps = [ + ":languages_proto", + ":profile_proto", + ], ) java_lite_proto_library( diff --git a/scripts/src/java/org/oppia/android/scripts/testing/TestGitRepository.kt b/scripts/src/java/org/oppia/android/scripts/testing/TestGitRepository.kt index 61d5c055992..2de94e3fc1f 100644 --- a/scripts/src/java/org/oppia/android/scripts/testing/TestGitRepository.kt +++ b/scripts/src/java/org/oppia/android/scripts/testing/TestGitRepository.kt @@ -19,20 +19,29 @@ class TestGitRepository( private val commandExecutor: CommandExecutor ) { private val rootDirectory by lazy { temporaryRootFolder.root } + private val gitDirectory: File get() = File(rootDirectory, ".git") + private val userEmail: String? + get() = maybeExecuteGitCommand("config", "--local", "--get", "user.email")?.joinOutput()?.trim() + private val userName: String? + get() = maybeExecuteGitCommand("config", "--local", "--get", "user.name")?.joinOutput()?.trim() /** Creates the repository using git init. */ fun init() { + verifyNotInGitRepository() executeSuccessfulGitCommand("init") } /** Sets the user's [email] and [name] using git config. */ fun setUser(email: String, name: String) { - executeSuccessfulGitCommand("config", "user.email", email) - executeSuccessfulGitCommand("config", "user.name", name) + verifyInGitRepository() + verifyUserIsNotSet() + executeSuccessfulGitCommand("config", "--local", "user.email", email) + executeSuccessfulGitCommand("config", "--local", "user.name", name) } /** Creates a new branch with the specified name, and switches to it. */ fun checkoutNewBranch(branchName: String) { + verifyInGitRepository() executeSuccessfulGitCommand("checkout", "-b", branchName) } @@ -42,6 +51,7 @@ class TestGitRepository( * This does not perform a commit. See [commit] for actually committing the change. */ fun stageFileForCommit(file: File) { + verifyInGitRepository() executeSuccessfulGitCommand("add", file.toRelativeString(rootDirectory)) } @@ -57,6 +67,7 @@ class TestGitRepository( * This does not perform a commit. See [commit] for actually committing the change. */ fun removeFileForCommit(file: File) { + verifyInGitRepository() executeSuccessfulGitCommand("rm", file.toRelativeString(rootDirectory)) } @@ -67,6 +78,7 @@ class TestGitRepository( * This does not perform a commit. See [commit] for actually committing the change. */ fun moveFileForCommit(oldFile: File, newFile: File) { + verifyInGitRepository() executeSuccessfulGitCommand( "mv", oldFile.toRelativeString(rootDirectory), @@ -81,25 +93,59 @@ class TestGitRepository( * @param allowEmpty whether to allow empty commits (i.e. committing with no staged files) */ fun commit(message: String, allowEmpty: Boolean = false) { + verifyInGitRepository() + verifyUserIsSet() val arguments = mutableListOf("commit", "-m", message) if (allowEmpty) arguments += "--allow-empty" executeSuccessfulGitCommand(*arguments.toTypedArray()) } /** Returns the result of git status. */ - fun status(): String { - return commandExecutor.executeCommand(rootDirectory, "git", "status").output.joinOutputString() + fun status(checkForGitRepository: Boolean = true): String { + if (checkForGitRepository) verifyInGitRepository() + return executeGitCommand("status").joinOutput() } - private fun executeSuccessfulGitCommand(vararg arguments: String) { - verifySuccessfulCommand(commandExecutor.executeCommand(rootDirectory, "git", *arguments)) - } + private fun executeGitCommand(vararg arguments: String): CommandResult = + commandExecutor.executeCommand(rootDirectory, "git", *arguments) + + private fun maybeExecuteGitCommand(vararg arguments: String): CommandResult? = + executeGitCommand(*arguments).takeIf { it.exitCode == 0 } + + private fun executeSuccessfulGitCommand(vararg arguments: String) = + verifySuccessfulCommand(executeGitCommand(*arguments)) private fun verifySuccessfulCommand(result: CommandResult) { - assertWithMessage("Output: ${result.output.joinOutputString()}") + assertWithMessage("Output: ${result.joinOutput()}") .that(result.exitCode) .isEqualTo(0) } - private fun List.joinOutputString(): String = joinToString(separator = "\n") { " $it" } + private fun verifyInGitRepository() { + failUnless(gitDirectory.exists()) { "Not operating in an initialized Git repository." } + } + + private fun verifyNotInGitRepository() { + failUnless(!gitDirectory.exists()) { "Git repository is already initialized." } + } + + private fun verifyUserIsNotSet() { + verifyIsNotSet(name = "User email", userEmail) + verifyIsNotSet(name = "User name", userName) + } + + private fun verifyUserIsSet() { + failUnless(userEmail != null) { "User email has not yet been set." } + failUnless(userName != null) { "User name has not yet been set." } + } + + private fun verifyIsNotSet(name: String, value: String?) { + failUnless(value == null) { "$name has already been set: $value." } + } + + private fun failUnless(condition: Boolean, lazyMessage: () -> String) { + if (!condition) throw AssertionError(lazyMessage()) + } + + private fun CommandResult.joinOutput(): String = output.joinToString(separator = "\n") { " $it" } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/build/FilterPerLanguageResourcesTest.kt b/scripts/src/javatests/org/oppia/android/scripts/build/FilterPerLanguageResourcesTest.kt index 8c217740d10..511b07f37e9 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/build/FilterPerLanguageResourcesTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/build/FilterPerLanguageResourcesTest.kt @@ -86,21 +86,21 @@ class FilterPerLanguageResourcesTest { @Test fun testUtility_noArgs_failsWithUsageString() { - val error = assertThrows(IllegalArgumentException::class) { runScript() } + val error = assertThrows() { runScript() } assertThat(error).hasMessageThat().contains(USAGE_STRING) } @Test fun testUtility_oneArg_failsWithUsageString() { - val error = assertThrows(IllegalArgumentException::class) { runScript("first_file.zip") } + val error = assertThrows() { runScript("first_file.zip") } assertThat(error).hasMessageThat().contains(USAGE_STRING) } @Test fun testUtility_threeArgs_failsWithUsageString() { - val error = assertThrows(IllegalArgumentException::class) { + val error = assertThrows() { runScript( tempFolder.getFilePath("input.zip"), tempFolder.getFilePath("output.zip"), "extra_param" ) @@ -114,7 +114,7 @@ class FilterPerLanguageResourcesTest { // Create an empty zip file. ZipOutputStream(File(tempFolder.root, "input.zip").outputStream()).close() - val error = assertThrows(IllegalStateException::class) { + val error = assertThrows() { runScript(tempFolder.getFilePath("input.zip"), tempFolder.getFilePath("output.zip")) } @@ -129,7 +129,7 @@ class FilterPerLanguageResourcesTest { ResourceTable.getDefaultInstance().writeTo(outputStream) } - val error = assertThrows(IllegalStateException::class) { + val error = assertThrows() { runScript(tempFolder.getFilePath("input.zip"), tempFolder.getFilePath("output.zip")) } @@ -147,7 +147,7 @@ class FilterPerLanguageResourcesTest { supportedLanguages = SUPPORTED_LANGUAGES_EN ) - val error = assertThrows(IllegalStateException::class) { + val error = assertThrows() { runScript(tempFolder.getFilePath("input.zip"), tempFolder.getFilePath("output.zip")) } diff --git a/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt b/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt index 424d22b661f..5d197b04615 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt @@ -70,7 +70,7 @@ class TransformAndroidManifestTest { fun testUtility_noArgs_failsWithUsageString() { initializeEmptyGitRepository() - val exception = assertThrows(IllegalStateException::class) { runScript() } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(USAGE_STRING) } @@ -79,7 +79,7 @@ class TransformAndroidManifestTest { fun testUtility_oneArg_failsWithUsageString() { initializeEmptyGitRepository() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript(tempFolder.root.absolutePath) } @@ -91,7 +91,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript(tempFolder.root.absolutePath, manifestFile.absolutePath) } @@ -103,7 +103,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -119,7 +119,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -136,7 +136,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -154,7 +154,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -173,7 +173,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -193,7 +193,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -214,7 +214,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -236,7 +236,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -258,7 +258,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, @@ -280,7 +280,7 @@ class TransformAndroidManifestTest { initializeEmptyGitRepository() val manifestFile = tempFolder.newFile(TEST_MANIFEST_FILE_NAME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( "nowhere", manifestFile.absolutePath, @@ -301,7 +301,7 @@ class TransformAndroidManifestTest { fun testUtility_allArgs_manifestDoesNotExist_failsWithError() { initializeEmptyGitRepository() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, "fake_manifest_file", @@ -325,7 +325,7 @@ class TransformAndroidManifestTest { writeText(TEST_MANIFEST_CONTENT_WITHOUT_VERSIONS_AND_APPLICATION) } - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript( tempFolder.root.absolutePath, manifestFile.absolutePath, diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel index cb9eafb6d21..3160447f15f 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel @@ -8,7 +8,7 @@ kt_jvm_test( name = "ComputeAffectedTestsTest", size = "large", srcs = ["ComputeAffectedTestsTest.kt"], - shard_count = 4, + shard_count = 8, deps = [ "//scripts/src/java/org/oppia/android/scripts/ci:compute_affected_tests_lib", "//scripts/src/java/org/oppia/android/scripts/common:proto_string_encoder", diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt index 654e42425c8..5bbdc432d62 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt @@ -57,12 +57,12 @@ class ComputeAffectedTestsTest { // Print the status of the git repository to help with debugging in the cases of test failures // and to help manually verify the expect git state at the end of each test. println("git status (at end of test):") - println(testGitRepository.status()) + println(testGitRepository.status(checkForGitRepository = false)) } @Test fun testUtility_noArguments_printsUsageStringAndExits() { - val exception = assertThrows(SecurityException::class) { main(arrayOf()) } + val exception = assertThrows() { main(arrayOf()) } // Bazel catches the System.exit() call and throws a SecurityException. This is a bit hacky way // to verify that System.exit() is called, but it's helpful. @@ -72,7 +72,7 @@ class ComputeAffectedTestsTest { @Test fun testUtility_oneArgument_printsUsageStringAndExits() { - val exception = assertThrows(SecurityException::class) { main(arrayOf("first")) } + val exception = assertThrows() { main(arrayOf("first")) } // Bazel catches the System.exit() call and throws a SecurityException. This is a bit hacky way // to verify that System.exit() is called, but it's helpful. @@ -82,7 +82,7 @@ class ComputeAffectedTestsTest { @Test fun testUtility_twoArguments_printsUsageStringAndExits() { - val exception = assertThrows(SecurityException::class) { main(arrayOf("first", "second")) } + val exception = assertThrows() { main(arrayOf("first", "second")) } // Bazel catches the System.exit() call and throws a SecurityException. This is a bit hacky way // to verify that System.exit() is called, but it's helpful. @@ -92,7 +92,7 @@ class ComputeAffectedTestsTest { @Test fun testUtility_threeArguments_printsUsageStringAndExits() { - val exception = assertThrows(SecurityException::class) { + val exception = assertThrows() { main(arrayOf("first", "second", "third")) } @@ -104,7 +104,7 @@ class ComputeAffectedTestsTest { @Test fun testUtility_directoryRootDoesNotExist_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { main(arrayOf("fake", "alsofake", "andstillfake", "compute_all_tests=false")) } @@ -113,7 +113,7 @@ class ComputeAffectedTestsTest { @Test fun testUtility_invalid_lastArgument_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { main(arrayOf("fake", "alsofake", "andstillfake", "compute_all_testss=false")) } @@ -123,7 +123,7 @@ class ComputeAffectedTestsTest { @Test fun testUtility_invalid_lastArgumentValue_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { main(arrayOf("fake", "alsofake", "andstillfake", "compute_all_tests=blah")) } @@ -133,7 +133,7 @@ class ComputeAffectedTestsTest { @Test fun testUtility_emptyDirectory_throwsException() { - val exception = assertThrows(IllegalStateException::class) { runScript() } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains("run from the workspace's root directory") } diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/RetrieveAffectedTestsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/ci/RetrieveAffectedTestsTest.kt index d43a7055f51..e449b856a6f 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/RetrieveAffectedTestsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/RetrieveAffectedTestsTest.kt @@ -45,7 +45,7 @@ class RetrieveAffectedTestsTest { @Test fun testUtility_noArguments_printsUsageStringAndExits() { - val exception = assertThrows(SecurityException::class) { runScript() } + val exception = assertThrows() { runScript() } // Bazel catches the System.exit() call and throws a SecurityException. This is a bit hacky way // to verify that System.exit() is called, but it's helpful. @@ -55,7 +55,7 @@ class RetrieveAffectedTestsTest { @Test fun testUtility_oneArgument_printsUsageStringAndExits() { - val exception = assertThrows(SecurityException::class) { runScript("arg1") } + val exception = assertThrows() { runScript("arg1") } // Bazel catches the System.exit() call and throws a SecurityException. This is a bit hacky way // to verify that System.exit() is called, but it's helpful. @@ -65,7 +65,7 @@ class RetrieveAffectedTestsTest { @Test fun testUtility_twoArguments_printsUsageStringAndExits() { - val exception = assertThrows(SecurityException::class) { runScript("arg1", "arg2") } + val exception = assertThrows() { runScript("arg1", "arg2") } // Bazel catches the System.exit() call and throws a SecurityException. This is a bit hacky way // to verify that System.exit() is called, but it's helpful. @@ -75,7 +75,7 @@ class RetrieveAffectedTestsTest { @Test fun testUtility_invalidBase64_throwsException() { - assertThrows(IllegalArgumentException::class) { runScript("badbase64", "file1", "file2") } + assertThrows() { runScript("badbase64", "file1", "file2") } } @Test diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel index e47fc741ab6..bceb5cfe864 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel @@ -8,6 +8,7 @@ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") kt_jvm_test( name = "BazelClientTest", srcs = ["BazelClientTest.kt"], + shard_count = 4, deps = [ "//scripts/src/java/org/oppia/android/scripts/common:bazel_client", "//scripts/src/java/org/oppia/android/scripts/testing:test_bazel_workspace", diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt index f2e7914682c..07aa4d4134c 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt @@ -48,7 +48,7 @@ class BazelClientTest { fun testRetrieveTestTargets_emptyFolder_fails() { val bazelClient = BazelClient(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { bazelClient.retrieveAllTestTargets() } @@ -62,7 +62,7 @@ class BazelClientTest { val bazelClient = BazelClient(tempFolder.root) testBazelWorkspace.initEmptyWorkspace() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { bazelClient.retrieveAllTestTargets() } diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt index e04c0954b85..78dc945dff6 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt @@ -37,7 +37,7 @@ class CommandExecutorImplTest { fun testExecute_echo_invalidDirectory_throwsException() { val commandExecutor = CommandExecutorImpl() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { commandExecutor.executeCommand(File("invaliddirectory"), "echo", "value") } @@ -53,7 +53,7 @@ class CommandExecutorImplTest { // Produce a large output so that echo takes a bit longer to reduce the likelihood of this test // flaking on faster machines. val largeOutput = "a".repeat(100_000) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { commandExecutor.executeCommand(tempFolder.root, "echo", largeOutput) } @@ -65,7 +65,7 @@ class CommandExecutorImplTest { fun testExecute_nonexistentCommand_throwsException() { val commandExecutor = CommandExecutorImpl() - val exception = assertThrows(IOException::class) { + val exception = assertThrows() { commandExecutor.executeCommand(tempFolder.root, "commanddoesnotexist") } diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt index 9362d7dd006..5cbda509373 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt @@ -37,14 +37,14 @@ class GitClientTest { // Print the status of the git repository to help with debugging in the cases of test failures // and to help manually verify the expect git state at the end of each test. println("git status (at end of test):") - println(testGitRepository.status()) + println(testGitRepository.status(checkForGitRepository = false)) } @Test fun testCurrentCommit_forNonRepository_throwsException() { val gitClient = GitClient(tempFolder.root, "develop") - val exception = assertThrows(IllegalStateException::class) { gitClient.currentCommit } + val exception = assertThrows() { gitClient.currentCommit } assertThat(exception).hasMessageThat().contains("Expected non-zero exit code") assertThat(exception).hasMessageThat().ignoringCase().contains("not a git repository") @@ -80,7 +80,7 @@ class GitClientTest { fun testCurrentBranch_forNonRepository_throwsException() { val gitClient = GitClient(tempFolder.root, "develop") - val exception = assertThrows(IllegalStateException::class) { gitClient.currentBranch } + val exception = assertThrows() { gitClient.currentBranch } assertThat(exception).hasMessageThat().contains("Expected non-zero exit code") assertThat(exception).hasMessageThat().ignoringCase().contains("not a git repository") diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt index b03c106500a..bed9db19a1b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt @@ -34,14 +34,14 @@ class ProtoStringEncoderTest { @Test fun testDecode_emptyString_throwsException() { - assertThrows(EOFException::class) { + assertThrows() { TestMessage.getDefaultInstance().mergeFromCompressedBase64(base64 = "") } } @Test fun testDecode_badString_throwsException() { - assertThrows(ZipException::class) { + assertThrows() { TestMessage.getDefaultInstance().mergeFromCompressedBase64(base64 = "asdf") } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt index 9a7b61faa6a..58b99cf4db5 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt @@ -281,7 +281,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -357,7 +357,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -387,7 +387,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -416,7 +416,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -442,7 +442,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -468,7 +468,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -495,7 +495,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -522,7 +522,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -550,7 +550,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -577,7 +577,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -604,7 +604,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -632,7 +632,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -668,7 +668,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -709,7 +709,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -755,7 +755,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -800,7 +800,7 @@ class KdocValidityCheckTest { tempFile2.writeText(testContent2) tempFile3.writeText(testContent3) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -879,7 +879,7 @@ class KdocValidityCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -913,7 +913,7 @@ class KdocValidityCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } diff --git a/scripts/src/javatests/org/oppia/android/scripts/label/AccessibilityLabelCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/label/AccessibilityLabelCheckTest.kt index a1410b3ead2..900140e93f7 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/label/AccessibilityLabelCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/label/AccessibilityLabelCheckTest.kt @@ -92,7 +92,7 @@ class AccessibilityLabelCheckTest { val manifestFile = tempFolder.newFile("testfiles/$tempFileRelativePath") manifestFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main( retrieveTestFilesDirectoryPath(), "${tempFolder.root}/$pathToProtoBinary", @@ -134,7 +134,7 @@ class AccessibilityLabelCheckTest { val manifestFile = tempFolder.newFile("testfiles/$tempFileRelativePath") manifestFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main( retrieveTestFilesDirectoryPath(), "${tempFolder.root}/$pathToProtoBinary", @@ -244,7 +244,7 @@ class AccessibilityLabelCheckTest { appManifestFile.writeText(testContent1) splashManifestFile.writeText(testContent2) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main( retrieveTestFilesDirectoryPath(), "${tempFolder.root}/$pathToProtoBinary", @@ -308,7 +308,7 @@ class AccessibilityLabelCheckTest { appManifestFile.writeText(testContent1) splashManifestFile.writeText(testContent2) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main( retrieveTestFilesDirectoryPath(), "${tempFolder.root}/$pathToProtoBinary", @@ -393,7 +393,7 @@ class AccessibilityLabelCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main( retrieveTestFilesDirectoryPath(), "${tempFolder.root}/$pathToProtoBinary", @@ -436,7 +436,7 @@ class AccessibilityLabelCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main( retrieveTestFilesDirectoryPath(), "${tempFolder.root}/$pathToProtoBinary", diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/LicenseTextsCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/LicenseTextsCheckTest.kt index 8a70436c6c7..baf034a9095 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/LicenseTextsCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/LicenseTextsCheckTest.kt @@ -41,7 +41,7 @@ class LicenseTextsCheckTest { val thirdPartyDepsXmlFile = tempFolder.newFile("values/third_party_dependencies.xml") thirdPartyDepsXmlFile.writeText(WARNING_COMMENT) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(arrayOf()) } @@ -53,7 +53,7 @@ class LicenseTextsCheckTest { val thirdPartyDepsXmlFile = tempFolder.newFile("values/third_party_dependencies.xml") thirdPartyDepsXmlFile.writeText("") - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(arrayOf("${tempFolder.root}/values/third_party_dependencies.xml")) } @@ -72,7 +72,7 @@ class LicenseTextsCheckTest { """.trimIndent() ) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(arrayOf("${tempFolder.root}/values/third_party_dependencies.xml")) } @@ -110,7 +110,7 @@ class LicenseTextsCheckTest { @Test fun testLicenseTexsCheck_xmlFileNotPresent_checkFailsWithFileNotFoundException() { val pathToThirdPartyDepsXml = "${tempFolder.root}/values/third_party_dependencies.xml" - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(arrayOf("${tempFolder.root}/values/third_party_dependencies.xml")) } diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt index f30b261f53a..5fdc807e3db 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt @@ -110,7 +110,7 @@ class MavenDependenciesListCheckTest { val coordsList = listOf(DATA_BINDING_DEP, FIREBASE_ANALYTICS_DEP) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -186,7 +186,7 @@ class MavenDependenciesListCheckTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -250,7 +250,7 @@ class MavenDependenciesListCheckTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -326,7 +326,7 @@ class MavenDependenciesListCheckTest { val coordsList = listOf(GLIDE_DEP) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -405,7 +405,7 @@ class MavenDependenciesListCheckTest { val coordsList = listOf(GLIDE_DEP) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -481,7 +481,7 @@ class MavenDependenciesListCheckTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -559,7 +559,7 @@ class MavenDependenciesListCheckTest { ) setUpBazelEnvironmentWithUpdatedFirebaseDependency(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -637,7 +637,7 @@ class MavenDependenciesListCheckTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -770,7 +770,7 @@ class MavenDependenciesListCheckTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -819,7 +819,7 @@ class MavenDependenciesListCheckTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor @@ -874,7 +874,7 @@ class MavenDependenciesListCheckTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, commandExecutor diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt index 6d63a6e9c6d..4507d76a5dc 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt @@ -96,7 +96,7 @@ class GenerateMavenDependenciesListTest { val coordsList = listOf(DEP_WITH_SCRAPABLE_LICENSE, DEP_WITH_DIRECT_LINK_ONLY_LICENSE) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -180,7 +180,7 @@ class GenerateMavenDependenciesListTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -204,7 +204,7 @@ class GenerateMavenDependenciesListTest { val coordsList = listOf(DEP_WITH_DIRECT_LINK_ONLY_LICENSE) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -246,7 +246,7 @@ class GenerateMavenDependenciesListTest { val coordsList = listOf(DEP_WITH_SCRAPABLE_AND_EXTRACTED_COPY_LICENSES) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -313,7 +313,7 @@ class GenerateMavenDependenciesListTest { val coordsList = listOf(DEP_WITH_INVALID_LINKS) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -355,7 +355,7 @@ class GenerateMavenDependenciesListTest { val coordsList = listOf(DEP_WITH_NO_LICENSE) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -614,7 +614,7 @@ class GenerateMavenDependenciesListTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -790,7 +790,7 @@ class GenerateMavenDependenciesListTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -915,7 +915,7 @@ class GenerateMavenDependenciesListTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor @@ -1028,7 +1028,7 @@ class GenerateMavenDependenciesListTest { ) setUpBazelEnvironment(coordsList) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, commandExecutor diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt index 6be3f9c0d71..d889d6ede2b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/RetrieveLicenseTextsTest.kt @@ -63,7 +63,7 @@ class RetrieveLicenseTextsTest { @Test fun testScript_oneArgument_printsUsageStringAndThrowsException() { - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { RetrieveLicenseTexts(mockLicenseFetcher).main(arrayOf()) } @@ -73,7 +73,7 @@ class RetrieveLicenseTextsTest { @Test fun testScript_oneArguments_printsUsageStringAndThrowsException() { - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { RetrieveLicenseTexts(mockLicenseFetcher).main( arrayOf( "${tempFolder.root}/values" @@ -92,7 +92,7 @@ class RetrieveLicenseTextsTest { val pbFile = tempFolder.newFile("scripts/assets/maven_dependencies.pb") pbFile.outputStream().use { mavenDependencyList.writeTo(it) } - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { RetrieveLicenseTexts(mockLicenseFetcher).main( arrayOf( "${tempFolder.root}/values", @@ -111,7 +111,7 @@ class RetrieveLicenseTextsTest { val pbFile = tempFolder.newFile("scripts/assets/maven_dependencies.pb") pbFile.outputStream().use { mavenDependencyList.writeTo(it) } - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { RetrieveLicenseTexts(mockLicenseFetcher).main( arrayOf( "${tempFolder.root}/values", @@ -141,7 +141,7 @@ class RetrieveLicenseTextsTest { val pbFile = tempFolder.newFile("scripts/assets/maven_dependencies.pb") pbFile.outputStream().use { mavenDependencyList.writeTo(it) } - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { RetrieveLicenseTexts(mockLicenseFetcher).main( arrayOf( "${tempFolder.root}/values", diff --git a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt index ae1d4fa60ff..39550f0f8ae 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt @@ -257,7 +257,7 @@ class RegexPatternValidationCheckTest { val tempFile = tempFolder.newFile("testfiles/data/src/main/TestActivity.kt") tempFile.writeText(requiredContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -287,7 +287,7 @@ class RegexPatternValidationCheckTest { tempFolder.newFolder("testfiles", "app", "src", "main", "res", "values", "subdir") tempFolder.newFile("testfiles/app/src/main/res/values/subdir/strings.xml") - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -307,7 +307,7 @@ class RegexPatternValidationCheckTest { tempFolder.newFolder("testfiles", "domain", "src", "main", "res", "drawable", "subdir") tempFolder.newFile("testfiles/domain/src/main/res/drawable/subdir/example.png") - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -337,7 +337,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -357,7 +357,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -377,7 +377,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -397,7 +397,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -417,7 +417,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -437,7 +437,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -457,7 +457,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -477,7 +477,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -497,7 +497,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -517,7 +517,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -537,7 +537,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -557,7 +557,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -577,7 +577,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -597,7 +597,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -617,7 +617,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -637,7 +637,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -657,7 +657,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -677,7 +677,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -697,7 +697,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -717,7 +717,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -737,7 +737,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -757,7 +757,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -777,7 +777,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -797,7 +797,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -817,7 +817,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -837,7 +837,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -857,7 +857,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -877,7 +877,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -897,7 +897,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -917,7 +917,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -937,7 +937,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -957,7 +957,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -977,7 +977,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -997,7 +997,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1018,7 +1018,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1039,7 +1039,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1072,7 +1072,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/untranslated_strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1093,7 +1093,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/untranslated_strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1114,7 +1114,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1135,7 +1135,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1207,7 +1207,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1250,7 +1250,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.java" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1285,7 +1285,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1317,7 +1317,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1345,7 +1345,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1370,7 +1370,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1400,7 +1400,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1443,7 +1443,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/SomeActivity.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent + requiredContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1465,7 +1465,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/SomeActivity.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent + requiredContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1487,7 +1487,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/SomeActivity.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent + requiredContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1508,7 +1508,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/SomeDialogFragment.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1541,7 +1541,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/AndroidManifest.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1571,7 +1571,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/AndroidManifest.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1601,7 +1601,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/AndroidManifest.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1622,7 +1622,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1643,7 +1643,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1669,7 +1669,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1692,7 +1692,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1713,7 +1713,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1745,7 +1745,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = "test_layout.xml" tempFolder.newFile("testfiles/$fileContainsSupportLibraryImport").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1774,7 +1774,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/test/SomeTest.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1796,7 +1796,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1817,7 +1817,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/BUILD" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1838,7 +1838,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/BUILD.bazel" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1859,7 +1859,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1881,7 +1881,7 @@ class RegexPatternValidationCheckTest { val prohibitedFile = tempFolder.newFile("testfiles/data/src/main/TestActivity.kt") prohibitedFile.writeText(prohibitedContent + requiredContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1914,7 +1914,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_palette.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -1964,7 +1964,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_defs.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2012,7 +2012,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/component_colors.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2059,7 +2059,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_defs.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2123,7 +2123,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/component_colors.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2171,7 +2171,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_palette.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2218,7 +2218,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_defs.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2263,7 +2263,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/component_colors.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2311,7 +2311,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/layout/test_layout.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2381,7 +2381,7 @@ class RegexPatternValidationCheckTest { tempFolder.newFile("testfiles/$stringFilePath5").writeText(prohibitedContent) tempFolder.newFile("testfiles/$stringFilePath6").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2438,7 +2438,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_palette.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2460,7 +2460,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/activity/HomeActivity.kt" tempFolder.newFile("testfiles/$stringFilePath") - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2492,7 +2492,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/activity/HomeActivityTest.kt" tempFolder.newFile("testfiles/$stringFilePath") - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2528,7 +2528,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/SomeInitializer.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2553,7 +2553,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2578,7 +2578,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2603,7 +2603,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -2633,7 +2633,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { runScript() } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -2657,7 +2657,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { runScript() } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -2682,7 +2682,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { runScript() } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -2720,7 +2720,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { runScript() } + val exception = assertThrows() { runScript() } // Two patterns are combined in this check because they slightly overlap in affected cases (e.g. // line 2 fails due to three different checks), and one pattern is subequently needed for the @@ -2752,7 +2752,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { runScript() } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -2782,7 +2782,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { runScript() } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -2807,7 +2807,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { runScript() } + val exception = assertThrows() { runScript() } // 'Punctuation' currently assumes a period. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) diff --git a/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt index a0fc700b720..3c22ca1ac31 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt @@ -52,7 +52,7 @@ class TestFileCheckTest { tempFolder.newFile("testfiles/ProdFile1Test.kt") tempFolder.newFile("testfiles/ProdFile2.kt") - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -73,7 +73,7 @@ class TestFileCheckTest { tempFolder.newFile("testfiles/ProdFile2.kt") tempFolder.newFile("testfiles/ProdFile3.kt") - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -95,7 +95,7 @@ class TestFileCheckTest { tempFolder.newFile("testfiles/ProdFile3.kt") tempFolder.newFile("testfiles/ProdFile2.kt") - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt index 9bec557f4ac..00cbba1f19c 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt @@ -59,7 +59,7 @@ class TestBazelWorkspaceTest { // Verify that when initializing an empty workspace fails, an AssertionError is thrown (which // would fail for calling tests). - assertThrows(AssertionError::class) { testBazelWorkspace.initEmptyWorkspace() } + assertThrows() { testBazelWorkspace.initEmptyWorkspace() } } @Test @@ -215,7 +215,7 @@ class TestBazelWorkspaceTest { testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", testFile = tempFolder.newFile("FirstTestOther.kt") @@ -492,7 +492,7 @@ class TestBazelWorkspaceTest { testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { testBazelWorkspace.createTest(testName = "FirstTest") } @@ -786,7 +786,7 @@ class TestBazelWorkspaceTest { testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary(dependencyName = "FirstLib") - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { testBazelWorkspace.createLibrary(dependencyName = "FirstLib") } @@ -822,7 +822,7 @@ class TestBazelWorkspaceTest { val testBazelWorkspace = TestBazelWorkspace(tempFolder) // A non-existent test file cannot be retrieved. - assertThrows(NoSuchElementException::class) { + assertThrows() { testBazelWorkspace.retrieveTestFile(testName = "Invalid") } } @@ -844,7 +844,7 @@ class TestBazelWorkspaceTest { val testBazelWorkspace = TestBazelWorkspace(tempFolder) // A non-existent library file cannot be retrieved. - assertThrows(NoSuchElementException::class) { + assertThrows() { testBazelWorkspace.retrieveLibraryFile(dependencyName = "Invalid") } } @@ -865,7 +865,7 @@ class TestBazelWorkspaceTest { fun testRetrieveTestDependencyFile_noTest_throwsExceptionWithHelpfulMessage() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { testBazelWorkspace.retrieveTestDependencyFile(testName = "Invalid") } @@ -878,7 +878,7 @@ class TestBazelWorkspaceTest { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.createTest("ValidWithoutDep") - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { testBazelWorkspace.retrieveTestDependencyFile(testName = "ValidWithoutDep") } diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt index 59aa28bdc84..453f17da044 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt @@ -59,11 +59,11 @@ class TestGitRepositoryTest { fun testSetUser_noGitRepository_throwsAssertionError() { val testGitRepository = TestGitRepository(tempFolder, commandExecutorInterceptor) - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.setUser(email = "test@oppia.org", name = "Test User") } - assertThat(error).hasMessageThat().contains("not in a git directory") + assertThat(error).hasMessageThat().contains("Not operating in an initialized Git repository.") } @Test @@ -92,11 +92,11 @@ class TestGitRepositoryTest { fun testCheckOutNewBranch_notGitRepository_throwsAssertionError() { val testGitRepository = TestGitRepository(tempFolder, commandExecutorInterceptor) - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.checkoutNewBranch("develop") } - assertThat(error).hasMessageThat().ignoringCase().contains("not a git repository") + assertThat(error).hasMessageThat().contains("Not operating in an initialized Git repository.") } @Test @@ -116,7 +116,7 @@ class TestGitRepositoryTest { testGitRepository.init() testGitRepository.checkoutNewBranch("develop") - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.stageFileForCommit(File(tempFolder.root, "fake_file")) } @@ -188,7 +188,7 @@ class TestGitRepositoryTest { testGitRepository.init() testGitRepository.checkoutNewBranch("develop") - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.stageFilesForCommit( listOf( tempFolder.newFile("new_file1"), @@ -207,7 +207,7 @@ class TestGitRepositoryTest { testGitRepository.init() testGitRepository.checkoutNewBranch("develop") - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.removeFileForCommit(File(tempFolder.root, "nonexistent_file")) } @@ -221,7 +221,7 @@ class TestGitRepositoryTest { testGitRepository.checkoutNewBranch("develop") tempFolder.newFile("untracked_file") - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.removeFileForCommit(File(tempFolder.root, "untracked_file")) } @@ -250,7 +250,7 @@ class TestGitRepositoryTest { testGitRepository.init() testGitRepository.checkoutNewBranch("develop") - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.moveFileForCommit( File(tempFolder.root, "nonexistent_file"), File(tempFolder.root, "new_file") ) @@ -266,7 +266,7 @@ class TestGitRepositoryTest { testGitRepository.checkoutNewBranch("develop") tempFolder.newFile("untracked_file") - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.moveFileForCommit( File(tempFolder.root, "untracked_file"), File(tempFolder.root, "new_file") ) @@ -304,11 +304,9 @@ class TestGitRepositoryTest { testGitRepository.checkoutNewBranch("develop") testGitRepository.stageFileForCommit(tempFolder.newFile("file_to_be_committed")) - val error = assertThrows(AssertionError::class) { - testGitRepository.commit("Commit new file.") - } + val error = assertThrows { testGitRepository.commit("Commit new file.") } - assertThat(error).hasMessageThat().contains("Please tell me who you are") + assertThat(error).hasMessageThat().contains("User email has not yet been set.") } @Test @@ -318,7 +316,7 @@ class TestGitRepositoryTest { testGitRepository.checkoutNewBranch("develop") testGitRepository.setUser(email = "test@oppia.org", name = "Test User") - val error = assertThrows(AssertionError::class) { + val error = assertThrows() { testGitRepository.commit("Attempting empty commit.", allowEmpty = false) } @@ -357,14 +355,34 @@ class TestGitRepositoryTest { } @Test - fun testStatus_noGitRepository_hasStatusWithError() { + fun testStatus_noGitRepository_doNotCheckForRepository_hasStatusWithError() { val testGitRepository = TestGitRepository(tempFolder, commandExecutorInterceptor) - val status = testGitRepository.status() + val status = testGitRepository.status(checkForGitRepository = false) assertThat(status).ignoringCase().contains("not a git repository") } + @Test + fun testStatus_noGitRepository_checkForRepository_throwsAssertionError() { + val testGitRepository = TestGitRepository(tempFolder, commandExecutorInterceptor) + + val error = assertThrows() { + testGitRepository.status(checkForGitRepository = true) + } + + assertThat(error).hasMessageThat().contains("Not operating in an initialized Git repository.") + } + + @Test + fun testStatus_noGitRepository_defaultCheckForRepository_throwsAssertionError() { + val testGitRepository = TestGitRepository(tempFolder, commandExecutorInterceptor) + + val error = assertThrows() { testGitRepository.status() } + + assertThat(error).hasMessageThat().contains("Not operating in an initialized Git repository.") + } + @Test fun testStatus_onBranch_nothingStaged_statusEmpty() { val testGitRepository = TestGitRepository(tempFolder, commandExecutorInterceptor) diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueCommentCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueCommentCheckTest.kt index 6c4d5fb8a8c..2d33e0e2a60 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueCommentCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueCommentCheckTest.kt @@ -51,7 +51,7 @@ class TodoIssueCommentCheckTest { latestCommentFile.writeText(latestCommentContent) scriptFailureCommentFile.writeText(scriptFailureCommentContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(tempFolder.root.toString(), "latest_comment.txt", "script_failures.txt") } assertThat(exception).hasMessageThat().contains("NEW COMMENT SHOULD BE POSTED") @@ -80,7 +80,7 @@ class TodoIssueCommentCheckTest { latestCommentFile.writeText(latestCommentContent) scriptFailureCommentFile.writeText(scriptFailureCommentContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(tempFolder.root.toString(), "latest_comment.txt", "script_failures.txt") } assertThat(exception).hasMessageThat().contains("NEW COMMENT SHOULD BE POSTED") @@ -109,7 +109,7 @@ class TodoIssueCommentCheckTest { latestCommentFile.writeText(latestCommentContent) scriptFailureCommentFile.writeText(scriptFailureCommentContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(tempFolder.root.toString(), "latest_comment.txt", "script_failures.txt") } assertThat(exception).hasMessageThat().contains("NEW COMMENT SHOULD BE POSTED") diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt index ae273159b92..4880c092ec5 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt @@ -105,7 +105,7 @@ class TodoIssueResolvedCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(retrieveTestFilesDirectoryPath(), "169877", "abmzuyt") } @@ -149,7 +149,7 @@ class TodoIssueResolvedCheckTest { tempFile2.writeText(testContent2) tempFile3.writeText(testContent3) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(retrieveTestFilesDirectoryPath(), "169877", "abmzuyt") } @@ -195,7 +195,7 @@ class TodoIssueResolvedCheckTest { tempFile2.writeText(testContent2) tempFile3.writeText(testContent3) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { main(retrieveTestFilesDirectoryPath(), "169877", "abmzuyt") } val fileContentList = diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index 23f42c53f2c..68b162340ac 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -43,7 +43,7 @@ class TodoOpenCheckTest { @Test fun testTodoCheck_noJsonFilePresent_checkShouldFail() { - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -103,7 +103,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -141,7 +141,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -185,7 +185,7 @@ class TodoOpenCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -239,7 +239,7 @@ class TodoOpenCheckTest { tempFile2.writeText(testContent2) tempFile3.writeText(testContent3) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -340,7 +340,7 @@ class TodoOpenCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -391,7 +391,7 @@ class TodoOpenCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/StringLanguageTranslationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/StringLanguageTranslationCheckTest.kt index 00916b400e4..bbe2c2ca818 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/StringLanguageTranslationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/StringLanguageTranslationCheckTest.kt @@ -65,7 +65,7 @@ class StringLanguageTranslationCheckTest { @Test fun testScript_missingPath_throwsException() { - val exception = assertThrows(IllegalArgumentException::class) { runScript(/* With no path. */) } + val exception = assertThrows() { runScript(/* With no path. */) } assertThat(exception) .hasMessageThat() @@ -74,7 +74,7 @@ class StringLanguageTranslationCheckTest { @Test fun testScript_validPath_noStringFiles_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript(tempFolder.root.absolutePath) } diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceParserTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceParserTest.kt index 0e1edd3fa30..0bbe198f040 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceParserTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceParserTest.kt @@ -70,7 +70,7 @@ class StringResourceParserTest { fun testRetrieveBaseStringFile_noStrings_throwsException() { val parser = StringResourceParser(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { parser.retrieveBaseStringFile() } + val exception = assertThrows() { parser.retrieveBaseStringFile() } assertThat(exception) .hasMessageThat() @@ -88,7 +88,7 @@ class StringResourceParserTest { populateNigerianPidginTranslations() val parser = StringResourceParser(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { parser.retrieveBaseStringFile() } + val exception = assertThrows() { parser.retrieveBaseStringFile() } assertThat(exception) .hasMessageThat() @@ -103,7 +103,7 @@ class StringResourceParserTest { populateNigerianPidginTranslations() val parser = StringResourceParser(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { parser.retrieveBaseStringFile() } + val exception = assertThrows() { parser.retrieveBaseStringFile() } assertThat(exception) .hasMessageThat() @@ -118,7 +118,7 @@ class StringResourceParserTest { populateNigerianPidginTranslations() val parser = StringResourceParser(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { parser.retrieveBaseStringFile() } + val exception = assertThrows() { parser.retrieveBaseStringFile() } assertThat(exception) .hasMessageThat() @@ -133,7 +133,7 @@ class StringResourceParserTest { populateNigerianPidginTranslations() val parser = StringResourceParser(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { parser.retrieveBaseStringFile() } + val exception = assertThrows() { parser.retrieveBaseStringFile() } assertThat(exception) .hasMessageThat() @@ -148,7 +148,7 @@ class StringResourceParserTest { populateSwahiliTranslations() val parser = StringResourceParser(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { parser.retrieveBaseStringFile() } + val exception = assertThrows() { parser.retrieveBaseStringFile() } assertThat(exception) .hasMessageThat() @@ -161,7 +161,7 @@ class StringResourceParserTest { populateTranslations(appResources, "values-fake", mapOf()) val parser = StringResourceParser(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { parser.retrieveBaseStringFile() } + val exception = assertThrows() { parser.retrieveBaseStringFile() } assertThat(exception) .hasMessageThat() @@ -180,7 +180,7 @@ class StringResourceParserTest { populateTranslations(utilityResources, "values", mapOf()) val parser = StringResourceParser(tempFolder.root) - val exception = assertThrows(IllegalStateException::class) { parser.retrieveBaseStringFile() } + val exception = assertThrows() { parser.retrieveBaseStringFile() } // An exception is still thrown since resources outside the app directory are ignored. assertThat(exception) @@ -197,7 +197,7 @@ class StringResourceParserTest { writeTranslationsFile(appResources, "values", "") val parser = StringResourceParser(tempFolder.root) - assertThrows(SAXParseException::class) { parser.retrieveBaseStringFile() } + assertThrows() { parser.retrieveBaseStringFile() } } @Test diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceValidationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceValidationCheckTest.kt index e2152950a99..424a0adb8c3 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceValidationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/StringResourceValidationCheckTest.kt @@ -64,7 +64,7 @@ class StringResourceValidationCheckTest { @Test fun testScript_missingPath_throwsException() { - val exception = assertThrows(IllegalArgumentException::class) { runScript(/* With no path. */) } + val exception = assertThrows() { runScript(/* With no path. */) } assertThat(exception) .hasMessageThat() @@ -73,7 +73,7 @@ class StringResourceValidationCheckTest { @Test fun testScript_validPath_noStringFiles_fails() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { runScript(tempFolder.root.absolutePath) } @@ -105,7 +105,7 @@ class StringResourceValidationCheckTest { populateSwahiliTranslations(mapOf("str1" to SW_STRING_ONE_NEWLINE)) populateNigerianPidginTranslations(mapOf("str1" to PCM_STRING_ONE_NEWLINE)) - val exception = assertThrows(Exception::class) { runScript(tempFolder.root.absolutePath) } + val exception = assertThrows() { runScript(tempFolder.root.absolutePath) } // This output check also inadvertently verifies that the script doesn't care about missing // strings in translated string files. @@ -133,7 +133,7 @@ class StringResourceValidationCheckTest { populateSwahiliTranslations(mapOf("str1" to SW_STRING_ONE_NEWLINE)) populateNigerianPidginTranslations(mapOf("str1" to PCM_STRING_ONE_NEWLINE)) - val exception = assertThrows(Exception::class) { runScript(tempFolder.root.absolutePath) } + val exception = assertThrows() { runScript(tempFolder.root.absolutePath) } // This output check also inadvertently verifies that the script doesn't care about missing // strings in translated string files. @@ -161,7 +161,7 @@ class StringResourceValidationCheckTest { ) populateNigerianPidginTranslations(mapOf("str1" to PCM_STRING_ONE_NEWLINE)) - val exception = assertThrows(Exception::class) { runScript(tempFolder.root.absolutePath) } + val exception = assertThrows() { runScript(tempFolder.root.absolutePath) } // This output check also inadvertently verifies that the script doesn't care about missing // strings in translated string files. @@ -189,7 +189,7 @@ class StringResourceValidationCheckTest { mapOf("str1" to PCM_STRING_NO_NEWLINES, "str2" to PCM_STRING_TWO_NEWLINES) ) - val exception = assertThrows(Exception::class) { runScript(tempFolder.root.absolutePath) } + val exception = assertThrows() { runScript(tempFolder.root.absolutePath) } // This output check also inadvertently verifies that the script doesn't care about missing // strings in translated string files. @@ -223,7 +223,7 @@ class StringResourceValidationCheckTest { mapOf("str1" to PCM_STRING_NO_NEWLINES, "str2" to PCM_STRING_TWO_NEWLINES) ) - val exception = assertThrows(Exception::class) { runScript(tempFolder.root.absolutePath) } + val exception = assertThrows() { runScript(tempFolder.root.absolutePath) } // This output check also inadvertently verifies that the script doesn't care about missing // strings in translated string files. diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt index 2e988cf0663..293cca1e47e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt @@ -73,7 +73,7 @@ class XmlSyntaxCheckTest { val tempFile = tempFolder.newFile("testfiles/TestFile.xml") tempFile.writeText(invalidXml) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -112,7 +112,7 @@ class XmlSyntaxCheckTest { tempFile1.writeText(invalidXmlForFile1) tempFile2.writeText(invalidXmlForFile2) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } @@ -163,7 +163,7 @@ class XmlSyntaxCheckTest { tempFile2.writeText(invalidXmlForFile2) tempFile3.writeText(invalidXmlForFile3) - val exception = assertThrows(Exception::class) { + val exception = assertThrows() { runScript() } diff --git a/testing/src/main/java/org/oppia/android/testing/AssertionHelpers.kt b/testing/src/main/java/org/oppia/android/testing/AssertionHelpers.kt index e40d985dad7..7927cd7b79b 100644 --- a/testing/src/main/java/org/oppia/android/testing/AssertionHelpers.kt +++ b/testing/src/main/java/org/oppia/android/testing/AssertionHelpers.kt @@ -1,42 +1,37 @@ package org.oppia.android.testing -import org.junit.Assert.fail -import kotlin.reflect.KClass -import kotlin.reflect.full.cast - /* This file contains generic assertion helpers which are meant to be usable in any test. Not for methods which are specific to a certain test or part of the codebase. */ /** * A replacement to JUnit5's assertThrows() that asserts an execution of the supplied operation - * throws an exception of the supplied type + * throws an exception of the indicated type. * * An example of this might be: * - * val exception = assertThrows(IllegalArgumentException::class) { + * ```kotlin + * val exception = assertThrows() { * stringToRatioParser.parseRatioOrThrow("a:b:c") * } - * assertThat(exception) - * .hasMessageThat() - * .contains("Incorrectly formatted ratio: a:b:c") + * assertThat(exception).hasMessageThat().contains("Incorrectly formatted ratio: a:b:c") + * ``` * - * @param type the type of exception to be thrown * @param operation the operation being run * @return the exception being thrown * @throws AssertionError if the specified exception is not thrown */ -fun assertThrows(type: KClass, operation: () -> Unit): T { - try { - operation() - fail("Expected to encounter exception of $type") - } catch (t: Throwable) { - if (type.isInstance(t)) { - return type.cast(t) +inline fun assertThrows(noinline operation: () -> Unit): T { + return when (val result = try { operation() } catch (t: Throwable) { t }) { + is T -> result + is Throwable -> { + throw AssertionError( + "Expected exception of type: ${T::class.java}, not: ${result::class.java}.", result + ) + } + else -> { + throw AssertionError( + "Expected exception of type: ${T::class.java}. No exception was thrown." + ) } - // Unexpected exception; throw it. - throw t } - throw AssertionError( - "Reached an impossible state when verifying that an exception was thrown." - ) } diff --git a/testing/src/test/java/org/oppia/android/testing/FakeAnalyticsEventLoggerTest.kt b/testing/src/test/java/org/oppia/android/testing/FakeAnalyticsEventLoggerTest.kt index c3d4b258494..b6b3870763a 100644 --- a/testing/src/test/java/org/oppia/android/testing/FakeAnalyticsEventLoggerTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/FakeAnalyticsEventLoggerTest.kt @@ -75,7 +75,7 @@ class FakeAnalyticsEventLoggerTest { @Test fun testFakeEventLogger_logNothing_getMostRecent_returnsFailure() { - assertThrows(NoSuchElementException::class) { fakeAnalyticsEventLogger.getMostRecentEvent() } + assertThrows() { fakeAnalyticsEventLogger.getMostRecentEvent() } } @Test @@ -83,7 +83,7 @@ class FakeAnalyticsEventLoggerTest { analyticsEventLogger.logEvent(eventLog1) fakeAnalyticsEventLogger.clearAllEvents() - val eventException = assertThrows(NoSuchElementException::class) { + val eventException = assertThrows() { fakeAnalyticsEventLogger.getMostRecentEvent() } @@ -141,7 +141,7 @@ class FakeAnalyticsEventLoggerTest { @Test fun testGetOldestEvent_noEventsLogged_throwsException() { - assertThrows(NoSuchElementException::class) { fakeAnalyticsEventLogger.getOldestEvent() } + assertThrows() { fakeAnalyticsEventLogger.getOldestEvent() } } @Test @@ -169,7 +169,7 @@ class FakeAnalyticsEventLoggerTest { analyticsEventLogger.logEvent(eventLog1) fakeAnalyticsEventLogger.clearAllEvents() - assertThrows(NoSuchElementException::class) { fakeAnalyticsEventLogger.getOldestEvent() } + assertThrows() { fakeAnalyticsEventLogger.getOldestEvent() } } @Test @@ -234,7 +234,7 @@ class FakeAnalyticsEventLoggerTest { analyticsEventLogger.logEvent(eventLog2) analyticsEventLogger.logEvent(eventLog1) - assertThrows(IllegalArgumentException::class) { + assertThrows() { fakeAnalyticsEventLogger.getMostRecentEvents(count = -1) } } diff --git a/testing/src/test/java/org/oppia/android/testing/FakeExceptionLoggerTest.kt b/testing/src/test/java/org/oppia/android/testing/FakeExceptionLoggerTest.kt index baa7483b27e..433731da58c 100644 --- a/testing/src/test/java/org/oppia/android/testing/FakeExceptionLoggerTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/FakeExceptionLoggerTest.kt @@ -69,7 +69,7 @@ class FakeExceptionLoggerTest { @Test fun testFakeExceptionLogger_logNothing_getMostRecent_returnsFailure() { - val exception = assertThrows(NoSuchElementException::class) { + val exception = assertThrows() { fakeExceptionLogger.getMostRecentException() } @@ -81,7 +81,7 @@ class FakeExceptionLoggerTest { exceptionLogger.logException(IllegalStateException("Test Exception")) fakeExceptionLogger.clearAllExceptions() - val exception = assertThrows(NoSuchElementException::class) { + val exception = assertThrows() { fakeExceptionLogger.getMostRecentException() } diff --git a/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt b/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt index 63afc482661..7f7b55a2d17 100644 --- a/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt @@ -78,7 +78,7 @@ class FakePerformanceMetricsEventLoggerTest { @Test fun testFakeMetricsEventLogger_logNothing_getMostRecent_returnsFailure() { - assertThrows(NoSuchElementException::class) { + assertThrows() { fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() } } @@ -88,7 +88,7 @@ class FakePerformanceMetricsEventLoggerTest { performanceMetricsEventLogger.logPerformanceMetric(metricLog1) fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() - assertThrows(NoSuchElementException::class) { + assertThrows() { fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvent() } } @@ -148,7 +148,7 @@ class FakePerformanceMetricsEventLoggerTest { @Test fun testGetOldestEvent_noEventsLogged_throwsException() { - assertThrows(NoSuchElementException::class) { + assertThrows() { fakePerformanceMetricsEventLogger.getOldestPerformanceMetricsEvent() } } @@ -178,7 +178,7 @@ class FakePerformanceMetricsEventLoggerTest { performanceMetricsEventLogger.logPerformanceMetric(metricLog1) fakePerformanceMetricsEventLogger.clearAllPerformanceMetricsEvents() - assertThrows(NoSuchElementException::class) { + assertThrows() { fakePerformanceMetricsEventLogger.getOldestPerformanceMetricsEvent() } } @@ -255,7 +255,7 @@ class FakePerformanceMetricsEventLoggerTest { performanceMetricsEventLogger.logPerformanceMetric(metricLog2) performanceMetricsEventLogger.logPerformanceMetric(metricLog1) - assertThrows(IllegalArgumentException::class) { + assertThrows() { fakePerformanceMetricsEventLogger.getMostRecentPerformanceMetricsEvents(count = -1) } } diff --git a/testing/src/test/java/org/oppia/android/testing/data/DataProviderTestMonitorTest.kt b/testing/src/test/java/org/oppia/android/testing/data/DataProviderTestMonitorTest.kt index 9df6e5257d3..aaa3f578c02 100644 --- a/testing/src/test/java/org/oppia/android/testing/data/DataProviderTestMonitorTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/data/DataProviderTestMonitorTest.kt @@ -167,7 +167,7 @@ class DataProviderTestMonitorTest { } val monitor = monitorFactory.createMonitor(dataProvider) - val failure = assertThrows(IllegalStateException::class) { monitor.waitForNextSuccessResult() } + val failure = assertThrows() { monitor.waitForNextSuccessResult() } assertThat(failure).hasMessageThat().contains("Expected next result to be a success") } @@ -179,7 +179,7 @@ class DataProviderTestMonitorTest { } val monitor = monitorFactory.createMonitor(dataProvider) - val failure = assertThrows(IllegalStateException::class) { monitor.waitForNextSuccessResult() } + val failure = assertThrows() { monitor.waitForNextSuccessResult() } assertThat(failure).hasMessageThat().contains("Expected next result to be a success") } @@ -221,7 +221,7 @@ class DataProviderTestMonitorTest { monitor.waitForNextResult() // Wait for the first result. asyncDataSubscriptionManager.notifyChangeAsync("test") - val failure = assertThrows(IllegalStateException::class) { monitor.waitForNextSuccessResult() } + val failure = assertThrows() { monitor.waitForNextSuccessResult() } assertThat(failure).hasMessageThat().contains("Expected next result to be a success") } @@ -251,7 +251,7 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) // Internal expectation failure since the operation hasn't completed. - assertThrows(AssertionError::class) { monitor.ensureNextResultIsSuccess() } + assertThrows() { monitor.ensureNextResultIsSuccess() } } @Test @@ -275,7 +275,7 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) testCoroutineDispatchers.runCurrent() // Ensure the subscription is updated. - val failure = assertThrows(IllegalStateException::class) { monitor.ensureNextResultIsSuccess() } + val failure = assertThrows() { monitor.ensureNextResultIsSuccess() } assertThat(failure).hasMessageThat().contains("Expected next result to be a success") } @@ -288,26 +288,11 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) testCoroutineDispatchers.runCurrent() // Ensure the subscription is updated. - val failure = assertThrows(IllegalStateException::class) { monitor.ensureNextResultIsSuccess() } + val failure = assertThrows() { monitor.ensureNextResultIsSuccess() } assertThat(failure).hasMessageThat().contains("Expected next result to be a success") } - @Test - fun testEnsureNextResultIsSuccess_failureThenSuccess_notified_throwsException() { - val dataProvider = - createDataProviderWithResultsQueue( - "test", AsyncResult.Failure(Exception("Failure")), AsyncResult.Success("str value") - ) - val monitor = monitorFactory.createMonitor(dataProvider) - monitor.waitForNextResult() // Wait for the first result. - - asyncDataSubscriptionManager.notifyChangeAsync("test") - testCoroutineDispatchers.runCurrent() // Ensure the subscription is updated. - // Internal expectation failure since the operation hasn't completed. - assertThrows(AssertionError::class) { monitor.ensureNextResultIsSuccess() } - } - @Test fun testEnsureNextResultIsSuccess_failureThenSuccess_notified_wait_returnsLatest() { val dataProvider = @@ -335,7 +320,7 @@ class DataProviderTestMonitorTest { asyncDataSubscriptionManager.notifyChangeAsync("test") testCoroutineDispatchers.runCurrent() // Ensure the subscription is updated. - val failure = assertThrows(IllegalStateException::class) { monitor.ensureNextResultIsSuccess() } + val failure = assertThrows() { monitor.ensureNextResultIsSuccess() } assertThat(failure).hasMessageThat().contains("Expected next result to be a success") } @@ -365,7 +350,7 @@ class DataProviderTestMonitorTest { } val monitor = monitorFactory.createMonitor(dataProvider) - val failure = assertThrows(IllegalStateException::class) { monitor.waitForNextFailingResult() } + val failure = assertThrows() { monitor.waitForNextFailingResult() } assertThat(failure).hasMessageThat().contains("Expected next result to be a failure") } @@ -389,7 +374,7 @@ class DataProviderTestMonitorTest { } val monitor = monitorFactory.createMonitor(dataProvider) - val failure = assertThrows(IllegalStateException::class) { monitor.waitForNextFailingResult() } + val failure = assertThrows() { monitor.waitForNextFailingResult() } assertThat(failure).hasMessageThat().contains("Expected next result to be a failure") } @@ -419,7 +404,7 @@ class DataProviderTestMonitorTest { monitor.waitForNextResult() // Wait for the first result. asyncDataSubscriptionManager.notifyChangeAsync("test") - val failure = assertThrows(IllegalStateException::class) { monitor.waitForNextFailingResult() } + val failure = assertThrows() { monitor.waitForNextFailingResult() } assertThat(failure).hasMessageThat().contains("Expected next result to be a failure") } @@ -449,7 +434,7 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) // Internal expectation failure since the operation hasn't completed. - assertThrows(AssertionError::class) { monitor.ensureNextResultIsSuccess() } + assertThrows() { monitor.ensureNextResultIsSuccess() } } @Test @@ -473,7 +458,7 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) testCoroutineDispatchers.runCurrent() // Ensure the subscription is updated. - val failure = assertThrows(IllegalStateException::class) { monitor.ensureNextResultIsFailing() } + val failure = assertThrows() { monitor.ensureNextResultIsFailing() } assertThat(failure).hasMessageThat().contains("Expected next result to be a failure") } @@ -486,7 +471,7 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) testCoroutineDispatchers.runCurrent() // Ensure the subscription is updated. - val failure = assertThrows(IllegalStateException::class) { monitor.ensureNextResultIsFailing() } + val failure = assertThrows() { monitor.ensureNextResultIsFailing() } assertThat(failure).hasMessageThat().contains("Expected next result to be a failure") } @@ -502,7 +487,7 @@ class DataProviderTestMonitorTest { asyncDataSubscriptionManager.notifyChangeAsync("test") // Internal expectation failure since the operation hasn't completed. - assertThrows(AssertionError::class) { monitor.ensureNextResultIsFailing() } + assertThrows() { monitor.ensureNextResultIsFailing() } } @Test @@ -532,7 +517,7 @@ class DataProviderTestMonitorTest { asyncDataSubscriptionManager.notifyChangeAsync("test") testCoroutineDispatchers.runCurrent() // Ensure the subscription is updated. - val failure = assertThrows(IllegalStateException::class) { monitor.ensureNextResultIsFailing() } + val failure = assertThrows() { monitor.ensureNextResultIsFailing() } assertThat(failure).hasMessageThat().contains("Expected next result to be a failure") } @@ -563,7 +548,7 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) // Verify that the method wsa actually called despite not being expected to have been. - assertThrows(NeverWantedButInvoked::class) { monitor.verifyProviderIsNotUpdated() } + assertThrows() { monitor.verifyProviderIsNotUpdated() } } @Test @@ -574,7 +559,7 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) // Verify that the method wsa actually called despite not being expected to have been. - assertThrows(NeverWantedButInvoked::class) { monitor.verifyProviderIsNotUpdated() } + assertThrows() { monitor.verifyProviderIsNotUpdated() } } @Test @@ -585,7 +570,7 @@ class DataProviderTestMonitorTest { val monitor = monitorFactory.createMonitor(dataProvider) // Verify that the method wsa actually called despite not being expected to have been. - assertThrows(NeverWantedButInvoked::class) { monitor.verifyProviderIsNotUpdated() } + assertThrows() { monitor.verifyProviderIsNotUpdated() } } @Test @@ -599,7 +584,7 @@ class DataProviderTestMonitorTest { asyncDataSubscriptionManager.notifyChangeAsync("test") // Verify that the method wsa actually called despite not being expected to have been. - assertThrows(NeverWantedButInvoked::class) { monitor.verifyProviderIsNotUpdated() } + assertThrows() { monitor.verifyProviderIsNotUpdated() } } @Test @@ -615,7 +600,7 @@ class DataProviderTestMonitorTest { asyncDataSubscriptionManager.notifyChangeAsync("test") // Verify that the method wsa actually called despite not being expected to have been. - assertThrows(NeverWantedButInvoked::class) { monitor.verifyProviderIsNotUpdated() } + assertThrows() { monitor.verifyProviderIsNotUpdated() } } @Test @@ -630,7 +615,7 @@ class DataProviderTestMonitorTest { asyncDataSubscriptionManager.notifyChangeAsync("test") // Verify that the method wsa actually called despite not being expected to have been. - assertThrows(NeverWantedButInvoked::class) { monitor.verifyProviderIsNotUpdated() } + assertThrows() { monitor.verifyProviderIsNotUpdated() } } @Test @@ -657,7 +642,7 @@ class DataProviderTestMonitorTest { } val failure = - assertThrows(AssertionError::class) { + assertThrows() { monitorFactory.ensureDataProviderExecutes(dataProvider) } @@ -673,7 +658,7 @@ class DataProviderTestMonitorTest { } val failure = - assertThrows(AssertionError::class) { + assertThrows() { monitorFactory.ensureDataProviderExecutes(dataProvider) } @@ -688,7 +673,7 @@ class DataProviderTestMonitorTest { AsyncResult.Failure(Exception("Failure")) } - val failure = assertThrows(IllegalStateException::class) { + val failure = assertThrows() { monitorFactory.waitForNextSuccessfulResult(dataProvider) } @@ -727,7 +712,7 @@ class DataProviderTestMonitorTest { ) monitorFactory.waitForNextSuccessfulResult(dataProvider) - val failure = assertThrows(IllegalStateException::class) { + val failure = assertThrows() { monitorFactory.waitForNextSuccessfulResult(dataProvider) } @@ -770,7 +755,7 @@ class DataProviderTestMonitorTest { } val failure = - assertThrows(IllegalStateException::class) { + assertThrows() { monitorFactory.waitForNextSuccessfulResult(dataProvider) } @@ -783,7 +768,7 @@ class DataProviderTestMonitorTest { AsyncResult.Failure(Exception("Failure")) } - val failure = assertThrows(IllegalStateException::class) { + val failure = assertThrows() { monitorFactory.waitForNextSuccessfulResult(dataProvider) } @@ -822,7 +807,7 @@ class DataProviderTestMonitorTest { ) monitorFactory.waitForNextSuccessfulResult(dataProvider) - val failure = assertThrows(IllegalStateException::class) { + val failure = assertThrows() { monitorFactory.waitForNextSuccessfulResult(dataProvider) } @@ -864,7 +849,7 @@ class DataProviderTestMonitorTest { AsyncResult.Pending() } - val failure = assertThrows(IllegalStateException::class) { + val failure = assertThrows() { monitorFactory.waitForNextFailureResult(dataProvider) } @@ -888,7 +873,7 @@ class DataProviderTestMonitorTest { AsyncResult.Success("str value") } - val failure = assertThrows(IllegalStateException::class) { + val failure = assertThrows() { monitorFactory.waitForNextFailureResult(dataProvider) } @@ -916,7 +901,7 @@ class DataProviderTestMonitorTest { ) monitorFactory.waitForNextFailureResult(dataProvider) - val failure = assertThrows(IllegalStateException::class) { + val failure = assertThrows() { monitorFactory.waitForNextFailureResult(dataProvider) } diff --git a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt index f2f2b2c89f0..e4719190051 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt @@ -105,7 +105,7 @@ class InitializeDefaultLocaleRuleOmissionTest { @Test fun testSuite_withoutRule_doesNotInitializeLocaleHandlerWithDefaultContext() { // Not including the rule should result in a helpful exception being thrown. - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { appLanguageLocaleHandler.getDisplayLocale() } assertThat(exception) diff --git a/testing/src/test/java/org/oppia/android/testing/threading/CoroutineExecutorServiceTest.kt b/testing/src/test/java/org/oppia/android/testing/threading/CoroutineExecutorServiceTest.kt index 2e158ee93a1..3af786359ca 100644 --- a/testing/src/test/java/org/oppia/android/testing/threading/CoroutineExecutorServiceTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/threading/CoroutineExecutorServiceTest.kt @@ -136,7 +136,7 @@ class CoroutineExecutorServiceTest { fun testExecute_nullParameter_throwsException() { val executorService = createExecutorService() - assertThrows(NullPointerException::class) { executorService.execute(/* command= */ null) } + assertThrows() { executorService.execute(/* command= */ null) } } @Test @@ -144,7 +144,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() executorService.shutdown() - assertThrows(RejectedExecutionException::class) { executorService.execute(mockRunnable) } + assertThrows() { executorService.execute(mockRunnable) } } @Test @@ -152,7 +152,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() executorService.shutdownNow() - assertThrows(RejectedExecutionException::class) { executorService.execute(mockRunnable) } + assertThrows() { executorService.execute(mockRunnable) } } @Test @@ -179,7 +179,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() val nullRunnable: Runnable? = null - assertThrows(NullPointerException::class) { executorService.submit(nullRunnable) } + assertThrows() { executorService.submit(nullRunnable) } } @Test @@ -187,7 +187,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() executorService.shutdown() - assertThrows(RejectedExecutionException::class) { executorService.submit(mockRunnable) } + assertThrows() { executorService.submit(mockRunnable) } } @Test @@ -195,7 +195,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() executorService.shutdownNow() - assertThrows(RejectedExecutionException::class) { executorService.submit(mockRunnable) } + assertThrows() { executorService.submit(mockRunnable) } } @Test @@ -222,7 +222,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() val nullCallable: Callable? = null - assertThrows(NullPointerException::class) { executorService.submit(nullCallable) } + assertThrows() { executorService.submit(nullCallable) } } @Test @@ -230,7 +230,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() executorService.shutdown() - assertThrows(RejectedExecutionException::class) { executorService.submit(mockCallable) } + assertThrows() { executorService.submit(mockCallable) } } @Test @@ -238,7 +238,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() executorService.shutdownNow() - assertThrows(RejectedExecutionException::class) { executorService.submit(mockCallable) } + assertThrows() { executorService.submit(mockCallable) } } @Test @@ -271,7 +271,7 @@ class CoroutineExecutorServiceTest { testCoroutineDispatchers.runCurrent() assertThat(callableFuture.isDone).isTrue() - val exception = assertThrows(ExecutionException::class) { callableFuture.get() } + val exception = assertThrows() { callableFuture.get() } assertThat(exception).hasCauseThat().isInstanceOf(Exception::class.java) assertThat(exception).hasCauseThat().hasMessageThat().contains("Task failed") } @@ -420,7 +420,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() val nullRunnable: Runnable? = null - assertThrows(NullPointerException::class) { + assertThrows() { executorService.submit(nullRunnable, /* result= */ "Task") } } @@ -430,7 +430,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() executorService.shutdown() - assertThrows(RejectedExecutionException::class) { + assertThrows() { executorService.submit(mockRunnable, /* result= */ "Task") } } @@ -440,7 +440,7 @@ class CoroutineExecutorServiceTest { val executorService = createExecutorService() executorService.shutdownNow() - assertThrows(RejectedExecutionException::class) { + assertThrows() { executorService.submit(mockRunnable, /* result= */ "Task") } } @@ -645,7 +645,7 @@ class CoroutineExecutorServiceTest { // Note that this is not documented in the ExecutorService documentation, it seems necessary // since it doesn't make sense to return false (per the documentation) or block unless a // shutdown request was actually initiated. - assertThrows(IllegalStateException::class) { + assertThrows() { executorService.awaitTermination(/* timeout= */ 1, TimeUnit.SECONDS) } } @@ -746,7 +746,7 @@ class CoroutineExecutorServiceTest { fun testInvokeAll_nullTasks_throwsException() { val executorService = createExecutorService() - assertThrows(NullPointerException::class) { executorService.invokeAll(/* tasks= */ null) } + assertThrows() { executorService.invokeAll(/* tasks= */ null) } } @Test @@ -807,7 +807,7 @@ class CoroutineExecutorServiceTest { val (future1, future2) = deferred.getCompleted() assertThat(future1.isDone).isTrue() assertThat(future2.isDone).isTrue() - assertThrows(ExecutionException::class) { future1.get() } + assertThrows() { future1.get() } assertThat(future2.get()).isEqualTo("Task 2") } @@ -906,7 +906,7 @@ class CoroutineExecutorServiceTest { fun testInvokeAny_nullTasks_throwsException() { val executorService = createExecutorService() - assertThrows(NullPointerException::class) { executorService.invokeAny(/* tasks= */ null) } + assertThrows() { executorService.invokeAny(/* tasks= */ null) } } @Test diff --git a/testing/src/test/java/org/oppia/android/testing/time/FakeOppiaClockTest.kt b/testing/src/test/java/org/oppia/android/testing/time/FakeOppiaClockTest.kt index 5b534916126..aabaee20ebc 100644 --- a/testing/src/test/java/org/oppia/android/testing/time/FakeOppiaClockTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/time/FakeOppiaClockTest.kt @@ -110,7 +110,7 @@ class FakeOppiaClockTest { fun testSetCurrentTimeMs_wallClockMode_throwsException() { fakeOppiaClock.setFakeTimeMode(MODE_WALL_CLOCK_TIME) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { fakeOppiaClock.setCurrentTimeMs(0) } assertThat(exception).hasMessageThat().contains("MODE_FIXED_FAKE_TIME") @@ -128,7 +128,7 @@ class FakeOppiaClockTest { fun testSetCurrentTimeMs_uptimeMillisMode_throwsException() { fakeOppiaClock.setFakeTimeMode(MODE_UPTIME_MILLIS) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { fakeOppiaClock.setCurrentTimeMs(0) } assertThat(exception).hasMessageThat().contains("MODE_FIXED_FAKE_TIME") @@ -226,7 +226,7 @@ class FakeOppiaClockTest { fun testSetCurrentTimeToSameDateTime_wallClockMode_throwsException() { fakeOppiaClock.setFakeTimeMode(MODE_UPTIME_MILLIS) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { fakeOppiaClock.setCurrentTimeToSameDateTime(0) } assertThat(exception).hasMessageThat().contains("MODE_FIXED_FAKE_TIME") @@ -258,7 +258,7 @@ class FakeOppiaClockTest { fun testSetCurrentTimeToSameDateTime_uptimeMillisMode_throwsException() { fakeOppiaClock.setFakeTimeMode(MODE_UPTIME_MILLIS) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { fakeOppiaClock.setCurrentTimeToSameDateTime(0) } assertThat(exception).hasMessageThat().contains("MODE_FIXED_FAKE_TIME") diff --git a/utility/src/test/java/org/oppia/android/util/caching/testing/TestNoOpAssetRepositoryTest.kt b/utility/src/test/java/org/oppia/android/util/caching/testing/TestNoOpAssetRepositoryTest.kt index 2cb1a10f433..ea5346c2490 100644 --- a/utility/src/test/java/org/oppia/android/util/caching/testing/TestNoOpAssetRepositoryTest.kt +++ b/utility/src/test/java/org/oppia/android/util/caching/testing/TestNoOpAssetRepositoryTest.kt @@ -38,7 +38,7 @@ class TestNoOpAssetRepositoryTest { @Test fun testLoadTextFileFromLocalAssets_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { assetRepository.loadTextFileFromLocalAssets("asset.json") } @@ -57,7 +57,7 @@ class TestNoOpAssetRepositoryTest { assetRepository.primeTextFileFromLocalAssets("asset.json") // Priming doesn't do anything, so the exception is still thrown. - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { assetRepository.loadTextFileFromLocalAssets("asset.json") } @@ -66,7 +66,7 @@ class TestNoOpAssetRepositoryTest { @Test fun testLoadProtoFromLocalAssets_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { assetRepository.loadProtoFromLocalAssets("test", TestMessage.getDefaultInstance()) } @@ -107,7 +107,7 @@ class TestNoOpAssetRepositoryTest { @Test fun testLoadRemoteBinaryAsset_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { assetRepository.loadRemoteBinaryAsset("https://example.com/test.pb") } @@ -117,7 +117,7 @@ class TestNoOpAssetRepositoryTest { @Test fun testLoadImageAssetFromLocalAssets_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { assetRepository.loadImageAssetFromLocalAssets("https://example.com/test.png") } @@ -137,7 +137,7 @@ class TestNoOpAssetRepositoryTest { assetRepository.primeRemoteBinaryAsset("https://example.com/test.pb") // Priming doesn't do anything, so the exception is still thrown. - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { assetRepository.loadRemoteBinaryAsset("https://example.com/test.pb") } diff --git a/utility/src/test/java/org/oppia/android/util/data/AsyncDataSubscriptionManagerTest.kt b/utility/src/test/java/org/oppia/android/util/data/AsyncDataSubscriptionManagerTest.kt index 8a9c0b627d9..0926b2fd323 100644 --- a/utility/src/test/java/org/oppia/android/util/data/AsyncDataSubscriptionManagerTest.kt +++ b/utility/src/test/java/org/oppia/android/util/data/AsyncDataSubscriptionManagerTest.kt @@ -258,7 +258,7 @@ class AsyncDataSubscriptionManagerTest { @Test fun testAssociateIds_sameId_throwsException() { - val error = assertThrows(IllegalStateException::class) { + val error = assertThrows() { asyncDataSubscriptionManager.associateIds("same_id", "same_id") } @@ -430,7 +430,7 @@ class AsyncDataSubscriptionManagerTest { asyncDataSubscriptionManager.subscribe("child_id", mockSubscriptionCallback2.toAsyncChange()) asyncDataSubscriptionManager.associateIds("child_id", "parent_id") - val error = assertThrows(IllegalStateException::class) { + val error = assertThrows() { asyncDataSubscriptionManager.associateIds("parent_id", "child_id") } @@ -446,7 +446,7 @@ class AsyncDataSubscriptionManagerTest { asyncDataSubscriptionManager.associateIds("child_id1", "parent_id") asyncDataSubscriptionManager.associateIds("child_id2", "child_id1") - val error = assertThrows(IllegalStateException::class) { + val error = assertThrows() { asyncDataSubscriptionManager.associateIds("parent_id", "child_id1") } diff --git a/utility/src/test/java/org/oppia/android/util/data/InMemoryBlockingCacheTest.kt b/utility/src/test/java/org/oppia/android/util/data/InMemoryBlockingCacheTest.kt index e5e2a69b59b..4dc2cc0fc5a 100644 --- a/utility/src/test/java/org/oppia/android/util/data/InMemoryBlockingCacheTest.kt +++ b/utility/src/test/java/org/oppia/android/util/data/InMemoryBlockingCacheTest.kt @@ -207,7 +207,7 @@ class InMemoryBlockingCacheTest { val deferredRead = cache.readIfPresentAsync() val exception = - assertThrows(IllegalStateException::class) { awaitCompletion(deferredRead) } + assertThrows() { awaitCompletion(deferredRead) } assertThat(exception).hasMessageThat() .contains("Expected to read the cache only after it's been created") } @@ -302,7 +302,7 @@ class InMemoryBlockingCacheTest { // The operation should fail since the method expects the cache to be initialized. val exception = - assertThrows(IllegalStateException::class) { awaitCompletion(deferredUpdate) } + assertThrows() { awaitCompletion(deferredUpdate) } assertThat(exception).hasMessageThat() .contains("Expected to update the cache only after it's been created") } @@ -422,7 +422,7 @@ class InMemoryBlockingCacheTest { // Deleting the cache should result in readIfPresent()'s expectations to fail. val exception = - assertThrows(IllegalStateException::class) { awaitCompletion(deferredRead) } + assertThrows() { awaitCompletion(deferredRead) } assertThat(exception).hasMessageThat() .contains("Expected to read the cache only after it's been created") } @@ -456,7 +456,7 @@ class InMemoryBlockingCacheTest { // The operation should fail since the method expects the cache to be initialized. val exception = - assertThrows(IllegalStateException::class) { awaitCompletion(deferredUpdate) } + assertThrows() { awaitCompletion(deferredUpdate) } assertThat(exception).hasMessageThat() .contains("Expected to update the cache only after it's been created") } diff --git a/utility/src/test/java/org/oppia/android/util/locale/AndroidLocaleFactoryTest.kt b/utility/src/test/java/org/oppia/android/util/locale/AndroidLocaleFactoryTest.kt index c0b45f7e9fd..c009baad4e0 100644 --- a/utility/src/test/java/org/oppia/android/util/locale/AndroidLocaleFactoryTest.kt +++ b/utility/src/test/java/org/oppia/android/util/locale/AndroidLocaleFactoryTest.kt @@ -51,7 +51,7 @@ class AndroidLocaleFactoryTest { @Test fun testCreateLocale_default_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { androidLocaleFactory.createAndroidLocale(OppiaLocaleContext.getDefaultInstance()) } @@ -513,7 +513,7 @@ class AndroidLocaleFactoryTest { regionDefinition = REGION_INDIA ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { androidLocaleFactory.createAndroidLocale(context) } @@ -566,7 +566,7 @@ class AndroidLocaleFactoryTest { regionDefinition = REGION_INDIA ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { androidLocaleFactory.createAndroidLocale(context) } @@ -945,7 +945,7 @@ class AndroidLocaleFactoryTest { regionDefinition = REGION_INDIA ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { androidLocaleFactory.createAndroidLocale(context) } @@ -998,7 +998,7 @@ class AndroidLocaleFactoryTest { regionDefinition = REGION_INDIA ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { androidLocaleFactory.createAndroidLocale(context) } @@ -1377,7 +1377,7 @@ class AndroidLocaleFactoryTest { regionDefinition = REGION_INDIA ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { androidLocaleFactory.createAndroidLocale(context) } @@ -1430,7 +1430,7 @@ class AndroidLocaleFactoryTest { regionDefinition = REGION_INDIA ) - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { androidLocaleFactory.createAndroidLocale(context) } diff --git a/utility/src/test/java/org/oppia/android/util/locale/DisplayLocaleImplTest.kt b/utility/src/test/java/org/oppia/android/util/locale/DisplayLocaleImplTest.kt index 8786f31948b..e300a47d6fa 100644 --- a/utility/src/test/java/org/oppia/android/util/locale/DisplayLocaleImplTest.kt +++ b/utility/src/test/java/org/oppia/android/util/locale/DisplayLocaleImplTest.kt @@ -354,7 +354,7 @@ class DisplayLocaleImplTest { val impl = createDisplayLocaleImpl(US_ENGLISH_CONTEXT) val resources = context.resources - assertThrows(Resources.NotFoundException::class) { + assertThrows() { impl.run { resources.getStringInLocale(-1) } } } @@ -397,7 +397,7 @@ class DisplayLocaleImplTest { val impl = createDisplayLocaleImpl(US_ENGLISH_CONTEXT) val resources = context.resources - assertThrows(Resources.NotFoundException::class) { + assertThrows() { impl.run { resources.getStringInLocaleWithWrapping(-1) } } } @@ -440,7 +440,7 @@ class DisplayLocaleImplTest { val impl = createDisplayLocaleImpl(US_ENGLISH_CONTEXT) val resources = context.resources - assertThrows(Resources.NotFoundException::class) { + assertThrows() { impl.run { resources.getStringInLocaleWithoutWrapping(-1) } } } @@ -460,7 +460,7 @@ class DisplayLocaleImplTest { val impl = createDisplayLocaleImpl(US_ENGLISH_CONTEXT) val resources = context.resources - assertThrows(Resources.NotFoundException::class) { + assertThrows() { impl.run { resources.getStringArrayInLocale(-1) } } } @@ -496,7 +496,7 @@ class DisplayLocaleImplTest { val impl = createDisplayLocaleImpl(US_ENGLISH_CONTEXT) val resources = context.resources - assertThrows(Resources.NotFoundException::class) { + assertThrows() { impl.run { resources.getQuantityStringInLocale(-1, 0) } } } @@ -535,7 +535,7 @@ class DisplayLocaleImplTest { val impl = createDisplayLocaleImpl(US_ENGLISH_CONTEXT) val resources = context.resources - assertThrows(Resources.NotFoundException::class) { + assertThrows() { impl.run { resources.getQuantityStringInLocaleWithWrapping(-1, 0) } } } @@ -574,7 +574,7 @@ class DisplayLocaleImplTest { val impl = createDisplayLocaleImpl(US_ENGLISH_CONTEXT) val resources = context.resources - assertThrows(Resources.NotFoundException::class) { + assertThrows() { impl.run { resources.getQuantityStringInLocaleWithoutWrapping(-1, 0) } } } @@ -610,7 +610,7 @@ class DisplayLocaleImplTest { val impl = createDisplayLocaleImpl(US_ENGLISH_CONTEXT) val resources = context.resources - assertThrows(Resources.NotFoundException::class) { + assertThrows() { impl.run { resources.getQuantityTextInLocale(-1, 0) } } } diff --git a/utility/src/test/java/org/oppia/android/util/locale/testing/TestOppiaBidiFormatterTest.kt b/utility/src/test/java/org/oppia/android/util/locale/testing/TestOppiaBidiFormatterTest.kt index d56be1961ae..91eefeac704 100644 --- a/utility/src/test/java/org/oppia/android/util/locale/testing/TestOppiaBidiFormatterTest.kt +++ b/utility/src/test/java/org/oppia/android/util/locale/testing/TestOppiaBidiFormatterTest.kt @@ -92,7 +92,7 @@ class TestOppiaBidiFormatterTest { val wrappedStr = formatter.wrapText("test str") // Try to wrap the string again. - val exception = assertThrows(IllegalStateException::class) { formatter.wrapText(wrappedStr) } + val exception = assertThrows() { formatter.wrapText(wrappedStr) } assertThat(exception).hasMessageThat() .contains("Error: encountered string that's already been wrapped: test str") diff --git a/utility/src/test/java/org/oppia/android/util/logging/SyncStatusManagerTestBase.kt b/utility/src/test/java/org/oppia/android/util/logging/SyncStatusManagerTestBase.kt index c19dcfa6d3d..8690cc70ae8 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/SyncStatusManagerTestBase.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/SyncStatusManagerTestBase.kt @@ -56,7 +56,7 @@ abstract class SyncStatusManagerTestBase { fun testInitializeEventLogStore_twice_throwsException() { impl.initializeEventLogStore(logsCacheStore) - val error = assertThrows(IllegalStateException::class) { + val error = assertThrows() { impl.initializeEventLogStore(logsCacheStore) } diff --git a/utility/src/test/java/org/oppia/android/util/math/FractionExtensionsTest.kt b/utility/src/test/java/org/oppia/android/util/math/FractionExtensionsTest.kt index 3913e7b6dda..f44bc197f98 100644 --- a/utility/src/test/java/org/oppia/android/util/math/FractionExtensionsTest.kt +++ b/utility/src/test/java/org/oppia/android/util/math/FractionExtensionsTest.kt @@ -444,7 +444,7 @@ class FractionExtensionsTest { val zeroDenominatorFraction = Fraction.getDefaultInstance() // Converting to simplest form results in a divide by zero in this case. - assertThrows(ArithmeticException::class) { zeroDenominatorFraction.toSimplestForm() } + assertThrows() { zeroDenominatorFraction.toSimplestForm() } } @Test @@ -518,7 +518,7 @@ class FractionExtensionsTest { val zeroDenominatorFraction = Fraction.getDefaultInstance() // Converting to simplest form results in a divide by zero in this case. - assertThrows(ArithmeticException::class) { zeroDenominatorFraction.toProperForm() } + assertThrows() { zeroDenominatorFraction.toProperForm() } } @Test @@ -1062,7 +1062,7 @@ class FractionExtensionsTest { val lhsFraction = ZERO_FRACTION val rhsFraction = ZERO_FRACTION - assertThrows(Exception::class) { lhsFraction / rhsFraction } + assertThrows() { lhsFraction / rhsFraction } } @Test @@ -1070,7 +1070,7 @@ class FractionExtensionsTest { val lhsFraction = ONE_FRACTION val rhsFraction = ZERO_FRACTION - assertThrows(Exception::class) { lhsFraction / rhsFraction } + assertThrows() { lhsFraction / rhsFraction } } @Test @@ -1078,7 +1078,7 @@ class FractionExtensionsTest { val lhsFraction = TWO_FRACTION val rhsFraction = ZERO_FRACTION - assertThrows(Exception::class) { lhsFraction / rhsFraction } + assertThrows() { lhsFraction / rhsFraction } } @Test diff --git a/utility/src/test/java/org/oppia/android/util/math/FractionParserTest.kt b/utility/src/test/java/org/oppia/android/util/math/FractionParserTest.kt index 864a429f753..fa00cf23485 100644 --- a/utility/src/test/java/org/oppia/android/util/math/FractionParserTest.kt +++ b/utility/src/test/java/org/oppia/android/util/math/FractionParserTest.kt @@ -173,7 +173,7 @@ class FractionParserTest { val parseFraction = fractionParser.parseFraction("7 1/2 4/5") assertThat(parseFraction).isEqualTo(null) - val exception = assertThrows(IllegalArgumentException::class) { + val exception = assertThrows() { fractionParser.parseFractionFromString("7 1/2 4/5") } assertThat(exception).hasMessageThat().contains("Incorrectly formatted fraction: 7 1/2 4/5") @@ -184,7 +184,7 @@ class FractionParserTest { val parseFraction = fractionParser.parseFraction("abc") assertThat(parseFraction).isEqualTo(null) - val exception = assertThrows(IllegalArgumentException::class) { + val exception = assertThrows() { fractionParser.parseFractionFromString("abc") } assertThat(exception).hasMessageThat().contains("Incorrectly formatted fraction: abc") diff --git a/utility/src/test/java/org/oppia/android/util/math/PeekableIteratorTest.kt b/utility/src/test/java/org/oppia/android/util/math/PeekableIteratorTest.kt index 0b6cddc7dbe..e342081aab0 100644 --- a/utility/src/test/java/org/oppia/android/util/math/PeekableIteratorTest.kt +++ b/utility/src/test/java/org/oppia/android/util/math/PeekableIteratorTest.kt @@ -55,7 +55,7 @@ class PeekableIteratorTest { val sequence = sequenceOf() val iterator = sequence.toPeekableIterator() - assertThrows(NoSuchElementException::class) { iterator.next() } + assertThrows() { iterator.next() } } @Test diff --git a/utility/src/test/java/org/oppia/android/util/math/RealExtensionsTest.kt b/utility/src/test/java/org/oppia/android/util/math/RealExtensionsTest.kt index fee8d4e00e7..bfcb4dba53d 100644 --- a/utility/src/test/java/org/oppia/android/util/math/RealExtensionsTest.kt +++ b/utility/src/test/java/org/oppia/android/util/math/RealExtensionsTest.kt @@ -252,7 +252,7 @@ class RealExtensionsTest { fun testIsNegative_default_throwsException() { val defaultReal = Real.getDefaultInstance() - val exception = assertThrows(IllegalStateException::class) { defaultReal.isNegative() } + val exception = assertThrows() { defaultReal.isNegative() } assertThat(exception).hasMessageThat().contains("Invalid real") } @@ -309,7 +309,7 @@ class RealExtensionsTest { val first = Real.getDefaultInstance() val second = TWO_REAL - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { first.isApproximatelyEqualTo(second) } @@ -321,7 +321,7 @@ class RealExtensionsTest { val first = TWO_REAL val second = Real.getDefaultInstance() - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { first.isApproximatelyEqualTo(second) } @@ -659,7 +659,7 @@ class RealExtensionsTest { fun testIsApproximatelyZero_default_throwsException() { val defaultReal = Real.getDefaultInstance() - val exception = assertThrows(IllegalStateException::class) { defaultReal.isApproximatelyZero() } + val exception = assertThrows() { defaultReal.isApproximatelyZero() } assertThat(exception).hasMessageThat().contains("Invalid real") } @@ -732,7 +732,7 @@ class RealExtensionsTest { fun testToDouble_default_returnsZeroDouble() { val defaultReal = Real.getDefaultInstance() - val exception = assertThrows(IllegalStateException::class) { defaultReal.toDouble() } + val exception = assertThrows() { defaultReal.toDouble() } assertThat(exception).hasMessageThat().contains("Invalid real") } @@ -783,7 +783,7 @@ class RealExtensionsTest { fun testAsWholeNumber_default_throwsException() { val defaultReal = Real.getDefaultInstance() - val exception = assertThrows(IllegalStateException::class) { defaultReal.asWholeNumber() } + val exception = assertThrows() { defaultReal.asWholeNumber() } assertThat(exception).hasMessageThat().contains("Invalid real") } @@ -925,7 +925,7 @@ class RealExtensionsTest { fun testUnaryMinus_default_throwsException() { val defaultReal = Real.getDefaultInstance() - val exception = assertThrows(IllegalStateException::class) { -defaultReal } + val exception = assertThrows() { -defaultReal } assertThat(exception).hasMessageThat().contains("Invalid real") } @@ -1782,7 +1782,7 @@ class RealExtensionsTest { val lhsReal = createIntegerReal(2) val rhsReal = createIntegerReal(0) - assertThrows(ArithmeticException::class) { lhsReal / rhsReal } + assertThrows() { lhsReal / rhsReal } } @Test @@ -1790,7 +1790,7 @@ class RealExtensionsTest { val lhsReal = createIntegerReal(2) val rhsReal = createRationalReal(ZERO_FRACTION) - assertThrows(ArithmeticException::class) { lhsReal / rhsReal } + assertThrows() { lhsReal / rhsReal } } @Test @@ -1808,7 +1808,7 @@ class RealExtensionsTest { val lhsReal = ONE_AND_ONE_HALF_REAL val rhsReal = createIntegerReal(0) - assertThrows(ArithmeticException::class) { lhsReal / rhsReal } + assertThrows() { lhsReal / rhsReal } } @Test @@ -1816,7 +1816,7 @@ class RealExtensionsTest { val lhsReal = ONE_AND_ONE_HALF_REAL val rhsReal = createRationalReal(ZERO_FRACTION) - assertThrows(ArithmeticException::class) { lhsReal / rhsReal } + assertThrows() { lhsReal / rhsReal } } @Test @@ -2188,7 +2188,7 @@ class RealExtensionsTest { fun testSqrt_defaultReal_throwsException() { val real = Real.getDefaultInstance() - val exception = assertThrows(IllegalStateException::class) { sqrt(real) } + val exception = assertThrows() { sqrt(real) } assertThat(exception).hasMessageThat().contains("Invalid real") } From fb59232b23e8c0a7a3c1c840c13b325f0f9fdd11 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Mon, 28 Aug 2023 21:35:39 +0000 Subject: [PATCH 17/63] Tidy some things up, and revert fragment test. ProfileAndDeviceIdFragmentTest had been updated to use a newer fragment initialization pattern, but that's no longer needed and seems to be causing what appears to be timing discrepancies between local dev and CI. --- .../ProfileAndDeviceIdFragmentTest.kt | 855 +++++++++--------- .../scripts/docs/KdocValidityCheckTest.kt | 152 ++-- .../regex/RegexPatternValidationCheckTest.kt | 348 ++----- .../scripts/testfile/TestFileCheckTest.kt | 18 +- .../android/scripts/todo/TodoOpenCheckTest.kt | 46 +- .../android/scripts/xml/XmlSyntaxCheckTest.kt | 18 +- testing/BUILD.bazel | 5 +- 7 files changed, 585 insertions(+), 857 deletions(-) diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt index f1caf58e449..74c37f0e6da 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt @@ -9,7 +9,6 @@ import android.view.View import androidx.annotation.IdRes import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView -import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.onView import androidx.test.espresso.ViewInteraction @@ -24,6 +23,7 @@ import androidx.test.espresso.matcher.ViewMatchers.isEnabled import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText +import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.truth.content.IntentSubject.assertThat import androidx.work.Configuration @@ -62,7 +62,6 @@ import org.oppia.android.app.recyclerview.RecyclerViewMatcher.Companion.atPositi import org.oppia.android.app.recyclerview.RecyclerViewMatcher.Companion.hasItemCount import org.oppia.android.app.shim.ViewBindingShimModule import org.oppia.android.app.testing.activity.TestActivity -import org.oppia.android.app.testing.activity.TestActivity.Companion.createIntent import org.oppia.android.app.translation.testing.ActivityRecreatorTestModule import org.oppia.android.app.utility.OrientationChangeAction.Companion.orientationLandscape import org.oppia.android.data.backends.gae.NetworkConfigProdModule @@ -148,6 +147,12 @@ import javax.inject.Singleton class ProfileAndDeviceIdFragmentTest { @get:Rule val initializeDefaultLocaleRule = InitializeDefaultLocaleRule() @get:Rule val oppiaTestRule = OppiaTestRule() + @get:Rule + var activityRule = + ActivityScenarioRule( + TestActivity.createIntent(ApplicationProvider.getApplicationContext()) + ) + @Inject lateinit var profileTestHelper: ProfileTestHelper @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers @Inject lateinit var context: Context @@ -188,587 +193,559 @@ class ProfileAndDeviceIdFragmentTest { @Test fun testFragment_withOnlyAdminProfile_hasThreeItems() { - runInTestActivityAndAddFragment { - // There should be three items: a header, a profile, and the sync status. - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 4)) - } + initializeActivityAndAddFragment() + + // There should be three items: a header, a profile, and the sync status. + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 4)) } @Test fun testFragment_withOnlyAdminProfile_hasDeviceIdHeader() { - runInTestActivityAndAddFragment { - onDeviceIdLabelAt(position = 0).check(matches(isDisplayed())) - } + initializeActivityAndAddFragment() + + onDeviceIdLabelAt(position = 0).check(matches(isDisplayed())) } @Test fun testFragment_hasDeviceId() { - runInTestActivityAndAddFragment { - onDeviceIdLabelAt(position = 0).check(matches(withText(containsString("113e04cc09a3")))) - } + initializeActivityAndAddFragment() + + onDeviceIdLabelAt(position = 0).check(matches(withText(containsString("113e04cc09a3")))) } @Test fun testFragment_deviceId_hasCopyButton() { - runInTestActivityAndAddFragment { - onDeviceIdCopyButtonAt(position = 0).check(matches(isDisplayed())) - } + initializeActivityAndAddFragment() + + onDeviceIdCopyButtonAt(position = 0).check(matches(isDisplayed())) } @Test fun testFragment_deviceId_clickCopyButton_copiesDeviceIdToClipboard() { - runInTestActivityAndAddFragment { - onDeviceIdCopyButtonAt(position = 0).perform(click()) - testCoroutineDispatchers.runCurrent() - - val clipData = getCurrentClipData() - assertThat(clipData?.description?.label).isEqualTo("Oppia installation ID") - assertThat(clipData?.itemCount).isEqualTo(1) - assertThat(clipData?.getItemAt(0)?.text).isEqualTo("113e04cc09a3") - } + initializeActivityAndAddFragment() + + onDeviceIdCopyButtonAt(position = 0).perform(click()) + testCoroutineDispatchers.runCurrent() + + val clipData = getCurrentClipData() + assertThat(clipData?.description?.label).isEqualTo("Oppia installation ID") + assertThat(clipData?.itemCount).isEqualTo(1) + assertThat(clipData?.getItemAt(0)?.text).isEqualTo("113e04cc09a3") } @Test fun testFragment_withOnlyAdminProfile_hasOneProfileListed() { - runInTestActivityAndAddFragment { - onProfileNameAt(position = 1).check(matches(isDisplayed())) - } + initializeActivityAndAddFragment() + + onProfileNameAt(position = 1).check(matches(isDisplayed())) } @Test fun testFragment_profileEntry_hasProfileName() { - runInTestActivityAndAddFragment { - onProfileNameAt(position = 1).check(matches(withText("Admin"))) - } + initializeActivityAndAddFragment() + + onProfileNameAt(position = 1).check(matches(withText("Admin"))) } @Test fun testFragment_profileEntry_hasLearnerId() { - runInTestActivityAndAddFragment { - onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) - } + initializeActivityAndAddFragment() + + onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) } @Test fun testFragment_profileEntry_hasCopyButton() { - runInTestActivityAndAddFragment { - onLearnerIdCopyButtonAt(position = 1).check(matches(isDisplayed())) - } + initializeActivityAndAddFragment() + + onLearnerIdCopyButtonAt(position = 1).check(matches(isDisplayed())) } @Test fun testFragment_profileEntry_clickFirstCopyButton_copiesAdminLearnerIdToClipboard() { - runInTestActivityAndAddFragment { - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() - - val clipData = getCurrentClipData() - assertThat(clipData?.description?.label).isEqualTo("Admin's learner ID") - assertThat(clipData?.itemCount).isEqualTo(1) - assertThat(clipData?.getItemAt(0)?.text).isEqualTo("8dcbbd21") - } + initializeActivityAndAddFragment() + + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() + + val clipData = getCurrentClipData() + assertThat(clipData?.description?.label).isEqualTo("Admin's learner ID") + assertThat(clipData?.itemCount).isEqualTo(1) + assertThat(clipData?.getItemAt(0)?.text).isEqualTo("8dcbbd21") } @Test fun testFragment_multipleProfiles_listsAllProfiles() { profileTestHelper.addMoreProfiles(numProfiles = 5) - runInTestActivityAndAddFragment { - // Header + admin + 5 new profiles + sync status = 8 items. - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) - } + initializeActivityAndAddFragment() + + // Header + admin + 5 new profiles + sync status = 8 items. + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) } @Test fun testFragment_multipleProfiles_adminIsFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - runInTestActivityAndAddFragment { - onProfileNameAt(position = 1).check(matches(withText("Admin"))) - } + initializeActivityAndAddFragment() + + onProfileNameAt(position = 1).check(matches(withText("Admin"))) } @Test fun testFragment_multipleProfiles_secondEntryHasDifferentName() { profileTestHelper.addMoreProfiles(numProfiles = 5) - runInTestActivityAndAddFragment { - // The second entry is not the admin. - onProfileNameAt(position = 2).check(matches(withText("A"))) - } + initializeActivityAndAddFragment() + + // The second entry is not the admin. + onProfileNameAt(position = 2).check(matches(withText("A"))) } @Test fun testFragment_multipleProfiles_secondEntryHasDifferentLearnerIdThanFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - runInTestActivityAndAddFragment { - // The second profile has a different learner ID. - onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) - onLearnerIdAt(position = 2).check(matches(withText("208663b0"))) - } + initializeActivityAndAddFragment() + + // The second profile has a different learner ID. + onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) + onLearnerIdAt(position = 2).check(matches(withText("208663b0"))) } @Test fun testFragment_multipleProfiles_copySecondEntry_copiesDifferentLearnerIdThanFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - runInTestActivityAndAddFragment { - onLearnerIdCopyButtonAt(position = 2).perform(click()) - testCoroutineDispatchers.runCurrent() + initializeActivityAndAddFragment() - val clipData = getCurrentClipData() - assertThat(clipData?.description?.label).isEqualTo("A's learner ID") - assertThat(clipData?.itemCount).isEqualTo(1) - assertThat(clipData?.getItemAt(0)?.text).isEqualTo("208663b0") - } + onLearnerIdCopyButtonAt(position = 2).perform(click()) + testCoroutineDispatchers.runCurrent() + + val clipData = getCurrentClipData() + assertThat(clipData?.description?.label).isEqualTo("A's learner ID") + assertThat(clipData?.itemCount).isEqualTo(1) + assertThat(clipData?.getItemAt(0)?.text).isEqualTo("208663b0") } @Test fun testFragment_initialState_deviceIdCopyButtonHasCopyLabel() { - runInTestActivityAndAddFragment { - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - } + initializeActivityAndAddFragment() + + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) } @Test fun testFragment_adminProfile_initialState_learnerIdCopyButtonHasCopyLabel() { - runInTestActivityAndAddFragment { - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) - } + initializeActivityAndAddFragment() + + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) } @Test fun testFragment_adminProfile_clickDeviceIdCopyButton_deviceIdIsCopiedButNotLearnerId() { - runInTestActivityAndAddFragment { - onDeviceIdCopyButtonAt(position = 0).perform(click()) - testCoroutineDispatchers.runCurrent() + initializeActivityAndAddFragment() - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copied"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) - } + onDeviceIdCopyButtonAt(position = 0).perform(click()) + testCoroutineDispatchers.runCurrent() + + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copied"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_learnerIdIsCopiedButNotDeviceId() { - runInTestActivityAndAddFragment { - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + initializeActivityAndAddFragment() - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) - } + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() + + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_copyInOtherApp_nothingIsCopied() { - runInTestActivityAndAddFragment { - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + initializeActivityAndAddFragment() + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() - updateClipDataAsThoughFromAnotherApp() + updateClipDataAsThoughFromAnotherApp() - // Changing the clipboard in a different app should reset the labels. - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) - } + // Changing the clipboard in a different app should reset the labels. + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_rotate_learnerIdStillCopied() { - runInTestActivityAndAddFragment { - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + initializeActivityAndAddFragment() + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - // The button label should be restored after a rotation. - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) - } + // The button label should be restored after a rotation. + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) } @Test fun testFragment_multipleProfiles_rotate_profilesStillPresent() { profileTestHelper.addMoreProfiles(numProfiles = 5) + initializeActivityAndAddFragment() - runInTestActivityAndAddFragment { - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) - } + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) } @Test fun testFragment_firstEntry_noAdminEvents_hasZeroAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) + initializeActivityAndAddFragment() - runInTestActivityAndAddFragment { - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - } + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) } @Test fun testFragment_firstEntry_adminEvents_notUploaded_hasSomeAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - // Log a couple of events. - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + // Log a couple of events. + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - // Two are awaiting upload, but neither have been uploaded yet. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - } + // Two are awaiting upload, but neither have been uploaded yet. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) } @Test fun testFragment_firstEntry_adminEvents_uploaded_hasSomeAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event. - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + // Log a couple of events, upload them, then log one more event. + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - // Two should be uploaded, and one waiting upload. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("2"))) - } + // Two should be uploaded, and one waiting upload. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("2"))) } @Test fun testFragment_firstEntry_noGenericEvents_hasZeroGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) + initializeActivityAndAddFragment() - runInTestActivityAndAddFragment { - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - } + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) } @Test fun testFragment_firstEntry_genericEvents_notUploaded_hasSomeGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - // Log a couple of events off of the admin profile. - logTwoAnalyticsEvents(profileId = null) + // Log a couple of events off of the admin profile. + logTwoAnalyticsEvents(profileId = null) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - } + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) } @Test fun testFragment_firstEntry_genericEvents_uploaded_hasSomeGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event, off of the admin profile. - logTwoAnalyticsEvents(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) + // Log a couple of events, upload them, then log one more event, off of the admin profile. + logTwoAnalyticsEvents(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) - } + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) } @Test fun testFragment_firstEntry_mixOfAdminAndGenericEvents_someUploaded_reportsAllEvents() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - - // Log & upload a mix of events with and without the admin profile. - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logThreeAnalyticsEvents(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - - // Event counts should be represented in the correct places. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("1"))) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("3"))) - } + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + + // Log & upload a mix of events with and without the admin profile. + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logThreeAnalyticsEvents(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + + // Event counts should be represented in the correct places. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("1"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("3"))) } @Test fun testFragment_secondEntry_noLearnerEvents_hasZeroLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) + initializeActivityAndAddFragment() - runInTestActivityAndAddFragment { - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - } + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) } @Test fun testFragment_secondEntry_learnerEvents_notUploaded_hasSomeLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - // Log a couple of events. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + // Log a couple of events. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - // Two are awaiting upload, but neither have been uploaded yet. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - } + // Two are awaiting upload, but neither have been uploaded yet. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) } @Test fun testFragment_secondEntry_learnerEvents_uploaded_hasSomeLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + // Log a couple of events, upload them, then log one more event. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - // Two should be uploaded, and one waiting upload. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("1"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("2"))) - } + // Two should be uploaded, and one waiting upload. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("1"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("2"))) } @Test fun testFragment_secondEntry_learnerEvents_hasZeroAdminOrGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - - // Log a couple of events, upload them, then log one more event, for a learner profile. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - - // The admin profile's event counts shouldn't change since the only logged events were for a - // specific learner profile. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - } + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + + // Log a couple of events, upload them, then log one more event, for a learner profile. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + + // The admin profile's event counts shouldn't change since the only logged events were for a + // specific learner profile. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) } @Test fun testFragment_secondEntry_adminAndGenericEvents_uploaded_hasZeroLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - - // Log a couple of events generically and for the admin profile. - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = null) - - // No events should be reported for the learner since it didn't have any events uploaded. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - } + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + + // Log a couple of events generically and for the admin profile. + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = null) + + // No events should be reported for the learner since it didn't have any events uploaded. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) } @Test fun testFragment_initialState_profileDataHasYetToBeCollected() { - runInTestActivityAndAddFragment { - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) - } + initializeActivityAndAddFragment() + + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) } @Test fun testFragment_initialState_wait_profileDataHasYetToBeCollected() { - runInTestActivityAndAddFragment { - testCoroutineDispatchers.advanceTimeBy(delayTimeMillis = TimeUnit.SECONDS.toMillis(1)) + initializeActivityAndAddFragment() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) - } + testCoroutineDispatchers.advanceTimeBy(delayTimeMillis = TimeUnit.SECONDS.toMillis(1)) + + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) } @Test fun testFragment_eventLogged_waitingForUpload_indicatorTextMentionsWaiting() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - - // Enqueue the event, but don't actually begin uploading it, then reconnect to the network. - // Note that the extra event log is a slight hack to force a refresh of the status indicator - // (since network changes are polled when there are other changes to represent rather than - // being actively "pushed" by the system). - logAnalyticsEvent() - connectNetwork() - logAnalyticsEvent() - - // The status indicator is suggesting that events can be uploaded (and there are some - // available to upload), they just haven't been scheduled yet. - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Waiting to schedule data uploading worker…")))) - } + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + + // Enqueue the event, but don't actually begin uploading it, then reconnect to the network. Note + // that the extra event log is a slight hack to force a refresh of the status indicator (since + // network changes are polled when there are other changes to represent rather than being + // actively "pushed" by the system). + logAnalyticsEvent() + connectNetwork() + logAnalyticsEvent() + + // The status indicator is suggesting that events can be uploaded (and there are some available + // to upload), they just haven't been scheduled yet. + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Waiting to schedule data uploading worker…")))) } @Test fun testFragment_eventLogged_waitingForUpload_uploadStarted_profileDataIsCurrentlyUploading() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - // Unfortunately, it's tricky to pause the actual upload worker so this is a hacky way to - // produce the same situation to ensure the label is correct. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) - testCoroutineDispatchers.runCurrent() + // Unfortunately, it's tricky to pause the actual upload worker so this is a hacky way to + // produce the same situation to ensure the label is correct. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Profile data is currently uploading")))) - } + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Profile data is currently uploading")))) } @Test fun testFragment_noConnectivity_indicatorTextMentionsDataCannotBeUploaded() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - - // Enqueue an event but don't reconnect to the network. - logAnalyticsEvent() - - // The status indicator is suggesting that internet connectivity needs to resume in order to - // upload events. - onSyncStatusAt(position = 2) - .check( - matches( - withText( - containsString( - "Please connect to a WiFi or Cellular network in order to upload profile data" - ) + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + + // Enqueue an event but don't reconnect to the network. + logAnalyticsEvent() + + // The status indicator is suggesting that internet connectivity needs to resume in order to + // upload events. + onSyncStatusAt(position = 2) + .check( + matches( + withText( + containsString( + "Please connect to a WiFi or Cellular network in order to upload profile data" ) ) ) - } + ) } @Test fun testFragment_eventLogged_waitForUpload_profileDataIsUploaded() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) - } + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) } @Test fun testFragment_eventLogged_uploadError_profileDataHasError() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() - // An upload error can currently only be simulated by directly influencing the sync manager. - syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) - testCoroutineDispatchers.runCurrent() + // An upload error can currently only be simulated by directly influencing the sync manager. + syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check( - matches(withText(containsString("Something went wrong when trying to upload events"))) - ) - } + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Something went wrong when trying to upload events")))) } @Test fun testFragment_eventLogged_uploadError_anotherLogged_wait_profileDataIsUploading() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.reportUploadError() - testCoroutineDispatchers.runCurrent() - - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() - - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) - } + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.reportUploadError() + testCoroutineDispatchers.runCurrent() + + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() + + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) } @Test fun testFragment_rotate_profileDataHasYetToBeCollected() { - runInTestActivityAndAddFragment { - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + initializeActivityAndAddFragment() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) - } + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() + + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) } @Test fun testFragment_eventLogged_waitingForUpload_rotate_profileDataIsCurrentlyUploading() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) - testCoroutineDispatchers.runCurrent() + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) + testCoroutineDispatchers.runCurrent() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Profile data is currently uploading")))) - } + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Profile data is currently uploading")))) } @Test fun testFragment_eventLogged_waitForUpload_rotate_profileDataIsUploaded() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) - } + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) } @Test fun testFragment_eventsLogged_uploadError_rotate_profileDataHasError() { - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) - testCoroutineDispatchers.runCurrent() - - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() - - onSyncStatusAt(position = 2) - .check( - matches(withText(containsString("Something went wrong when trying to upload events"))) - ) - } + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) + testCoroutineDispatchers.runCurrent() + + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() + + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Something went wrong when trying to upload events")))) } @Test @@ -776,141 +753,129 @@ class ProfileAndDeviceIdFragmentTest { // Use fake time so that the generated event logs are consistent across runs. fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_FIXED_FAKE_TIME) profileTestHelper.addMoreProfiles(numProfiles = 2) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - - // Log & upload some events, then enqueue others. - logThreeAnalyticsEvents(profileId = null) - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_1) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) - logThreeAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_1) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - - onShareIdsAndEventsButtonAt(position = 5).perform(click()) - testCoroutineDispatchers.runCurrent() - - val expectedShareText = - """ - Oppia app installation ID: 113e04cc09a3 - - Profile name: Admin, learner ID: 8dcbbd21 - - Uploading learner events: 3 - - Uploaded learner events: 2 - - Uploading uncategorized events: 1 - - Uploaded uncategorized events: 4 - - Profile name: A, learner ID: 208663b0 - - Uploading learner events: 2 - - Uploaded learner events: 1 - - Profile name: B, learner ID: 92d0c6e2 - - Uploading learner events: 1 - - Uploaded learner events: 2 - Current sync status: Waiting to schedule data uploading worker…. - Event log encoding integrity checks: - - First 40 chars of encoded string: H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pY - - Last 40 chars of encoded string: BzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA - - SHA-1 hash (unwrapped event string): 1ee817dd58dcb25c9af4fbfc3c89c86b730f6680 - - Total event string length (unwrapped): 140 - Encoded event logs: - H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pYlJdaFJ+ZIgQRyMwrLknMyQEKcBkSrVSLwYjBisGJ - gU5ajEnVwsTBSDdNTELEBzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA - """.trimIndent() - val intents = getIntents() - assertThat(intents).hasSize(1) - assertThat(intents.single()).hasAction(Intent.ACTION_SEND) - assertThat(intents.single()).hasType("text/plain") - assertThat(intents.single()).extras().containsKey(Intent.EXTRA_TEXT) - assertThat(intents.single()).extras().string(Intent.EXTRA_TEXT).isEqualTo(expectedShareText) - } + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + + // Log & upload some events, then enqueue others. + logThreeAnalyticsEvents(profileId = null) + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_1) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) + logThreeAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_1) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + + onShareIdsAndEventsButtonAt(position = 5).perform(click()) + testCoroutineDispatchers.runCurrent() + + val expectedShareText = + """ + Oppia app installation ID: 113e04cc09a3 + - Profile name: Admin, learner ID: 8dcbbd21 + - Uploading learner events: 3 + - Uploaded learner events: 2 + - Uploading uncategorized events: 1 + - Uploaded uncategorized events: 4 + - Profile name: A, learner ID: 208663b0 + - Uploading learner events: 2 + - Uploaded learner events: 1 + - Profile name: B, learner ID: 92d0c6e2 + - Uploading learner events: 1 + - Uploaded learner events: 2 + Current sync status: Waiting to schedule data uploading worker…. + Event log encoding integrity checks: + - First 40 chars of encoded string: H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pY + - Last 40 chars of encoded string: BzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA + - SHA-1 hash (unwrapped event string): 1ee817dd58dcb25c9af4fbfc3c89c86b730f6680 + - Total event string length (unwrapped): 140 + Encoded event logs: + H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pYlJdaFJ+ZIgQRyMwrLknMyQEKcBkSrVSLwYjBisGJ + gU5ajEnVwsTBSDdNTELEBzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA + """.trimIndent() + val intents = getIntents() + assertThat(intents).hasSize(1) + assertThat(intents.single()).hasAction(Intent.ACTION_SEND) + assertThat(intents.single()).hasType("text/plain") + assertThat(intents.single()).extras().containsKey(Intent.EXTRA_TEXT) + assertThat(intents.single()).extras().string(Intent.EXTRA_TEXT).isEqualTo(expectedShareText) } @Test fun testFragment_noEventsPending_uploadLogsButtonDisabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - // The upload button should be disabled when there are no events to upload. - onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) - } + // The upload button should be disabled when there are no events to upload. + onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) } @Test fun testFragment_multipleEventsPending_noConnection_uploadLogsButtonDisabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - // The button is still disabled since there's no internet connection. - onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) - } + // The button is still disabled since there's no internet connection. + onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) } @Test fun testFragment_multipleEventsPending_uploadLogsButtonEnabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - // With events pending & connectivity, the upload button should now be available to press. - onUploadLogsButtonAt(position = 4).check(matches(isEnabled())) - } + // With events pending & connectivity, the upload button should now be available to press. + onUploadLogsButtonAt(position = 4).check(matches(isEnabled())) } @Test fun testFragment_multipleEventsPending_clickUploadLogs_wait_uploadsEventLogs() { profileTestHelper.addMoreProfiles(numProfiles = 1) - runInTestActivityAndAddFragment { - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - fakeAnalyticsEventLogger.clearAllEvents() - - // Click the 'upload logs' button and wait. - onUploadLogsButtonAt(position = 4).perform(click()) - testCoroutineDispatchers.runCurrent() - - // The events should be uploaded. - assertThat(fakeAnalyticsEventLogger.getEventListCount()).isEqualTo(3) - } - } + initializeActivityAndAddFragment() + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + fakeAnalyticsEventLogger.clearAllEvents() + + // Click the 'upload logs' button and wait. + onUploadLogsButtonAt(position = 4).perform(click()) + testCoroutineDispatchers.runCurrent() - private fun runInTestActivityAndAddFragment(testBlock: () -> Unit) { - launchActivityAndAddFragment().use { scenario -> - scenario.onActivity { activity -> - activity.setContentView(R.layout.test_activity) + // The events should be uploaded. + assertThat(fakeAnalyticsEventLogger.getEventListCount()).isEqualTo(3) + } - activity.supportFragmentManager.beginTransaction() - .add(R.id.test_fragment_placeholder, ProfileAndDeviceIdFragment()) - .commitNow() - } - connectNetwork() // Start with internet connectivity. - testCoroutineDispatchers.runCurrent() + private fun initializeActivityAndAddFragment() { + activityRule.scenario.onActivity { activity -> + activity.setContentView(R.layout.test_activity) - testBlock() + activity.supportFragmentManager.beginTransaction() + .add(R.id.test_fragment_placeholder, ProfileAndDeviceIdFragment()) + .commitNow() } + connectNetwork() // Start with internet connectivity. + testCoroutineDispatchers.runCurrent() } - private fun launchActivityAndAddFragment() = - ActivityScenario.launch(createIntent(ApplicationProvider.getApplicationContext())) - private fun scrollTo(position: Int) { onView(withId(R.id.profile_and_device_id_recycler_view)) .perform(actionOnItemAtPosition(position, scrollTo())) diff --git a/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt index 58b99cf4db5..6850c951041 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/docs/KdocValidityCheckTest.kt @@ -46,7 +46,7 @@ class KdocValidityCheckTest { val testContent = """ /** - * Returns the string corresponding to this error's string resources, or null if there + * Returns the string corresponding to this error's string resources, or null if there * is none. */ fun getErrorMessageFromStringRes(context: Context): String? { @@ -260,7 +260,7 @@ class KdocValidityCheckTest { val testContent = """ val testVal = "testContent" - + fun provideContext(application: Application): Context """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFileTest.kt") @@ -281,16 +281,14 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:2 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -352,21 +350,19 @@ class KdocValidityCheckTest { fun testKdoc_class_withoutKdoc_checkShouldFail() { val testContent = """ - class TestClass {} + class TestClass {} """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:1 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -382,21 +378,19 @@ class KdocValidityCheckTest { class NestedClass { class NestedLevel2Class {} } - } + } """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:5 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -409,16 +403,14 @@ class KdocValidityCheckTest { /** Test KDoc 1. */ class TestClass { val testVal = "test" - + fun testFunc(){} - } + } """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -426,7 +418,7 @@ class KdocValidityCheckTest { KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:3 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:5 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -442,9 +434,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -452,7 +442,7 @@ class KdocValidityCheckTest { KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:1 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:2 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -468,16 +458,14 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:2 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -495,16 +483,14 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:4 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -522,9 +508,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -533,7 +517,7 @@ class KdocValidityCheckTest { - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:1 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:2 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:3 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -544,15 +528,13 @@ class KdocValidityCheckTest { val testContent = """ const val TABLE_USER_ATTRIBUTE_EMPID = "_id" - + const val TABLE_USER_ATTRIBUTE_DATA = "data" """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -560,7 +542,7 @@ class KdocValidityCheckTest { KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:1 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:3 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -572,21 +554,19 @@ class KdocValidityCheckTest { """ fun getErrorMessageFromStringRes(context: Context): String? { return error?.let(context::getString) - } + } """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:1 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -604,16 +584,14 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:3 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -627,14 +605,12 @@ class KdocValidityCheckTest { WELCOME(0), TOPIC_LIST(1), FINAL(2) - } + } """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -644,7 +620,7 @@ class KdocValidityCheckTest { - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:2 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:3 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:4 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -655,22 +631,20 @@ class KdocValidityCheckTest { val testContent = """ interface ChapterSelector { - + fun chapterSelected(chapterIndex: Int, nextStoryIndex: Int, explorationId: String) - + fun chapterUnselected(chapterIndex: Int, nextStoryIndex: Int) - + interface ChildInterface { fun testFunction() } - } + } """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -681,7 +655,7 @@ class KdocValidityCheckTest { - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:5 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:7 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:8 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -695,11 +669,11 @@ class KdocValidityCheckTest { class TestClass { companion object { val pos = 1 - + fun incrementedPosition(position: Int): Int { return position+1 } - + fun decrementedPosition(position: Int): Int { return position-1 } @@ -709,9 +683,7 @@ class KdocValidityCheckTest { val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -720,7 +692,7 @@ class KdocValidityCheckTest { - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:4 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:6 - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:10 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -748,23 +720,21 @@ class KdocValidityCheckTest { val testContent = """ import javax.inject.Qualifier - + @Qualifier annotation class DelayShowAdditionalHintsFromWrongAnswerMillis """.trimIndent() val tempFile = tempFolder.newFile("testfiles/TempFile.kt") tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/TempFile.kt:4 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -775,7 +745,7 @@ class KdocValidityCheckTest { val testContent1 = """ import javax.inject.Qualifier - + @Qualifier annotation class DelayShowAdditionalHintsFromWrongAnswerMillis """.trimIndent() @@ -783,9 +753,9 @@ class KdocValidityCheckTest { """ class TestClass { fun testFunc(){} - + private val testVal = "test" - + val testVal2 = "test2" } """.trimIndent() @@ -800,9 +770,7 @@ class KdocValidityCheckTest { tempFile2.writeText(testContent2) tempFile3.writeText(testContent3) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -813,7 +781,7 @@ class KdocValidityCheckTest { - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:2 - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:6 - ${retrieveTestFilesDirectoryPath()}/TempFile3.kt:1 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -825,9 +793,9 @@ class KdocValidityCheckTest { """ /** test kdoc. */ val testVal1 = "test content" - + val testVal2 = "test content" - + fun getErrorMessageFromStringRes(context: Context): String? { return error?.let(context::getString) } @@ -858,7 +826,7 @@ class KdocValidityCheckTest { """ /** test Kdoc1. */ val testVal = "test content" - + /** test Kdoc2. */ fun getErrorMessageFromStringRes(context: Context): String? { return error?.let(context::getString) @@ -879,9 +847,7 @@ class KdocValidityCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -913,9 +879,7 @@ class KdocValidityCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(KDOC_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -923,10 +887,10 @@ class KdocValidityCheckTest { Redundant exemptions: - app/src/main/java/org/oppia/android/app/splash/SplashActivity.kt Please remove them from scripts/assets/kdoc_validity_exemptions.textproto - + KDoc missing for files: - ${retrieveTestFilesDirectoryPath()}/HomeActivity.kt:1 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) diff --git a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt index 39550f0f8ae..c555f4cba76 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt @@ -257,9 +257,7 @@ class RegexPatternValidationCheckTest { val tempFile = tempFolder.newFile("testfiles/data/src/main/TestActivity.kt") tempFile.writeText(requiredContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()).isEqualTo( @@ -287,9 +285,7 @@ class RegexPatternValidationCheckTest { tempFolder.newFolder("testfiles", "app", "src", "main", "res", "values", "subdir") tempFolder.newFile("testfiles/app/src/main/res/values/subdir/strings.xml") - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()).isEqualTo( @@ -307,16 +303,14 @@ class RegexPatternValidationCheckTest { tempFolder.newFolder("testfiles", "domain", "src", "main", "res", "drawable", "subdir") tempFolder.newFile("testfiles/domain/src/main/res/drawable/subdir/example.png") - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()).isEqualTo( """ File name/path violation: $nestedResourceSubdirectoryErrorMessage - domain/src/main/res/drawable/subdir/example.png - + $wikiReferenceNote """.trimIndent() ) @@ -337,9 +331,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -357,9 +349,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -377,9 +367,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -397,9 +385,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -417,9 +403,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/TestFile.kt") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -437,9 +421,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -457,9 +439,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -477,9 +457,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -497,9 +475,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -517,9 +493,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -537,9 +511,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -557,9 +529,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -577,9 +547,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -597,9 +565,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -617,9 +583,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -637,9 +601,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -657,9 +619,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -677,9 +637,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -697,9 +655,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -717,9 +673,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -737,9 +691,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -757,9 +709,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -777,9 +727,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -797,9 +745,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -817,9 +763,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -837,9 +781,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -857,9 +799,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -877,9 +817,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -897,9 +835,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -917,9 +853,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -937,9 +871,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -957,9 +889,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -977,9 +907,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -997,9 +925,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = tempFolder.newFile("testfiles/test_layout.xml") fileContainsSupportLibraryImport.writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1018,9 +944,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1039,9 +963,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1072,9 +994,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/untranslated_strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1093,9 +1013,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/untranslated_strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1114,9 +1032,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1135,9 +1051,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1207,9 +1121,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -1250,9 +1162,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.java" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -1285,9 +1195,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -1317,9 +1225,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -1345,9 +1251,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1370,9 +1274,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1400,9 +1302,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/strings.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -1443,9 +1343,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/SomeActivity.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent + requiredContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1465,9 +1363,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/SomeActivity.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent + requiredContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1487,9 +1383,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/SomeActivity.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent + requiredContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1508,9 +1402,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/SomeDialogFragment.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1541,9 +1433,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/AndroidManifest.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1571,9 +1461,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/AndroidManifest.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1601,9 +1489,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/AndroidManifest.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1622,9 +1508,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1643,9 +1527,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1669,9 +1551,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1692,9 +1572,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1713,9 +1591,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1745,9 +1621,7 @@ class RegexPatternValidationCheckTest { val fileContainsSupportLibraryImport = "test_layout.xml" tempFolder.newFile("testfiles/$fileContainsSupportLibraryImport").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1774,9 +1648,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/test/SomeTest.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1796,9 +1668,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "data/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1817,9 +1687,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/BUILD" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1838,9 +1706,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/BUILD.bazel" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1859,9 +1725,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "domain/src/main/SomeController.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -1881,9 +1745,7 @@ class RegexPatternValidationCheckTest { val prohibitedFile = tempFolder.newFile("testfiles/data/src/main/TestActivity.kt") prohibitedFile.writeText(prohibitedContent + requiredContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()).isEqualTo( @@ -1914,9 +1776,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_palette.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -1964,9 +1824,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_defs.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2012,9 +1870,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/component_colors.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2059,9 +1915,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_defs.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2123,9 +1977,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/component_colors.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2171,9 +2023,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_palette.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2218,9 +2068,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_defs.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2263,9 +2111,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/component_colors.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2311,9 +2157,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/layout/test_layout.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2381,9 +2225,7 @@ class RegexPatternValidationCheckTest { tempFolder.newFile("testfiles/$stringFilePath5").writeText(prohibitedContent) tempFolder.newFile("testfiles/$stringFilePath6").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2438,9 +2280,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/values/color_palette.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2460,9 +2300,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/activity/HomeActivity.kt" tempFolder.newFile("testfiles/$stringFilePath") - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -2492,9 +2330,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/activity/HomeActivityTest.kt" tempFolder.newFile("testfiles/$stringFilePath") - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) assertThat(outContent.toString().trim()) @@ -2528,9 +2364,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/SomeInitializer.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2553,9 +2387,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2578,9 +2410,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2603,9 +2433,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/java/org/oppia/android/TestPresenter.kt" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) @@ -2702,7 +2530,7 @@ class RegexPatternValidationCheckTest { /** Content here.*/ /** Content here. **/ /** Correct KDoc. */ - + /* * Incorrect block comment. **/ diff --git a/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt index 3c22ca1ac31..1b6ded9633a 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testfile/TestFileCheckTest.kt @@ -52,15 +52,13 @@ class TestFileCheckTest { tempFolder.newFile("testfiles/ProdFile1Test.kt") tempFolder.newFile("testfiles/ProdFile2.kt") - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TEST_FILE_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ File ${retrieveTestFilesDirectoryPath()}/ProdFile2.kt $errorMessage - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -73,16 +71,14 @@ class TestFileCheckTest { tempFolder.newFile("testfiles/ProdFile2.kt") tempFolder.newFile("testfiles/ProdFile3.kt") - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TEST_FILE_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ File ${retrieveTestFilesDirectoryPath()}/ProdFile2.kt does not have a corresponding test file. File ${retrieveTestFilesDirectoryPath()}/ProdFile3.kt does not have a corresponding test file. - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -95,16 +91,14 @@ class TestFileCheckTest { tempFolder.newFile("testfiles/ProdFile3.kt") tempFolder.newFile("testfiles/ProdFile2.kt") - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TEST_FILE_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ File ${retrieveTestFilesDirectoryPath()}/ProdFile2.kt does not have a corresponding test file. File ${retrieveTestFilesDirectoryPath()}/ProdFile3.kt does not have a corresponding test file. - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index 68b162340ac..6df3902ba9a 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -43,9 +43,7 @@ class TodoOpenCheckTest { @Test fun testTodoCheck_noJsonFilePresent_checkShouldFail() { - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains( "${retrieveTestFilesDirectoryPath()}/open_issues.json: No such file exists" @@ -103,9 +101,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -116,7 +112,7 @@ class TodoOpenCheckTest { - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:3 - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:4 - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:5 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -141,9 +137,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -152,7 +146,7 @@ class TodoOpenCheckTest { - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:1 - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:2 - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:5 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -185,9 +179,7 @@ class TodoOpenCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -195,11 +187,11 @@ class TodoOpenCheckTest { TODOs not in correct format: - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:2 - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:1 - + TODOs not corresponding to open issues on GitHub: - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:1 - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:3 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -239,9 +231,7 @@ class TodoOpenCheckTest { tempFile2.writeText(testContent2) tempFile3.writeText(testContent3) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -250,11 +240,11 @@ class TodoOpenCheckTest { - ${retrieveTestFilesDirectoryPath()}/Activity.kt:2 - ${retrieveTestFilesDirectoryPath()}/Fragment.kt:1 - ${retrieveTestFilesDirectoryPath()}/Presenter.kt:2 - + TODOs not corresponding to open issues on GitHub: - ${retrieveTestFilesDirectoryPath()}/Fragment.kt:3 - ${retrieveTestFilesDirectoryPath()}/Presenter.kt:1 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -340,9 +330,7 @@ class TodoOpenCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -391,9 +379,7 @@ class TodoOpenCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -401,13 +387,13 @@ class TodoOpenCheckTest { Redundant exemptions (there are no TODOs corresponding to these lines): - TempFile1.kt:2 Please remove them from scripts/assets/todo_exemptions.textproto - + TODOs not in correct format: - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:1 - + TODOs not corresponding to open issues on GitHub: - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:3 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt index 293cca1e47e..bc78d44296e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/XmlSyntaxCheckTest.kt @@ -73,15 +73,13 @@ class XmlSyntaxCheckTest { val tempFile = tempFolder.newFile("testfiles/TestFile.xml") tempFile.writeText(invalidXml) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(XML_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ ${retrieveTestFilesDirectoryPath()}/TestFile.xml:6:8: $syntaxFailureMessage1 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -112,16 +110,14 @@ class XmlSyntaxCheckTest { tempFile1.writeText(invalidXmlForFile1) tempFile2.writeText(invalidXmlForFile2) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(XML_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = """ ${retrieveTestFilesDirectoryPath()}/TestFile1.xml:4:4: $syntaxFailureMessage2 ${retrieveTestFilesDirectoryPath()}/TestFile2.xml:6:8: $syntaxFailureMessage1 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -163,9 +159,7 @@ class XmlSyntaxCheckTest { tempFile2.writeText(invalidXmlForFile2) tempFile3.writeText(invalidXmlForFile3) - val exception = assertThrows() { - runScript() - } + val exception = assertThrows() { runScript() } assertThat(exception).hasMessageThat().contains(XML_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = @@ -173,7 +167,7 @@ class XmlSyntaxCheckTest { ${retrieveTestFilesDirectoryPath()}/TestFile1.xml:4:4: $syntaxFailureMessage2 ${retrieveTestFilesDirectoryPath()}/TestFile2.xml:6:8: $syntaxFailureMessage1 ${retrieveTestFilesDirectoryPath()}/TestFile3.xml:6:8: $syntaxFailureMessage1 - + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) diff --git a/testing/BUILD.bazel b/testing/BUILD.bazel index 9bed8754f08..5c6cf0abf63 100644 --- a/testing/BUILD.bazel +++ b/testing/BUILD.bazel @@ -153,10 +153,7 @@ kt_android_library( testonly = True, srcs = ["src/main/java/org/oppia/android/testing/AssertionHelpers.kt"], visibility = ["//visibility:public"], - deps = [ - "//third_party:junit_junit", - "//third_party:org_jetbrains_kotlin_kotlin-reflect", - ], + deps = ["//third_party:junit_junit"], ) filegroup( From 2551d4b908fea3f867fc2c94bdd472c468351fda Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Mon, 11 Sep 2023 23:39:38 +0000 Subject: [PATCH 18/63] Fix test behavior inconsistency in test. The issue ultimately arose from test parameters being initialized after they're needed in the launched UI. This type of change was tried earlier in the branch, but reverted since it didn't seem necessary. It is, however, necessary when there are environment differences (e.g. local vs. CI) or when running certain tests individually. Due to the difficulty in finding this issue, ActivityScenarioRule has been added as a prohibited pattern in the static regex checks (along with ActivityTestRule since that's deprecated and discouraged, anyway). --- .../ProfileAndDeviceIdFragmentTest.kt | 825 +++++++++--------- .../file_content_validation_checks.textproto | 87 ++ .../regex/RegexPatternValidationCheckTest.kt | 51 ++ 3 files changed, 567 insertions(+), 396 deletions(-) diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt index 74c37f0e6da..b7e883989f8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt @@ -9,6 +9,7 @@ import android.view.View import androidx.annotation.IdRes import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView +import androidx.test.core.app.ActivityScenario import androidx.test.core.app.ApplicationProvider import androidx.test.espresso.Espresso.onView import androidx.test.espresso.ViewInteraction @@ -23,7 +24,6 @@ import androidx.test.espresso.matcher.ViewMatchers.isEnabled import androidx.test.espresso.matcher.ViewMatchers.isRoot import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.espresso.matcher.ViewMatchers.withText -import androidx.test.ext.junit.rules.ActivityScenarioRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.truth.content.IntentSubject.assertThat import androidx.work.Configuration @@ -147,11 +147,6 @@ import javax.inject.Singleton class ProfileAndDeviceIdFragmentTest { @get:Rule val initializeDefaultLocaleRule = InitializeDefaultLocaleRule() @get:Rule val oppiaTestRule = OppiaTestRule() - @get:Rule - var activityRule = - ActivityScenarioRule( - TestActivity.createIntent(ApplicationProvider.getApplicationContext()) - ) @Inject lateinit var profileTestHelper: ProfileTestHelper @Inject lateinit var testCoroutineDispatchers: TestCoroutineDispatchers @@ -193,39 +188,39 @@ class ProfileAndDeviceIdFragmentTest { @Test fun testFragment_withOnlyAdminProfile_hasThreeItems() { - initializeActivityAndAddFragment() - - // There should be three items: a header, a profile, and the sync status. - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 4)) + runWithLaunchedActivityAndAddedFragment { + // There should be three items: a header, a profile, and the sync status. + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 4)) + } } @Test fun testFragment_withOnlyAdminProfile_hasDeviceIdHeader() { - initializeActivityAndAddFragment() - - onDeviceIdLabelAt(position = 0).check(matches(isDisplayed())) + runWithLaunchedActivityAndAddedFragment { + onDeviceIdLabelAt(position = 0).check(matches(isDisplayed())) + } } @Test fun testFragment_hasDeviceId() { - initializeActivityAndAddFragment() - - onDeviceIdLabelAt(position = 0).check(matches(withText(containsString("113e04cc09a3")))) + runWithLaunchedActivityAndAddedFragment { + onDeviceIdLabelAt(position = 0).check(matches(withText(containsString("113e04cc09a3")))) + } } @Test fun testFragment_deviceId_hasCopyButton() { - initializeActivityAndAddFragment() - - onDeviceIdCopyButtonAt(position = 0).check(matches(isDisplayed())) + runWithLaunchedActivityAndAddedFragment { + onDeviceIdCopyButtonAt(position = 0).check(matches(isDisplayed())) + } } @Test fun testFragment_deviceId_clickCopyButton_copiesDeviceIdToClipboard() { - initializeActivityAndAddFragment() - - onDeviceIdCopyButtonAt(position = 0).perform(click()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onDeviceIdCopyButtonAt(position = 0).perform(click()) + testCoroutineDispatchers.runCurrent() + } val clipData = getCurrentClipData() assertThat(clipData?.description?.label).isEqualTo("Oppia installation ID") @@ -235,38 +230,38 @@ class ProfileAndDeviceIdFragmentTest { @Test fun testFragment_withOnlyAdminProfile_hasOneProfileListed() { - initializeActivityAndAddFragment() - - onProfileNameAt(position = 1).check(matches(isDisplayed())) + runWithLaunchedActivityAndAddedFragment { + onProfileNameAt(position = 1).check(matches(isDisplayed())) + } } @Test fun testFragment_profileEntry_hasProfileName() { - initializeActivityAndAddFragment() - - onProfileNameAt(position = 1).check(matches(withText("Admin"))) + runWithLaunchedActivityAndAddedFragment { + onProfileNameAt(position = 1).check(matches(withText("Admin"))) + } } @Test fun testFragment_profileEntry_hasLearnerId() { - initializeActivityAndAddFragment() - - onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) + runWithLaunchedActivityAndAddedFragment { + onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) + } } @Test fun testFragment_profileEntry_hasCopyButton() { - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 1).check(matches(isDisplayed())) + runWithLaunchedActivityAndAddedFragment { + onLearnerIdCopyButtonAt(position = 1).check(matches(isDisplayed())) + } } @Test fun testFragment_profileEntry_clickFirstCopyButton_copiesAdminLearnerIdToClipboard() { - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() + } val clipData = getCurrentClipData() assertThat(clipData?.description?.label).isEqualTo("Admin's learner ID") @@ -278,50 +273,50 @@ class ProfileAndDeviceIdFragmentTest { fun testFragment_multipleProfiles_listsAllProfiles() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - // Header + admin + 5 new profiles + sync status = 8 items. - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) + runWithLaunchedActivityAndAddedFragment { + // Header + admin + 5 new profiles + sync status = 8 items. + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) + } } @Test fun testFragment_multipleProfiles_adminIsFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - onProfileNameAt(position = 1).check(matches(withText("Admin"))) + runWithLaunchedActivityAndAddedFragment { + onProfileNameAt(position = 1).check(matches(withText("Admin"))) + } } @Test fun testFragment_multipleProfiles_secondEntryHasDifferentName() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - // The second entry is not the admin. - onProfileNameAt(position = 2).check(matches(withText("A"))) + runWithLaunchedActivityAndAddedFragment { + // The second entry is not the admin. + onProfileNameAt(position = 2).check(matches(withText("A"))) + } } @Test fun testFragment_multipleProfiles_secondEntryHasDifferentLearnerIdThanFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - // The second profile has a different learner ID. - onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) - onLearnerIdAt(position = 2).check(matches(withText("208663b0"))) + runWithLaunchedActivityAndAddedFragment { + // The second profile has a different learner ID. + onLearnerIdAt(position = 1).check(matches(withText("8dcbbd21"))) + onLearnerIdAt(position = 2).check(matches(withText("208663b0"))) + } } @Test fun testFragment_multipleProfiles_copySecondEntry_copiesDifferentLearnerIdThanFirst() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 2).perform(click()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onLearnerIdCopyButtonAt(position = 2).perform(click()) + testCoroutineDispatchers.runCurrent() + } val clipData = getCurrentClipData() assertThat(clipData?.description?.label).isEqualTo("A's learner ID") @@ -331,421 +326,449 @@ class ProfileAndDeviceIdFragmentTest { @Test fun testFragment_initialState_deviceIdCopyButtonHasCopyLabel() { - initializeActivityAndAddFragment() - - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + runWithLaunchedActivityAndAddedFragment { + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + } } @Test fun testFragment_adminProfile_initialState_learnerIdCopyButtonHasCopyLabel() { - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + runWithLaunchedActivityAndAddedFragment { + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + } } @Test fun testFragment_adminProfile_clickDeviceIdCopyButton_deviceIdIsCopiedButNotLearnerId() { - initializeActivityAndAddFragment() - - onDeviceIdCopyButtonAt(position = 0).perform(click()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onDeviceIdCopyButtonAt(position = 0).perform(click()) + testCoroutineDispatchers.runCurrent() - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copied"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copied"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + } } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_learnerIdIsCopiedButNotDeviceId() { - initializeActivityAndAddFragment() - - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) + } } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_copyInOtherApp_nothingIsCopied() { - initializeActivityAndAddFragment() - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() - updateClipDataAsThoughFromAnotherApp() + updateClipDataAsThoughFromAnotherApp() - // Changing the clipboard in a different app should reset the labels. - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + // Changing the clipboard in a different app should reset the labels. + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copy"))) + } } @Test fun testFragment_adminProfile_clickLearnerIdCopyButton_rotate_learnerIdStillCopied() { - initializeActivityAndAddFragment() - onLearnerIdCopyButtonAt(position = 1).perform(click()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onLearnerIdCopyButtonAt(position = 1).perform(click()) + testCoroutineDispatchers.runCurrent() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - // The button label should be restored after a rotation. - onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) - onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) + // The button label should be restored after a rotation. + onDeviceIdCopyButtonAt(position = 0).check(matches(withText("Copy"))) + onLearnerIdCopyButtonAt(position = 1).check(matches(withText("Copied"))) + } } @Test fun testFragment_multipleProfiles_rotate_profilesStillPresent() { profileTestHelper.addMoreProfiles(numProfiles = 5) - initializeActivityAndAddFragment() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) + onView(withId(R.id.profile_and_device_id_recycler_view)).check(hasItemCount(count = 9)) + } } @Test fun testFragment_firstEntry_noAdminEvents_hasZeroAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + runWithLaunchedActivityAndAddedFragment { + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_firstEntry_adminEvents_notUploaded_hasSomeAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events. - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + // Log a couple of events. + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - // Two are awaiting upload, but neither have been uploaded yet. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + // Two are awaiting upload, but neither have been uploaded yet. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_firstEntry_adminEvents_uploaded_hasSomeAdminEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event. - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + // Log a couple of events, upload them, then log one more event. + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - // Two should be uploaded, and one waiting upload. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + // Two should be uploaded, and one waiting upload. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + } } @Test fun testFragment_firstEntry_noGenericEvents_hasZeroGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + runWithLaunchedActivityAndAddedFragment { + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_firstEntry_genericEvents_notUploaded_hasSomeGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events off of the admin profile. - logTwoAnalyticsEvents(profileId = null) + // Log a couple of events off of the admin profile. + logTwoAnalyticsEvents(profileId = null) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_firstEntry_genericEvents_uploaded_hasSomeGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event, off of the admin profile. - logTwoAnalyticsEvents(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) + // Log a couple of events, upload them, then log one more event, off of the admin profile. + logTwoAnalyticsEvents(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("2"))) + } } @Test fun testFragment_firstEntry_mixOfAdminAndGenericEvents_someUploaded_reportsAllEvents() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Log & upload a mix of events with and without the admin profile. - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logThreeAnalyticsEvents(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - - // Event counts should be represented in the correct places. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("1"))) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("3"))) + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + + // Log & upload a mix of events with and without the admin profile. + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logThreeAnalyticsEvents(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + + // Event counts should be represented in the correct places. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("1"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("1"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("3"))) + } } @Test fun testFragment_secondEntry_noLearnerEvents_hasZeroLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + runWithLaunchedActivityAndAddedFragment { + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + } } @Test fun testFragment_secondEntry_learnerEvents_notUploaded_hasSomeLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + // Log a couple of events. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - // Two are awaiting upload, but neither have been uploaded yet. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("2"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + // Two are awaiting upload, but neither have been uploaded yet. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("2"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + } } @Test fun testFragment_secondEntry_learnerEvents_uploaded_hasSomeLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - // Log a couple of events, upload them, then log one more event. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + // Log a couple of events, upload them, then log one more event. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - // Two should be uploaded, and one waiting upload. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("1"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("2"))) + // Two should be uploaded, and one waiting upload. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("1"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("2"))) + } } @Test fun testFragment_secondEntry_learnerEvents_hasZeroAdminOrGenericEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Log a couple of events, upload them, then log one more event, for a learner profile. - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - - // The admin profile's event counts shouldn't change since the only logged events were for a - // specific learner profile. - onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) - onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) - onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + + // Log a couple of events, upload them, then log one more event, for a learner profile. + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + + // The admin profile's event counts shouldn't change since the only logged events were for a + // specific learner profile. + onAwaitingUploadLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 1).check(matches(withText("0"))) + onAwaitingUploadUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + onUploadedUncategorizedEventsCountAt(position = 1).check(matches(withText("0"))) + } } @Test fun testFragment_secondEntry_adminAndGenericEvents_uploaded_hasZeroLearnerEventsReported() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Log a couple of events generically and for the admin profile. - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = null) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = null) - - // No events should be reported for the learner since it didn't have any events uploaded. - onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) - onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + + // Log a couple of events generically and for the admin profile. + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = null) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = null) + + // No events should be reported for the learner since it didn't have any events uploaded. + onAwaitingUploadLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + onUploadedLearnerEventsCountAt(position = 2).check(matches(withText("0"))) + } } @Test fun testFragment_initialState_profileDataHasYetToBeCollected() { - initializeActivityAndAddFragment() - - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) + runWithLaunchedActivityAndAddedFragment { + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) + } } @Test fun testFragment_initialState_wait_profileDataHasYetToBeCollected() { - initializeActivityAndAddFragment() - - testCoroutineDispatchers.advanceTimeBy(delayTimeMillis = TimeUnit.SECONDS.toMillis(1)) + runWithLaunchedActivityAndAddedFragment { + testCoroutineDispatchers.advanceTimeBy(delayTimeMillis = TimeUnit.SECONDS.toMillis(1)) - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) + } } @Test fun testFragment_eventLogged_waitingForUpload_indicatorTextMentionsWaiting() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Enqueue the event, but don't actually begin uploading it, then reconnect to the network. Note - // that the extra event log is a slight hack to force a refresh of the status indicator (since - // network changes are polled when there are other changes to represent rather than being - // actively "pushed" by the system). - logAnalyticsEvent() - connectNetwork() - logAnalyticsEvent() - - // The status indicator is suggesting that events can be uploaded (and there are some available - // to upload), they just haven't been scheduled yet. - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Waiting to schedule data uploading worker…")))) + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + + // Enqueue the event, but don't actually begin uploading it, then reconnect to the network. + // Note that the extra event log is a slight hack to force a refresh of the status indicator + // (since network changes are polled when there are other changes to represent rather than + // being actively "pushed" by the system). + logAnalyticsEvent() + connectNetwork() + logAnalyticsEvent() + + // The status indicator is suggesting that events can be uploaded (and there are some + // available to upload), they just haven't been scheduled yet. + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Waiting to schedule data uploading worker…")))) + } } @Test fun testFragment_eventLogged_waitingForUpload_uploadStarted_profileDataIsCurrentlyUploading() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - // Unfortunately, it's tricky to pause the actual upload worker so this is a hacky way to - // produce the same situation to ensure the label is correct. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) - testCoroutineDispatchers.runCurrent() + // Unfortunately, it's tricky to pause the actual upload worker so this is a hacky way to + // produce the same situation to ensure the label is correct. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Profile data is currently uploading")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Profile data is currently uploading")))) + } } @Test fun testFragment_noConnectivity_indicatorTextMentionsDataCannotBeUploaded() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Enqueue an event but don't reconnect to the network. - logAnalyticsEvent() - - // The status indicator is suggesting that internet connectivity needs to resume in order to - // upload events. - onSyncStatusAt(position = 2) - .check( - matches( - withText( - containsString( - "Please connect to a WiFi or Cellular network in order to upload profile data" + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + + // Enqueue an event but don't reconnect to the network. + logAnalyticsEvent() + + // The status indicator is suggesting that internet connectivity needs to resume in order to + // upload events. + onSyncStatusAt(position = 2) + .check( + matches( + withText( + containsString( + "Please connect to a WiFi or Cellular network in order to upload profile data" + ) ) ) ) - ) + } } @Test fun testFragment_eventLogged_waitForUpload_profileDataIsUploaded() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) + } } @Test fun testFragment_eventLogged_uploadError_profileDataHasError() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() - // An upload error can currently only be simulated by directly influencing the sync manager. - syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) - testCoroutineDispatchers.runCurrent() + // An upload error can currently only be simulated by directly influencing the sync manager. + syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Something went wrong when trying to upload events")))) + onSyncStatusAt(position = 2) + .check( + matches(withText(containsString("Something went wrong when trying to upload events"))) + ) + } } @Test fun testFragment_eventLogged_uploadError_anotherLogged_wait_profileDataIsUploading() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.reportUploadError() - testCoroutineDispatchers.runCurrent() - - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() - - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.reportUploadError() + testCoroutineDispatchers.runCurrent() + + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() + + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) + } } @Test fun testFragment_rotate_profileDataHasYetToBeCollected() { - initializeActivityAndAddFragment() - - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("No data has been collected yet to upload")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("No data has been collected yet to upload")))) + } } @Test fun testFragment_eventLogged_waitingForUpload_rotate_profileDataIsCurrentlyUploading() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) - testCoroutineDispatchers.runCurrent() + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.DATA_UPLOADING) + testCoroutineDispatchers.runCurrent() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Profile data is currently uploading")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("Profile data is currently uploading")))) + } } @Test fun testFragment_eventLogged_waitForUpload_rotate_profileDataIsUploaded() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - connectNetwork() - flushEventWorkerQueue() + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + connectNetwork() + flushEventWorkerQueue() - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("All profile data has been uploaded")))) + onSyncStatusAt(position = 2) + .check(matches(withText(containsString("All profile data has been uploaded")))) + } } @Test fun testFragment_eventsLogged_uploadError_rotate_profileDataHasError() { - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent() - syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) - testCoroutineDispatchers.runCurrent() - - onView(isRoot()).perform(orientationLandscape()) - testCoroutineDispatchers.runCurrent() - - onSyncStatusAt(position = 2) - .check(matches(withText(containsString("Something went wrong when trying to upload events")))) + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent() + syncStatusManager.forceSyncStatus(SyncStatus.UPLOAD_ERROR) + testCoroutineDispatchers.runCurrent() + + onView(isRoot()).perform(orientationLandscape()) + testCoroutineDispatchers.runCurrent() + + onSyncStatusAt(position = 2) + .check( + matches(withText(containsString("Something went wrong when trying to upload events"))) + ) + } } @Test @@ -753,127 +776,137 @@ class ProfileAndDeviceIdFragmentTest { // Use fake time so that the generated event logs are consistent across runs. fakeOppiaClock.setFakeTimeMode(FakeOppiaClock.FakeTimeMode.MODE_FIXED_FAKE_TIME) profileTestHelper.addMoreProfiles(numProfiles = 2) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - - // Log & upload some events, then enqueue others. - logThreeAnalyticsEvents(profileId = null) - logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_1) - connectOnlyToFlushWorkerQueue() - logAnalyticsEvent(profileId = null) - logThreeAnalyticsEvents(profileId = ADMIN_PROFILE_ID) - logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_1) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - - onShareIdsAndEventsButtonAt(position = 5).perform(click()) - testCoroutineDispatchers.runCurrent() - - val expectedShareText = - """ - Oppia app installation ID: 113e04cc09a3 - - Profile name: Admin, learner ID: 8dcbbd21 - - Uploading learner events: 3 - - Uploaded learner events: 2 - - Uploading uncategorized events: 1 - - Uploaded uncategorized events: 4 - - Profile name: A, learner ID: 208663b0 - - Uploading learner events: 2 - - Uploaded learner events: 1 - - Profile name: B, learner ID: 92d0c6e2 - - Uploading learner events: 1 - - Uploaded learner events: 2 - Current sync status: Waiting to schedule data uploading worker…. - Event log encoding integrity checks: - - First 40 chars of encoded string: H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pY - - Last 40 chars of encoded string: BzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA - - SHA-1 hash (unwrapped event string): 1ee817dd58dcb25c9af4fbfc3c89c86b730f6680 - - Total event string length (unwrapped): 140 - Encoded event logs: - H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pYlJdaFJ+ZIgQRyMwrLknMyQEKcBkSrVSLwYjBisGJ - gU5ajEnVwsTBSDdNTELEBzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA - """.trimIndent() - val intents = getIntents() - assertThat(intents).hasSize(1) - assertThat(intents.single()).hasAction(Intent.ACTION_SEND) - assertThat(intents.single()).hasType("text/plain") - assertThat(intents.single()).extras().containsKey(Intent.EXTRA_TEXT) - assertThat(intents.single()).extras().string(Intent.EXTRA_TEXT).isEqualTo(expectedShareText) + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + + // Log & upload some events, then enqueue others. + logThreeAnalyticsEvents(profileId = null) + logTwoAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_1) + connectOnlyToFlushWorkerQueue() + logAnalyticsEvent(profileId = null) + logThreeAnalyticsEvents(profileId = ADMIN_PROFILE_ID) + logTwoAnalyticsEvents(profileId = LEARNER_PROFILE_ID_0) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_1) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + + onShareIdsAndEventsButtonAt(position = 5).perform(click()) + testCoroutineDispatchers.runCurrent() + + val expectedShareText = + """ + Oppia app installation ID: 113e04cc09a3 + - Profile name: Admin, learner ID: 8dcbbd21 + - Uploading learner events: 3 + - Uploaded learner events: 2 + - Uploading uncategorized events: 1 + - Uploaded uncategorized events: 4 + - Profile name: A, learner ID: 208663b0 + - Uploading learner events: 2 + - Uploaded learner events: 1 + - Profile name: B, learner ID: 92d0c6e2 + - Uploading learner events: 1 + - Uploaded learner events: 2 + Current sync status: Waiting to schedule data uploading worker…. + Event log encoding integrity checks: + - First 40 chars of encoded string: H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pY + - Last 40 chars of encoded string: BzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA + - SHA-1 hash (unwrapped event string): 1ee817dd58dcb25c9af4fbfc3c89c86b730f6680 + - Total event string length (unwrapped): 140 + Encoded event logs: + H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pYlJdaFJ+ZIgQRyMwrLknMyQEKcBkSrVSLwYjBisGJ + gU5ajEnVwsTBSDdNTELEBzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA + """.trimIndent() + val intents = getIntents() + assertThat(intents).hasSize(1) + assertThat(intents.single()).hasAction(Intent.ACTION_SEND) + assertThat(intents.single()).hasType("text/plain") + assertThat(intents.single()).extras().containsKey(Intent.EXTRA_TEXT) + assertThat(intents.single()).extras().string(Intent.EXTRA_TEXT).isEqualTo(expectedShareText) + } } @Test fun testFragment_noEventsPending_uploadLogsButtonDisabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - // The upload button should be disabled when there are no events to upload. - onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) + // The upload button should be disabled when there are no events to upload. + onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) + } } @Test fun testFragment_multipleEventsPending_noConnection_uploadLogsButtonDisabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - // The button is still disabled since there's no internet connection. - onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) + // The button is still disabled since there's no internet connection. + onUploadLogsButtonAt(position = 4).check(matches(not(isEnabled()))) + } } @Test fun testFragment_multipleEventsPending_uploadLogsButtonEnabled() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - // With events pending & connectivity, the upload button should now be available to press. - onUploadLogsButtonAt(position = 4).check(matches(isEnabled())) + // With events pending & connectivity, the upload button should now be available to press. + onUploadLogsButtonAt(position = 4).check(matches(isEnabled())) + } } @Test fun testFragment_multipleEventsPending_clickUploadLogs_wait_uploadsEventLogs() { profileTestHelper.addMoreProfiles(numProfiles = 1) - initializeActivityAndAddFragment() - disconnectNetwork() // Ensure events are cached. - logAnalyticsEvent(profileId = null) - logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) - logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) - connectNetwork() - logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. - fakeAnalyticsEventLogger.clearAllEvents() - - // Click the 'upload logs' button and wait. - onUploadLogsButtonAt(position = 4).perform(click()) - testCoroutineDispatchers.runCurrent() - - // The events should be uploaded. - assertThat(fakeAnalyticsEventLogger.getEventListCount()).isEqualTo(3) + runWithLaunchedActivityAndAddedFragment { + disconnectNetwork() // Ensure events are cached. + logAnalyticsEvent(profileId = null) + logAnalyticsEvent(profileId = ADMIN_PROFILE_ID) + logAnalyticsEvent(profileId = LEARNER_PROFILE_ID_0) + connectNetwork() + logAnalyticsEvent(profileId = null) // Log an event to trigger tracking the network change. + fakeAnalyticsEventLogger.clearAllEvents() + + // Click the 'upload logs' button and wait. + onUploadLogsButtonAt(position = 4).perform(click()) + testCoroutineDispatchers.runCurrent() + + // The events should be uploaded. + assertThat(fakeAnalyticsEventLogger.getEventListCount()).isEqualTo(3) + } } - private fun initializeActivityAndAddFragment() { - activityRule.scenario.onActivity { activity -> - activity.setContentView(R.layout.test_activity) - - activity.supportFragmentManager.beginTransaction() - .add(R.id.test_fragment_placeholder, ProfileAndDeviceIdFragment()) - .commitNow() + private fun runWithLaunchedActivityAndAddedFragment( + testBlock: ActivityScenario.() -> Unit + ) { + ActivityScenario.launch(TestActivity.createIntent(context)).use { scenario -> + scenario.onActivity { activity -> + activity.setContentView(R.layout.test_activity) + + activity.supportFragmentManager.beginTransaction() + .add(R.id.test_fragment_placeholder, ProfileAndDeviceIdFragment()) + .commitNow() + } + connectNetwork() // Start with internet connectivity. + testCoroutineDispatchers.runCurrent() + scenario.testBlock() } - connectNetwork() // Start with internet connectivity. - testCoroutineDispatchers.runCurrent() } private fun scrollTo(position: Int) { diff --git a/scripts/assets/file_content_validation_checks.textproto b/scripts/assets/file_content_validation_checks.textproto index 677e7ebcb9e..817a9a5e7ee 100644 --- a/scripts/assets/file_content_validation_checks.textproto +++ b/scripts/assets/file_content_validation_checks.textproto @@ -498,3 +498,90 @@ file_content_checks { failure_message: "Badly formatted KDoc. Single-line KDocs should end with punctuation." exempted_file_name: "scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt" } +file_content_checks { + file_path_regex: ".+?Test\\.kt" + prohibited_content_regex: "androidx.test.rule.ActivityTestRule" + failure_message: "ActivityTestRule is deprecated since it operates test activities in sometimes unsafe situations. Use ActivityScenario, instead." + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/survey/SurveyActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/survey/SurveyFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt" + exempted_file_name: "scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt" +} +file_content_checks { + file_path_regex: ".+?Test\\.kt" + prohibited_content_regex: "androidx.test.ext.junit.rules.ActivityScenarioRule" + failure_message: "ActivityScenarioRule can result in order dependence when static state leaks across tests (such as static module variables), and can make staging much more difficult for platform parameters. Use ActivityScenario directly, instead." + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt" + exempted_file_name: "app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterModuleTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt" + exempted_file_name: "app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt" + exempted_file_name: "domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/ApplicationLifecycleObserverTest.kt" + exempted_file_name: "scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt" + exempted_file_name: "testing/src/test/java/org/oppia/android/testing/espresso/TextInputActionTest.kt" +} diff --git a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt index c555f4cba76..707a2cf7e2a 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt @@ -209,6 +209,13 @@ class RegexPatternValidationCheckTest { " should immediately follow the at-clause without any additional linking with brackets." private val badSingleLineKdocShouldEndWithPunctuation = "Badly formatted KDoc. Single-line KDocs should end with punctuation." + private val activityTestRuleShouldNotBeUsed = + "ActivityTestRule is deprecated since it operates test activities in sometimes unsafe" + + " situations. Use ActivityScenario, instead." + private val activityScenarioRuleShouldNotBeUsed = + "ActivityScenarioRule can result in order dependence when static state leaks across tests" + + " (such as static module variables), and can make staging much more difficult for platform" + + " parameters. Use ActivityScenario directly, instead." private val wikiReferenceNote = "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#regexpatternvalidation-check for more details on how to fix this." @@ -2649,6 +2656,50 @@ class RegexPatternValidationCheckTest { ) } + @Test + fun testFileContent_referencesActivityTestRule_fileContentIsNotCorrect() { + val prohibitedContent = + """ + import androidx.test.rule.ActivityTestRule + """.trimIndent() + tempFolder.newFolder("testfiles", "app", "src", "test", "java", "org", "oppia", "android") + val stringFilePath = "app/src/test/java/org/oppia/android/PresenterTest.kt" + tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) + + val exception = assertThrows() { runScript() } + + assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) + assertThat(outContent.toString().trim()) + .isEqualTo( + """ + $stringFilePath:1: $activityTestRuleShouldNotBeUsed + $wikiReferenceNote + """.trimIndent() + ) + } + + @Test + fun testFileContent_referencesActivityScenarioRule_fileContentIsNotCorrect() { + val prohibitedContent = + """ + import androidx.test.ext.junit.rules.ActivityScenarioRule + """.trimIndent() + tempFolder.newFolder("testfiles", "app", "src", "test", "java", "org", "oppia", "android") + val stringFilePath = "app/src/test/java/org/oppia/android/PresenterTest.kt" + tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) + + val exception = assertThrows() { runScript() } + + assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) + assertThat(outContent.toString().trim()) + .isEqualTo( + """ + $stringFilePath:1: $activityScenarioRuleShouldNotBeUsed + $wikiReferenceNote + """.trimIndent() + ) + } + /** Runs the regex_pattern_validation_check. */ private fun runScript() { main(File(tempFolder.root, "testfiles").absolutePath) From 7488b9f8d0dd90bddc471679949a735221d6e667 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 13 Sep 2023 23:59:47 +0000 Subject: [PATCH 19/63] Fix broken ProfileAndDeviceIdFragmentTest test. The test was suffering from some proto encoding inconsistencies that seem to occur between some development machines vs. on CI. The fix improves the test's robustness by extracting the raw encoded string, verifying that the other outputs in the intent message correctly correspond to that string, and that the string (as a parsed proto) contains the correct values. As a result, the test no longer depends on a hardcoded encoding value to be present for verification. This does result in a bit more logic than is generally good to have in a test (and it lengthened the test code quite a bit), but it seems necessary in this particular case. --- .../learneranalytics/BUILD.bazel | 1 + .../ProfileAndDeviceIdFragmentTest.kt | 104 ++++++++++++++++-- scripts/assets/todo_open_exemptions.textproto | 48 ++++---- .../testing/logging/EventLogSubject.kt | 7 ++ 4 files changed, 125 insertions(+), 35 deletions(-) diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel index f98a384b911..da61bfc0e69 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/BUILD.bazel @@ -51,6 +51,7 @@ app_test( "//app/src/main/java/org/oppia/android/app/translation/testing:test_module", "//testing", "//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule", + "//testing/src/main/java/org/oppia/android/testing/logging:event_log_subject", "//testing/src/main/java/org/oppia/android/testing/logging:sync_status_test_module", "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt index b7e883989f8..ae4e10ff244 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt @@ -56,6 +56,7 @@ import org.oppia.android.app.application.ApplicationStartupListenerModule import org.oppia.android.app.application.testing.TestingBuildFlavorModule import org.oppia.android.app.devoptions.DeveloperOptionsModule import org.oppia.android.app.devoptions.DeveloperOptionsStarterModule +import org.oppia.android.app.model.OppiaEventLogs import org.oppia.android.app.model.ProfileId import org.oppia.android.app.player.state.itemviewmodel.SplitScreenInteractionModule import org.oppia.android.app.recyclerview.RecyclerViewMatcher.Companion.atPositionOnView @@ -103,6 +104,9 @@ import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule +import org.oppia.android.testing.logging.EventLogSubject +import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat +import org.oppia.android.testing.logging.EventLogSubject.LearnerDetailsContextSubject import org.oppia.android.testing.logging.SyncStatusTestModule import org.oppia.android.testing.logging.TestSyncStatusManager import org.oppia.android.testing.platformparameter.TestPlatformParameterModule @@ -117,6 +121,7 @@ import org.oppia.android.util.caching.AssetModule import org.oppia.android.util.caching.testing.CachingTestModule import org.oppia.android.util.gcsresource.GcsResourceModule import org.oppia.android.util.locale.LocaleProdModule +import org.oppia.android.util.locale.OppiaLocale import org.oppia.android.util.logging.EventLoggingConfigurationModule import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusManager.SyncStatus @@ -130,7 +135,10 @@ import org.oppia.android.util.parser.image.GlideImageLoaderModule import org.oppia.android.util.parser.image.ImageParsingModule import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode +import java.security.MessageDigest +import java.util.Base64 import java.util.concurrent.TimeUnit +import java.util.zip.GZIPInputStream import javax.inject.Inject import javax.inject.Singleton @@ -158,6 +166,7 @@ class ProfileAndDeviceIdFragmentTest { @Inject lateinit var syncStatusManager: TestSyncStatusManager @Inject lateinit var learnerAnalyticsLogger: LearnerAnalyticsLogger @Inject lateinit var fakeAnalyticsEventLogger: FakeAnalyticsEventLogger + @Inject lateinit var machineLocale: OppiaLocale.MachineLocale private val clipboardManager by lazy { context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager @@ -795,7 +804,7 @@ class ProfileAndDeviceIdFragmentTest { onShareIdsAndEventsButtonAt(position = 5).perform(click()) testCoroutineDispatchers.runCurrent() - val expectedShareText = + val expectedShareTextPattern = """ Oppia app installation ID: 113e04cc09a3 - Profile name: Admin, learner ID: 8dcbbd21 @@ -811,20 +820,49 @@ class ProfileAndDeviceIdFragmentTest { - Uploaded learner events: 2 Current sync status: Waiting to schedule data uploading worker…. Event log encoding integrity checks: - - First 40 chars of encoded string: H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pY - - Last 40 chars of encoded string: BzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA - - SHA-1 hash (unwrapped event string): 1ee817dd58dcb25c9af4fbfc3c89c86b730f6680 - - Total event string length (unwrapped): 140 - Encoded event logs: - H4sIAAAAAAAA/+PSlGBUUj3FqMTFX5JaXBKfk5pYlJdaFJ+ZIgQRyMwrLknMyQEKcBkSrVSLwYjBisGJ - gU5ajEnVwsTBSDdNTELEBzGNlJIepORoISdAydHERJ4m4sMLAFFY60EUAwAA - """.trimIndent() + - First 40 chars of encoded string: ([\p{Alnum}/\\+=]+) + - Last 40 chars of encoded string: ([\p{Alnum}/\\+=]+) + - SHA-1 hash \(unwrapped event string\): (\p{XDigit}+) + - Total event string length \(unwrapped\): (\p{Digit}+) + Encoded event logs:([\p{Alnum}/+=\p{Space}]+) + """.trimIndent().toRegex() val intents = getIntents() + val extraText = intents.singleOrNull()?.getStringExtra(Intent.EXTRA_TEXT) assertThat(intents).hasSize(1) assertThat(intents.single()).hasAction(Intent.ACTION_SEND) assertThat(intents.single()).hasType("text/plain") assertThat(intents.single()).extras().containsKey(Intent.EXTRA_TEXT) - assertThat(intents.single()).extras().string(Intent.EXTRA_TEXT).isEqualTo(expectedShareText) + assertThat(extraText).matches(expectedShareTextPattern.toPattern()) + val (encodingPrefix, encodingSuffix, shaHash, encodingLength, rawEncodedLogs) = + extraText?.let { expectedShareTextPattern.matchEntire(it) }?.destructured!! + val unwrappedEncodedLogs = rawEncodedLogs.trim().replace(" ", "").replace("\n", "") + // Verify that the correct _values_ are being outputted, even if the specific values might + // differ slightly (depending on the running platform). + assertThat(encodingPrefix).isEqualTo(unwrappedEncodedLogs.take(40)) + assertThat(encodingSuffix).isEqualTo(unwrappedEncodedLogs.takeLast(40)) + assertThat(shaHash).isEqualTo(unwrappedEncodedLogs.computeSha1Hash()) + assertThat(encodingLength.toInt()).isEqualTo(unwrappedEncodedLogs.length) + // Verify the encoded events themselves are correct by decoding them and analyzing the loaded + // proto (since the string can vary somewhat). + val eventLogs = decodeEventLogString(unwrappedEncodedLogs) + assertThat(eventLogs.eventLogsToUploadCount).isEqualTo(7) + assertThat(eventLogs.uploadedEventLogsCount).isEqualTo(9) + assertThat(eventLogs.eventLogsToUploadList[0]).hasCommonPropsWithNoProfileId() + assertThat(eventLogs.eventLogsToUploadList[1]).hasCommonPropsWithProfile(ADMIN_PROFILE_ID) + assertThat(eventLogs.eventLogsToUploadList[2]).hasCommonPropsWithProfile(ADMIN_PROFILE_ID) + assertThat(eventLogs.eventLogsToUploadList[3]).hasCommonPropsWithProfile(ADMIN_PROFILE_ID) + assertThat(eventLogs.eventLogsToUploadList[4]).hasCommonPropsWithProfile(LEARNER_PROFILE_ID_0) + assertThat(eventLogs.eventLogsToUploadList[5]).hasCommonPropsWithProfile(LEARNER_PROFILE_ID_0) + assertThat(eventLogs.eventLogsToUploadList[6]).hasCommonPropsWithProfile(LEARNER_PROFILE_ID_1) + assertThat(eventLogs.uploadedEventLogsList[0]).hasCommonPropsWithNoProfileId() + assertThat(eventLogs.uploadedEventLogsList[1]).hasCommonPropsWithNoProfileId() + assertThat(eventLogs.uploadedEventLogsList[2]).hasCommonPropsWithNoProfileId() + assertThat(eventLogs.uploadedEventLogsList[3]).hasCommonPropsWithProfile(ADMIN_PROFILE_ID) + assertThat(eventLogs.uploadedEventLogsList[4]).hasCommonPropsWithProfile(ADMIN_PROFILE_ID) + assertThat(eventLogs.uploadedEventLogsList[5]).hasCommonPropsWithProfile(LEARNER_PROFILE_ID_0) + assertThat(eventLogs.uploadedEventLogsList[6]).hasCommonPropsWithProfile(LEARNER_PROFILE_ID_1) + assertThat(eventLogs.uploadedEventLogsList[7]).hasCommonPropsWithProfile(LEARNER_PROFILE_ID_1) + assertThat(eventLogs.uploadedEventLogsList[8]).hasCommonPropsWithNoProfileId() } } @@ -976,7 +1014,7 @@ class ProfileAndDeviceIdFragmentTest { private fun logAnalyticsEvent(profileId: ProfileId? = null) { learnerAnalyticsLogger.logAppInForeground( - installationId = "test_install_id", profileId, learnerId = "test_learner_id" + installationId = TEST_INSTALLATION_ID, profileId, learnerId = TEST_LEARNER_ID ) testCoroutineDispatchers.runCurrent() } @@ -1017,6 +1055,48 @@ class ProfileAndDeviceIdFragmentTest { disconnectNetwork() } + private fun String.computeSha1Hash(): String { + return machineLocale.run { + MessageDigest.getInstance("SHA-1") + .digest(this@computeSha1Hash.toByteArray()) + .joinToString("") { "%02x".formatForMachines(it) } + } + } + + private fun decodeEventLogString(encodedEventLogs: String): OppiaEventLogs { + return GZIPInputStream(Base64.getDecoder().decode(encodedEventLogs).inputStream()).use { inps -> + OppiaEventLogs.newBuilder().mergeFrom(inps).build() + } + } + + private fun EventLogSubject.hasCommonProperties() { + hasNoLanguageInformation() + hasTimestampThat().isEqualTo(0) + isEssentialPriority() + hasAppInForegroundContextThat().hasDefaultIds() + } + + private fun EventLogSubject.hasCommonPropsWithNoProfileId() { + hasCommonProperties() + hasNoProfileId() + } + + private fun EventLogSubject.hasCommonPropsWithProfile(profileId: ProfileId) { + hasCommonProperties() + hasProfileIdThat().isEqualTo(profileId) + } + + private fun EventLogSubject.hasNoLanguageInformation() { + hasAppLanguageSelectionThat().isEqualToDefaultInstance() + hasWrittenTranslationLanguageSelectionThat().isEqualToDefaultInstance() + hasAudioTranslationLanguageSelectionThat().isEqualToDefaultInstance() + } + + private fun LearnerDetailsContextSubject.hasDefaultIds() { + hasLearnerIdThat().isEqualTo(TEST_LEARNER_ID) + hasInstallationIdThat().isEqualTo(TEST_INSTALLATION_ID) + } + private fun setUpTestApplicationComponent() { ApplicationProvider.getApplicationContext().inject(this) } @@ -1091,6 +1171,8 @@ class ProfileAndDeviceIdFragmentTest { private companion object { private const val DEFAULT_APPLICATION_ID = 123456789L + private const val TEST_LEARNER_ID = "test_learner_id" + private const val TEST_INSTALLATION_ID = "test_install_id" private val ADMIN_PROFILE_ID = createProfileId(internalProfileId = 0) private val LEARNER_PROFILE_ID_0 = createProfileId(internalProfileId = 1) diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index 0fa81fd297d..51af8ca27ee 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -1,37 +1,37 @@ todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" - line_number: 67 - line_number: 68 + line_number: 65 + line_number: 66 + line_number: 72 line_number: 74 - line_number: 76 + line_number: 96 + line_number: 97 line_number: 98 line_number: 99 line_number: 100 - line_number: 101 - line_number: 102 + line_number: 132 + line_number: 133 line_number: 136 - line_number: 137 - line_number: 140 - line_number: 173 + line_number: 167 + line_number: 168 + line_number: 169 line_number: 174 - line_number: 175 - line_number: 180 - line_number: 182 - line_number: 221 + line_number: 176 + line_number: 213 + line_number: 214 + line_number: 215 + line_number: 220 line_number: 222 - line_number: 223 line_number: 228 - line_number: 230 - line_number: 236 - line_number: 275 - line_number: 279 - line_number: 317 - line_number: 318 - line_number: 322 - line_number: 371 - line_number: 372 - line_number: 373 - line_number: 377 + line_number: 265 + line_number: 269 + line_number: 307 + line_number: 308 + line_number: 312 + line_number: 359 + line_number: 360 + line_number: 361 + line_number: 365 } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt" diff --git a/testing/src/main/java/org/oppia/android/testing/logging/EventLogSubject.kt b/testing/src/main/java/org/oppia/android/testing/logging/EventLogSubject.kt index cbd7163ce19..fd8b539e06c 100644 --- a/testing/src/main/java/org/oppia/android/testing/logging/EventLogSubject.kt +++ b/testing/src/main/java/org/oppia/android/testing/logging/EventLogSubject.kt @@ -96,6 +96,13 @@ class EventLogSubject private constructor( assertThat(actual.priority).isEqualTo(EventLog.Priority.OPTIONAL) } + /** + * Verifies that the [EventLog] under test has no profile ID defined per [EventLog.getProfileId]. + */ + fun hasNoProfileId() { + assertThat(actual.hasProfileId()).isFalse() + } + /** * Returns an [LiteProtoSubject] to verify the under-test [EventLog]'s [EventLog.getProfileId] * field. From 5671673175891d0491280b901d3f8b53802d3e7d Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 26 Oct 2023 18:40:57 +0000 Subject: [PATCH 20/63] Post-merge fix. --- .../android/scripts/regex/RegexPatternValidationCheckTest.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt index a862d2f5114..a3eb9c825d9 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/regex/RegexPatternValidationCheckTest.kt @@ -2209,9 +2209,7 @@ class RegexPatternValidationCheckTest { val stringFilePath = "app/src/main/res/drawable/test_layout.xml" tempFolder.newFile("testfiles/$stringFilePath").writeText(prohibitedContent) - val exception = assertThrows(Exception::class) { - runScript() - } + val exception = assertThrows() { runScript() } // Verify that all patterns are properly detected & prohibited. assertThat(exception).hasMessageThat().contains(REGEX_CHECK_FAILED_OUTPUT_INDICATOR) From 9f1a2ec995d31447805c7a87a6a55e53a1151979 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 17 Jan 2024 23:50:10 +0000 Subject: [PATCH 21/63] Some follow-up post-merge fixes. This doesn't address all timeouts being observed in scripts. More analysis may be needed. --- .../scripts/testing/TestBazelWorkspace.kt | 19 +++++++++---- .../android/scripts/common/BazelClientTest.kt | 2 +- ...ScriptBackgroundCoroutineDispatcherTest.kt | 2 +- .../license/MavenDependenciesListCheckTest.kt | 28 +++++++++---------- .../license/MavenDependenciesRetrieverTest.kt | 2 +- .../scripts/testing/TestBazelWorkspaceTest.kt | 9 ++++++ .../android/scripts/todo/TodoOpenCheckTest.kt | 4 +-- 7 files changed, 41 insertions(+), 25 deletions(-) diff --git a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt index 68487b6062b..665a621774c 100644 --- a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt +++ b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt @@ -4,6 +4,9 @@ import com.google.common.truth.Truth.assertThat import org.junit.rules.TemporaryFolder import java.io.File +/** The version of Bazel to use in tests that set up Bazel workspaces. */ +const val BAZEL_VERSION = "4.0.0" + /** * Test utility for generating various test & library targets in the specified [TemporaryFolder]. * This is meant to be used to arrange the local test filesystem for use with a real Bazel @@ -23,6 +26,10 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { */ val rootBuildFile: File by lazy { temporaryRootFolder.newFile("BUILD.bazel") } + private val bazelVersionFile by lazy { + temporaryRootFolder.newFile(".bazelversion").also { it.writeText(BAZEL_VERSION) } + } + private val testFileMap = mutableMapOf() private val libraryFileMap = mutableMapOf() private val testDependencyNameMap = mutableMapOf() @@ -33,9 +40,10 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { /** Initializes the local Bazel workspace by introducing a new, empty WORKSPACE file. */ fun initEmptyWorkspace() { - // Sanity check, but in reality this is just initializing workspaceFile to ensure that it + // Sanity checks, but in reality this is just initializing workspaceFile to ensure that it // exists. assertThat(workspaceFile.exists()).isTrue() + assertThat(bazelVersionFile.exists()).isTrue() } /** @@ -187,6 +195,7 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { /** Appends rules_jvm_external configuration to the WORKSPACE file if not done already. */ fun setUpWorkspaceForRulesJvmExternal(depsList: List) { if (!isConfiguredForRulesJvmExternal) { + initEmptyWorkspace() workspaceFile.appendText("artifactsList = [") for (dep in depsList) { workspaceFile.appendText("\"$dep\",\n") @@ -198,23 +207,23 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { RULES_JVM_EXTERNAL_TAG = "4.0" RULES_JVM_EXTERNAL_SHA = "31701ad93dbfe544d597dbe62c9a1fdd76d81d8a9150c2bf1ecf928ecdf97169" - + http_archive( name = "rules_jvm_external", strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG, sha256 = RULES_JVM_EXTERNAL_SHA, url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG, ) - + load("@rules_jvm_external//:defs.bzl", "maven_install") - + maven_install( artifacts = artifactsList, repositories = [ "https://maven.google.com", "https://repo1.maven.org/maven2", ], - ) + ) """.trimIndent() + "\n" ) diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt index 6ce7467f6a4..57b2f26964a 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt @@ -352,7 +352,7 @@ class BazelClientTest { } @Test - fun testRetrieveMavenDepsList_binaryDependsOnArtifactNotViaThirdParty_doesNotreturnArtifact() { + fun testRetrieveMavenDepsList_binaryDependsOnArtifactNotViaThirdParty_doesNotReturnArtifact() { testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( listOf("com.android.support:support-annotations:28.0.0") diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt index dce99691bcb..68329ac15fa 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt @@ -49,7 +49,7 @@ class ScriptBackgroundCoroutineDispatcherTest { dispatcher.close() // The task should fail to schedule since the dispatcher has been closed. - assertThrows(CancellationException::class) { + assertThrows() { runBlocking { withContext(dispatcher) { mockRunnable.run() } } } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt index 339e172432f..6ecefd7ddce 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt @@ -138,14 +138,14 @@ class MavenDependenciesListCheckTest { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" } - + artifact_name: "com.google.firebase:firebase-analytics:17.5.0" artifact_version: "17.5.0" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -215,7 +215,7 @@ class MavenDependenciesListCheckTest { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -280,14 +280,14 @@ class MavenDependenciesListCheckTest { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" } - + artifact_name: "$FIREBASE_ANALYTICS_DEP" artifact_version: "$FIREBASE_ANALYTICS_VERSION" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -437,7 +437,7 @@ class MavenDependenciesListCheckTest { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" } - + artifact_name: "$FIREBASE_ANALYTICS_DEP" artifact_version: "$FIREBASE_ANALYTICS_VERSION" license { @@ -516,14 +516,14 @@ class MavenDependenciesListCheckTest { } Missing dependencies that need to be added: - + artifact_name: "$FIREBASE_ANALYTICS_DEP" artifact_version: "$FIREBASE_ANALYTICS_VERSION" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -595,14 +595,14 @@ class MavenDependenciesListCheckTest { } Missing dependencies that need to be added: - + artifact_name: "$FIREBASE_ANALYTICS_UPGRADED_DEP" artifact_version: "$FIREBASE_ANALYTICS_UPGRADED_VERSION" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -661,7 +661,7 @@ class MavenDependenciesListCheckTest { } assertThat(exception).hasMessageThat().contains(MISSING_AND_REDUNDANT_DEPENDENCIES_FAILURE) assertThat(outContent.toString()).isEqualTo( - """ + """ Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Redundant dependencies that need to be removed: @@ -674,14 +674,14 @@ class MavenDependenciesListCheckTest { } Missing dependencies that need to be added: - + artifact_name: "$FIREBASE_ANALYTICS_DEP" artifact_version: "$FIREBASE_ANALYTICS_VERSION" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -1032,7 +1032,7 @@ class MavenDependenciesListCheckTest { } ] } - } + } """.trimIndent() ) } diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt index c815941f42b..311bfe5f446 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt @@ -1221,7 +1221,7 @@ class MavenDependenciesRetrieverTest { } ] } - } + } """.trimIndent() ) } diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt index e8cb737a0bb..0697fe079cf 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt @@ -74,6 +74,15 @@ class TestBazelWorkspaceTest { assertThat(workspaceFile.readLines()).isEmpty() } + @Test + fun testInitEmptyWorkspace_createsBazelVersionFileWithCorrectVersion() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.initEmptyWorkspace() + + assertThat(File(tempFolder.root, ".bazelversion").readText().trim()).isEqualTo("4.0.0") + } + @Test fun testSetupWorkspaceForRulesJvmExternal_withOneDep_containsCorrectList() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index ea13903cd41..70208ae40f5 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -449,9 +449,7 @@ class TodoOpenCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows(Exception::class) { - runScript(regenerateFile = true) - } + val exception = assertThrows() { runScript(regenerateFile = true) } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) val failureMessage = From 39a3add73401f47acc1a6dc2872cd0aa902912ff Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 18 Jan 2024 19:36:10 +0000 Subject: [PATCH 22/63] Make TodoOpenCheck locally runnable. This does a bunch of other small things, too, but the main difference here is introducing support for interacting with GitHub via its REST API rather than requiring the user to use the 'gh' tool locally (though the gh CLI tool is still needed for maintaining authentication access). --- scripts/assets/todo_open_exemptions.textproto | 438 +++++++++--------- .../org/oppia/android/scripts/ci/BUILD.bazel | 4 +- .../oppia/android/scripts/common/BUILD.bazel | 18 + .../android/scripts/common/GitHubClient.kt | 80 ++++ .../android/scripts/common/model/BUILD.bazel | 15 + .../scripts/common/model/GitHubIssue.kt | 98 ++++ .../android/scripts/common/remote/BUILD.bazel | 18 + .../scripts/common/remote/GitHubService.kt | 24 + .../oppia/android/scripts/docs/BUILD.bazel | 2 +- .../oppia/android/scripts/label/BUILD.bazel | 2 +- .../oppia/android/scripts/license/BUILD.bazel | 1 - .../oppia/android/scripts/maven/BUILD.bazel | 1 - .../oppia/android/scripts/proto/BUILD.bazel | 33 +- .../oppia/android/scripts/regex/BUILD.bazel | 4 +- .../android/scripts/testfile/BUILD.bazel | 2 +- .../oppia/android/scripts/todo/BUILD.bazel | 5 +- .../android/scripts/todo/TodoCollector.kt | 18 +- .../scripts/todo/TodoIssueResolvedCheck.kt | 33 +- .../android/scripts/todo/TodoOpenCheck.kt | 151 +++--- .../android/scripts/todo/model/BUILD.bazel | 8 - .../oppia/android/scripts/todo/model/Issue.kt | 14 - .../oppia/android/scripts/todo/model/Todo.kt | 6 +- .../android/scripts/todo/TodoCollectorTest.kt | 136 +++--- scripts/static_checks.sh | 7 + wiki/Static-Analysis-Checks.md | 21 +- 25 files changed, 700 insertions(+), 439 deletions(-) create mode 100644 scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt create mode 100644 scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel create mode 100644 scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt create mode 100644 scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel create mode 100644 scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt delete mode 100644 scripts/src/java/org/oppia/android/scripts/todo/model/Issue.kt diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index cb81317adae..09dcc5300ef 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -1,40 +1,15 @@ todo_open_exemption { - exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" - line_number: 67 - line_number: 68 - line_number: 74 - line_number: 76 - line_number: 98 - line_number: 99 - line_number: 100 - line_number: 101 - line_number: 102 - line_number: 136 - line_number: 137 - line_number: 140 - line_number: 173 - line_number: 174 - line_number: 175 - line_number: 180 - line_number: 182 - line_number: 221 - line_number: 222 - line_number: 223 - line_number: 228 - line_number: 230 - line_number: 236 - line_number: 275 - line_number: 279 - line_number: 317 - line_number: 318 - line_number: 322 - line_number: 371 - line_number: 372 - line_number: 373 - line_number: 377 + exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt" + line_number: 78 +} +todo_open_exemption { + exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt" + line_number: 12 } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt" + line_number: 31 + line_number: 32 line_number: 33 line_number: 34 line_number: 35 @@ -58,127 +33,127 @@ todo_open_exemption { line_number: 53 line_number: 54 line_number: 55 - line_number: 56 - line_number: 57 - line_number: 63 - line_number: 64 - line_number: 73 - line_number: 76 - line_number: 80 - line_number: 83 - line_number: 87 - line_number: 90 - line_number: 94 - line_number: 97 - line_number: 101 - line_number: 104 - line_number: 108 - line_number: 111 - line_number: 115 - line_number: 118 - line_number: 122 - line_number: 125 - line_number: 129 - line_number: 132 - line_number: 136 - line_number: 139 - line_number: 143 - line_number: 146 - line_number: 150 - line_number: 153 - line_number: 157 - line_number: 160 - line_number: 164 - line_number: 167 - line_number: 171 - line_number: 174 - line_number: 178 - line_number: 181 - line_number: 185 - line_number: 188 - line_number: 192 - line_number: 195 - line_number: 199 - line_number: 202 - line_number: 206 - line_number: 209 - line_number: 213 - line_number: 216 - line_number: 220 - line_number: 223 - line_number: 227 - line_number: 230 - line_number: 234 - line_number: 237 - line_number: 241 - line_number: 244 - line_number: 248 - line_number: 255 - line_number: 258 - line_number: 262 - line_number: 265 - line_number: 274 - line_number: 275 - line_number: 279 - line_number: 283 - line_number: 284 - line_number: 296 - line_number: 299 - line_number: 303 - line_number: 306 - line_number: 310 - line_number: 313 - line_number: 317 - line_number: 320 - line_number: 324 - line_number: 327 + line_number: 61 + line_number: 62 + line_number: 71 + line_number: 74 + line_number: 78 + line_number: 81 + line_number: 85 + line_number: 88 + line_number: 92 + line_number: 95 + line_number: 99 + line_number: 102 + line_number: 106 + line_number: 109 + line_number: 113 + line_number: 116 + line_number: 120 + line_number: 123 + line_number: 127 + line_number: 130 + line_number: 134 + line_number: 137 + line_number: 141 + line_number: 144 + line_number: 148 + line_number: 151 + line_number: 155 + line_number: 158 + line_number: 162 + line_number: 165 + line_number: 169 + line_number: 172 + line_number: 176 + line_number: 179 + line_number: 183 + line_number: 186 + line_number: 190 + line_number: 193 + line_number: 197 + line_number: 200 + line_number: 204 + line_number: 207 + line_number: 211 + line_number: 214 + line_number: 218 + line_number: 221 + line_number: 225 + line_number: 228 + line_number: 232 + line_number: 235 + line_number: 239 + line_number: 242 + line_number: 246 + line_number: 253 + line_number: 256 + line_number: 260 + line_number: 263 + line_number: 272 + line_number: 273 + line_number: 277 + line_number: 281 + line_number: 282 + line_number: 294 + line_number: 297 + line_number: 301 + line_number: 304 + line_number: 308 + line_number: 311 + line_number: 315 + line_number: 318 + line_number: 322 + line_number: 325 + line_number: 334 + line_number: 335 line_number: 336 line_number: 337 - line_number: 338 - line_number: 339 - line_number: 344 - line_number: 349 - line_number: 352 - line_number: 365 - line_number: 368 - line_number: 372 - line_number: 375 - line_number: 379 - line_number: 382 - line_number: 386 - line_number: 389 - line_number: 393 - line_number: 396 - line_number: 400 - line_number: 403 - line_number: 407 - line_number: 410 + line_number: 342 + line_number: 347 + line_number: 350 + line_number: 363 + line_number: 366 + line_number: 370 + line_number: 373 + line_number: 377 + line_number: 380 + line_number: 384 + line_number: 387 + line_number: 391 + line_number: 394 + line_number: 398 + line_number: 401 + line_number: 405 + line_number: 408 + line_number: 417 + line_number: 418 line_number: 419 line_number: 420 - line_number: 421 - line_number: 422 - line_number: 426 - line_number: 430 - line_number: 433 - line_number: 446 - line_number: 449 - line_number: 453 - line_number: 456 - line_number: 460 - line_number: 463 - line_number: 467 - line_number: 470 - line_number: 474 - line_number: 477 - line_number: 481 - line_number: 484 - line_number: 488 - line_number: 491 + line_number: 424 + line_number: 428 + line_number: 431 + line_number: 444 + line_number: 447 + line_number: 451 + line_number: 454 + line_number: 458 + line_number: 461 + line_number: 465 + line_number: 468 + line_number: 472 + line_number: 475 + line_number: 479 + line_number: 482 + line_number: 486 + line_number: 489 + line_number: 530 + line_number: 531 line_number: 532 - line_number: 533 - line_number: 534 - line_number: 539 - line_number: 544 + line_number: 537 + line_number: 542 + line_number: 545 + line_number: 546 line_number: 547 line_number: 548 line_number: 549 @@ -200,62 +175,60 @@ todo_open_exemption { line_number: 565 line_number: 566 line_number: 567 - line_number: 568 - line_number: 569 - line_number: 575 - line_number: 588 - line_number: 591 - line_number: 595 - line_number: 598 - line_number: 602 - line_number: 605 - line_number: 609 - line_number: 612 - line_number: 616 - line_number: 619 - line_number: 627 - line_number: 636 - line_number: 645 - line_number: 654 - line_number: 663 - line_number: 672 - line_number: 681 - line_number: 690 - line_number: 699 - line_number: 708 - line_number: 717 - line_number: 726 - line_number: 735 - line_number: 744 - line_number: 753 - line_number: 762 - line_number: 771 - line_number: 780 - line_number: 789 - line_number: 798 - line_number: 807 - line_number: 816 + line_number: 573 + line_number: 586 + line_number: 589 + line_number: 593 + line_number: 596 + line_number: 600 + line_number: 603 + line_number: 607 + line_number: 610 + line_number: 614 + line_number: 617 + line_number: 625 + line_number: 634 + line_number: 643 + line_number: 652 + line_number: 661 + line_number: 670 + line_number: 679 + line_number: 688 + line_number: 697 + line_number: 706 + line_number: 715 + line_number: 724 + line_number: 733 + line_number: 742 + line_number: 751 + line_number: 760 + line_number: 769 + line_number: 778 + line_number: 787 + line_number: 796 + line_number: 805 + line_number: 814 + line_number: 824 + line_number: 825 line_number: 826 - line_number: 827 - line_number: 828 - line_number: 836 - line_number: 839 - line_number: 843 - line_number: 846 - line_number: 850 - line_number: 853 + line_number: 834 + line_number: 837 + line_number: 841 + line_number: 844 + line_number: 848 + line_number: 851 + line_number: 860 + line_number: 861 line_number: 862 - line_number: 863 - line_number: 864 - line_number: 873 - line_number: 876 - line_number: 880 - line_number: 883 - line_number: 887 - line_number: 890 + line_number: 871 + line_number: 874 + line_number: 878 + line_number: 881 + line_number: 885 + line_number: 888 + line_number: 897 + line_number: 898 line_number: 899 - line_number: 900 - line_number: 901 } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt" @@ -279,31 +252,60 @@ todo_open_exemption { line_number: 192 } todo_open_exemption { - exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt" - line_number: 82 + exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" + line_number: 67 + line_number: 68 + line_number: 74 + line_number: 76 + line_number: 98 + line_number: 99 + line_number: 100 + line_number: 101 + line_number: 102 + line_number: 136 + line_number: 137 + line_number: 140 + line_number: 173 + line_number: 174 + line_number: 175 + line_number: 180 + line_number: 182 + line_number: 221 + line_number: 222 + line_number: 223 + line_number: 228 + line_number: 230 + line_number: 236 + line_number: 275 + line_number: 279 + line_number: 317 + line_number: 318 + line_number: 322 + line_number: 371 + line_number: 372 + line_number: 373 + line_number: 377 } todo_open_exemption { - exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt" - line_number: 10 + exempted_file_path: "scripts/static_checks.sh" + line_number: 110 } - todo_open_exemption { exempted_file_path: "wiki/Coding-style-guide.md" line_number: 43 } - todo_open_exemption { exempted_file_path: "wiki/Static-Analysis-Checks.md" line_number: 171 - line_number: 179 - line_number: 184 - line_number: 188 - line_number: 192 - line_number: 194 - line_number: 209 - line_number: 219 - line_number: 222 - line_number: 225 + line_number: 195 + line_number: 200 + line_number: 204 + line_number: 208 + line_number: 210 line_number: 228 - line_number: 231 + line_number: 238 + line_number: 241 + line_number: 244 + line_number: 247 + line_number: 250 } diff --git a/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel index 2e91f4a052e..f8b345eaa80 100644 --- a/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel @@ -15,7 +15,7 @@ kt_jvm_library( "//scripts/src/java/org/oppia/android/scripts/common:bazel_client", "//scripts/src/java/org/oppia/android/scripts/common:git_client", "//scripts/src/java/org/oppia/android/scripts/common:proto_string_encoder", - "//scripts/src/java/org/oppia/android/scripts/proto:affected_tests_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:affected_tests_java_proto", ], ) @@ -28,6 +28,6 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:proto_string_encoder", - "//scripts/src/java/org/oppia/android/scripts/proto:affected_tests_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:affected_tests_java_proto", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel index 3a94254e9fc..ba726809519 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel @@ -28,6 +28,24 @@ kt_jvm_library( ], ) +kt_jvm_library( + name = "github_client", + testonly = True, + srcs = [ + "GitHubClient.kt", + ], + visibility = ["//scripts:oppia_script_library_visibility"], + deps = [ + ":command_executor", + "//scripts/src/java/org/oppia/android/scripts/common/model:github_issue", + "//scripts/src/java/org/oppia/android/scripts/common/remote:github_service", + "//third_party:com_squareup_okhttp3_okhttp", + "//third_party:com_squareup_retrofit2_converter-moshi", + "//third_party:com_squareup_retrofit2_retrofit", + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + ], +) + kt_jvm_library( name = "command_executor", srcs = [ diff --git a/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt b/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt new file mode 100644 index 00000000000..dbee20893b7 --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt @@ -0,0 +1,80 @@ +package org.oppia.android.scripts.common + +import java.io.File +import retrofit2.Retrofit +import retrofit2.converter.moshi.MoshiConverterFactory +import okhttp3.OkHttpClient +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.async +import kotlinx.coroutines.withContext +import org.oppia.android.scripts.common.model.GitHubIssue +import org.oppia.android.scripts.common.remote.GitHubService +import com.squareup.moshi.Moshi +import java.io.IOException + +class GitHubClient( + private val rootDirectory: File, + private val dispatcher: CoroutineDispatcher, + private val commandExecutor: CommandExecutor = CommandExecutorImpl(), + private val repoOwner: String = "oppia", + private val repoName: String = "oppia-android" +) { + private val remoteApiUrl by lazy { "https://api.github.com/" } + private val okHttpClient by lazy { OkHttpClient.Builder().build() } + private val moshi by lazy { + Moshi.Builder().add(GitHubIssue.DateAdapter).add(GitHubIssue.UriAdapter).add(GitHubIssue.State.Adapter).add(GitHubIssue.StateReason.Adapter).build() + } + private val retrofit by lazy { + Retrofit.Builder().baseUrl(remoteApiUrl).addConverterFactory(MoshiConverterFactory.create(moshi)).client(okHttpClient).build() + } + private val gitHubService by lazy { retrofit.create(GitHubService::class.java) } + private val authorizationBearer by lazy { "Bearer ${retrieveAccessToken()}" } + + fun fetchAllOpenIssues(): Deferred> { + return CoroutineScope(dispatcher).async { + // Fetch issues one page at a time (starting at page 1) until all are found. + fetchOpenIssuesRecursive(startPageNumber = 1) + } + } + + private suspend fun fetchOpenIssuesRecursive(startPageNumber: Int): List { + val issues = fetchOpenIssues(startPageNumber).await() + return if (issues.isNotEmpty()) { + issues + fetchOpenIssuesRecursive(startPageNumber + 1) + } else issues + } + + private fun fetchOpenIssues(pageNumber: Int): Deferred> { + return CoroutineScope(dispatcher).async { + val call = gitHubService.fetchOpenIssues(repoOwner, repoName, authorizationBearer, pageNumber) + // Deferred blocking I/O operation to the dedicated I/O dispatcher. + val response = withContext(Dispatchers.IO) { call.execute() } + check(response.isSuccessful()) { "Failed to fetch issues at page $pageNumber: ${response.code()}\n${call.request()}\n${response.errorBody()}." } + return@async checkNotNull(response.body()) { "No issues response from GitHub for page: $pageNumber." } + } + } + + // Retrieve the access token that 'gh' is configured to use (to allow the script to run without being tied to a specific access token). + private fun retrieveAccessToken(): String { + // First, make sure the command actually exists. + try { + commandExecutor.executeCommand(rootDirectory, "gh", "help") + } catch (e: IOException) { + throw IllegalStateException( + "Failed to interact with gh tool. Please make sure your environment is set up properly"+ + " per https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + + "#todo-open-checks.", e + ) + } + return commandExecutor.executeCommand(rootDirectory, "gh", "auth", "token").also { + check(it.exitCode == 0) { + "Failed to retrieve auth token from GH tool. Please make sure your environment is set up" + + " properly per https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + + "#todo-open-checks. Command output:\n${it.output.joinToString(separator = "\n")}" + } + }.output.single() + } +} diff --git a/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel new file mode 100644 index 00000000000..37f8b5750e9 --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel @@ -0,0 +1,15 @@ +""" +Data structures corresponding to common utilities, such as for GitHub API integration. +""" + +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") + +kt_jvm_library( + name = "github_issue", + testonly = True, + srcs = [ + "GitHubIssue.kt", + ], + visibility = ["//scripts:oppia_script_library_visibility"], + deps = ["//third_party:moshi"], +) diff --git a/scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt b/scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt new file mode 100644 index 00000000000..29ddc8f54ed --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt @@ -0,0 +1,98 @@ +package org.oppia.android.scripts.common.model + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import com.squareup.moshi.FromJson +import com.squareup.moshi.ToJson +import com.squareup.moshi.JsonReader +import com.squareup.moshi.JsonWriter +import java.net.URI +import java.util.Date +import java.time.Instant +import java.time.format.DateTimeFormatter.ISO_INSTANT + +@JsonClass(generateAdapter = true) +data class GitHubIssue( + @Json(name = "id") val id: Long, + @Json(name = "number") val number: Int, + @Json(name = "title") val title: String, + @Json(name = "body") val body: String?, + @Json(name = "state") val state: State, + @Json(name = "state_reason") val stateReason: StateReason?, + @Json(name = "created_at") val creationDate: Date, + @Json(name = "updated_at") val lastUpdatedDate: Date, + @Json(name = "closed_at") val closeDate: Date?, + @Json(name = "pull_request") val pullRequestMetadata: PullRequestMetadata? +) { + val isPullRequest: Boolean get() = pullRequestMetadata != null + + @JsonClass(generateAdapter = false) + enum class State { + OPEN, + CLOSED; + + object Adapter { + @FromJson + fun fromJson(jsonReader: JsonReader): State? { + return when (val stateStr = jsonReader.maybeNextString() ?: return null) { + "open" -> State.OPEN + "closed" -> State.CLOSED + else -> error("Invalid state value: '$stateStr'.") + } + } + + @ToJson + fun toJson(jsonWriter: JsonWriter, date: State?): Unit = error("Not supported.") + } + } + + @JsonClass(generateAdapter = false) + enum class StateReason { + COMPLETED, + REOPENED, + NOT_PLANNED; + + object Adapter { + @FromJson + fun fromJson(jsonReader: JsonReader): StateReason? { + return when (val stateReasonStr = jsonReader.maybeNextString() ?: return null) { + "completed" -> StateReason.COMPLETED + "reopened" -> StateReason.REOPENED + "not_planned" -> StateReason.NOT_PLANNED + else -> error("Invalid state reason value: '$stateReasonStr'.") + } + } + + @ToJson + fun toJson(jsonWriter: JsonWriter, date: StateReason?): Unit = error("Not supported.") + } + } + + @JsonClass(generateAdapter = true) + data class PullRequestMetadata( + @Json(name = "url") val url: URI?, + @Json(name = "merged_at") val mergeDate: Date? + ) + + object DateAdapter { + // Reference: https://stackoverflow.com/a/60214805. + @FromJson + fun fromJson(jsonReader: JsonReader): Date? = + jsonReader.maybeNextString()?.let(ISO_INSTANT::parse)?.let(Instant::from)?.let(Date::from) + + @ToJson + fun toJson(jsonWriter: JsonWriter, date: Date?): Unit = error("Not supported.") + } + + object UriAdapter { + @FromJson + fun fromJson(jsonReader: JsonReader): URI? = jsonReader.maybeNextString()?.let(::URI) + + @ToJson + fun toJson(jsonWriter: JsonWriter, date: URI?): Unit = error("Not supported.") + } +} + +// The next value must be either a string or null. +private fun JsonReader.maybeNextString(): String? = + if (peek() == JsonReader.Token.STRING) nextString() else nextNull() diff --git a/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel new file mode 100644 index 00000000000..a73fc5e09bf --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel @@ -0,0 +1,18 @@ +""" +Remote service endpoints for common shared utilities, such as for GitHub API integration. +""" + +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") + +kt_jvm_library( + name = "github_service", + testonly = True, + srcs = [ + "GitHubService.kt", + ], + visibility = ["//scripts:oppia_script_library_visibility"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/common/model:github_issue", + "//third_party:com_squareup_retrofit2_retrofit", + ], +) diff --git a/scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt b/scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt new file mode 100644 index 00000000000..65b659b21d6 --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt @@ -0,0 +1,24 @@ +package org.oppia.android.scripts.common.remote + +import org.oppia.android.scripts.common.model.GitHubIssue +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Path +import retrofit2.http.Query +import retrofit2.http.Header +import retrofit2.http.Headers + +interface GitHubService { + + // Reference: https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#list-repository-issues. + // Sort by ascending creation date by default to attempt improving stability (e.g. slight robustness against new issues being filed) since the GitHub API doesn't seem to provide support for stable pagination. + @Headers("Accept: application/vnd.github+json", "X-GitHub-Api-Version: 2022-11-28") + @GET("repos/{repo_owner}/{repo_name}/issues?direction=asc") + fun fetchOpenIssues( + @Path("repo_owner") repoOwner: String, + @Path("repo_name") repoName: String, + @Header("Authorization") authorizationBearer: String, + @Query("page") pageNumber: Int, + @Query("per_page") countPerPage: Int = 100 + ): Call> +} diff --git a/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel index f342da5ec2b..72ff0c07474 100644 --- a/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel @@ -11,7 +11,7 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:repository_file", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", "//third_party:org_jetbrains_kotlin_kotlin-compiler-embeddable", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel index 01524932353..7ad9a92714b 100644 --- a/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel @@ -12,6 +12,6 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:repository_file", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel index aaeeb5d34a6..67e3d13032e 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel @@ -24,7 +24,6 @@ kt_jvm_library( "//scripts/src/java/org/oppia/android/scripts/common:bazel_client", "//scripts/src/java/org/oppia/android/scripts/maven/model", "//scripts/src/java/org/oppia/android/scripts/proto:maven_dependencies_java_proto", - "//scripts/src/java/org/oppia/android/scripts/proto:maven_dependencies_java_proto_lite", "//third_party:com_google_protobuf_protobuf-java", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel index 189bc4e2be9..91261ac00db 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel @@ -24,6 +24,5 @@ kt_jvm_library( "//scripts/src/java/org/oppia/android/scripts/license/model", "//scripts/src/java/org/oppia/android/scripts/maven/model", "//scripts/src/java/org/oppia/android/scripts/proto:maven_dependencies_java_proto", - "//scripts/src/java/org/oppia/android/scripts/proto:maven_dependencies_java_proto_lite", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/proto/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/proto/BUILD.bazel index 60f6588f1a0..7265ff0efc3 100644 --- a/scripts/src/java/org/oppia/android/scripts/proto/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/proto/BUILD.bazel @@ -1,12 +1,13 @@ """ This library contains all protos used in the scripts module. -In Bazel, proto files are built using the oppia_proto_library() and java_lite_proto_library() rules. -The oppia_proto_library() rule creates a proto file library to be used in multiple languages. -The java_lite_proto_library() rule takes in a proto_library target and generates java code. -For more context on adding a new proto library, please refer to model/BUILD + +In Bazel, proto files are built using the oppia_proto_library() and java_proto_library() rules. The +oppia_proto_library() rule creates a proto file library to be used in multiple languages. The +java_proto_library() rule takes in a proto_library target and generates java code. For more context +on adding a new proto library, please refer to //model/BUILD.bazel. """ -load("@rules_java//java:defs.bzl", "java_lite_proto_library", "java_proto_library") +load("@rules_java//java:defs.bzl", "java_proto_library") load("//model:oppia_proto_library.bzl", "oppia_proto_library") oppia_proto_library( @@ -14,8 +15,8 @@ oppia_proto_library( srcs = ["affected_tests.proto"], ) -java_lite_proto_library( - name = "affected_tests_java_proto_lite", +java_proto_library( + name = "affected_tests_java_proto", visibility = ["//scripts:oppia_script_library_visibility"], deps = [":affected_tests_proto"], ) @@ -26,8 +27,8 @@ oppia_proto_library( visibility = ["//scripts:oppia_script_binary_visibility"], ) -java_lite_proto_library( - name = "filename_pattern_validation_checks_java_proto_lite", +java_proto_library( + name = "filename_pattern_validation_checks_java_proto", visibility = ["//scripts:oppia_script_library_visibility"], deps = [":filename_pattern_validation_checks_proto"], ) @@ -38,8 +39,8 @@ oppia_proto_library( visibility = ["//scripts:oppia_script_binary_visibility"], ) -java_lite_proto_library( - name = "file_content_validation_checks_java_proto_lite", +java_proto_library( + name = "file_content_validation_checks_java_proto", visibility = ["//scripts:oppia_script_library_visibility"], deps = [":file_content_validation_checks_proto"], ) @@ -50,8 +51,8 @@ oppia_proto_library( visibility = ["//scripts:oppia_script_binary_visibility"], ) -java_lite_proto_library( - name = "script_exemptions_java_proto_lite", +java_proto_library( + name = "script_exemptions_java_proto", visibility = ["//scripts:oppia_script_library_visibility"], deps = [":script_exemptions_proto"], ) @@ -67,9 +68,3 @@ java_proto_library( visibility = ["//scripts:oppia_script_library_visibility"], deps = [":maven_dependencies_proto"], ) - -java_lite_proto_library( - name = "maven_dependencies_java_proto_lite", - visibility = ["//scripts:oppia_script_library_visibility"], - deps = [":maven_dependencies_proto"], -) diff --git a/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel index 3b9ca212aa1..82867e55ee1 100644 --- a/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel @@ -12,7 +12,7 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:repository_file", - "//scripts/src/java/org/oppia/android/scripts/proto:file_content_validation_checks_java_proto_lite", - "//scripts/src/java/org/oppia/android/scripts/proto:filename_pattern_validation_checks_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:file_content_validation_checks_java_proto", + "//scripts/src/java/org/oppia/android/scripts/proto:filename_pattern_validation_checks_java_proto", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel index dbcb1023446..6777296ae26 100644 --- a/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel @@ -12,6 +12,6 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:repository_file", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto_lite", + "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel index a099106c2cb..351184690d0 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel @@ -23,8 +23,9 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ ":todo_collector", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto_lite", - "//scripts/src/java/org/oppia/android/scripts/todo/model:issue", + "//scripts/src/java/org/oppia/android/scripts/common:github_client", + "//scripts/src/java/org/oppia/android/scripts/common/model:github_issue", + "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", "//scripts/src/java/org/oppia/android/scripts/todo/model:todo", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt index d7b8271f544..a4487f1396a 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt @@ -2,6 +2,7 @@ package org.oppia.android.scripts.todo import org.oppia.android.scripts.common.RepositoryFile import org.oppia.android.scripts.todo.model.Todo +import java.io.File /** Collects code lines containing the 'todo' keyword (case-insensitive). */ class TodoCollector { @@ -26,11 +27,7 @@ class TodoCollector { file.bufferedReader() .lineSequence() .mapIndexedNotNull { lineIndex, lineContent -> - checkIfContainsTodo( - filePath = file.toString(), - lineContent = lineContent, - lineIndex = lineIndex - ) + checkIfContainsTodo(file.absoluteFile.normalize(), lineContent, lineIndex) } } } @@ -65,21 +62,20 @@ class TodoCollector { * @param codeLine the line of code to be checked * @return the parsed issue number */ - fun parseIssueNumberFromTodo(codeLine: String): String? { - return correctTodoFormatRegex.find(codeLine)?.groupValues?.get(1) - } + fun parseIssueNumberFromTodo(codeLine: String): Int? = + correctTodoFormatRegex.find(codeLine)?.groupValues?.get(1)?.toIntOrNull() /** * Computes whether a line of code contains the 'todo' keyword. * - * @param filePath the path of the file + * @param file the file being checked * @param lineContent the line string * @param lineIndex the index of the line sequence which is to be searched for a TODO * @return a Todo instance if the todo detector regex matches, else returns null */ - private fun checkIfContainsTodo(filePath: String, lineContent: String, lineIndex: Int): Todo? { + private fun checkIfContainsTodo(file: File, lineContent: String, lineIndex: Int): Todo? { if (todoDetectorRegex.containsMatchIn(lineContent)) { - return Todo(filePath = filePath, lineNumber = lineIndex + 1, lineContent = lineContent) + return Todo(file, lineNumber = lineIndex + 1, lineContent = lineContent) } return null } diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoIssueResolvedCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoIssueResolvedCheck.kt index d0f9a1db331..18ce0d201c7 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoIssueResolvedCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoIssueResolvedCheck.kt @@ -22,11 +22,12 @@ import java.io.File * NOTE TO DEVELOPERS: The script is executed in the CI enviornment. */ fun main(vararg args: String) { - // Path of the repo to be analyzed. - val repoPath = "${args[0]}/" + // The first argument is the path of the repo to be analyzed. + val repoRoot = File("${args[0]}/").absoluteFile.normalize() + val repoPath = repoRoot.path // Issue number of the closed issue. - val closedIssueNumber = args[1] + val closedIssueNumber = args[1].toInt() val commitSha = args[2] @@ -42,6 +43,7 @@ fun main(vararg args: String) { } logFailures( + repoRoot, todoIssueResolvedFailures = todoIssueResolvedFailures, failureMessage = "The following TODOs are unresolved for the closed issue:" ) @@ -54,7 +56,7 @@ fun main(vararg args: String) { } if (todoIssueResolvedFailures.isNotEmpty()) { - generateTodoListFile(repoPath, todoIssueResolvedFailures, githubPermalinkUrl) + generateTodoListFile(repoRoot, todoIssueResolvedFailures, githubPermalinkUrl) throw Exception("TODO ISSUE RESOLVED CHECK FAILED") } else { println("TODO ISSUE RESOLVED CHECK PASSED") @@ -67,7 +69,7 @@ fun main(vararg args: String) { * @param codeLine line content corresponding to the todo * @param closedIssueNumber issue number of the closed issue */ -private fun checkIfTodoIssueResolvedFailure(codeLine: String, closedIssueNumber: String): Boolean { +private fun checkIfTodoIssueResolvedFailure(codeLine: String, closedIssueNumber: Int): Boolean { val parsedIssueNumberFromTodo = TodoCollector.parseIssueNumberFromTodo(codeLine) return parsedIssueNumberFromTodo == closedIssueNumber } @@ -75,22 +77,22 @@ private fun checkIfTodoIssueResolvedFailure(codeLine: String, closedIssueNumber: /** * Generates a file containing all the todos corresponding to the closed issue. * - * @param repoPath path of the repo to be analyzed + * @param repoRoot the root directory of the repository * @param todoIssueResolvedFailures list of all the unresolved todos corresponding to the closed * issue. * @param githubPermalinkUrl the GitHub url for the permalinks */ private fun generateTodoListFile( - repoPath: String, + repoRoot: File, todoIssueResolvedFailures: List, githubPermalinkUrl: String ) { - val todoListFile = File(repoPath + "script_failures.txt") + val todoListFile = File(repoRoot, "script_failures.txt") todoListFile.appendText("The issue is reopened because of the following unresolved TODOs:\n") - todoIssueResolvedFailures.sortedWith(compareBy({ it.filePath }, { it.lineNumber })) + todoIssueResolvedFailures.sortedWith(compareBy({ it.file.path }, { it.lineNumber })) .forEach { todo -> todoListFile.appendText( - "$githubPermalinkUrl/${(todo.filePath).removePrefix(repoPath)}#L${todo.lineNumber}\n" + "$githubPermalinkUrl/${(todo.file.toRelativeString(repoRoot))}#L${todo.lineNumber}\n" ) } } @@ -98,14 +100,19 @@ private fun generateTodoListFile( /** * Logs the TODO issue resolved check failures. * + * @param repoRoot the root directory of the repository * @param todoIssueResolvedFailures list of all the unresolved todos for the closed issue * @param failureMessage the failure message to be logged */ -private fun logFailures(todoIssueResolvedFailures: List, failureMessage: String) { +private fun logFailures( + repoRoot: File, + todoIssueResolvedFailures: List, + failureMessage: String +) { if (todoIssueResolvedFailures.isNotEmpty()) { println(failureMessage) - todoIssueResolvedFailures.sortedWith(compareBy({ it.filePath }, { it.lineNumber })).forEach { - println("- ${it.filePath}:${it.lineNumber}") + todoIssueResolvedFailures.sortedWith(compareBy({ it.file.path }, { it.lineNumber })).forEach { + println("- ${it.file.toRelativeString(repoRoot)}:${it.lineNumber}") } println() } diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt index 65fc87faa0b..2cd179d3e15 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt @@ -1,59 +1,58 @@ package org.oppia.android.scripts.todo -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types -import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import org.oppia.android.scripts.proto.TodoOpenExemption import org.oppia.android.scripts.proto.TodoOpenExemptions -import org.oppia.android.scripts.todo.model.Issue +import org.oppia.android.scripts.common.GitHubClient +import org.oppia.android.scripts.common.model.GitHubIssue import org.oppia.android.scripts.todo.model.Todo import java.io.File import java.io.FileInputStream +import java.util.concurrent.Executors +import java.util.concurrent.ThreadFactory +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.runBlocking +import com.google.protobuf.TextFormat /** * Script for ensuring that all TODOs present in the repository are correctly formatted and * corresponds to open issues on GitHub. * + * Note that the setup instructions at + * https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks#todo-open-checks must be + * followed in order to ensure that this script works correctly in the local environment. + * * Usage: - * bazel run //scripts:todo_open_check -- - * + * bazel run //scripts:todo_open_check -- [regenerate] * * Arguments: - * - path_to_directory_root: directory path to the root of the Oppia Android repository. + * - path_to_dir_root: directory path to the root of the Oppia Android repository. * - path_to_proto_binary: relative path to the exemption .pb file. - * - path_to_json_file: path to the json file containing the list of all open issues on Github + * - regenerate: optional 'regenerate' string to, instead of checking for TODOs, regenerate the + * exemption textproto file and print it to the command output. * - * Example: + * Examples: * bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb - * open_issues.json - * - * NOTE TO DEVELOPERS: The script is executed in the CI enviornment. The CI workflow creates a - * json file from the GitHub api which contains a list of all open issues of the - * oppia/oppia-android repository. To execute it without the CI, please create open issues json - * file and provide its path to the script in the format as stated above. - * - * Instructions to create the open_issues.json file: - * 1. Set up Github CLI Tools locally. - * 2. cd to the oppia-android repository. - * 3. Run the command: gh issue list --limit 2000 --repo oppia/oppia-android - * --json number > $(pwd)/open_issues.json + * bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb regenerate */ fun main(vararg args: String) { // Path of the repo to be analyzed. - val repoPath = "${args[0]}/" + val repoRoot = File(args[0]).absoluteFile.normalize() + val repoPath = "${repoRoot.path}/" val pathToProtoBinary = args[1] - - // Path to the JSON file containing the list of open issues. - val openIssuesJsonFile = File(repoPath, args[2]) - - check(openIssuesJsonFile.exists()) { "$repoPath${args[2]}: No such file exists" } + val regenerateFile = args.getOrNull(2) == "regenerate" val todoExemptionTextProtoFilePath = "scripts/assets/todo_exemptions" // List of all the open issues on GitHub of this repository. - val openIssueList = retrieveOpenIssueList(openIssuesJsonFile) + // TODO: Use script bg dispatcher here, instead. + val defaultFactory = Executors.defaultThreadFactory() + val daemonFactory = object: ThreadFactory { + override fun newThread(r: Runnable) = defaultFactory.newThread(r).also { it.setDaemon(true) } + } + val dispatcher = Executors.newSingleThreadExecutor(daemonFactory).asCoroutineDispatcher() + val gitHubClient = GitHubClient(repoRoot, dispatcher) + val openIssueList = runBlocking { gitHubClient.fetchAllOpenIssues().await() } val todoExemptionList = loadTodoExemptionsProto(pathToProtoBinary).getTodoOpenExemptionList() @@ -71,32 +70,26 @@ fun main(vararg args: String) { } val redundantExemptions = retrieveRedundantExemptions( - todos = poorlyFormattedTodos + openIssueFailureTodos, - todoExemptionList = todoExemptionList, - repoPath = repoPath + todos = poorlyFormattedTodos + openIssueFailureTodos, todoExemptionList, repoRoot ) - val poorlyFormattedTodosAfterExemption = retrieveTodosAfterExemption( - todos = poorlyFormattedTodos, - todoExemptionList = todoExemptionList, - repoPath = repoPath - ) + val poorlyFormattedTodosAfterExemption = + retrieveTodosAfterExemption(todos = poorlyFormattedTodos, todoExemptionList, repoRoot) - val openIssueFailureTodosAfterExemption = retrieveTodosAfterExemption( - todos = openIssueFailureTodos, - todoExemptionList = todoExemptionList, - repoPath = repoPath - ) + val openIssueFailureTodosAfterExemption = + retrieveTodosAfterExemption(todos = openIssueFailureTodos, todoExemptionList, repoRoot) logRedundantExemptions(redundantExemptions, todoExemptionTextProtoFilePath) logFailures( invalidTodos = poorlyFormattedTodosAfterExemption, + repoRoot, failureMessage = "TODOs not in correct format:", ) logFailures( invalidTodos = openIssueFailureTodosAfterExemption, + repoRoot, failureMessage = "TODOs not corresponding to open issues on GitHub:", ) @@ -109,11 +102,25 @@ fun main(vararg args: String) { ) } + if (regenerateFile) { + println("Regenerated exemptions:") + println() + val allProblematicTodos = poorlyFormattedTodos + openIssueFailureTodos + val newExemptions = allProblematicTodos.convertToExemptions(repoRoot) + println(newExemptions.convertToExemptionTextProto()) + throw Exception("TODO CHECK SKIPPED") + } + if ( redundantExemptions.isNotEmpty() || poorlyFormattedTodosAfterExemption.isNotEmpty() || openIssueFailureTodosAfterExemption.isNotEmpty() ) { + println( + "There were failures. Re-run the command with \"regenerate\" at the end to regenerate the" + + " exemption file with all failures as exempted." + ) + println() throw Exception("TODO CHECK FAILED") } else { println("TODO CHECK PASSED") @@ -125,18 +132,18 @@ fun main(vararg args: String) { * * @param todos the list of all the failure causing TODOs * @param todoExemptionList the list contating the TODO exemptions - * @param repoPath path of the repo to be analyzed + * @param repoRoot the root directory of the repository * @return list obtained after filtering the exemptions */ private fun retrieveTodosAfterExemption( todos: List, todoExemptionList: List, - repoPath: String + repoRoot: File ): List { return todos.filter { todo -> - todoExemptionList.none { it -> - it.exemptedFilePath == todo.filePath.removePrefix(repoPath) && - todo.lineNumber in it.getLineNumberList() + todoExemptionList.none { + it.exemptedFilePath == todo.file.toRelativeString(repoRoot) && + todo.lineNumber in it.lineNumberList } } } @@ -146,18 +153,18 @@ private fun retrieveTodosAfterExemption( * * @param todos the list of all the failure causing TODOs * @param todoExemptionList the list contating the TODO exemptions - * @param repoPath path of the repo to be analyzed + * @param repoRoot the root directory of the repository * @return a list of all the redundant exemptions */ private fun retrieveRedundantExemptions( todos: List, todoExemptionList: List, - repoPath: String + repoRoot: File ): List> { return todoExemptionList.flatMap { exemption -> - exemption.getLineNumberList().mapNotNull { exemptedLineNumber -> + exemption.lineNumberList.mapNotNull { exemptedLineNumber -> val isRedundantExemption = todos.none { - it.filePath.removePrefix(repoPath) == exemption.exemptedFilePath && + it.file.toRelativeString(repoRoot) == exemption.exemptedFilePath && it.lineNumber == exemptedLineNumber } if (isRedundantExemption) { @@ -178,10 +185,10 @@ private fun retrieveRedundantExemptions( */ private fun checkIfIssueDoesNotMatchOpenIssue( codeLine: String, - openIssueList: List, + openIssueList: List, ): Boolean { val parsedIssueNumberFromTodo = TodoCollector.parseIssueNumberFromTodo(codeLine) - return openIssueList.none { it -> it.issueNumber == parsedIssueNumberFromTodo } + return openIssueList.none { it -> it.number == parsedIssueNumberFromTodo } } /** @@ -212,35 +219,33 @@ private fun logRedundantExemptions( * @param invalidTodos a list of all the invalid TODOs present in the repository. A TODO is * considered to be invalid if it is poorly formatted or if it does not corresponds to open * issues on GitHub. + * @param repoRoot the root directory of the repository * @param failureMessage the failure message to be logged */ -private fun logFailures(invalidTodos: List, failureMessage: String) { +private fun logFailures(invalidTodos: List, repoRoot: File, failureMessage: String) { if (invalidTodos.isNotEmpty()) { println(failureMessage) - invalidTodos.sortedWith(compareBy({ it.filePath }, { it.lineNumber })).forEach { - println("- ${it.filePath}:${it.lineNumber}") + invalidTodos.sortedWith(compareBy({ it.file.path }, { it.lineNumber })).forEach { + println("- ${it.file.toRelativeString(repoRoot)}:${it.lineNumber}") } println() } } -/** - * Retrieves the list of all open issues on GitHub by parsing the JSON file generated by the GitHub - * API. - * - * @param openIssuesJsonFile file containing all the open issues of the repository - * @return list of all open issues - */ -private fun retrieveOpenIssueList(openIssuesJsonFile: File): List { - val openIssuesJsonText = openIssuesJsonFile - .inputStream() - .bufferedReader() - .use { it.readText() } - val moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build() - val listType = Types.newParameterizedType(List::class.java, Issue::class.java) - val adapter: JsonAdapter> = moshi.adapter(listType) - return adapter.fromJson(openIssuesJsonText) - ?: throw Exception("Failed to parse $openIssuesJsonFile") +private fun List.convertToExemptions(repoRoot: File): List { + return groupBy { it.file.path }.map { (_, todos) -> + TodoOpenExemption.newBuilder().apply { + exemptedFilePath = todos.first().file.toRelativeString(repoRoot) + addAllLineNumber(todos.map { it.lineNumber }.sorted()) + }.build() + }.sortedBy { it.exemptedFilePath } +} + +private fun List.convertToExemptionTextProto(): String { + val baseProto = TodoOpenExemptions.newBuilder().apply { + addAllTodoOpenExemption(this@convertToExemptionTextProto) + }.build() + return TextFormat.printer().printToString(baseProto) } /** diff --git a/scripts/src/java/org/oppia/android/scripts/todo/model/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/todo/model/BUILD.bazel index 7df0565783a..34cd905db58 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/model/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/todo/model/BUILD.bazel @@ -4,14 +4,6 @@ Libraries corresponding to data structures for representing a parsed open_issues load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") -kt_jvm_library( - name = "issue", - testonly = True, - srcs = ["Issue.kt"], - visibility = ["//scripts:oppia_script_library_visibility"], - deps = ["//third_party:moshi"], -) - kt_jvm_library( name = "todo", testonly = True, diff --git a/scripts/src/java/org/oppia/android/scripts/todo/model/Issue.kt b/scripts/src/java/org/oppia/android/scripts/todo/model/Issue.kt deleted file mode 100644 index 3ab249a844c..00000000000 --- a/scripts/src/java/org/oppia/android/scripts/todo/model/Issue.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.oppia.android.scripts.todo.model - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -/** - * Data class that contains the required details of an [Issue] that is present in - * open_issues.json. - */ -@JsonClass(generateAdapter = true) -data class Issue( - /** The issue's identification number. */ - @Json(name = "number") val issueNumber: String, -) diff --git a/scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt b/scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt index 4a4bd66dae3..855ade490a4 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt @@ -1,10 +1,12 @@ package org.oppia.android.scripts.todo.model +import java.io.File + /** * Represents the structure of TODO. * - * @property filePath the path of the file + * @property file the file containing a TODO * @property lineNumber the line number of the line of code * @property lineContent the content of the line of code */ -data class Todo(val filePath: String, val lineNumber: Int, val lineContent: String) +data class Todo(val file: File, val lineNumber: Int, val lineContent: String) diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt index a357ee517e7..32561eddc20 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt @@ -9,9 +9,7 @@ import org.oppia.android.scripts.todo.model.Todo /** Tests for [TodoCollector]. */ class TodoCollectorTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { @@ -71,196 +69,196 @@ class TodoCollectorTest { assertThat(collectedTodos).hasSize(28) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 3, lineContent = "# TODO(#457741): test description 1" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 4, lineContent = "# TODO (#457742): test description 2" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 5, lineContent = "# TODO(#457743) : test description 3" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 6, lineContent = "# TODO(457744): test description 4" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 7, lineContent = "// TODO(#457741)" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 8, lineContent = "// TODO(#457745):" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 9, lineContent = "// TODO(#457747) test description 5" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 10, lineContent = "// some comment which has a TODO(#12182992): some description" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 11, lineContent = "// TODO(test description 7)" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 12, lineContent = "// Todo(#4577413): test description 8" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 13, lineContent = "// Todo (#4577423): test description 9" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 14, lineContent = "// Todo(#4577433) : test description 10" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 15, lineContent = "// Todo(4577443): test description 11" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 16, lineContent = "// Todo(#4577413)" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 17, lineContent = "// Todo(#4577453):" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 18, lineContent = "// Todo(#4577473) test description 12" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 19, lineContent = "// some comment which has a Todo(#12182999): some description" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 20, lineContent = "// todo(#4577413): test description 14" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 21, lineContent = "// todo (#4577423): test description 15" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 22, lineContent = "// todo(#4577433) : test description 16" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 23, lineContent = "// todo(4577443): test description 17" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 24, lineContent = "// todo(#4577413)" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 25, lineContent = "// todo(#4577453):" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 26, lineContent = "// todo(#4577473) test description 18" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 27, lineContent = "// some comment which has a todo(#12182999): some description" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 30, lineContent = "todo" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 33, lineContent = "TODO(#ISSUE_NUMBER): Revert ownership to @USERNAME after YYYY-MM-DD." ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile.toString(), + file = tempFile, lineNumber = 34, lineContent = "//TODO(#161614): some another test description" ) @@ -294,35 +292,35 @@ class TodoCollectorTest { assertThat(collectedTodos).hasSize(5) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "# TODO (#121): test todo." ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile2.toString(), + file = tempFile2, lineNumber = 1, lineContent = "# TODO(#10500): Test description" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 1, lineContent = "// TODO(#17800): test todo." ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 2, lineContent = "// TODO( 210)" ) @@ -347,8 +345,8 @@ class TodoCollectorTest { val testContent3 = """ // TODO (#178): test todo. - - + + # TODO( 210) """.trimIndent() val tempFile1 = tempFolder.newFile("testfiles/TempFile1.txt") @@ -363,49 +361,49 @@ class TodoCollectorTest { assertThat(poorlyFormattedTodos).hasSize(7) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "//TODO(#1215545): test todo." ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "# TODO( 110)" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "//todo(#15444)" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 4, lineContent = "" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile2.toString(), + file = tempFile2, lineNumber = 2, lineContent = "TODO(# 105)" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 1, lineContent = "// TODO (#178): test todo." ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 4, lineContent = "# TODO( 210)" ) @@ -428,8 +426,8 @@ class TodoCollectorTest { val testContent3 = """ // ToDo(#17878788): test content 6 - - + + # some todo(#21084884): test content 7 """.trimIndent() val tempFile1 = tempFolder.newFile("testfiles/TempFile1.txt") @@ -444,49 +442,49 @@ class TodoCollectorTest { assertThat(poorlyFormattedTodos).hasSize(7) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "// Todo(#1215157): test content 1" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "# todo(#110484844): test content 2" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "// TODo(#15444): test content 3" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 4, lineContent = "" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile2.toString(), + file = tempFile2, lineNumber = 1, lineContent = "" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 1, lineContent = "// ToDo(#17878788): test content 6" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 4, lineContent = "# some todo(#21084884): test content 7" ) @@ -509,8 +507,8 @@ class TodoCollectorTest { val testContent3 = """ // Another Todo comment - - + + # some test comment including todo """.trimIndent() val tempFile1 = tempFolder.newFile("testfiles/TempFile1.txt") @@ -542,8 +540,8 @@ class TodoCollectorTest { val testContent3 = """ // TODO(#1788888): some description 5. - - + + # TODO(#210000): some description 6. // TODO (#457742): test description 2 // TODO(#457743) : test description 3 @@ -586,35 +584,35 @@ class TodoCollectorTest { assertThat(correctlyFormattedTodos).hasSize(5) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "// TODO(#12111): some description 1." ) ) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "# TODO(#110000): some description 2." ) ) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "" ) ) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 1, lineContent = "// TODO(#1788888): some description 5." ) ) assertThat(correctlyFormattedTodos).contains( Todo( - filePath = tempFile3.toString(), + file = tempFile3, lineNumber = 4, lineContent = "# TODO(#210000): some description 6." ) @@ -834,21 +832,21 @@ class TodoCollectorTest { assertThat(collectedTodos).hasSize(3) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "// TODO(#1234478" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "// Todo(#1234478" ) ) assertThat(collectedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "// todo(#1234478" ) @@ -871,21 +869,21 @@ class TodoCollectorTest { assertThat(poorlyFormattedTodos).hasSize(3) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 1, lineContent = "// TODO(#1234478" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 2, lineContent = "// Todo(#1234478" ) ) assertThat(poorlyFormattedTodos).contains( Todo( - filePath = tempFile1.toString(), + file = tempFile1, lineNumber = 3, lineContent = "// todo(#1234478" ) diff --git a/scripts/static_checks.sh b/scripts/static_checks.sh index 688e542602e..f7ad2a39d8e 100644 --- a/scripts/static_checks.sh +++ b/scripts/static_checks.sh @@ -105,4 +105,11 @@ echo "********************************" echo "Running license texts checks" echo "********************************" bazel run //scripts:license_texts_check -- $(pwd)/app/src/main/res/values/third_party_dependencies.xml +echo "" +# TODO checks. +echo "********************************" +echo "Running TODO correctness checks" +echo "********************************" +bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb +echo "" diff --git a/wiki/Static-Analysis-Checks.md b/wiki/Static-Analysis-Checks.md index e4252c7c445..dc15ce4231d 100644 --- a/wiki/Static-Analysis-Checks.md +++ b/wiki/Static-Analysis-Checks.md @@ -71,7 +71,7 @@ In general, failures for this check should be fixed by moving the file to the co filename_checks { prohibited_filename_regex: "^((?!(app|testing)).)+/src/main/.+?Activity.kt" failure_message: "Activities cannot be placed outside the app or testing module" - exempted_file_name: "testing/src/main/SampleActivity.kt" + exempted_file_name: "testing/src/main/SampleActivity.kt" } ``` 2. Add an explanation to your PR description detailing why this exemption is correct @@ -174,6 +174,22 @@ This check ensures that every TODO present in the codebase corresponds to open i ### Purpose To avoid scenarios where a TODO was added not corresponding to an open issue on GitHub, this check is particularly needed. Having a corresponding issue for a TODO helps us to track its progress. Also, in order to maintain consistency we want all the TODOs to be formatted as per the convention. +### Running the command +The TODO open check can be run as follows: +```sh +bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb +``` + +Please note, however, that this tool requires the GitHub CLI to be set up and _logged in_ on your local machine. Specifically, you'll need to: +- Follow the instructions on the GitHub CLI repository page to install the tool: https://github.com/cli/cli?tab=readme-ov-file#installation. +- Follow the instructions on the tool's official documentation to authenticate (e.g. via ``gh auth login``): https://cli.github.com/manual/gh_auth_login. + +Some things to note: +- If you're using a headless environment, you can force the browser check to fail by setting the ``GH_BROWSER`` variable to a non-existent command ahead of ``gh auth login``. This allows you to authenticate on a different machine. +- You don't need to authenticate using a browser. This defaults to creating a PAT (personal access token) with full access to your account. While that can be helpful, it may not be what you want (in which case you can create a fine-grained PAT for authenticating the tool). The minimum required scopes for the token are mentioned in the command's output while authenticating the tool. + +If you decide to use a personal access token, you can generate a fine-grained one via the Developer settings section of your GitHub profile. It only needs access to public repositories and no other permissions for the purpose of Oppia's scripts. + ### Fixing failures #### TODO formatting failure @@ -196,6 +212,7 @@ To fix this failure: there are 3 ways: 1. Repurpose the TODO to a new issue. 2. If the TODO has been resolved then please remove it from the repository. 3. Reopen the issue. + #### Case when using ‘TODO’ keyword for documentation purposes If it’s a case where a ‘TODO’ keyword has been used for documentation purposes or if it's not meant to correspond to a future work, then please add an exemption for it. Add a new TODO exemption in the [scripts/assets/todo_open_exemptions.textproto](https://github.com/oppia/oppia-android/blob/2da95a53928bc989f5959fbac211f7f7ca0a753f/scripts/assets/todo_open_exemptions.textproto). Example: @@ -206,6 +223,8 @@ todo_open_exemption { } ``` +Alternatively, the textproto can be entirely generated + ## TODO issue resolved check The check ensures that a TODO issue is not closed until all of its corresponding TODO items are resolved. From 4f7bfd6a69b9a73dae278a3abcce2bda8e2a9802 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 18 Jan 2024 20:30:54 +0000 Subject: [PATCH 23/63] Simplify GitHubIssue & some static fixes/docs. Tests still need to be added, and some cleanup is needed once the branch's base is adjusted. --- scripts/assets/test_file_exemptions.textproto | 2 + .../android/scripts/common/GitHubClient.kt | 54 ++++++---- .../android/scripts/common/model/BUILD.bazel | 4 +- .../scripts/common/model/GitHubIssue.kt | 99 ++----------------- .../android/scripts/common/remote/BUILD.bazel | 4 +- .../scripts/common/remote/GitHubService.kt | 24 ++++- .../android/scripts/todo/TodoOpenCheck.kt | 14 +-- 7 files changed, 75 insertions(+), 126 deletions(-) diff --git a/scripts/assets/test_file_exemptions.textproto b/scripts/assets/test_file_exemptions.textproto index 382bd7c1efa..8a5cbf93331 100644 --- a/scripts/assets/test_file_exemptions.textproto +++ b/scripts/assets/test_file_exemptions.textproto @@ -741,6 +741,8 @@ exempted_file_path: "instrumentation/src/java/org/oppia/android/instrumentation/ exempted_file_path: "instrumentation/src/java/org/oppia/android/instrumentation/testing/EndToEndTestHelper.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/common/CommandExecutor.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/common/CommandResult.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/LicenseFetcher.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/LicenseFetcherImpl.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/model/CopyrightLicense.kt" diff --git a/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt b/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt index dbee20893b7..3de49bb498e 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt @@ -1,20 +1,27 @@ package org.oppia.android.scripts.common -import java.io.File -import retrofit2.Retrofit -import retrofit2.converter.moshi.MoshiConverterFactory -import okhttp3.OkHttpClient -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Deferred +import com.squareup.moshi.Moshi import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.withContext +import okhttp3.OkHttpClient import org.oppia.android.scripts.common.model.GitHubIssue import org.oppia.android.scripts.common.remote.GitHubService -import com.squareup.moshi.Moshi +import retrofit2.Retrofit +import retrofit2.converter.moshi.MoshiConverterFactory +import java.io.File import java.io.IOException +// TODO: finish documentation once bg dispatcher is incorporated. +/** + * General utility for interfacing with a remote GitHub repository (specifically Oppia Android). + * + * Note that this utility expects 'gh' to be available in the local environment and be properly + * authenticated. + */ class GitHubClient( private val rootDirectory: File, private val dispatcher: CoroutineDispatcher, @@ -24,16 +31,21 @@ class GitHubClient( ) { private val remoteApiUrl by lazy { "https://api.github.com/" } private val okHttpClient by lazy { OkHttpClient.Builder().build() } - private val moshi by lazy { - Moshi.Builder().add(GitHubIssue.DateAdapter).add(GitHubIssue.UriAdapter).add(GitHubIssue.State.Adapter).add(GitHubIssue.StateReason.Adapter).build() - } + private val moshi by lazy { Moshi.Builder().build() } private val retrofit by lazy { - Retrofit.Builder().baseUrl(remoteApiUrl).addConverterFactory(MoshiConverterFactory.create(moshi)).client(okHttpClient).build() + Retrofit.Builder() + .baseUrl(remoteApiUrl) + .addConverterFactory(MoshiConverterFactory.create(moshi)) + .client(okHttpClient) + .build() } private val gitHubService by lazy { retrofit.create(GitHubService::class.java) } private val authorizationBearer by lazy { "Bearer ${retrieveAccessToken()}" } - fun fetchAllOpenIssues(): Deferred> { + /** + * Asynchronously returns all [GitHubIssue]s currently open in the Oppia Android GitHub project. + */ + fun fetchAllOpenIssuesAsync(): Deferred> { return CoroutineScope(dispatcher).async { // Fetch issues one page at a time (starting at page 1) until all are found. fetchOpenIssuesRecursive(startPageNumber = 1) @@ -52,23 +64,31 @@ class GitHubClient( val call = gitHubService.fetchOpenIssues(repoOwner, repoName, authorizationBearer, pageNumber) // Deferred blocking I/O operation to the dedicated I/O dispatcher. val response = withContext(Dispatchers.IO) { call.execute() } - check(response.isSuccessful()) { "Failed to fetch issues at page $pageNumber: ${response.code()}\n${call.request()}\n${response.errorBody()}." } - return@async checkNotNull(response.body()) { "No issues response from GitHub for page: $pageNumber." } + check(response.isSuccessful()) { + "Failed to fetch issues at page $pageNumber: ${response.code()}\n${call.request()}" + + "\n${response.errorBody()}." + } + return@async checkNotNull(response.body()) { + "No issues response from GitHub for page: $pageNumber." + } } } - // Retrieve the access token that 'gh' is configured to use (to allow the script to run without being tied to a specific access token). private fun retrieveAccessToken(): String { // First, make sure the command actually exists. try { commandExecutor.executeCommand(rootDirectory, "gh", "help") } catch (e: IOException) { throw IllegalStateException( - "Failed to interact with gh tool. Please make sure your environment is set up properly"+ + "Failed to interact with gh tool. Please make sure your environment is set up properly" + " per https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + - "#todo-open-checks.", e + "#todo-open-checks.", + e ) } + + // Retrieve the access token that 'gh' is configured to use (to allow the script to run without + // being tied to a specific access token). return commandExecutor.executeCommand(rootDirectory, "gh", "auth", "token").also { check(it.exitCode == 0) { "Failed to retrieve auth token from GH tool. Please make sure your environment is set up" + diff --git a/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel index 37f8b5750e9..af3cc0b52d7 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel @@ -7,9 +7,7 @@ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") kt_jvm_library( name = "github_issue", testonly = True, - srcs = [ - "GitHubIssue.kt", - ], + srcs = ["GitHubIssue.kt"], visibility = ["//scripts:oppia_script_library_visibility"], deps = ["//third_party:moshi"], ) diff --git a/scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt b/scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt index 29ddc8f54ed..7a824fc3120 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/model/GitHubIssue.kt @@ -2,97 +2,12 @@ package org.oppia.android.scripts.common.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass -import com.squareup.moshi.FromJson -import com.squareup.moshi.ToJson -import com.squareup.moshi.JsonReader -import com.squareup.moshi.JsonWriter -import java.net.URI -import java.util.Date -import java.time.Instant -import java.time.format.DateTimeFormatter.ISO_INSTANT +/** + * Moshi data structure representing a remote issue on GitHub. + * + * @property number the unique number corresponding to this issue (i.e. the number listed after + * 'issues/' in an issue's GitHub URL) + */ @JsonClass(generateAdapter = true) -data class GitHubIssue( - @Json(name = "id") val id: Long, - @Json(name = "number") val number: Int, - @Json(name = "title") val title: String, - @Json(name = "body") val body: String?, - @Json(name = "state") val state: State, - @Json(name = "state_reason") val stateReason: StateReason?, - @Json(name = "created_at") val creationDate: Date, - @Json(name = "updated_at") val lastUpdatedDate: Date, - @Json(name = "closed_at") val closeDate: Date?, - @Json(name = "pull_request") val pullRequestMetadata: PullRequestMetadata? -) { - val isPullRequest: Boolean get() = pullRequestMetadata != null - - @JsonClass(generateAdapter = false) - enum class State { - OPEN, - CLOSED; - - object Adapter { - @FromJson - fun fromJson(jsonReader: JsonReader): State? { - return when (val stateStr = jsonReader.maybeNextString() ?: return null) { - "open" -> State.OPEN - "closed" -> State.CLOSED - else -> error("Invalid state value: '$stateStr'.") - } - } - - @ToJson - fun toJson(jsonWriter: JsonWriter, date: State?): Unit = error("Not supported.") - } - } - - @JsonClass(generateAdapter = false) - enum class StateReason { - COMPLETED, - REOPENED, - NOT_PLANNED; - - object Adapter { - @FromJson - fun fromJson(jsonReader: JsonReader): StateReason? { - return when (val stateReasonStr = jsonReader.maybeNextString() ?: return null) { - "completed" -> StateReason.COMPLETED - "reopened" -> StateReason.REOPENED - "not_planned" -> StateReason.NOT_PLANNED - else -> error("Invalid state reason value: '$stateReasonStr'.") - } - } - - @ToJson - fun toJson(jsonWriter: JsonWriter, date: StateReason?): Unit = error("Not supported.") - } - } - - @JsonClass(generateAdapter = true) - data class PullRequestMetadata( - @Json(name = "url") val url: URI?, - @Json(name = "merged_at") val mergeDate: Date? - ) - - object DateAdapter { - // Reference: https://stackoverflow.com/a/60214805. - @FromJson - fun fromJson(jsonReader: JsonReader): Date? = - jsonReader.maybeNextString()?.let(ISO_INSTANT::parse)?.let(Instant::from)?.let(Date::from) - - @ToJson - fun toJson(jsonWriter: JsonWriter, date: Date?): Unit = error("Not supported.") - } - - object UriAdapter { - @FromJson - fun fromJson(jsonReader: JsonReader): URI? = jsonReader.maybeNextString()?.let(::URI) - - @ToJson - fun toJson(jsonWriter: JsonWriter, date: URI?): Unit = error("Not supported.") - } -} - -// The next value must be either a string or null. -private fun JsonReader.maybeNextString(): String? = - if (peek() == JsonReader.Token.STRING) nextString() else nextNull() +data class GitHubIssue(@Json(name = "number") val number: Int) diff --git a/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel index a73fc5e09bf..fec47cca77b 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel @@ -7,9 +7,7 @@ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") kt_jvm_library( name = "github_service", testonly = True, - srcs = [ - "GitHubService.kt", - ], + srcs = ["GitHubService.kt"], visibility = ["//scripts:oppia_script_library_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common/model:github_issue", diff --git a/scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt b/scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt index 65b659b21d6..0fdb1dd3a19 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/remote/GitHubService.kt @@ -3,15 +3,31 @@ package org.oppia.android.scripts.common.remote import org.oppia.android.scripts.common.model.GitHubIssue import retrofit2.Call import retrofit2.http.GET -import retrofit2.http.Path -import retrofit2.http.Query import retrofit2.http.Header import retrofit2.http.Headers +import retrofit2.http.Path +import retrofit2.http.Query +/** Retrofit service for interacting with GitHub's REST API. */ interface GitHubService { - // Reference: https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#list-repository-issues. - // Sort by ascending creation date by default to attempt improving stability (e.g. slight robustness against new issues being filed) since the GitHub API doesn't seem to provide support for stable pagination. + /** + * Fetches [countPerPage] open issues from the configured GitHub repository. + * + * Note that the returned issues are sorted in ascending order by creation date as a basic attempt + * to improve API stability (e.g. robustness against new issues being filed when fetching multiple + * pages of issues) since the GitHub API doesn't seem to provide support for stable pagination. + * + * API reference: + * https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#list-repository-issues. + * + * @param repoOwner the owner of the repository to be read (e.g. 'oppia') + * @param repoName the name of the repository to be read (e.g. 'oppia-android') + * @param authorizationBearer the authorization access token bearer to allow repository reading + * @param pageNumber the current page number to read (starting at 1) + * @param countPerPage the number of issues to read per page (defaults to 100) + * @return the list of [GitHubIssue]s read from the remote repository (as a [Call]) + */ @Headers("Accept: application/vnd.github+json", "X-GitHub-Api-Version: 2022-11-28") @GET("repos/{repo_owner}/{repo_name}/issues?direction=asc") fun fetchOpenIssues( diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt index 2cd179d3e15..de74201d474 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt @@ -1,17 +1,17 @@ package org.oppia.android.scripts.todo -import org.oppia.android.scripts.proto.TodoOpenExemption -import org.oppia.android.scripts.proto.TodoOpenExemptions +import com.google.protobuf.TextFormat +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.runBlocking import org.oppia.android.scripts.common.GitHubClient import org.oppia.android.scripts.common.model.GitHubIssue +import org.oppia.android.scripts.proto.TodoOpenExemption +import org.oppia.android.scripts.proto.TodoOpenExemptions import org.oppia.android.scripts.todo.model.Todo import java.io.File import java.io.FileInputStream import java.util.concurrent.Executors import java.util.concurrent.ThreadFactory -import kotlinx.coroutines.asCoroutineDispatcher -import kotlinx.coroutines.runBlocking -import com.google.protobuf.TextFormat /** * Script for ensuring that all TODOs present in the repository are correctly formatted and @@ -47,12 +47,12 @@ fun main(vararg args: String) { // List of all the open issues on GitHub of this repository. // TODO: Use script bg dispatcher here, instead. val defaultFactory = Executors.defaultThreadFactory() - val daemonFactory = object: ThreadFactory { + val daemonFactory = object : ThreadFactory { override fun newThread(r: Runnable) = defaultFactory.newThread(r).also { it.setDaemon(true) } } val dispatcher = Executors.newSingleThreadExecutor(daemonFactory).asCoroutineDispatcher() val gitHubClient = GitHubClient(repoRoot, dispatcher) - val openIssueList = runBlocking { gitHubClient.fetchAllOpenIssues().await() } + val openIssueList = runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } val todoExemptionList = loadTodoExemptionsProto(pathToProtoBinary).getTodoOpenExemptionList() From 000bba3f18c8ef86c4124e6d9546f5a5f966fb27 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 18 Jan 2024 23:27:19 +0000 Subject: [PATCH 24/63] Add ScriptBackgroundCoroutineDispatcher. This is a script-specific dispatcher which will allow for better asynchronous support in upcoming PRs (especially for command execution). This change serves to prepare for those changes. --- .../scripts/build/TransformAndroidManifest.kt | 43 ++++++---- .../scripts/ci/ComputeAffectedTests.kt | 18 ++-- .../oppia/android/scripts/common/BUILD.bazel | 13 +++ .../android/scripts/common/BazelClient.kt | 2 +- .../scripts/common/CommandExecutorImpl.kt | 4 + .../oppia/android/scripts/common/GitClient.kt | 5 +- .../ScriptBackgroundCoroutineDispatcher.kt | 86 +++++++++++++++++++ .../license/MavenDependenciesListCheck.kt | 8 +- .../license/MavenDependenciesRetriever.kt | 2 +- .../maven/GenerateMavenDependenciesList.kt | 83 +++++++++--------- .../build/TransformAndroidManifestTest.kt | 16 ++-- .../scripts/ci/ComputeAffectedTestsTest.kt | 16 ++-- .../oppia/android/scripts/common/BUILD.bazel | 11 +++ .../android/scripts/common/BazelClientTest.kt | 66 +++++++------- .../scripts/common/CommandExecutorImplTest.kt | 32 ++++--- .../android/scripts/common/GitClientTest.kt | 42 ++++----- ...ScriptBackgroundCoroutineDispatcherTest.kt | 79 +++++++++++++++++ .../license/MavenDependenciesListCheckTest.kt | 54 ++++++++---- .../license/MavenDependenciesRetrieverTest.kt | 13 +-- .../GenerateMavenDependenciesListTest.kt | 29 +++++-- .../scripts/testing/TestGitRepositoryTest.kt | 22 +++-- wiki/Updating-Maven-Dependencies.md | 32 +++---- 22 files changed, 477 insertions(+), 199 deletions(-) create mode 100644 scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt create mode 100644 scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt diff --git a/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt b/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt index 4fde91e42eb..96095ee2925 100644 --- a/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt +++ b/scripts/src/java/org/oppia/android/scripts/build/TransformAndroidManifest.kt @@ -1,6 +1,8 @@ package org.oppia.android.scripts.build +import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.GitClient +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.w3c.dom.Document import org.w3c.dom.NodeList import java.io.File @@ -62,21 +64,24 @@ fun main(args: Array) { check(args.size >= 9) { USAGE_STRING } val repoRoot = File(args[0]).also { if (!it.exists()) error("File doesn't exist: ${args[0]}") } - TransformAndroidManifest( - repoRoot = repoRoot, - sourceManifestFile = File(args[1]).also { - if (!it.exists()) { - error("File doesn't exist: ${args[1]}") - } - }, - outputManifestFile = File(args[2]), - buildFlavor = args[3], - majorVersion = args[4].toIntOrNull() ?: error(USAGE_STRING), - minorVersion = args[5].toIntOrNull() ?: error(USAGE_STRING), - versionCode = args[6].toIntOrNull() ?: error(USAGE_STRING), - relativelyQualifiedApplicationClass = args[7], - baseDevelopBranchReference = args[8] - ).generateAndOutputNewManifest() + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + TransformAndroidManifest( + repoRoot = repoRoot, + sourceManifestFile = File(args[1]).also { + if (!it.exists()) { + error("File doesn't exist: ${args[1]}") + } + }, + outputManifestFile = File(args[2]), + buildFlavor = args[3], + majorVersion = args[4].toIntOrNull() ?: error(USAGE_STRING), + minorVersion = args[5].toIntOrNull() ?: error(USAGE_STRING), + versionCode = args[6].toIntOrNull() ?: error(USAGE_STRING), + relativelyQualifiedApplicationClass = args[7], + baseDevelopBranchReference = args[8], + scriptBgDispatcher + ).generateAndOutputNewManifest() + } } private class TransformAndroidManifest( @@ -88,11 +93,11 @@ private class TransformAndroidManifest( private val minorVersion: Int, private val versionCode: Int, private val relativelyQualifiedApplicationClass: String, - private val baseDevelopBranchReference: String + private val baseDevelopBranchReference: String, + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher ) { - private val gitClient by lazy { - GitClient(repoRoot, baseDevelopBranchReference) - } + private val commandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } + private val gitClient by lazy { GitClient(repoRoot, baseDevelopBranchReference, commandExecutor) } private val documentBuilderFactory by lazy { DocumentBuilderFactory.newInstance() } private val transformerFactory by lazy { TransformerFactory.newInstance() } diff --git a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt index f7cc482c72a..53742b4081f 100644 --- a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt +++ b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt @@ -7,6 +7,9 @@ import org.oppia.android.scripts.proto.AffectedTestsBucket import java.io.File import java.util.Locale import kotlin.system.exitProcess +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher +import org.oppia.android.scripts.common.CommandExecutor +import org.oppia.android.scripts.common.CommandExecutorImpl private const val COMPUTE_ALL_TESTS_PREFIX = "compute_all_tests=" private const val MAX_TEST_COUNT_PER_LARGE_SHARD = 50 @@ -57,9 +60,10 @@ fun main(args: Array) { " '$computeAllTestsValue'" ) } - ComputeAffectedTests().compute( - pathToRoot, pathToOutputFile, baseDevelopBranchReference, computeAllTestsSetting - ) + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + ComputeAffectedTests(scriptBgDispatcher) + .compute(pathToRoot, pathToOutputFile, baseDevelopBranchReference, computeAllTestsSetting) + } } // Needed since the codebase isn't yet using Kotlin 1.5, so this function isn't available. @@ -73,9 +77,11 @@ private fun String.toBooleanStrictOrNull(): Boolean? { /** Utility used to compute affected test targets. */ class ComputeAffectedTests( + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, val maxTestCountPerLargeShard: Int = MAX_TEST_COUNT_PER_LARGE_SHARD, val maxTestCountPerMediumShard: Int = MAX_TEST_COUNT_PER_MEDIUM_SHARD, - val maxTestCountPerSmallShard: Int = MAX_TEST_COUNT_PER_SMALL_SHARD + val maxTestCountPerSmallShard: Int = MAX_TEST_COUNT_PER_SMALL_SHARD, + val commandExecutor: CommandExecutor = CommandExecutorImpl(scriptBgDispatcher) ) { private companion object { private const val GENERIC_TEST_BUCKET_NAME = "generic" @@ -105,8 +111,8 @@ class ComputeAffectedTests( println("Running from directory root: $rootDirectory") - val gitClient = GitClient(rootDirectory, baseDevelopBranchReference) - val bazelClient = BazelClient(rootDirectory) + val gitClient = GitClient(rootDirectory, baseDevelopBranchReference, commandExecutor) + val bazelClient = BazelClient(rootDirectory, commandExecutor) println("Current branch: ${gitClient.currentBranch}") println("Most recent common commit: ${gitClient.branchMergeBase}") diff --git a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel index 3a94254e9fc..6b26dd4f49f 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel @@ -36,6 +36,10 @@ kt_jvm_library( "CommandResult.kt", ], visibility = ["//scripts:oppia_script_library_visibility"], + deps = [ + ":script_background_coroutine_dispatcher", + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + ], ) kt_jvm_library( @@ -57,3 +61,12 @@ kt_jvm_library( "//third_party:org_jetbrains_kotlin_kotlin-stdlib-jdk8_jar", ], ) + +kt_jvm_library( + name = "script_background_coroutine_dispatcher", + srcs = ["ScriptBackgroundCoroutineDispatcher.kt"], + visibility = ["//scripts:oppia_script_library_visibility"], + deps = [ + "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + ], +) diff --git a/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt b/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt index b6071d86b76..7d5806a5869 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt @@ -10,7 +10,7 @@ import java.util.Locale */ class BazelClient( private val rootDirectory: File, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() + private val commandExecutor: CommandExecutor ) { /** Returns all Bazel test targets in the workspace. */ fun retrieveAllTestTargets(): List { diff --git a/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt b/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt index 44817344a8f..35c56d0988f 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt @@ -2,6 +2,9 @@ package org.oppia.android.scripts.common import java.io.File import java.util.concurrent.TimeUnit +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.async +import kotlinx.coroutines.runBlocking /** * The default amount of time that should be waited before considering a process as 'hung', in @@ -11,6 +14,7 @@ const val WAIT_PROCESS_TIMEOUT_MS = 60_000L /** Default implementation of [CommandExecutor]. */ class CommandExecutorImpl( + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, private val processTimeout: Long = WAIT_PROCESS_TIMEOUT_MS, private val processTimeoutUnit: TimeUnit = TimeUnit.MILLISECONDS ) : CommandExecutor { diff --git a/scripts/src/java/org/oppia/android/scripts/common/GitClient.kt b/scripts/src/java/org/oppia/android/scripts/common/GitClient.kt index 797d345bbf2..dfda3889b8f 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/GitClient.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/GitClient.kt @@ -9,10 +9,9 @@ import java.io.File */ class GitClient( private val workingDirectory: File, - private val baseDevelopBranchReference: String + private val baseDevelopBranchReference: String, + private val commandExecutor: CommandExecutor ) { - private val commandExecutor by lazy { CommandExecutorImpl() } - /** The commit hash of the HEAD of the local Git repository. */ val currentCommit: String by lazy { retrieveCurrentCommit() } diff --git a/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt b/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt new file mode 100644 index 00000000000..52bb21c0a0f --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcher.kt @@ -0,0 +1,86 @@ +package org.oppia.android.scripts.common + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Runnable +import kotlinx.coroutines.asCoroutineDispatcher +import java.io.Closeable +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit +import kotlin.coroutines.CoroutineContext + +/** + * A [CoroutineDispatcher] that's [Closeable] and particularly tailored to be easily used in scripts + * that need to perform parallel tasks for expensive IO. It's highly recommended to exclusively use + * this dispatcher over any others, and to ensure that [close] is called at the end of the script to + * avoid any potential threads hanging (causing the script to not actually close). + * + * Note that the dispatcher attempts to finish any ongoing tasks when [close] is called, but it will + * reject new tasks from being scheduled and it will force terminate if any pending tasks at the + * time of closing don't end within the configured [closeTimeout] provided. + * + * A simple example for using this dispatcher: + * ```kotlin + * ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + * val deferred = CoroutineScope(scriptBgDispatcher).async { + * // Expensive task... + * } + * // IMPORTANT: The operation must be observed before use{} ends, otherwise the dispatcher will + * // close and terminate any pending tasks. + * runBlocking { deferred.await() } + * } + * ``` + * + * A more complex example for I/O operations: + * ```kotlin + * ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + * val deferred = CoroutineScope(scriptBgDispatcher).async { + * withContext(Dispatchers.IO) { + * // Perform I/O using Kotlin's highly parallelized I/O dispatcher, but wait for the result + * // using the background script dispatcher (since execution could continue if other I/O + * // operations need to be kicked off, or if other work can be done alongside the I/O). + * } + * } + * // IMPORTANT: The operation must be observed before use{} ends, otherwise the dispatcher will + * // close and terminate any pending tasks. + * runBlocking { deferred.await() } + * } + * ``` + * + * @property closeTimeout the amount of time, in [closeTimeoutUnit] units, that should be waited + * when [close]ing this dispatcher before force-ending ongoing tasks + * @property closeTimeoutUnit the unit of time used for [closeTimeout] + */ +class ScriptBackgroundCoroutineDispatcher( + private val closeTimeout: Long = 5, + private val closeTimeoutUnit: TimeUnit = TimeUnit.SECONDS +) : CoroutineDispatcher(), Closeable { + private val threadPool by lazy { Executors.newCachedThreadPool() } + private val coroutineDispatcher by lazy { threadPool.asCoroutineDispatcher() } + + override fun dispatch(context: CoroutineContext, block: Runnable) { + coroutineDispatcher.dispatch(context, block) + } + + override fun close() { + threadPool.tryShutdownFully(timeout = closeTimeout, unit = closeTimeoutUnit) + coroutineDispatcher.close() + } + + private companion object { + private fun ExecutorService.tryShutdownFully(timeout: Long, unit: TimeUnit) { + // Try to fully shutdown the executor service per https://stackoverflow.com/a/33690603 and + // https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html. + shutdown() + try { + if (!awaitTermination(timeout, unit)) { + shutdownNow() + check(awaitTermination(timeout, unit)) { "ExecutorService didn't fully shutdown: $this." } + } + } catch (e: InterruptedException) { + shutdownNow() + Thread.currentThread().interrupt() + } + } + } +} diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt index 1632c3c9068..d8f178c7b21 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt @@ -3,6 +3,7 @@ package org.oppia.android.scripts.license import com.google.protobuf.TextFormat import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.MavenDependency /** @@ -24,7 +25,9 @@ import org.oppia.android.scripts.proto.MavenDependency * third_party/maven_install.json scripts/assets/maven_dependencies.pb */ fun main(args: Array) { - MavenDependenciesListCheck(LicenseFetcherImpl()).main(args) + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + MavenDependenciesListCheck(LicenseFetcherImpl(), scriptBgDispatcher).main(args) + } } /** @@ -33,7 +36,8 @@ fun main(args: Array) { */ class MavenDependenciesListCheck( private val licenseFetcher: LicenseFetcher, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() + scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, + private val commandExecutor: CommandExecutor = CommandExecutorImpl(scriptBgDispatcher) ) { /** diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt index 3b67d51a751..4eeec0be8df 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt @@ -24,7 +24,7 @@ private const val MAVEN_PREFIX = "@maven//:" class MavenDependenciesRetriever( private val rootPath: String, private val licenseFetcher: LicenseFetcher, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() + private val commandExecutor: CommandExecutor ) { private val bazelClient by lazy { diff --git a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt index 8829a55a475..36b28f3228c 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt +++ b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt @@ -2,6 +2,7 @@ package org.oppia.android.scripts.maven import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.license.LicenseFetcher import org.oppia.android.scripts.license.LicenseFetcherImpl import org.oppia.android.scripts.license.MavenDependenciesRetriever @@ -27,13 +28,16 @@ import org.oppia.android.scripts.proto.MavenDependencyList * scripts/assets/maven_dependencies.pb */ fun main(args: Array) { - GenerateMavenDependenciesList(LicenseFetcherImpl()).main(args) + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + GenerateMavenDependenciesList(LicenseFetcherImpl(), scriptBgDispatcher).main(args) + } } /** Wrapper class to pass dependencies to be utilized by the the main method. */ class GenerateMavenDependenciesList( private val licenseFetcher: LicenseFetcher, - private val commandExecutor: CommandExecutor = CommandExecutorImpl() + scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, + private val commandExecutor: CommandExecutor = CommandExecutorImpl(scriptBgDispatcher) ) { /** * Compiles a list of third-party maven dependencies along with their license links on @@ -48,45 +52,46 @@ class GenerateMavenDependenciesList( val pathToMavenDependenciesTextProto = "$pathToRoot/${args[2]}" val pathToMavenDependenciesPb = args[3] - val MavenDependenciesRetriever = MavenDependenciesRetriever(pathToRoot, licenseFetcher) + val mavenDependenciesRetriever = + MavenDependenciesRetriever(pathToRoot, licenseFetcher, commandExecutor) val bazelQueryDepsList = - MavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() - val mavenInstallDepsList = MavenDependenciesRetriever.getDependencyListFromMavenInstall( + mavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() + val mavenInstallDepsList = mavenDependenciesRetriever.getDependencyListFromMavenInstall( pathToMavenInstallJson, bazelQueryDepsList ) val dependenciesListFromPom = - MavenDependenciesRetriever + mavenDependenciesRetriever .retrieveDependencyListFromPom(mavenInstallDepsList) .mavenDependencyList val dependenciesListFromTextProto = - MavenDependenciesRetriever.retrieveMavenDependencyList(pathToMavenDependenciesPb) + mavenDependenciesRetriever.retrieveMavenDependencyList(pathToMavenDependenciesPb) - val updatedDependenciesList = MavenDependenciesRetriever.addChangesFromTextProto( + val updatedDependenciesList = mavenDependenciesRetriever.addChangesFromTextProto( dependenciesListFromPom, dependenciesListFromTextProto ) val manuallyUpdatedLicenses = - MavenDependenciesRetriever.retrieveManuallyUpdatedLicensesSet(updatedDependenciesList) + mavenDependenciesRetriever.retrieveManuallyUpdatedLicensesSet(updatedDependenciesList) - val finalDependenciesList = MavenDependenciesRetriever.updateMavenDependenciesList( + val finalDependenciesList = mavenDependenciesRetriever.updateMavenDependenciesList( updatedDependenciesList, manuallyUpdatedLicenses ) - MavenDependenciesRetriever.writeTextProto( + mavenDependenciesRetriever.writeTextProto( pathToMavenDependenciesTextProto, MavenDependencyList.newBuilder().addAllMavenDependency(finalDependenciesList).build() ) val licensesToBeFixed = - MavenDependenciesRetriever.getAllBrokenLicenses(finalDependenciesList) + mavenDependenciesRetriever.getAllBrokenLicenses(finalDependenciesList) if (licensesToBeFixed.isNotEmpty()) { - val licenseToDependencyMap = MavenDependenciesRetriever + val licenseToDependencyMap = mavenDependenciesRetriever .findFirstDependenciesWithBrokenLicenses( finalDependenciesList, licensesToBeFixed @@ -95,34 +100,34 @@ class GenerateMavenDependenciesList( """ Some licenses do not have their 'original_link' verified. To verify a license link, click on the original link of the license and check if the link points to any valid license or - not. If the link does not point to a valid license (e.g - https://fabric.io/terms), set + not. If the link does not point to a valid license (e.g. - https://fabric.io/terms), set the 'is_original_link_invalid' field of the license to 'true'. - - e.g - + + e.g. - license { license_name: "Terms of Service for Firebase Services" original_link: "https://fabric.io/terms" is_original_link_invalid: true } - - If the link does point to a valid license then choose the most appropriate category for + + If the link does point to a valid license then choose the most appropriate category for the link: - + 1. scrapable_link: If the license text is plain text and the URL mentioned can be scraped - directly from the original_link of the license. e.g - + directly from the original_link of the license. e.g. - https://www.apache.org/licenses/LICENSE-2.0.txt - - 2. extracted_copy_link: If the license text is plain text but it can not be scraped - directly from the original_link of the license. e.g - + + 2. extracted_copy_link: If the license text is plain text but it can not be scraped + directly from the original_link of the license. e.g. - https://www.opensource.org/licenses/bsd-license - + 3. direct_link_only: If the license text is not plain text, it's best to display only the - link of the license. e.g - https://developer.android.com/studio/terms.html - + link of the license. e.g. - https://developer.android.com/studio/terms.html + After identifying the category of the license, modify the license to include one of the - above mentioned 'url'. - - e.g - + above mentioned 'url'. + + e.g. - license { license_name: "The Apache Software License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -130,9 +135,9 @@ class GenerateMavenDependenciesList( url: "https://www.apache.org/licenses/LICENSE-2.0.txt" } } - - Please verify the license link(s) for the following license(s) manually in - maven_dependencies.textproto. Note that only first dependency that contains the license + + Please verify the license link(s) for the following license(s) manually in + maven_dependencies.textproto. Note that only first dependency that contains the license needs to be updated and also re-run the script to update the license details at all places. """.trimIndent() ) @@ -150,21 +155,21 @@ class GenerateMavenDependenciesList( } val dependenciesWithoutAnyLinks = - MavenDependenciesRetriever.getDependenciesThatNeedIntervention(finalDependenciesList) + mavenDependenciesRetriever.getDependenciesThatNeedIntervention(finalDependenciesList) if (dependenciesWithoutAnyLinks.isNotEmpty()) { println( """ - Please remove all the invalid links (if any) from maven_dependencies.textproto for the + Please remove all the invalid links (if any) from maven_dependencies.textproto for the below mentioned dependencies and provide the valid license links manually. - e.g - - + e.g. - + maven_dependency { artifact_name: "com.google.guava:failureaccess:1.0.1" artifact_version: "1.0.1" } - + ***** changes to ***** - + maven_dependency { artifact_name: "com.google.guava:failureaccess:1.0.1" artifact_version: "1.0.1" @@ -175,7 +180,7 @@ class GenerateMavenDependenciesList( } } } - + Dependencies with invalid or no license links: """.trimIndent() + "\n" ) diff --git a/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt b/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt index 5d197b04615..d614ef5a1db 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/build/TransformAndroidManifestTest.kt @@ -1,11 +1,13 @@ package org.oppia.android.scripts.build import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.testing.TestGitRepository import org.oppia.android.testing.assertThrows import java.io.File @@ -54,16 +56,20 @@ class TransformAndroidManifestTest { private val VERSION_CODE = "23" private val APPLICATION_RELATIVE_QUALIFIED_CLASS = ".example.CustomApplication" - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() - private val commandExecutor by lazy { CommandExecutorImpl() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val commandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } private lateinit var testGitRepository: TestGitRepository @Before fun setUp() { - testGitRepository = TestGitRepository(tempFolder, CommandExecutorImpl()) + testGitRepository = TestGitRepository(tempFolder, commandExecutor) + } + + @After + fun tearDown() { + scriptBgDispatcher.close() } @Test diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt index 5bbdc432d62..ae177def7d6 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt @@ -6,6 +6,7 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.ProtoStringEncoder.Companion.mergeFromCompressedBase64 import org.oppia.android.scripts.proto.AffectedTestsBucket @@ -16,6 +17,7 @@ import java.io.ByteArrayOutputStream import java.io.File import java.io.OutputStream import java.io.PrintStream +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher /** * Tests for the compute_affected_tests utility. @@ -28,20 +30,21 @@ import java.io.PrintStream // Function name: test names are conventionally named with underscores. @Suppress("SameParameterValue", "FunctionName") class ComputeAffectedTestsTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + + private lateinit var commandExecutor: CommandExecutor private lateinit var testBazelWorkspace: TestBazelWorkspace private lateinit var testGitRepository: TestGitRepository - private lateinit var pendingOutputStream: ByteArrayOutputStream private lateinit var originalStandardOutputStream: OutputStream @Before fun setUp() { + commandExecutor = CommandExecutorImpl(scriptBgDispatcher) testBazelWorkspace = TestBazelWorkspace(tempFolder) - testGitRepository = TestGitRepository(tempFolder, CommandExecutorImpl()) + testGitRepository = TestGitRepository(tempFolder, commandExecutor) // Redirect script output for testing purposes. pendingOutputStream = ByteArrayOutputStream() @@ -58,6 +61,8 @@ class ComputeAffectedTestsTest { // and to help manually verify the expect git state at the end of each test. println("git status (at end of test):") println(testGitRepository.status(checkForGitRepository = false)) + + scriptBgDispatcher.close() } @Test @@ -722,6 +727,7 @@ class ComputeAffectedTestsTest { // Note that main() can't be used since the shard counts need to be overwritten. Dagger would // be a nicer means to do this, but it's not set up currently for scripts. ComputeAffectedTests( + scriptBgDispatcher, maxTestCountPerLargeShard = maxTestCountPerLargeShard, maxTestCountPerMediumShard = maxTestCountPerMediumShard, maxTestCountPerSmallShard = maxTestCountPerSmallShard diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel index bceb5cfe864..bb2009d98bd 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel @@ -61,3 +61,14 @@ kt_jvm_test( "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) + +kt_jvm_test( + name = "ScriptBackgroundCoroutineDispatcherTest", + srcs = ["ScriptBackgroundCoroutineDispatcherTest.kt"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/common:script_background_coroutine_dispatcher", + "//testing:assertion_helpers", + "//third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//third_party:org_mockito_mockito-core", + ], +) diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt index 07aa4d4134c..57b2f26964a 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt @@ -1,6 +1,7 @@ package org.oppia.android.scripts.common import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -25,19 +26,20 @@ import java.util.concurrent.TimeUnit // Function name: test names are conventionally named with underscores. @Suppress("SameParameterValue", "FunctionName") class BazelClientTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + @field:[Rule JvmField] val mockitoRule: MockitoRule = MockitoJUnit.rule() - @Rule - @JvmField - val mockitoRule: MockitoRule = MockitoJUnit.rule() - - private val commandExecutor by lazy { initiazeCommandExecutorWithLongProcessWaitTime() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val commandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } + private val longCommandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } private lateinit var testBazelWorkspace: TestBazelWorkspace - @Mock - lateinit var mockCommandExecutor: CommandExecutor + @Mock lateinit var mockCommandExecutor: CommandExecutor + + @After + fun tearDown() { + scriptBgDispatcher.close() + } @Before fun setUp() { @@ -46,7 +48,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_emptyFolder_fails() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) val exception = assertThrows() { bazelClient.retrieveAllTestTargets() @@ -59,7 +61,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_emptyWorkspace_fails() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() val exception = assertThrows() { @@ -73,7 +75,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_workspaceWithTest_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("ExampleTest") @@ -84,7 +86,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_workspaceWithMultipleTests_returnsTestTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest") @@ -106,7 +108,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forFileNotInBuildGraph_returnsEmptyList() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() tempFolder.newFile("filenotingraph") @@ -117,7 +119,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forTestFile_returnsBazelTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") @@ -128,7 +130,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forMultipleMixedFiles_returnsBazelTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", withGeneratedDependency = true) @@ -157,7 +159,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forTargetWithNoTestDependency_returnsNoTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary("SomeDependency") testBazelWorkspace.createTest("FirstTest") @@ -170,7 +172,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forTestFileTarget_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") @@ -181,7 +183,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forDependentFileTarget_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest", withGeneratedDependency = true) @@ -192,7 +194,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forMixedFileTargets_returnsRelatedTestTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary("ExtraDep") testBazelWorkspace.createTest("FirstTest", withExtraDependency = "//:ExtraDep_lib") @@ -227,7 +229,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forNoFiles_returnsEmptyList() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() val testTargets = bazelClient.retrieveTransitiveTestTargets(listOf()) @@ -238,7 +240,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forBuildFile_returnsAllTestsInThatBuildFile() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest") @@ -253,7 +255,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forMultipleBuildFiles_returnsAllRelatedTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", subpackage = "two") @@ -269,7 +271,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forBzlFile_returnsRelatedTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() // Generate tests. testBazelWorkspace.createTest("FirstTest") @@ -298,7 +300,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forWorkspace_returnsAllTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", subpackage = "two") @@ -341,7 +343,7 @@ class BazelClientTest { artifactName = "com.android.support:support-annotations:28.0.0", buildFile = thirdPartyBuild ) - val bazelClient = BazelClient(tempFolder.root, commandExecutor) + val bazelClient = BazelClient(tempFolder.root, longCommandExecutor) val thirdPartyDependenciesList = bazelClient.retrieveThirdPartyMavenDepsListForBinary("//:test_oppia") @@ -350,7 +352,7 @@ class BazelClientTest { } @Test - fun testRetrieveMavenDepsList_binaryDependsOnArtifactNotViaThirdParty_doesNotreturnArtifact() { + fun testRetrieveMavenDepsList_binaryDependsOnArtifactNotViaThirdParty_doesNotReturnArtifact() { testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( listOf("com.android.support:support-annotations:28.0.0") @@ -371,7 +373,7 @@ class BazelClientTest { artifactName = "com.android.support:support-annotations:28.0.0", buildFile = testBazelWorkspace.rootBuildFile ) - val bazelClient = BazelClient(tempFolder.root, commandExecutor) + val bazelClient = BazelClient(tempFolder.root, longCommandExecutor) val thirdPartyDependenciesList = bazelClient.retrieveThirdPartyMavenDepsListForBinary("//:test_oppia") @@ -463,8 +465,10 @@ class BazelClientTest { return secondNewFile } - private fun initiazeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { - return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + private fun initializeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { + return CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) } private fun updateBuildFileToUseCustomJvmTestRule(bazelFile: File, buildFile: File) { diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt index 78dc945dff6..140c27bfe1d 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/CommandExecutorImplTest.kt @@ -1,6 +1,7 @@ package org.oppia.android.scripts.common import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder @@ -19,13 +20,18 @@ import java.util.concurrent.TimeUnit // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class CommandExecutorImplTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + + @After + fun tearDown() { + scriptBgDispatcher.close() + } @Test fun testExecute_echo_oneArgument_succeedsWithOutput() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "echo", "value") @@ -35,7 +41,7 @@ class CommandExecutorImplTest { @Test fun testExecute_echo_invalidDirectory_throwsException() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val exception = assertThrows() { commandExecutor.executeCommand(File("invaliddirectory"), "echo", "value") @@ -47,7 +53,7 @@ class CommandExecutorImplTest { @Test fun testExecute_echo_largeOutput_insufficientTimeout_throwsException() { val commandExecutor = CommandExecutorImpl( - processTimeout = 0L, processTimeoutUnit = TimeUnit.MILLISECONDS + scriptBgDispatcher, processTimeout = 0L, processTimeoutUnit = TimeUnit.MILLISECONDS ) // Produce a large output so that echo takes a bit longer to reduce the likelihood of this test @@ -63,7 +69,7 @@ class CommandExecutorImplTest { @Test fun testExecute_nonexistentCommand_throwsException() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val exception = assertThrows() { commandExecutor.executeCommand(tempFolder.root, "commanddoesnotexist") @@ -74,7 +80,7 @@ class CommandExecutorImplTest { @Test fun testExecute_echo_multipleArguments_succeedsWithOutput() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "echo", "first", "second", "third") @@ -84,7 +90,7 @@ class CommandExecutorImplTest { @Test fun testExecute_echo_multipleArguments_resultHasCorrectCommand() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "echo", "first", "second", "third") @@ -93,7 +99,7 @@ class CommandExecutorImplTest { @Test fun testExecute_defaultErrorOutput_rmdir_failed_failsWithCombinedOutput() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "rmdir", "filethatdoesnotexist") @@ -105,7 +111,7 @@ class CommandExecutorImplTest { @Test fun testExecute_splitErrorOutput_rmdir_failed_failsWithErrorOutput() { - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand( @@ -121,7 +127,7 @@ class CommandExecutorImplTest { @Test fun testExecute_removeDirectoryInLocalDirectory_succeeds() { val newFolder = tempFolder.newFolder("newfolder") - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(tempFolder.root, "rmdir", "./newfolder") @@ -135,7 +141,7 @@ class CommandExecutorImplTest { fun testExecute_removeUnknownDirectoryInOtherDirectory_fails() { val newFolder = tempFolder.newFolder("newfolder") val alternateRoot = tempFolder.newFolder("alternateroot") - val commandExecutor = CommandExecutorImpl() + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) val result = commandExecutor.executeCommand(alternateRoot, "rmdir", "./newfolder") diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt index 5cbda509373..51efeeadd0a 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt @@ -20,12 +20,11 @@ import java.lang.IllegalStateException // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class GitClientTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() private lateinit var testGitRepository: TestGitRepository - private val commandExecutor by lazy { CommandExecutorImpl() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val commandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } @Before fun setUp() { @@ -38,11 +37,12 @@ class GitClientTest { // and to help manually verify the expect git state at the end of each test. println("git status (at end of test):") println(testGitRepository.status(checkForGitRepository = false)) + scriptBgDispatcher.close() } @Test fun testCurrentCommit_forNonRepository_throwsException() { - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val exception = assertThrows() { gitClient.currentCommit } @@ -55,7 +55,7 @@ class GitClientTest { initializeRepoWithDevelopBranch() val developHash = getMostRecentCommitOnCurrentBranch() - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val currentCommit = gitClient.currentCommit assertThat(currentCommit).isEqualTo(developHash) @@ -69,7 +69,7 @@ class GitClientTest { testGitRepository.commit(message = "Test empty commit", allowEmpty = true) val featureBranchHash = getMostRecentCommitOnCurrentBranch() - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val currentCommit = gitClient.currentCommit assertThat(currentCommit).isNotEqualTo(developHash) @@ -78,7 +78,7 @@ class GitClientTest { @Test fun testCurrentBranch_forNonRepository_throwsException() { - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val exception = assertThrows() { gitClient.currentBranch } @@ -90,7 +90,7 @@ class GitClientTest { fun testCurrentBranch_forValidRepository_returnsCorrectBranch() { initializeRepoWithDevelopBranch() - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val currentBranch = gitClient.currentBranch assertThat(currentBranch).isEqualTo("develop") @@ -101,7 +101,7 @@ class GitClientTest { initializeRepoWithDevelopBranch() testGitRepository.checkoutNewBranch("introduce-feature") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val currentBranch = gitClient.currentBranch assertThat(currentBranch).isEqualTo("introduce-feature") @@ -112,7 +112,7 @@ class GitClientTest { initializeRepoWithDevelopBranch() val developHash = getMostRecentCommitOnCurrentBranch() - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val mergeBase = gitClient.branchMergeBase assertThat(mergeBase).isEqualTo(developHash) @@ -124,7 +124,7 @@ class GitClientTest { val developHash = getMostRecentCommitOnCurrentBranch() testGitRepository.checkoutNewBranch("introduce-feature") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val mergeBase = gitClient.branchMergeBase assertThat(mergeBase).isEqualTo(developHash) @@ -137,7 +137,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") commitNewFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val mergeBase = gitClient.branchMergeBase // The merge base is the latest common hash between this & the develop branch. @@ -149,7 +149,7 @@ class GitClientTest { initializeRepoWithDevelopBranch() testGitRepository.checkoutNewBranch("introduce-feature") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).isEmpty() @@ -161,7 +161,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") createNewFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("example_file") @@ -173,7 +173,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") stageNewFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("example_file") @@ -185,7 +185,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") commitNewFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("example_file") @@ -197,7 +197,7 @@ class GitClientTest { commitNewFile("develop_file") testGitRepository.checkoutNewBranch("introduce-feature") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles // Committed files to the develop branch are not included since they aren't part of the feature @@ -212,7 +212,7 @@ class GitClientTest { commitNewFile("example_file") modifyFile("example_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("example_file") @@ -225,7 +225,7 @@ class GitClientTest { testGitRepository.checkoutNewBranch("introduce-feature") deleteFile("develop_file") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly("develop_file") @@ -244,7 +244,7 @@ class GitClientTest { modifyFile("develop_branch_file_changed_not_staged") deleteFile("develop_branch_file_removed") - val gitClient = GitClient(tempFolder.root, "develop") + val gitClient = GitClient(tempFolder.root, "develop", commandExecutor) val changedFiles = gitClient.changedFiles assertThat(changedFiles).containsExactly( diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt new file mode 100644 index 00000000000..68329ac15fa --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt @@ -0,0 +1,79 @@ +package org.oppia.android.scripts.common + +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.async +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import org.junit.Rule +import org.junit.Test +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule +import org.oppia.android.testing.assertThrows +import java.util.concurrent.TimeUnit + +/** Tests for [ScriptBackgroundCoroutineDispatcher]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +class ScriptBackgroundCoroutineDispatcherTest { + @field:[Rule JvmField] val mockitoRule: MockitoRule = MockitoJUnit.rule() + + @Mock lateinit var mockRunnable: Runnable + + @Test + fun testDispatchTask_taskIsRun() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + + runBlocking { withContext(dispatcher) { mockRunnable.run() } } + + verify(mockRunnable).run() + } + + @Test + fun testClose_noExceptionThrown() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + + dispatcher.close() + + // The verification is that no exception is thrown (otherwise the test should fail). + } + + @Test + fun testDispatch_afterClosing_throwsException() { + val dispatcher = ScriptBackgroundCoroutineDispatcher() + dispatcher.close() + + // The task should fail to schedule since the dispatcher has been closed. + assertThrows() { + runBlocking { withContext(dispatcher) { mockRunnable.run() } } + } + } + + @Test + fun testClose_pendingTaskLongerThanCloseTimeout_taskIsNotRun() { + val dispatcher = + ScriptBackgroundCoroutineDispatcher( + closeTimeout = 50L, closeTimeoutUnit = TimeUnit.MILLISECONDS + ) + val taskStartedChannel = Channel() + // Schedule a task but make sure that the attempt to close the dispatcher happens exactly + // between the task starting and ending (to verify close timeout flows). + @Suppress("DeferredResultUnused") + CoroutineScope(dispatcher).async { + taskStartedChannel.send(true) + delay(1_000L) + mockRunnable.run() + } + runBlocking { taskStartedChannel.receive() } + + dispatcher.close() + + // The task should not have run since it was cancelled, but no exception will be thrown. + verifyNoMoreInteractions(mockRunnable) + } +} diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt index 5fdc807e3db..6ecefd7ddce 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt @@ -10,6 +10,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink import org.oppia.android.scripts.proto.License @@ -79,16 +80,16 @@ class MavenDependenciesListCheckTest { private val UNAVAILABLE_OR_INVALID_LICENSE_LINKS_FAILURE = "License links are invalid or not available for some dependencies" + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } private val mockLicenseFetcher by lazy { initializeLicenseFetcher() } private val commandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } - private lateinit var testBazelWorkspace: TestBazelWorkspace - @Rule - @JvmField - var tempFolder = TemporaryFolder() + private lateinit var testBazelWorkspace: TestBazelWorkspace @Before fun setUp() { @@ -101,6 +102,7 @@ class MavenDependenciesListCheckTest { @After fun restoreStreams() { System.setOut(originalOut) + scriptBgDispatcher.close() } @Test @@ -113,6 +115,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -135,14 +138,14 @@ class MavenDependenciesListCheckTest { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" } - + artifact_name: "com.google.firebase:firebase-analytics:17.5.0" artifact_version: "17.5.0" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -189,6 +192,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -211,7 +215,7 @@ class MavenDependenciesListCheckTest { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -253,6 +257,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -275,14 +280,14 @@ class MavenDependenciesListCheckTest { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" } - + artifact_name: "$FIREBASE_ANALYTICS_DEP" artifact_version: "$FIREBASE_ANALYTICS_VERSION" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -329,6 +334,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -408,6 +414,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -430,7 +437,7 @@ class MavenDependenciesListCheckTest { license_name: "The Apache License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" } - + artifact_name: "$FIREBASE_ANALYTICS_DEP" artifact_version: "$FIREBASE_ANALYTICS_VERSION" license { @@ -484,6 +491,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -508,14 +516,14 @@ class MavenDependenciesListCheckTest { } Missing dependencies that need to be added: - + artifact_name: "$FIREBASE_ANALYTICS_DEP" artifact_version: "$FIREBASE_ANALYTICS_VERSION" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -562,6 +570,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -586,14 +595,14 @@ class MavenDependenciesListCheckTest { } Missing dependencies that need to be added: - + artifact_name: "$FIREBASE_ANALYTICS_UPGRADED_DEP" artifact_version: "$FIREBASE_ANALYTICS_UPGRADED_VERSION" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -640,6 +649,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -651,7 +661,7 @@ class MavenDependenciesListCheckTest { } assertThat(exception).hasMessageThat().contains(MISSING_AND_REDUNDANT_DEPENDENCIES_FAILURE) assertThat(outContent.toString()).isEqualTo( - """ + """ Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Redundant dependencies that need to be removed: @@ -664,14 +674,14 @@ class MavenDependenciesListCheckTest { } Missing dependencies that need to be added: - + artifact_name: "$FIREBASE_ANALYTICS_DEP" artifact_version: "$FIREBASE_ANALYTICS_VERSION" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" } - + Refer to https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies for more details. """.trimIndent() + "\n" ) @@ -720,6 +730,7 @@ class MavenDependenciesListCheckTest { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -773,6 +784,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -822,6 +834,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -877,6 +890,7 @@ class MavenDependenciesListCheckTest { val exception = assertThrows() { MavenDependenciesListCheck( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -1018,13 +1032,15 @@ class MavenDependenciesListCheckTest { } ] } - } + } """.trimIndent() ) } private fun initializeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { - return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + return CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) } /** Returns a mock for the [LicenseFetcher]. */ diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt index 5dd8baec8b3..311bfe5f446 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt @@ -11,6 +11,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.maven.model.MavenListDependency import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink @@ -81,12 +82,11 @@ class MavenDependenciesRetrieverTest { private val mavenDependenciesRetriever by lazy { initializeMavenDependenciesRetriever() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } private lateinit var testBazelWorkspace: TestBazelWorkspace - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { @@ -99,6 +99,7 @@ class MavenDependenciesRetrieverTest { @After fun restoreStreams() { System.setOut(originalOut) + scriptBgDispatcher.close() } @Test @@ -1220,13 +1221,15 @@ class MavenDependenciesRetrieverTest { } ] } - } + } """.trimIndent() ) } private fun initializeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { - return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + return CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) } /** Returns a mock for the [LicenseFetcher]. */ diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt index 4507d76a5dc..96e3a92ad64 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt @@ -11,6 +11,7 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.license.LicenseFetcher import org.oppia.android.scripts.proto.DirectLinkOnly import org.oppia.android.scripts.proto.ExtractedCopyLink @@ -64,17 +65,16 @@ class GenerateMavenDependenciesListTest { private val SCRIPT_PASSED_MESSAGE = "Script executed succesfully: maven_dependencies.textproto updated successfully." + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() private val originalOut: PrintStream = System.out + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } private val mockLicenseFetcher by lazy { initializeLicenseFetcher() } private val commandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } private lateinit var testBazelWorkspace: TestBazelWorkspace - @Rule - @JvmField - var tempFolder = TemporaryFolder() - @Before fun setUp() { tempFolder.newFolder("scripts", "assets") @@ -86,6 +86,7 @@ class GenerateMavenDependenciesListTest { @After fun restoreStreams() { System.setOut(originalOut) + scriptBgDispatcher.close() } @Test @@ -99,6 +100,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -183,6 +185,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -207,6 +210,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -249,6 +253,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -316,6 +321,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -358,6 +364,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -426,6 +433,7 @@ class GenerateMavenDependenciesListTest { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -519,6 +527,7 @@ class GenerateMavenDependenciesListTest { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -617,6 +626,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -680,6 +690,7 @@ class GenerateMavenDependenciesListTest { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -793,6 +804,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -918,6 +930,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -1031,6 +1044,7 @@ class GenerateMavenDependenciesListTest { val exception = assertThrows() { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -1150,6 +1164,7 @@ class GenerateMavenDependenciesListTest { GenerateMavenDependenciesList( mockLicenseFetcher, + scriptBgDispatcher, commandExecutor ).main( arrayOf( @@ -1394,13 +1409,15 @@ class GenerateMavenDependenciesListTest { } ] } - } + } """.trimIndent() ) } private fun initializeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { - return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + return CommandExecutorImpl( + scriptBgDispatcher, processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES + ) } /** Returns a mock for the [LicenseFetcher]. */ diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt index 453f17da044..0782a6c5512 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestGitRepositoryTest.kt @@ -1,12 +1,14 @@ package org.oppia.android.scripts.testing import com.google.common.truth.Truth.assertThat +import org.junit.After import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.CommandResult +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.testing.assertThrows import java.io.File import java.util.UUID @@ -31,11 +33,15 @@ import java.util.UUID // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class TestGitRepositoryTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() - private val commandExecutorInterceptor by lazy { CommandExecutorInterceptor() } + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val commandExecutorInterceptor by lazy { CommandExecutorInterceptor(scriptBgDispatcher) } + + @After + fun tearDown() { + scriptBgDispatcher.close() + } @Test fun testCreateTestUtility_doesNotImmediatelyCreateAnyFiles() { @@ -52,7 +58,7 @@ class TestGitRepositoryTest { testGitRepository.init() - assertThat(tempFolder.root.list().toList()).containsExactly(".git") + assertThat(tempFolder.root.list()?.toList()).containsExactly(".git") } @Test @@ -494,9 +500,11 @@ class TestGitRepositoryTest { return file } - private class CommandExecutorInterceptor : CommandExecutor { + private class CommandExecutorInterceptor( + scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher + ) : CommandExecutor { private val commandResults = mutableListOf() - private val realCommandExecutor by lazy { CommandExecutorImpl() } + private val realCommandExecutor by lazy { CommandExecutorImpl(scriptBgDispatcher) } override fun executeCommand( workingDir: File, diff --git a/wiki/Updating-Maven-Dependencies.md b/wiki/Updating-Maven-Dependencies.md index 6e0653f844b..353de7a5d7c 100644 --- a/wiki/Updating-Maven-Dependencies.md +++ b/wiki/Updating-Maven-Dependencies.md @@ -18,7 +18,7 @@ cd ~/opensource/oppia-android The above command ensures that the terminal points to the root directory `oppia-android` repository. Note that if you have configured a different path to the `oppia-android` repository then you should modify the above command accordingly ( `cd ~/` ). #### Running `GenerateMavenDependenciesList.kt` script -After the terminal points to the Oppia-android repository, run the bazel run command to execute the Kotlin script. +After the terminal points to the Oppia-android repository, run the bazel run command to execute the Kotlin script. ``` bazel run //scripts:generate_maven_dependencies_list -- $(pwd) third_party/maven_install.json scripts/assets/maven_dependencies.textproto scripts/assets/maven_dependencies.pb ``` @@ -26,19 +26,19 @@ bazel run //scripts:generate_maven_dependencies_list -- $(pwd) third_party/maven ## Handling Exception: `Too few arguments passed` If after running the script the exception message says: **Too few arguments passed**, then please ensure that you copied the command correctly from [here](https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies#running-generatemavendependencieslistkt-script). The script accepts 4 parameters to be passed to run successfully: -1. **_path_to_directory_root_**: directory path to the root of the Oppia Android repository, e.g - `home//opensource/oppia-android` -2. **_path_to_maven_install_json_**: relative path to the maven_install.json file, e.g - `third_party/maven_install.json` -3. **_path_to_maven_dependencies_textproto_**: relative path to the maven_dependencies.textproto, e.g - `scripts/assets/maven_dependencies.textproto` -4. **_path_to_maven_dependencies_pb_**: relative path to the maven_dependencies.pb file, e.g - `scripts/assets/maven_dependencies.pb` +1. **_path_to_directory_root_**: directory path to the root of the Oppia Android repository, e.g. - `home//opensource/oppia-android` +2. **_path_to_maven_install_json_**: relative path to the maven_install.json file, e.g. - `third_party/maven_install.json` +3. **_path_to_maven_dependencies_textproto_**: relative path to the maven_dependencies.textproto, e.g. - `scripts/assets/maven_dependencies.textproto` +4. **_path_to_maven_dependencies_pb_**: relative path to the maven_dependencies.pb file, e.g. - `scripts/assets/maven_dependencies.pb` ## Handling Exception: `Licenses details are not completed` The script can take about a minute to execute, and if the script fails with the exception: `Licenses details are not completed`, you will need to do some manual work in `maven_dependencies.textproto`. -The script would call out specific dependencies that need to be updated manually, e.g - +The script would call out specific dependencies that need to be updated manually, e.g. - ``` -Please verify the license link(s) for the following license(s) manually in -maven_dependencies.textproto, note that only the first dependency that contains the license +Please verify the license link(s) for the following license(s) manually in +maven_dependencies.textproto, note that only the first dependency that contains the license needs to be updated and also re-run the script to update the license details at all places: license_name: Android Software Development Kit License @@ -67,14 +67,14 @@ maven_dependency { ### Categorizing the license link If the link does point to a valid license then choose the most appropriate category for the link: -1. scrapable_link: If the license text is plain text and the URL mentioned can be scraped directly from the original_link of the license. - e.g - https://www.apache.org/licenses/LICENSE-2.0.txt +1. scrapable_link: If the license text is plain text and the URL mentioned can be scraped directly from the original_link of the license. + e.g. - https://www.apache.org/licenses/LICENSE-2.0.txt 2. extracted_copy_link: If the license text is plain text but can not be scraped directly from the original_link of the license. - e.g - https://opensource.org/license/bsd-3-clause + e.g. - https://opensource.org/license/bsd-3-clause 3. direct_link_only: If the license text is not plain text, it's best to display only the link of the license. - e.g - https://developer.android.com/studio/terms.html + e.g. - https://developer.android.com/studio/terms.html -After identifying the category of the license, modify the license to include one of the above-mentioned 'url'. e.g - +After identifying the category of the license, modify the license to include one of the above-mentioned 'url'. e.g. - ``` license { license_name: "The Apache Software License, Version 2.0" @@ -86,7 +86,7 @@ license { ``` Also, if the license falls in the `extracted_copy_link` category, then go to [Oppia-android-licenses](https://github.com/oppia/oppia-android-licenses) and find if there exists a copy of the license already in the repository. If there exists a copy of the license, perform the following steps to get the link for the license that can be scraped easily. -1. Click on the appropriate license file. +1. Click on the appropriate license file. 2. Now click on the raw button positioned in the left of the edit and delete button. 3. Copy the URL from the browser and mention it at the appropriate place. @@ -95,7 +95,7 @@ If the license does not exist in the Oppia-android-licenses repository, then coo -After modifying `maven_dependencies.textproto` for all the called out licenses in the console output, re-run the script and see if any other error occurs. +After modifying `maven_dependencies.textproto` for all the called out licenses in the console output, re-run the script and see if any other error occurs. ## Handling Exception: `License links are invalid or not available for some dependencies` @@ -122,7 +122,7 @@ maven_dependency { To fix the error, consider the above example. For the first maven_dependency: "io.fabric.sdk.android:fabric:1.4.7", the original_link is invalid, and hence we need to find a valid link for this dependency. Please coordinate with the Oppia Android team and find a valid link for this dependency. Once you have a valid link for this license then categorize it as mentioned [here](https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies#categorizing-the-license-link). -For the second maven_dependency: "com.google.guava:failureaccess:1.0.1", you need to find a license by coordinating with the Oppia Android team and then specify it under the artifact_version field of the dependency. e.g - +For the second maven_dependency: "com.google.guava:failureaccess:1.0.1", you need to find a license by coordinating with the Oppia Android team and then specify it under the artifact_version field of the dependency. e.g. - ``` maven_dependency { From 79878cd134857d2581b7c42f20fafd6060c0d316 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Fri, 19 Jan 2024 21:27:12 +0000 Subject: [PATCH 25/63] Some more robustness fixes. The main change here is ensuring that Bazel 4.0.0 is used & bzlmod disabled in newer versions of Bazel when running operations in a test Bazel environment. This commit also introduces some more timing tweaks on CommandExecutor for some tests, though these only affect very specific tests (as many script tests directly call a script's main() function and thus don't overwrite its executor behavior). This commit attempted to introduce "--batch" mode to runs, but the isolation didn't actually seem to improve stability and, instead, substantially slowed down some of the tests. --- .../scripts/ci/ComputeAffectedTests.kt | 11 +++-- .../scripts/testing/TestBazelWorkspace.kt | 29 +++++++++--- .../org/oppia/android/scripts/ci/BUILD.bazel | 2 +- .../scripts/ci/ComputeAffectedTestsTest.kt | 15 ++++--- .../android/scripts/common/BazelClientTest.kt | 44 ++++++++----------- .../oppia/android/scripts/license/BUILD.bazel | 1 + .../oppia/android/scripts/maven/BUILD.bazel | 1 + 7 files changed, 63 insertions(+), 40 deletions(-) diff --git a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt index f7cc482c72a..5437874f191 100644 --- a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt +++ b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt @@ -1,6 +1,8 @@ package org.oppia.android.scripts.ci import org.oppia.android.scripts.common.BazelClient +import org.oppia.android.scripts.common.CommandExecutor +import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.GitClient import org.oppia.android.scripts.common.ProtoStringEncoder.Companion.toCompressedBase64 import org.oppia.android.scripts.proto.AffectedTestsBucket @@ -73,9 +75,10 @@ private fun String.toBooleanStrictOrNull(): Boolean? { /** Utility used to compute affected test targets. */ class ComputeAffectedTests( - val maxTestCountPerLargeShard: Int = MAX_TEST_COUNT_PER_LARGE_SHARD, - val maxTestCountPerMediumShard: Int = MAX_TEST_COUNT_PER_MEDIUM_SHARD, - val maxTestCountPerSmallShard: Int = MAX_TEST_COUNT_PER_SMALL_SHARD + private val maxTestCountPerLargeShard: Int = MAX_TEST_COUNT_PER_LARGE_SHARD, + private val maxTestCountPerMediumShard: Int = MAX_TEST_COUNT_PER_MEDIUM_SHARD, + private val maxTestCountPerSmallShard: Int = MAX_TEST_COUNT_PER_SMALL_SHARD, + private val commandExecutor: CommandExecutor = CommandExecutorImpl() ) { private companion object { private const val GENERIC_TEST_BUCKET_NAME = "generic" @@ -106,7 +109,7 @@ class ComputeAffectedTests( println("Running from directory root: $rootDirectory") val gitClient = GitClient(rootDirectory, baseDevelopBranchReference) - val bazelClient = BazelClient(rootDirectory) + val bazelClient = BazelClient(rootDirectory, commandExecutor) println("Current branch: ${gitClient.currentBranch}") println("Most recent common commit: ${gitClient.branchMergeBase}") diff --git a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt index 68487b6062b..f1230c0f63d 100644 --- a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt +++ b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt @@ -4,6 +4,9 @@ import com.google.common.truth.Truth.assertThat import org.junit.rules.TemporaryFolder import java.io.File +/** The version of Bazel to use in tests that set up Bazel workspaces. */ +const val BAZEL_VERSION = "4.0.0" + /** * Test utility for generating various test & library targets in the specified [TemporaryFolder]. * This is meant to be used to arrange the local test filesystem for use with a real Bazel @@ -23,6 +26,13 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { */ val rootBuildFile: File by lazy { temporaryRootFolder.newFile("BUILD.bazel") } + private val bazelVersionFile by lazy { + temporaryRootFolder.newFile(".bazelversion").also { it.writeText(BAZEL_VERSION) } + } + private val bazelRcFile by lazy { + temporaryRootFolder.newFile(".bazelrc").also { it.writeText("--noenable_bzlmod") } + } + private val testFileMap = mutableMapOf() private val libraryFileMap = mutableMapOf() private val testDependencyNameMap = mutableMapOf() @@ -33,9 +43,11 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { /** Initializes the local Bazel workspace by introducing a new, empty WORKSPACE file. */ fun initEmptyWorkspace() { - // Sanity check, but in reality this is just initializing workspaceFile to ensure that it + // Sanity checks, but in reality this is just initializing workspaceFile to ensure that it // exists. assertThat(workspaceFile.exists()).isTrue() + assertThat(bazelVersionFile.exists()).isTrue() + assertThat(bazelRcFile.exists()).isTrue() } /** @@ -61,6 +73,8 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { withExtraDependency: String? = null, subpackage: String? = null ): Iterable { + initEmptyWorkspace() // Ensure the workspace is at least initialized. + check(testName !in testFileMap) { "Test '$testName' already set up" } val prereqFiles = ensureWorkspaceIsConfiguredForKotlin() val (dependencyTargetName, libPrereqFiles) = if (withGeneratedDependency) { @@ -109,6 +123,8 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { withExtraDependency: String? = null, subpackage: String? = null ): Iterable { + initEmptyWorkspace() // Ensure the workspace is at least initialized. + check(testName !in testFileMap) { "Test '$testName' already exists" } val testFile = if (subpackage != null) { if (!File(temporaryRootFolder.root, subpackage.replace(".", "/")).exists()) { @@ -137,6 +153,8 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { * iterable of files that were changed as part of generating this library */ fun createLibrary(dependencyName: String): Pair> { + initEmptyWorkspace() // Ensure the workspace is at least initialized. + val libTargetName = "${dependencyName}_lib" check("//:$libTargetName" !in libraryFileMap) { "Library '$dependencyName' already exists" } val prereqFiles = ensureWorkspaceIsConfiguredForKotlin() @@ -187,6 +205,7 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { /** Appends rules_jvm_external configuration to the WORKSPACE file if not done already. */ fun setUpWorkspaceForRulesJvmExternal(depsList: List) { if (!isConfiguredForRulesJvmExternal) { + initEmptyWorkspace() workspaceFile.appendText("artifactsList = [") for (dep in depsList) { workspaceFile.appendText("\"$dep\",\n") @@ -198,23 +217,23 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { RULES_JVM_EXTERNAL_TAG = "4.0" RULES_JVM_EXTERNAL_SHA = "31701ad93dbfe544d597dbe62c9a1fdd76d81d8a9150c2bf1ecf928ecdf97169" - + http_archive( name = "rules_jvm_external", strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG, sha256 = RULES_JVM_EXTERNAL_SHA, url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG, ) - + load("@rules_jvm_external//:defs.bzl", "maven_install") - + maven_install( artifacts = artifactsList, repositories = [ "https://maven.google.com", "https://repo1.maven.org/maven2", ], - ) + ) """.trimIndent() + "\n" ) diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel index 3160447f15f..fcdb77f2f1d 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel @@ -8,7 +8,7 @@ kt_jvm_test( name = "ComputeAffectedTestsTest", size = "large", srcs = ["ComputeAffectedTestsTest.kt"], - shard_count = 8, + shard_count = 24, deps = [ "//scripts/src/java/org/oppia/android/scripts/ci:compute_affected_tests_lib", "//scripts/src/java/org/oppia/android/scripts/common:proto_string_encoder", diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt index 5bbdc432d62..2bf59212f66 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt @@ -16,6 +16,7 @@ import java.io.ByteArrayOutputStream import java.io.File import java.io.OutputStream import java.io.PrintStream +import java.util.concurrent.TimeUnit /** * Tests for the compute_affected_tests utility. @@ -28,13 +29,12 @@ import java.io.PrintStream // Function name: test names are conventionally named with underscores. @Suppress("SameParameterValue", "FunctionName") class ComputeAffectedTestsTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + + private val commandExecutor by lazy { initiazeCommandExecutorWithLongProcessWaitTime() } private lateinit var testBazelWorkspace: TestBazelWorkspace private lateinit var testGitRepository: TestGitRepository - private lateinit var pendingOutputStream: ByteArrayOutputStream private lateinit var originalStandardOutputStream: OutputStream @@ -724,7 +724,8 @@ class ComputeAffectedTestsTest { ComputeAffectedTests( maxTestCountPerLargeShard = maxTestCountPerLargeShard, maxTestCountPerMediumShard = maxTestCountPerMediumShard, - maxTestCountPerSmallShard = maxTestCountPerSmallShard + maxTestCountPerSmallShard = maxTestCountPerSmallShard, + commandExecutor = commandExecutor ).compute( pathToRoot = tempFolder.root.absolutePath, pathToOutputFile = outputLog.absolutePath, @@ -862,4 +863,8 @@ class ComputeAffectedTestsTest { testGitRepository.stageFileForCommit(libFile) testGitRepository.commit(message = "Modified library $name") } + + private fun initiazeCommandExecutorWithLongProcessWaitTime(): CommandExecutorImpl { + return CommandExecutorImpl(processTimeout = 5, processTimeoutUnit = TimeUnit.MINUTES) + } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt index 07aa4d4134c..2109155025f 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt @@ -25,20 +25,14 @@ import java.util.concurrent.TimeUnit // Function name: test names are conventionally named with underscores. @Suppress("SameParameterValue", "FunctionName") class BazelClientTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + @field:[Rule JvmField] val mockitoRule: MockitoRule = MockitoJUnit.rule() - @Rule - @JvmField - val mockitoRule: MockitoRule = MockitoJUnit.rule() + @Mock lateinit var mockCommandExecutor: CommandExecutor private val commandExecutor by lazy { initiazeCommandExecutorWithLongProcessWaitTime() } private lateinit var testBazelWorkspace: TestBazelWorkspace - @Mock - lateinit var mockCommandExecutor: CommandExecutor - @Before fun setUp() { testBazelWorkspace = TestBazelWorkspace(tempFolder) @@ -46,7 +40,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_emptyFolder_fails() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) val exception = assertThrows() { bazelClient.retrieveAllTestTargets() @@ -59,7 +53,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_emptyWorkspace_fails() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() val exception = assertThrows() { @@ -73,7 +67,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_workspaceWithTest_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("ExampleTest") @@ -84,7 +78,7 @@ class BazelClientTest { @Test fun testRetrieveTestTargets_workspaceWithMultipleTests_returnsTestTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest") @@ -106,7 +100,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forFileNotInBuildGraph_returnsEmptyList() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() tempFolder.newFile("filenotingraph") @@ -117,7 +111,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forTestFile_returnsBazelTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") @@ -128,7 +122,7 @@ class BazelClientTest { @Test fun testRetrieveBazelTargets_forMultipleMixedFiles_returnsBazelTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", withGeneratedDependency = true) @@ -157,7 +151,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forTargetWithNoTestDependency_returnsNoTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary("SomeDependency") testBazelWorkspace.createTest("FirstTest") @@ -170,7 +164,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forTestFileTarget_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") @@ -181,7 +175,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forDependentFileTarget_returnsTestTarget() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest", withGeneratedDependency = true) @@ -192,7 +186,7 @@ class BazelClientTest { @Test fun testRetrieveRelatedTestTargets_forMixedFileTargets_returnsRelatedTestTargets() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary("ExtraDep") testBazelWorkspace.createTest("FirstTest", withExtraDependency = "//:ExtraDep_lib") @@ -227,7 +221,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forNoFiles_returnsEmptyList() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() val testTargets = bazelClient.retrieveTransitiveTestTargets(listOf()) @@ -238,7 +232,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forBuildFile_returnsAllTestsInThatBuildFile() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest") @@ -253,7 +247,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forMultipleBuildFiles_returnsAllRelatedTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", subpackage = "two") @@ -269,7 +263,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forBzlFile_returnsRelatedTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() // Generate tests. testBazelWorkspace.createTest("FirstTest") @@ -298,7 +292,7 @@ class BazelClientTest { @Test fun testRetrieveTransitiveTestTargets_forWorkspace_returnsAllTests() { - val bazelClient = BazelClient(tempFolder.root) + val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") testBazelWorkspace.createTest("SecondTest", subpackage = "two") diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel index 707ec3e8081..e4499086079 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel @@ -18,6 +18,7 @@ kt_jvm_test( kt_jvm_test( name = "MavenDependenciesListCheckTest", size = "large", + shard_count = 4, srcs = ["MavenDependenciesListCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/license:maven_dependencies_list_check_lib", diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel index a46ee7ad500..da5af646bc2 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel @@ -8,6 +8,7 @@ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") kt_jvm_test( name = "GenerateMavenDependenciesListTest", size = "large", + shard_count = 4, srcs = ["GenerateMavenDependenciesListTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:command_executor", From 0b55bd47439ac9b55e942916c838a0919cd60706 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Fri, 19 Jan 2024 21:55:36 +0000 Subject: [PATCH 26/63] Post-merge fixes. Plus, actually makes use of the new script background dispatcher in CommandExecutorImpl to make the new wiring make more sense (though its real utility will come in a follow-up PR). --- .../oppia/android/scripts/ci/ComputeAffectedTests.kt | 4 +--- .../android/scripts/common/CommandExecutorImpl.kt | 10 +++++++--- .../scripts/license/MavenDependenciesRetriever.kt | 1 - .../android/scripts/ci/ComputeAffectedTestsTest.kt | 2 +- .../org/oppia/android/scripts/license/BUILD.bazel | 2 +- .../org/oppia/android/scripts/maven/BUILD.bazel | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt index 07d960cb4bd..ec82cb18e8b 100644 --- a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt +++ b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt @@ -5,13 +5,11 @@ import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.GitClient import org.oppia.android.scripts.common.ProtoStringEncoder.Companion.toCompressedBase64 +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.AffectedTestsBucket import java.io.File import java.util.Locale import kotlin.system.exitProcess -import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher -import org.oppia.android.scripts.common.CommandExecutor -import org.oppia.android.scripts.common.CommandExecutorImpl private const val COMPUTE_ALL_TESTS_PREFIX = "compute_all_tests=" private const val MAX_TEST_COUNT_PER_LARGE_SHARD = 50 diff --git a/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt b/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt index 35c56d0988f..8431c534496 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt @@ -1,10 +1,10 @@ package org.oppia.android.scripts.common -import java.io.File -import java.util.concurrent.TimeUnit import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking +import java.io.File +import java.util.concurrent.TimeUnit /** * The default amount of time that should be waited before considering a process as 'hung', in @@ -33,7 +33,11 @@ class CommandExecutorImpl( .directory(workingDir) .redirectErrorStream(includeErrorOutput) .start() - val finished = process.waitFor(processTimeout, processTimeoutUnit) + val finished = runBlocking { + CoroutineScope(scriptBgDispatcher).async { + process.waitFor(processTimeout, processTimeoutUnit) + }.await() + } check(finished) { "Process did not finish within the expected timeout" } return CommandResult( process.exitValue(), diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt index 4eeec0be8df..e37c188bac5 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt @@ -5,7 +5,6 @@ import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import org.oppia.android.scripts.common.BazelClient import org.oppia.android.scripts.common.CommandExecutor -import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.maven.model.MavenListDependency import org.oppia.android.scripts.maven.model.MavenListDependencyTree import org.oppia.android.scripts.proto.License diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt index e7b9832d114..4d8542e1e5b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/ComputeAffectedTestsTest.kt @@ -9,6 +9,7 @@ import org.junit.rules.TemporaryFolder import org.oppia.android.scripts.common.CommandExecutor import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.ProtoStringEncoder.Companion.mergeFromCompressedBase64 +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.proto.AffectedTestsBucket import org.oppia.android.scripts.testing.TestBazelWorkspace import org.oppia.android.scripts.testing.TestGitRepository @@ -17,7 +18,6 @@ import java.io.ByteArrayOutputStream import java.io.File import java.io.OutputStream import java.io.PrintStream -import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import java.util.concurrent.TimeUnit /** diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel index e4499086079..ab6b739a3b8 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel @@ -18,8 +18,8 @@ kt_jvm_test( kt_jvm_test( name = "MavenDependenciesListCheckTest", size = "large", - shard_count = 4, srcs = ["MavenDependenciesListCheckTest.kt"], + shard_count = 4, deps = [ "//scripts/src/java/org/oppia/android/scripts/license:maven_dependencies_list_check_lib", "//scripts/src/java/org/oppia/android/scripts/testing:test_bazel_workspace", diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel index da5af646bc2..68b0d6fad28 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel @@ -8,8 +8,8 @@ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") kt_jvm_test( name = "GenerateMavenDependenciesListTest", size = "large", - shard_count = 4, srcs = ["GenerateMavenDependenciesListTest.kt"], + shard_count = 4, deps = [ "//scripts/src/java/org/oppia/android/scripts/common:command_executor", "//scripts/src/java/org/oppia/android/scripts/maven:generate_maven_dependencies_list_lib", From 00c7c285c6757a3d0c3c67db4db8cf6e9ca05dc0 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Sat, 20 Jan 2024 01:37:05 +0000 Subject: [PATCH 27/63] Post-merge fixes & adjustments. This makes the TODO open check script runnable using the script background dispatcher, and fixes some tests so that they pass now. More documentation and testing work is still needed to finalize this PR. --- .../android/scripts/common/GitHubClient.kt | 15 +- .../android/scripts/todo/TodoOpenCheck.kt | 14 +- .../oppia/android/scripts/todo/BUILD.bazel | 1 + .../android/scripts/todo/TodoCollectorTest.kt | 2 +- .../todo/TodoIssueResolvedCheckTest.kt | 30 ++-- .../android/scripts/todo/TodoOpenCheckTest.kt | 135 +++++++----------- 6 files changed, 83 insertions(+), 114 deletions(-) diff --git a/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt b/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt index 3de49bb498e..6a989db8e50 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt @@ -1,7 +1,6 @@ package org.oppia.android.scripts.common import com.squareup.moshi.Moshi -import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers @@ -24,12 +23,11 @@ import java.io.IOException */ class GitHubClient( private val rootDirectory: File, - private val dispatcher: CoroutineDispatcher, - private val commandExecutor: CommandExecutor = CommandExecutorImpl(), + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, + private val commandExecutor: CommandExecutor = CommandExecutorImpl(scriptBgDispatcher), private val repoOwner: String = "oppia", private val repoName: String = "oppia-android" ) { - private val remoteApiUrl by lazy { "https://api.github.com/" } private val okHttpClient by lazy { OkHttpClient.Builder().build() } private val moshi by lazy { Moshi.Builder().build() } private val retrofit by lazy { @@ -46,7 +44,7 @@ class GitHubClient( * Asynchronously returns all [GitHubIssue]s currently open in the Oppia Android GitHub project. */ fun fetchAllOpenIssuesAsync(): Deferred> { - return CoroutineScope(dispatcher).async { + return CoroutineScope(scriptBgDispatcher).async { // Fetch issues one page at a time (starting at page 1) until all are found. fetchOpenIssuesRecursive(startPageNumber = 1) } @@ -60,7 +58,7 @@ class GitHubClient( } private fun fetchOpenIssues(pageNumber: Int): Deferred> { - return CoroutineScope(dispatcher).async { + return CoroutineScope(scriptBgDispatcher).async { val call = gitHubService.fetchOpenIssues(repoOwner, repoName, authorizationBearer, pageNumber) // Deferred blocking I/O operation to the dedicated I/O dispatcher. val response = withContext(Dispatchers.IO) { call.execute() } @@ -97,4 +95,9 @@ class GitHubClient( } }.output.single() } + + companion object { + // TODO: Use Dagger instead (need an issue filed). + var remoteApiUrl = "https://api.github.com/" + } } diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt index de74201d474..97664dfa242 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt @@ -1,17 +1,15 @@ package org.oppia.android.scripts.todo import com.google.protobuf.TextFormat -import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.runBlocking import org.oppia.android.scripts.common.GitHubClient +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.common.model.GitHubIssue import org.oppia.android.scripts.proto.TodoOpenExemption import org.oppia.android.scripts.proto.TodoOpenExemptions import org.oppia.android.scripts.todo.model.Todo import java.io.File import java.io.FileInputStream -import java.util.concurrent.Executors -import java.util.concurrent.ThreadFactory /** * Script for ensuring that all TODOs present in the repository are correctly formatted and @@ -45,14 +43,10 @@ fun main(vararg args: String) { val todoExemptionTextProtoFilePath = "scripts/assets/todo_exemptions" // List of all the open issues on GitHub of this repository. - // TODO: Use script bg dispatcher here, instead. - val defaultFactory = Executors.defaultThreadFactory() - val daemonFactory = object : ThreadFactory { - override fun newThread(r: Runnable) = defaultFactory.newThread(r).also { it.setDaemon(true) } + val openIssueList = ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + val gitHubClient = GitHubClient(repoRoot, scriptBgDispatcher) + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } } - val dispatcher = Executors.newSingleThreadExecutor(daemonFactory).asCoroutineDispatcher() - val gitHubClient = GitHubClient(repoRoot, dispatcher) - val openIssueList = runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } val todoExemptionList = loadTodoExemptionsProto(pathToProtoBinary).getTodoOpenExemptionList() diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel index 334e07b70f1..f141e31ba93 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel @@ -21,6 +21,7 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/todo:todo_open_check_lib", "//testing:assertion_helpers", + "//third_party:com_squareup_okhttp3_mockwebserver", "//third_party:com_google_truth_truth", "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt index 32561eddc20..ab35976dfd2 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoCollectorTest.kt @@ -625,7 +625,7 @@ class TodoCollectorTest { "// TODO(#1548774): some test description." ) - assertThat(parsedIssueNumber).isEqualTo("1548774") + assertThat(parsedIssueNumber).isEqualTo(1548774) } @Test diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt index 4880c092ec5..3665278c101 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt @@ -45,7 +45,7 @@ class TodoIssueResolvedCheckTest { val testContent1 = """ // Test comment 1 - + // Test comment 2 """.trimIndent() val testContent2 = @@ -69,7 +69,7 @@ class TodoIssueResolvedCheckTest { val testContent1 = """ // TODO(#169877): test description 1 - + // TODO(#1021211): test description 2 """.trimIndent() val testContent2 = @@ -93,7 +93,7 @@ class TodoIssueResolvedCheckTest { val testContent1 = """ // TODO(#169877): test description 1 - + // TODO(#1021211): test description 2 """.trimIndent() val testContent2 = @@ -113,9 +113,9 @@ class TodoIssueResolvedCheckTest { val failureMessage = """ The following TODOs are unresolved for the closed issue: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile2.bazel:3 - + - TempFile1.kt:1 + - TempFile2.bazel:3 + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -129,7 +129,7 @@ class TodoIssueResolvedCheckTest { val testContent1 = """ // TODO(#169877): test description 1 - + // TODO(#1021211): test description 2 """.trimIndent() val testContent2 = @@ -141,7 +141,7 @@ class TodoIssueResolvedCheckTest { val testContent3 = """ - + """.trimIndent() @@ -157,11 +157,11 @@ class TodoIssueResolvedCheckTest { val failureMessage = """ The following TODOs are unresolved for the closed issue: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile2.bazel:3 - - ${retrieveTestFilesDirectoryPath()}/TempFile3.xml:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile3.xml:4 - + - TempFile1.kt:1 + - TempFile2.bazel:3 + - TempFile3.xml:1 + - TempFile3.xml:4 + $wikiReferenceNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) @@ -175,7 +175,7 @@ class TodoIssueResolvedCheckTest { val testContent1 = """ // TODO(#169877): test description 1 - + // TODO(#1021211): test description 2 """.trimIndent() val testContent2 = @@ -187,7 +187,7 @@ class TodoIssueResolvedCheckTest { val testContent3 = """ - + """.trimIndent() diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index 6df3902ba9a..b93e90d354c 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -12,6 +12,9 @@ import org.oppia.android.testing.assertThrows import java.io.ByteArrayOutputStream import java.io.File import java.io.PrintStream +import okhttp3.mockwebserver.MockWebServer +import okhttp3.mockwebserver.MockResponse +import org.oppia.android.scripts.common.GitHubClient /** Tests for [TodoOpenCheck]. */ class TodoOpenCheckTest { @@ -23,6 +26,9 @@ class TodoOpenCheckTest { private val wikiReferenceNote = "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#todo-open-checks for more details on how to fix this." + private val regenerateNote = + "There were failures. Re-run the command with \"regenerate\" at the end to regenerate the " + + "exemption file with all failures as exempted." @Rule @JvmField @@ -41,23 +47,9 @@ class TodoOpenCheckTest { System.setOut(originalOut) } - @Test - fun testTodoCheck_noJsonFilePresent_checkShouldFail() { - val exception = assertThrows() { runScript() } - - assertThat(exception).hasMessageThat().contains( - "${retrieveTestFilesDirectoryPath()}/open_issues.json: No such file exists" - ) - } - @Test fun testTodoCheck_multipleTodosPresent_allAreValid_checkShouldPass() { - val testJSONContent = - """ - [{"number":11004},{"number":11003},{"number":11002},{"number":11001}] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = listOf(11004, 11003, 11002, 11001)) val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") val testContent1 = @@ -84,12 +76,7 @@ class TodoOpenCheckTest { @Test fun testTodoCheck_onlyPoorlyFormattedTodosPresent_checkShouldFail() { - val testJSONContent = - """ - [] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = emptyList()) val tempFile = tempFolder.newFile("testfiles/TempFile.txt") val testContent = """ @@ -107,25 +94,22 @@ class TodoOpenCheckTest { val failureMessage = """ TODOs not in correct format: - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:2 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:3 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:4 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:5 + - TempFile.txt:1 + - TempFile.txt:2 + - TempFile.txt:3 + - TempFile.txt:4 + - TempFile.txt:5 $wikiReferenceNote + + $regenerateNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @Test fun testTodoCheck_onlyOpenIssueFailureTodosPresent_checkShouldFail() { - val testJSONContent = - """ - [{"number":10000000},{"number":100000004}] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = listOf(10000000, 100000004)) val tempFile = tempFolder.newFile("testfiles/TempFile.txt") val testContent = """ @@ -143,23 +127,20 @@ class TodoOpenCheckTest { val failureMessage = """ TODOs not corresponding to open issues on GitHub: - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:2 - - ${retrieveTestFilesDirectoryPath()}/TempFile.txt:5 + - TempFile.txt:1 + - TempFile.txt:2 + - TempFile.txt:5 $wikiReferenceNote + + $regenerateNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @Test fun testTodoCheck_multipleFailuresPresent_allFailuresShouldBeReported() { - val testJSONContent = - """ - [{"number":349888},{"number":349777}] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = listOf(349888, 349777)) val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") val testContent1 = @@ -185,26 +166,23 @@ class TodoOpenCheckTest { val failureMessage = """ TODOs not in correct format: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:2 - - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:1 + - TempFile1.kt:2 + - TempFile2.kt:1 TODOs not corresponding to open issues on GitHub: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:1 - - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:3 + - TempFile1.kt:1 + - TempFile2.kt:3 $wikiReferenceNote + + $regenerateNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @Test fun testTodoCheck_multipleFailuresPresent_loggingShouldBeAsPerLexicographicalOrder() { - val testJSONContent = - """ - [{"number":349888},{"number":349777}] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = listOf(349888, 349777)) val tempFile1 = tempFolder.newFile("testfiles/Presenter.kt") val tempFile2 = tempFolder.newFile("testfiles/Fragment.kt") val tempFile3 = tempFolder.newFile("testfiles/Activity.kt") @@ -237,27 +215,24 @@ class TodoOpenCheckTest { val failureMessage = """ TODOs not in correct format: - - ${retrieveTestFilesDirectoryPath()}/Activity.kt:2 - - ${retrieveTestFilesDirectoryPath()}/Fragment.kt:1 - - ${retrieveTestFilesDirectoryPath()}/Presenter.kt:2 + - Activity.kt:2 + - Fragment.kt:1 + - Presenter.kt:2 TODOs not corresponding to open issues on GitHub: - - ${retrieveTestFilesDirectoryPath()}/Fragment.kt:3 - - ${retrieveTestFilesDirectoryPath()}/Presenter.kt:1 + - Fragment.kt:3 + - Presenter.kt:1 $wikiReferenceNote + + $regenerateNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @Test fun testTodoCheck_addExemptions_exemptedTodosAreInvalid_checkShouldPass() { - val testJSONContent = - """ - [{"number":11004},{"number":11003},{"number":11002},{"number":11001}] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = listOf(11004, 11003, 11002, 11001)) val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") val testContent1 = @@ -294,12 +269,7 @@ class TodoOpenCheckTest { @Test fun testTodoCheck_allTodosAreValid_redundantExemption_checkShouldFail() { - val testJSONContent = - """ - [{"number":1000000},{"number":152440222},{"number":152440223},{"number":11001}] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = listOf(1000000, 152440222, 152440223, 11001)) val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") val testContent1 = @@ -340,18 +310,15 @@ class TodoOpenCheckTest { - TempFile1.kt:2 - TempFile2.kt:1 Please remove them from scripts/assets/todo_exemptions.textproto + + $regenerateNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } @Test fun testTodoCheck_combineMultipleFailures_checkShouldFailWithAllErrorsLogged() { - val testJSONContent = - """ - [{"number":1000000},{"number":152440222},{"number":152440223},{"number":11001}] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = listOf(1000000, 152440222, 152440223, 11001)) val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") val testContent1 = @@ -389,27 +356,31 @@ class TodoOpenCheckTest { Please remove them from scripts/assets/todo_exemptions.textproto TODOs not in correct format: - - ${retrieveTestFilesDirectoryPath()}/TempFile2.kt:1 + - TempFile2.kt:1 TODOs not corresponding to open issues on GitHub: - - ${retrieveTestFilesDirectoryPath()}/TempFile1.kt:3 + - TempFile1.kt:3 $wikiReferenceNote + + $regenerateNote """.trimIndent() assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } - /** Retrieves the absolute path of testfiles directory. */ - private fun retrieveTestFilesDirectoryPath(): String { - return "${tempFolder.root}/testfiles" + private fun setUpGitHubService(issueNumbers: List) { + val issueJsons = issueNumbers.joinToString(separator = ",") { "{\"number\":$it}" } + val mockWebServer = MockWebServer() + mockWebServer.enqueue(MockResponse().setBody("[$issueJsons]")) + mockWebServer.enqueue(MockResponse().setBody("[]")) // No more issues. + GitHubClient.remoteApiUrl = mockWebServer.url("/").toString() } /** Runs the todo_open_check. */ private fun runScript() { main( - retrieveTestFilesDirectoryPath(), - "${tempFolder.root}/$pathToProtoBinary", - "open_issues.json" + "${tempFolder.root}/testfiles", + "${tempFolder.root}/$pathToProtoBinary" ) } } From bd97611f1d54f956bede86fa0379da726c9e3542 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Sat, 20 Jan 2024 01:39:52 +0000 Subject: [PATCH 28/63] Fix BUILD file lint issue. --- .../src/javatests/org/oppia/android/scripts/license/BUILD.bazel | 2 +- .../src/javatests/org/oppia/android/scripts/maven/BUILD.bazel | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel index e4499086079..ab6b739a3b8 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel @@ -18,8 +18,8 @@ kt_jvm_test( kt_jvm_test( name = "MavenDependenciesListCheckTest", size = "large", - shard_count = 4, srcs = ["MavenDependenciesListCheckTest.kt"], + shard_count = 4, deps = [ "//scripts/src/java/org/oppia/android/scripts/license:maven_dependencies_list_check_lib", "//scripts/src/java/org/oppia/android/scripts/testing:test_bazel_workspace", diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel index da5af646bc2..68b0d6fad28 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel @@ -8,8 +8,8 @@ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") kt_jvm_test( name = "GenerateMavenDependenciesListTest", size = "large", - shard_count = 4, srcs = ["GenerateMavenDependenciesListTest.kt"], + shard_count = 4, deps = [ "//scripts/src/java/org/oppia/android/scripts/common:command_executor", "//scripts/src/java/org/oppia/android/scripts/maven:generate_maven_dependencies_list_lib", From 0618b12863046620add1a52aa8c85a2c1a24556f Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Sat, 20 Jan 2024 01:53:18 +0000 Subject: [PATCH 29/63] Static fix checks. --- scripts/assets/todo_open_exemptions.textproto | 62 +++++++++---------- .../android/scripts/common/GitHubClient.kt | 11 +++- .../oppia/android/scripts/todo/BUILD.bazel | 2 +- .../android/scripts/todo/TodoOpenCheckTest.kt | 6 +- 4 files changed, 44 insertions(+), 37 deletions(-) diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index 3797b1b49b6..38b2655fe3e 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -253,38 +253,38 @@ todo_open_exemption { } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" - line_number: 65 + line_number: 57 + line_number: 58 + line_number: 64 line_number: 66 - line_number: 72 - line_number: 74 - line_number: 96 - line_number: 97 - line_number: 98 - line_number: 99 - line_number: 100 - line_number: 132 - line_number: 133 - line_number: 136 - line_number: 167 - line_number: 168 - line_number: 169 - line_number: 174 - line_number: 176 - line_number: 213 - line_number: 214 - line_number: 215 - line_number: 220 - line_number: 222 - line_number: 228 - line_number: 265 - line_number: 269 - line_number: 307 - line_number: 308 - line_number: 312 - line_number: 359 - line_number: 360 - line_number: 361 - line_number: 365 + line_number: 83 + line_number: 84 + line_number: 85 + line_number: 86 + line_number: 87 + line_number: 116 + line_number: 117 + line_number: 120 + line_number: 148 + line_number: 149 + line_number: 150 + line_number: 155 + line_number: 157 + line_number: 191 + line_number: 192 + line_number: 193 + line_number: 198 + line_number: 200 + line_number: 206 + line_number: 240 + line_number: 244 + line_number: 277 + line_number: 278 + line_number: 282 + line_number: 326 + line_number: 327 + line_number: 328 + line_number: 332 } todo_open_exemption { exempted_file_path: "scripts/static_checks.sh" diff --git a/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt b/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt index 6a989db8e50..fd7cc105037 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/GitHubClient.kt @@ -14,12 +14,18 @@ import retrofit2.converter.moshi.MoshiConverterFactory import java.io.File import java.io.IOException -// TODO: finish documentation once bg dispatcher is incorporated. /** * General utility for interfacing with a remote GitHub repository (specifically Oppia Android). * * Note that this utility expects 'gh' to be available in the local environment and be properly * authenticated. + * + * @property rootDirectory the [File] corresponding to the local repository's root directory + * @property scriptBgDispatcher the dispatcher for offloading asynchronous network I/O operations + * @property commandExecutor the executor for local commands (e.g. 'gh'). This defaults to a general + * [CommandExecutorImpl] implementation that relies upon [scriptBgDispatcher] for execution. + * @property repoOwner the owner of the remote GitHub repository. This defaults to 'oppia'. + * @property repoName the name of the remote GitHub repository. This defaults to 'oppia-android'. */ class GitHubClient( private val rootDirectory: File, @@ -97,7 +103,8 @@ class GitHubClient( } companion object { - // TODO: Use Dagger instead (need an issue filed). + // TODO(#5314): Migrate this over to a Dagger constant. + /** The remote URL corresponding to GitHub's REST API. */ var remoteApiUrl = "https://api.github.com/" } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel index f141e31ba93..55e7c6fb79e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel @@ -21,8 +21,8 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/todo:todo_open_check_lib", "//testing:assertion_helpers", - "//third_party:com_squareup_okhttp3_mockwebserver", "//third_party:com_google_truth_truth", + "//third_party:com_squareup_okhttp3_mockwebserver", "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index b93e90d354c..c0fe90e51bd 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -1,20 +1,20 @@ package org.oppia.android.scripts.todo import com.google.common.truth.Truth.assertThat +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import org.oppia.android.scripts.common.GitHubClient import org.oppia.android.scripts.proto.TodoOpenExemption import org.oppia.android.scripts.proto.TodoOpenExemptions import org.oppia.android.testing.assertThrows import java.io.ByteArrayOutputStream import java.io.File import java.io.PrintStream -import okhttp3.mockwebserver.MockWebServer -import okhttp3.mockwebserver.MockResponse -import org.oppia.android.scripts.common.GitHubClient /** Tests for [TodoOpenCheck]. */ class TodoOpenCheckTest { From ab326ff6b74ff6475077242d89e7103f632ee640 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Sat, 20 Jan 2024 02:16:07 +0000 Subject: [PATCH 30/63] Post-merge fixes. --- scripts/assets/todo_open_exemptions.textproto | 98 +++++++++---------- .../scripts/common/CommandExecutorImpl.kt | 2 - .../oppia/android/scripts/todo/BUILD.bazel | 2 - .../android/scripts/todo/TodoOpenCheck.kt | 4 - .../android/scripts/todo/TodoOpenCheckTest.kt | 15 +-- 5 files changed, 54 insertions(+), 67 deletions(-) diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index 2dba1b29abe..f7f01102b0c 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -1,10 +1,6 @@ -todo_open_exemption { - exempted_file_path: ".github/CODEOWNERS" - line_number: 9 -} todo_open_exemption { exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/TodoCollector.kt" - line_number: 79 + line_number: 78 } todo_open_exemption { exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt" @@ -257,42 +253,46 @@ todo_open_exemption { } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" - line_number: 68 - line_number: 69 - line_number: 75 - line_number: 77 - line_number: 99 - line_number: 100 - line_number: 101 - line_number: 102 - line_number: 103 - line_number: 139 - line_number: 140 - line_number: 143 - line_number: 178 - line_number: 179 - line_number: 180 - line_number: 185 - line_number: 187 - line_number: 228 - line_number: 229 - line_number: 230 - line_number: 235 - line_number: 237 + line_number: 56 + line_number: 57 + line_number: 63 + line_number: 65 + line_number: 82 + line_number: 83 + line_number: 84 + line_number: 85 + line_number: 86 + line_number: 115 + line_number: 116 + line_number: 119 + line_number: 147 + line_number: 148 + line_number: 149 + line_number: 154 + line_number: 156 + line_number: 190 + line_number: 191 + line_number: 192 + line_number: 197 + line_number: 199 + line_number: 205 + line_number: 239 line_number: 243 - line_number: 284 - line_number: 288 + line_number: 276 + line_number: 277 + line_number: 281 line_number: 326 line_number: 327 - line_number: 331 - line_number: 383 - line_number: 384 + line_number: 328 + line_number: 332 + line_number: 379 + line_number: 380 + line_number: 381 line_number: 385 - line_number: 389 - line_number: 443 - line_number: 444 - line_number: 445 - line_number: 449 +} +todo_open_exemption { + exempted_file_path: "scripts/static_checks.sh" + line_number: 110 } todo_open_exemption { exempted_file_path: "wiki/Coding-style-guide.md" @@ -300,16 +300,16 @@ todo_open_exemption { } todo_open_exemption { exempted_file_path: "wiki/Static-Analysis-Checks.md" - line_number: 169 - line_number: 177 - line_number: 182 - line_number: 186 - line_number: 190 - line_number: 192 - line_number: 207 - line_number: 217 - line_number: 220 - line_number: 223 - line_number: 226 - line_number: 229 + line_number: 171 + line_number: 195 + line_number: 200 + line_number: 204 + line_number: 208 + line_number: 210 + line_number: 228 + line_number: 238 + line_number: 241 + line_number: 244 + line_number: 247 + line_number: 250 } diff --git a/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt b/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt index 11e77b5849f..01476cbf3cd 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/CommandExecutorImpl.kt @@ -12,8 +12,6 @@ import kotlinx.coroutines.flow.consumeAsFlow import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeout -import kotlinx.coroutines.async -import kotlinx.coroutines.runBlocking import java.io.File import java.io.InputStream import java.util.concurrent.TimeUnit diff --git a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel index db980efc6be..351184690d0 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel @@ -23,8 +23,6 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ ":todo_collector", - "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", - "//scripts/src/java/org/oppia/android/scripts/todo/model:issue", "//scripts/src/java/org/oppia/android/scripts/common:github_client", "//scripts/src/java/org/oppia/android/scripts/common/model:github_issue", "//scripts/src/java/org/oppia/android/scripts/proto:script_exemptions_java_proto", diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt index aabe00c0179..97664dfa242 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt @@ -1,10 +1,6 @@ package org.oppia.android.scripts.todo import com.google.protobuf.TextFormat -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types -import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory import kotlinx.coroutines.runBlocking import org.oppia.android.scripts.common.GitHubClient import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index bb63524c998..63cfe3a431d 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -22,6 +22,7 @@ class TodoOpenCheckTest { private val originalOut: PrintStream = System.out private val TODO_CHECK_PASSED_OUTPUT_INDICATOR: String = "TODO CHECK PASSED" private val TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR: String = "TODO CHECK FAILED" + private val TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR: String = "TODO CHECK SKIPPED" private val pathToProtoBinary = "scripts/assets/todo_exemptions.pb" private val wikiReferenceNote = "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + @@ -317,6 +318,7 @@ class TodoOpenCheckTest { @Test fun testTodoCheck_combineMultipleFailures_checkShouldFailWithAllErrorsLogged() { setUpGitHubService(issueNumbers = listOf(1000000, 152440222, 152440223, 11001)) + tempFolder.newFolder("testfiles/extra_dir") val tempFile1 = tempFolder.newFile("testfiles/extra_dir/TempFile1.kt") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") val testContent1 = @@ -368,12 +370,7 @@ class TodoOpenCheckTest { @Test fun testTodoCheck_multipleFailureTypes_withRegenerationEnabled_outputsUpdatedTextProto() { - val testJSONContent = - """ - [{"number":1000000},{"number":152440222},{"number":152440223},{"number":11001}] - """.trimIndent() - val testJSONFile = tempFolder.newFile("testfiles/open_issues.json") - testJSONFile.writeText(testJSONContent) + setUpGitHubService(issueNumbers = listOf(1000000, 152440222, 152440223, 11001)) tempFolder.newFolder("testfiles/extra_dir") val tempFile1 = tempFolder.newFile("testfiles/extra_dir/TempFile1.kt") val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") @@ -402,11 +399,9 @@ class TodoOpenCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows(Exception::class) { - runScript(regenerateFile = true) - } + val exception = assertThrows() { runScript(regenerateFile = true) } - assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR) + assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) val failureMessage = """ Redundant exemptions (there are no TODOs corresponding to these lines): From 1e2df1431111fe446695993193ad3b9357305010 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Sat, 20 Jan 2024 03:04:47 +0000 Subject: [PATCH 31/63] Post-merge fixes. --- .../scripts/license/MavenDependenciesRetrieverTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt index 15af9c881fd..9b17c85da45 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt @@ -1002,7 +1002,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_oneComponent_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { MavenDependenciesRetriever.MavenCoordinate.parseFrom("androidx.lifecycle") } @@ -1011,7 +1011,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_twoComponents_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { MavenDependenciesRetriever.MavenCoordinate.parseFrom("androidx.lifecycle:lifecycle-viewmodel") } @@ -1062,7 +1062,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_sixComponents_throwsException() { - val exception = assertThrows(IllegalStateException::class) { + val exception = assertThrows() { MavenDependenciesRetriever.MavenCoordinate.parseFrom( "androidx.lifecycle:lifecycle-viewmodel:aar:sources:fake:2.2.0" ) From 1a666a9ceb1c2f8809a26e564f793a6299053ce5 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Tue, 6 Feb 2024 23:43:51 +0000 Subject: [PATCH 32/63] Post-merge fixes. --- .../android/testing/FakeFirestoreEventLoggerTest.kt | 10 +++++----- .../firebase/DebugFirestoreEventLoggerImplTest.kt | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/testing/src/test/java/org/oppia/android/testing/FakeFirestoreEventLoggerTest.kt b/testing/src/test/java/org/oppia/android/testing/FakeFirestoreEventLoggerTest.kt index 41ce667b82f..b04b5d13890 100644 --- a/testing/src/test/java/org/oppia/android/testing/FakeFirestoreEventLoggerTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/FakeFirestoreEventLoggerTest.kt @@ -78,7 +78,7 @@ class FakeFirestoreEventLoggerTest { @Test fun testfakeEventLogger_logNothing_getMostRecent_returnsFailure() { - assertThrows(NoSuchElementException::class) { fakeEventLogger.getMostRecentEvent() } + assertThrows() { fakeEventLogger.getMostRecentEvent() } } @Test @@ -86,7 +86,7 @@ class FakeFirestoreEventLoggerTest { eventLogger.uploadEvent(eventLog1) fakeEventLogger.clearAllEvents() - val eventException = assertThrows(NoSuchElementException::class) { + val eventException = assertThrows() { fakeEventLogger.getMostRecentEvent() } @@ -144,7 +144,7 @@ class FakeFirestoreEventLoggerTest { @Test fun testGetOldestEvent_noEventsLogged_throwsException() { - assertThrows(NoSuchElementException::class) { fakeEventLogger.getOldestEvent() } + assertThrows() { fakeEventLogger.getOldestEvent() } } @Test @@ -172,7 +172,7 @@ class FakeFirestoreEventLoggerTest { eventLogger.uploadEvent(eventLog1) fakeEventLogger.clearAllEvents() - assertThrows(NoSuchElementException::class) { fakeEventLogger.getOldestEvent() } + assertThrows() { fakeEventLogger.getOldestEvent() } } @Test @@ -237,7 +237,7 @@ class FakeFirestoreEventLoggerTest { eventLogger.uploadEvent(eventLog2) eventLogger.uploadEvent(eventLog1) - assertThrows(IllegalArgumentException::class) { + assertThrows() { fakeEventLogger.getMostRecentEvents(count = -1) } } diff --git a/utility/src/test/java/org/oppia/android/util/logging/firebase/DebugFirestoreEventLoggerImplTest.kt b/utility/src/test/java/org/oppia/android/util/logging/firebase/DebugFirestoreEventLoggerImplTest.kt index 011eb532a09..32d83a0d91c 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/firebase/DebugFirestoreEventLoggerImplTest.kt +++ b/utility/src/test/java/org/oppia/android/util/logging/firebase/DebugFirestoreEventLoggerImplTest.kt @@ -79,7 +79,7 @@ class DebugFirestoreEventLoggerImplTest { @Test fun testDebugFirestoreEventLogger_logNothing_getMostRecent_returnsFailure() { - assertThrows(NoSuchElementException::class) { debugFirestoreLoggerImpl.getMostRecentEvent() } + assertThrows() { debugFirestoreLoggerImpl.getMostRecentEvent() } } @Test @@ -87,7 +87,7 @@ class DebugFirestoreEventLoggerImplTest { eventLogger.uploadEvent(eventLog1) debugFirestoreLoggerImpl.clearAllEvents() - val eventException = assertThrows(NoSuchElementException::class) { + val eventException = assertThrows() { debugFirestoreLoggerImpl.getMostRecentEvent() } From a2ee5d31d47ed2392847bf0298d22c41bd829dde Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 7 Feb 2024 21:50:42 +0000 Subject: [PATCH 33/63] Add smoke tests for instr. binaries & tests. --- instrumentation/BUILD.bazel | 7 +++++++ instrumentation/oppia_instrumentation_test.bzl | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/instrumentation/BUILD.bazel b/instrumentation/BUILD.bazel index 03c56337516..eeb4f436d50 100644 --- a/instrumentation/BUILD.bazel +++ b/instrumentation/BUILD.bazel @@ -8,6 +8,8 @@ Note that: exports_files(["src/javatests/AndroidManifest.xml"]) +load("@bazel_skylib//rules:build_test.bzl", "build_test") + # Used for end-to-end tests android_binary( name = "oppia_test", @@ -29,3 +31,8 @@ android_binary( "//instrumentation/src/java/org/oppia/android/instrumentation/application:oppia_test_application", ], ) + +build_test( + name = "oppia_test_binary_smoke_test", + targets = [":oppia_test"], +) diff --git a/instrumentation/oppia_instrumentation_test.bzl b/instrumentation/oppia_instrumentation_test.bzl index 63d8413cd2c..7196865c93c 100644 --- a/instrumentation/oppia_instrumentation_test.bzl +++ b/instrumentation/oppia_instrumentation_test.bzl @@ -3,6 +3,7 @@ Instrumentation macros to define up end-to-end tests. """ load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@bazel_skylib//rules:build_test.bzl", "build_test") def oppia_instrumentation_test( name, @@ -39,3 +40,8 @@ def oppia_instrumentation_test( test_app = ":%sBinary" % name, tags = ["manual"], ) + + build_test( + name = "%s_smoke_test" % name, + targets = [name, "%sBinary" % name], + ) From d5b90128f7bb1eb5f1dc5e6de02b3b01d2c02751 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 7 Feb 2024 21:53:36 +0000 Subject: [PATCH 34/63] Some minor refactoring for readability. --- instrumentation/oppia_instrumentation_test.bzl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/instrumentation/oppia_instrumentation_test.bzl b/instrumentation/oppia_instrumentation_test.bzl index 7196865c93c..8a3f74b64ce 100644 --- a/instrumentation/oppia_instrumentation_test.bzl +++ b/instrumentation/oppia_instrumentation_test.bzl @@ -17,31 +17,34 @@ def oppia_instrumentation_test( srcs: list of str. List of test files corresponding to this test suite. deps: list of str. The list of dependencies needed to build and run the test. """ + test_lib_name = "%s_lib" % name + test_binary_name = "%sBinary" % name + kt_android_library( - name = "%s_lib" % name, + name = test_lib_name, testonly = True, srcs = srcs, deps = deps, ) native.android_binary( - name = "%sBinary" % name, + name = test_binary_name, testonly = True, custom_package = "org.oppia.android", instruments = "//instrumentation:oppia_test", manifest = "//instrumentation:src/javatests/AndroidManifest.xml", - deps = [":%s_lib" % name], + deps = [test_lib_name], ) # TODO(#3617): Target isn't supported yet. Remove the manual tag once fixed. native.android_instrumentation_test( name = name, target_device = "@android_test_support//tools/android/emulated_devices/generic_phone:android_23_x86_qemu2", - test_app = ":%sBinary" % name, + test_app = test_binary_name, tags = ["manual"], ) build_test( name = "%s_smoke_test" % name, - targets = [name, "%sBinary" % name], + targets = [name, test_binary_name], ) From e6ec869dccfc7fdddd431585e8344e61bbd53467 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 7 Feb 2024 22:48:22 +0000 Subject: [PATCH 35/63] Fixed broken instrumentation builds. This was done by removing the //testing dependency and, instead, having instrumentation targets depend on the direct module within //testing that they need to build. This module & its corresponding implementation binding (and tests) needed to be moved out of //testing and into their own /firebase package. --- .../AdministratorControlsActivityTest.kt | 2 +- .../AdministratorControlsFragmentTest.kt | 2 +- .../AppVersionActivityTest.kt | 2 +- .../ProfileAndDeviceIdActivityTest.kt | 2 +- .../ProfileAndDeviceIdFragmentTest.kt | 2 +- .../CompletedStoryListActivityTest.kt | 2 +- .../LessonThumbnailImageViewTest.kt | 2 +- .../MathExpressionInteractionsViewTest.kt | 2 +- .../AppCompatCheckBoxBindingAdaptersTest.kt | 2 +- .../CircularProgressIndicatorAdaptersTest.kt | 2 +- .../DrawableBindingAdaptersTest.kt | 2 +- .../ImageViewBindingAdaptersTest.kt | 2 +- .../databinding/MarginBindingAdaptersTest.kt | 2 +- ...StateAssemblerMarginBindingAdaptersTest.kt | 2 +- ...tateAssemblerPaddingBindingAdaptersTest.kt | 2 +- .../TextViewBindingAdaptersTest.kt | 2 +- .../databinding/ViewBindingAdaptersTest.kt | 2 +- .../DeveloperOptionsActivityTest.kt | 2 +- .../DeveloperOptionsFragmentTest.kt | 2 +- .../MarkChaptersCompletedActivityTest.kt | 2 +- .../MarkChaptersCompletedFragmentTest.kt | 2 +- .../MarkStoriesCompletedActivityTest.kt | 2 +- .../MarkStoriesCompletedFragmentTest.kt | 2 +- .../MarkTopicsCompletedActivityTest.kt | 2 +- .../MarkTopicsCompletedFragmentTest.kt | 2 +- .../devoptions/ViewEventLogsActivityTest.kt | 2 +- .../devoptions/ViewEventLogsFragmentTest.kt | 2 +- .../ForceNetworkTypeActivityTest.kt | 2 +- .../ForceNetworkTypeFragmentTest.kt | 2 +- .../MathExpressionParserActivityTest.kt | 2 +- .../MathExpressionParserFragmentTest.kt | 2 +- .../android/app/faq/FAQListFragmentTest.kt | 2 +- .../android/app/faq/FAQSingleActivityTest.kt | 2 +- .../android/app/faq/FaqListActivityTest.kt | 2 +- .../android/app/help/HelpActivityTest.kt | 2 +- .../android/app/help/HelpFragmentTest.kt | 2 +- .../android/app/home/HomeActivityTest.kt | 2 +- .../app/home/RecentlyPlayedFragmentTest.kt | 2 +- .../app/home/TopicSummaryViewModelTest.kt | 2 +- .../android/app/home/WelcomeViewModelTest.kt | 2 +- .../PromotedStoryListViewModelTest.kt | 2 +- .../PromotedStoryViewModelTest.kt | 2 +- .../mydownloads/MyDownloadsActivityTest.kt | 2 +- .../mydownloads/MyDownloadsFragmentTest.kt | 2 +- .../notice/BetaNoticeDialogFragmentTest.kt | 2 +- ...dAppDeprecationNoticeDialogFragmentTest.kt | 2 +- ...labilityUpgradeNoticeDialogFragmentTest.kt | 2 +- ...lAppDeprecationNoticeDialogFragmentTest.kt | 2 +- .../OsDeprecationNoticeDialogFragmentTest.kt | 2 +- .../app/onboarding/OnboardingActivityTest.kt | 2 +- .../app/onboarding/OnboardingFragmentTest.kt | 2 +- .../OngoingTopicListActivityTest.kt | 2 +- .../app/options/AppLanguageActivityTest.kt | 2 +- .../app/options/AppLanguageFragmentTest.kt | 2 +- .../app/options/AudioLanguageActivityTest.kt | 2 +- .../app/options/AudioLanguageFragmentTest.kt | 2 +- .../app/options/OptionsActivityTest.kt | 2 +- .../app/options/OptionsFragmentTest.kt | 2 +- .../options/ReadingTextSizeActivityTest.kt | 2 +- .../options/ReadingTextSizeFragmentTest.kt | 2 +- .../android/app/parser/HtmlParserTest.kt | 2 +- .../app/player/audio/AudioFragmentTest.kt | 2 +- .../exploration/BottomSheetOptionsMenuTest.kt | 2 +- .../exploration/ExplorationActivityTest.kt | 2 +- .../app/player/state/StateFragmentTest.kt | 2 +- .../app/policies/PoliciesActivityTest.kt | 2 +- .../app/policies/PoliciesFragmentTest.kt | 2 +- .../app/profile/AddProfileActivityTest.kt | 2 +- .../app/profile/AdminAuthActivityTest.kt | 2 +- .../app/profile/AdminPinActivityTest.kt | 2 +- .../app/profile/PinPasswordActivityTest.kt | 2 +- .../app/profile/ProfileChooserActivityTest.kt | 2 +- .../app/profile/ProfileChooserFragmentTest.kt | 2 +- .../ProfilePictureActivityTest.kt | 2 +- .../ProfileProgressActivityTest.kt | 2 +- .../ProfileProgressFragmentTest.kt | 2 +- .../app/recyclerview/BindableAdapterTest.kt | 2 +- .../resumelesson/ResumeLessonActivityTest.kt | 2 +- .../resumelesson/ResumeLessonFragmentTest.kt | 2 +- .../profile/ProfileEditActivityTest.kt | 2 +- .../profile/ProfileEditFragmentTest.kt | 2 +- .../profile/ProfileListActivityTest.kt | 2 +- .../profile/ProfileListFragmentTest.kt | 2 +- .../profile/ProfileRenameActivityTest.kt | 2 +- .../profile/ProfileRenameFragmentTest.kt | 2 +- .../profile/ProfileResetPinActivityTest.kt | 2 +- .../profile/ProfileResetPinFragmentTest.kt | 2 +- .../android/app/splash/SplashActivityTest.kt | 2 +- .../app/spotlight/SpotlightFragmentTest.kt | 2 +- .../android/app/story/StoryActivityTest.kt | 2 +- .../android/app/story/StoryFragmentTest.kt | 2 +- .../android/app/survey/SurveyActivityTest.kt | 2 +- .../android/app/survey/SurveyFragmentTest.kt | 2 +- .../app/testing/DragDropTestActivityTest.kt | 2 +- ...ionInputInteractionViewTestActivityTest.kt | 2 +- ...ImageRegionSelectionInteractionViewTest.kt | 2 +- .../InputInteractionViewTestActivityTest.kt | 2 +- .../NavigationDrawerActivityDebugTest.kt | 2 +- .../NavigationDrawerActivityProdTest.kt | 2 +- ...tioInputInteractionViewTestActivityTest.kt | 2 +- ...tFontScaleConfigurationUtilActivityTest.kt | 2 +- .../testing/TopicTestActivityForStoryTest.kt | 2 +- .../app/thirdparty/LicenseListActivityTest.kt | 2 +- .../app/thirdparty/LicenseListFragmentTest.kt | 2 +- .../LicenseTextViewerActivityTest.kt | 2 +- .../LicenseTextViewerFragmentTest.kt | 2 +- .../ThirdPartyDependencyListActivityTest.kt | 2 +- .../ThirdPartyDependencyListFragmentTest.kt | 2 +- .../android/app/topic/TopicActivityTest.kt | 2 +- .../android/app/topic/TopicFragmentTest.kt | 2 +- .../conceptcard/ConceptCardFragmentTest.kt | 2 +- .../app/topic/info/TopicInfoFragmentTest.kt | 2 +- .../topic/lessons/TopicLessonsFragmentTest.kt | 2 +- .../practice/TopicPracticeFragmentTest.kt | 2 +- .../QuestionPlayerActivityTest.kt | 2 +- .../revision/TopicRevisionFragmentTest.kt | 2 +- .../revisioncard/RevisionCardActivityTest.kt | 2 +- .../revisioncard/RevisionCardFragmentTest.kt | 2 +- .../app/utility/RatioExtensionsTest.kt | 2 +- .../walkthrough/WalkthroughActivityTest.kt | 2 +- .../WalkthroughFinalFragmentTest.kt | 2 +- .../WalkthroughTopicListFragmentTest.kt | 2 +- .../WalkthroughWelcomeFragmentTest.kt | 2 +- .../activity/ActivityIntentFactoriesTest.kt | 2 +- .../route/ActivityRouterModuleTest.kt | 2 +- .../app/activity/route/ActivityRouterTest.kt | 2 +- .../android/app/home/HomeActivityLocalTest.kt | 2 +- .../app/parser/FractionParsingUiErrorTest.kt | 2 +- .../parser/ListItemLeadingMarginSpanTest.kt | 2 +- .../app/parser/StringToRatioParserTest.kt | 2 +- .../ExplorationActivityLocalTest.kt | 2 +- .../player/state/StateFragmentLocalTest.kt | 2 +- .../ProfileChooserFragmentLocalTest.kt | 2 +- .../app/story/StoryActivityLocalTest.kt | 2 +- .../app/testing/CompletedStoryListSpanTest.kt | 2 +- .../oppia/android/app/testing/HomeSpanTest.kt | 2 +- .../app/testing/OngoingTopicListSpanTest.kt | 2 +- .../PlatformParameterIntegrationTest.kt | 2 +- .../app/testing/ProfileChooserSpanTest.kt | 2 +- .../testing/ProfileProgressSpanCountTest.kt | 2 +- .../app/testing/RecentlyPlayedSpanTest.kt | 2 +- .../app/testing/TopicRevisionSpanTest.kt | 2 +- .../app/testing/activity/TestActivityTest.kt | 2 +- .../AdministratorControlsFragmentTest.kt | 2 +- .../testing/options/OptionsFragmentTest.kt | 2 +- .../player/split/PlayerSplitScreenTest.kt | 2 +- .../state/StateFragmentAccessibilityTest.kt | 2 +- .../topic/info/TopicInfoFragmentLocalTest.kt | 2 +- .../lessons/TopicLessonsFragmentLocalTest.kt | 2 +- .../QuestionPlayerActivityLocalTest.kt | 2 +- .../RevisionCardActivityLocalTest.kt | 2 +- .../ActivityLanguageLocaleHandlerTest.kt | 2 +- .../AppLanguageResourceHandlerTest.kt | 2 +- .../AppLanguageWatcherMixinTest.kt | 2 +- .../app/utility/datetime/DateTimeUtilTest.kt | 2 +- .../MathExpressionAccessibilityUtilTest.kt | 2 +- .../domain/audio/AudioPlayerControllerTest.kt | 2 +- .../auth/AuthenticationControllerTest.kt | 4 +- .../ExplorationDataControllerTest.kt | 2 +- .../ExplorationProgressControllerTest.kt | 2 +- .../ExplorationCheckpointControllerTest.kt | 2 +- .../analytics/FirestoreDataControllerTest.kt | 2 +- .../analytics/LearnerAnalyticsLoggerTest.kt | 2 +- .../analytics/SurveyEventsLoggerTest.kt | 2 +- .../LogReportWorkManagerInitializerTest.kt | 2 +- .../loguploader/LogUploadWorkerTest.kt | 2 +- .../domain/survey/SurveyControllerTest.kt | 2 +- .../survey/SurveyProgressControllerTest.kt | 2 +- instrumentation/BUILD.bazel | 4 +- .../oppia_instrumentation_test.bzl | 2 +- .../instrumentation/application/BUILD.bazel | 2 +- .../application/TestApplicationComponent.kt | 2 +- testing/BUILD.bazel | 1 + .../android/testing/firebase/BUILD.bazel | 22 +++++++++ .../FakeFirebaseAuthWrapperImpl.kt | 2 +- .../TestAuthenticationModule.kt | 2 +- .../android/testing/firebase/BUILD.bazel | 48 +++++++++++++++++++ .../FakeFirebaseAuthWrapperImplTest.kt | 5 +- .../TestAuthenticationModuleTest.kt | 2 +- ...alizeDefaultLocaleRuleCustomContextTest.kt | 2 +- ...InitializeDefaultLocaleRuleOmissionTest.kt | 2 +- .../junit/InitializeDefaultLocaleRuleTest.kt | 2 +- 182 files changed, 254 insertions(+), 182 deletions(-) create mode 100644 testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel rename testing/src/main/java/org/oppia/android/testing/{ => firebase}/FakeFirebaseAuthWrapperImpl.kt (97%) rename testing/src/main/java/org/oppia/android/testing/{ => firebase}/TestAuthenticationModule.kt (90%) create mode 100644 testing/src/test/java/org/oppia/android/testing/firebase/BUILD.bazel rename testing/src/test/java/org/oppia/android/testing/{ => firebase}/FakeFirebaseAuthWrapperImplTest.kt (95%) rename testing/src/test/java/org/oppia/android/testing/{ => firebase}/TestAuthenticationModuleTest.kt (98%) diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt index 7d0dbf96afc..4a340d416ca 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityTest.kt @@ -103,8 +103,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt index ff5cba27e23..b50d9c099f2 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AdministratorControlsFragmentTest.kt @@ -91,8 +91,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt index cbe287cfaa9..82bc4bd09d3 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/AppVersionActivityTest.kt @@ -81,8 +81,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt index 2710157c685..4a76dfd4479 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivityTest.kt @@ -72,8 +72,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt index 9bd43e39012..925535d3433 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdFragmentTest.kt @@ -101,8 +101,8 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.logging.SyncStatusTestModule import org.oppia.android.testing.logging.TestSyncStatusManager diff --git a/app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt index 17f0c3d6f73..60c1d8e03c9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/completedstorylist/CompletedStoryListActivityTest.kt @@ -84,8 +84,8 @@ import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt b/app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt index 29a4743fe20..7eb357dd46a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/customview/LessonThumbnailImageViewTest.kt @@ -64,9 +64,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt index 768ba9a67a0..2b8ea2dc02d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/customview/interaction/MathExpressionInteractionsViewTest.kt @@ -78,9 +78,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.junit.OppiaParameterizedTestRunner import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt index 7ea576a3ebb..ade4a20211d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdaptersTest.kt @@ -65,9 +65,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt index c84c6fc96b2..426294f59cf 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdaptersTest.kt @@ -68,10 +68,10 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt index 5a81aa9f654..9817db99f6a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/DrawableBindingAdaptersTest.kt @@ -69,9 +69,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt index 72f19842249..d5690443bad 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/ImageViewBindingAdaptersTest.kt @@ -74,9 +74,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt index 7bdc00ef976..b720fc78a5d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/MarginBindingAdaptersTest.kt @@ -78,9 +78,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt index 9e8a843ee06..0e7f32257a7 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdaptersTest.kt @@ -77,9 +77,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt index 073add10f38..104b314ef64 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdaptersTest.kt @@ -75,9 +75,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt index ca6a286febb..235498e6ef2 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/TextViewBindingAdaptersTest.kt @@ -67,9 +67,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt b/app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt index 9db806e5f0e..716820377d4 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/databinding/ViewBindingAdaptersTest.kt @@ -72,9 +72,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt index 55bbad1e323..e2c0034aad8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityTest.kt @@ -91,8 +91,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt index 8247b045e36..29ea1a94163 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentTest.kt @@ -86,9 +86,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt index 59415795065..0c666f19607 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedActivityTest.kt @@ -77,8 +77,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt index 6125413e6f6..af03c3a086e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkChaptersCompletedFragmentTest.kt @@ -82,9 +82,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.topic.StoryProgressController import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt index 8d8204d9684..e36a5e93b11 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedActivityTest.kt @@ -68,8 +68,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt index e67d776813a..489691717d9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkStoriesCompletedFragmentTest.kt @@ -77,8 +77,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt index 5a575360d80..5e9cfb3fdc4 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedActivityTest.kt @@ -68,8 +68,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt index 78214587b28..47e4e0c33a0 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/MarkTopicsCompletedFragmentTest.kt @@ -77,8 +77,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt index 94dab9dd41d..a3a48b24828 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsActivityTest.kt @@ -69,7 +69,7 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt index 6ec2a227ec1..c42f916f8fa 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/ViewEventLogsFragmentTest.kt @@ -83,7 +83,7 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeFirestoreInstanceWrapperImpl import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt index 7bc720e4ae0..c163e91f5e0 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeActivityTest.kt @@ -69,8 +69,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt index 25cccdd0bd1..596ce0b7623 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentTest.kt @@ -73,8 +73,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt index 517da7ca48a..c8c71821bc8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserActivityTest.kt @@ -65,8 +65,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt index cac62ddb6b4..b5d32fa77ee 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/devoptions/mathexpressionparser/MathExpressionParserFragmentTest.kt @@ -74,10 +74,10 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt index 41fefe4329b..48da829d39e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQListFragmentTest.kt @@ -79,8 +79,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt index 90d49553c6c..9bfd477a36b 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/faq/FAQSingleActivityTest.kt @@ -75,8 +75,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt index 680afbdeb44..9b25a1320d4 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/faq/FaqListActivityTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt index f00931977eb..f48c81b20ee 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/HelpActivityTest.kt @@ -62,8 +62,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt index 73cfb22be58..74fbc2f0e70 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/help/HelpFragmentTest.kt @@ -93,9 +93,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt index f5e058dfb62..7bcd6a4a196 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/HomeActivityTest.kt @@ -121,10 +121,10 @@ import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt index 0aca510567f..e03c49a7ca7 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/RecentlyPlayedFragmentTest.kt @@ -108,9 +108,9 @@ import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.lightweightcheckpointing.ExplorationCheckpointTestHelper import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_STORY_0_EXPLORATION_0_CURRENT_VERSION diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt index 97fc6eb4f8c..19d874cc4a9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/TopicSummaryViewModelTest.kt @@ -66,8 +66,8 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.translation.TranslationController import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt index 9ede16565ca..59ec6348510 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/WelcomeViewModelTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt index 99cd9dcd48e..5fd5a452779 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryListViewModelTest.kt @@ -66,8 +66,8 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.translation.TranslationController import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt b/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt index ac309882dd1..0ac61cb1caa 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/home/promotedlist/PromotedStoryViewModelTest.kt @@ -64,8 +64,8 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.translation.TranslationController import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt index c42a30b0d55..ff6d31f06d7 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsActivityTest.kt @@ -61,8 +61,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt index 2441f617b3d..447b3d33ed1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/mydownloads/MyDownloadsFragmentTest.kt @@ -71,8 +71,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/BetaNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/BetaNoticeDialogFragmentTest.kt index b98726e61f3..423822f8d19 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/BetaNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/BetaNoticeDialogFragmentTest.kt @@ -74,9 +74,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/ForcedAppDeprecationNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/ForcedAppDeprecationNoticeDialogFragmentTest.kt index 675426fe1eb..1af22c3a018 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/ForcedAppDeprecationNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/ForcedAppDeprecationNoticeDialogFragmentTest.kt @@ -74,9 +74,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt index 29c1cde2351..171e62cd76c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/GeneralAvailabilityUpgradeNoticeDialogFragmentTest.kt @@ -74,9 +74,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/OptionalAppDeprecationNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/OptionalAppDeprecationNoticeDialogFragmentTest.kt index b981373f23d..db82579e4e9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/OptionalAppDeprecationNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/OptionalAppDeprecationNoticeDialogFragmentTest.kt @@ -74,9 +74,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/notice/OsDeprecationNoticeDialogFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/notice/OsDeprecationNoticeDialogFragmentTest.kt index 1a522d1242d..51afc4b45e2 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/notice/OsDeprecationNoticeDialogFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/notice/OsDeprecationNoticeDialogFragmentTest.kt @@ -74,9 +74,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt index 23704d8ef36..10a388f6f4a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingActivityTest.kt @@ -62,8 +62,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt index e1227d6396f..43dc8c7cef0 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/onboarding/OnboardingFragmentTest.kt @@ -88,8 +88,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt index bf37a173a38..d19b037818d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListActivityTest.kt @@ -82,8 +82,8 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.topic.RATIOS_TOPIC_ID import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt index 52e8a3cc154..3a2e401d0c5 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageActivityTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt index 07df1432348..cdb12ba202c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/AppLanguageFragmentTest.kt @@ -75,9 +75,9 @@ import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt index a87d648e98e..52be8c16782 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageActivityTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt index 9511978a74b..c7b5bfe0d86 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/AudioLanguageFragmentTest.kt @@ -74,8 +74,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt index 7aff373149c..dd9d85926e2 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/OptionsActivityTest.kt @@ -62,8 +62,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt index da8a49d42a3..8788ead2ab6 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/OptionsFragmentTest.kt @@ -90,9 +90,9 @@ import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt index 6c54efd52c8..ee07540d885 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeActivityTest.kt @@ -62,8 +62,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt index 56933de3067..df07900e97a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/options/ReadingTextSizeFragmentTest.kt @@ -77,8 +77,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt b/app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt index a655da4b9e0..571ba12ee85 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/parser/HtmlParserTest.kt @@ -102,10 +102,10 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.mockito.capture diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt index 173b024aa5f..4f3fb329a19 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/player/audio/AudioFragmentTest.kt @@ -87,9 +87,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.IsOnRobolectric diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BottomSheetOptionsMenuTest.kt b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BottomSheetOptionsMenuTest.kt index e390e6eea1a..e378c5285bd 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BottomSheetOptionsMenuTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/BottomSheetOptionsMenuTest.kt @@ -70,9 +70,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt index 6245681585e..800916c4391 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/player/exploration/ExplorationActivityTest.kt @@ -130,11 +130,11 @@ import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.lightweightcheckpointing.ExplorationCheckpointTestHelper import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_STORY_0_EXPLORATION_1_CURRENT_VERSION diff --git a/app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt index 0ee896da96d..f295bd9c3e5 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/player/state/StateFragmentTest.kt @@ -151,13 +151,13 @@ import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.lightweightcheckpointing.ExplorationCheckpointTestHelper import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat diff --git a/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesActivityTest.kt index 95dd5e209d2..d8d95d2bab1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesActivityTest.kt @@ -79,9 +79,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt index 2a318c9324a..07790dc33d8 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/policies/PoliciesFragmentTest.kt @@ -91,9 +91,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt index 175b0a62bf9..34dfb5f3b18 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/AddProfileActivityTest.kt @@ -96,12 +96,12 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasHelperText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasNoErrorText +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt index cb49cff5daa..cfabe083384 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminAuthActivityTest.kt @@ -82,10 +82,10 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt index ea44c5d0d1c..b6fdce97344 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/AdminPinActivityTest.kt @@ -91,11 +91,11 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasNoErrorText +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt index f65a6f5f45a..90c78003600 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/PinPasswordActivityTest.kt @@ -87,11 +87,11 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasNoErrorText +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt index 3442c182a7d..74d2f607988 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserActivityTest.kt @@ -62,8 +62,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt index 0418a1339a8..5fff9c4006b 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profile/ProfileChooserFragmentTest.kt @@ -84,8 +84,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt index 57d8180ed22..deb1c56251e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfilePictureActivityTest.kt @@ -70,8 +70,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt index fc6c676d227..1cad2587804 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressActivityTest.kt @@ -62,8 +62,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt index a4c5187cf25..2f83eb95f5d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/profileprogress/ProfileProgressFragmentTest.kt @@ -108,8 +108,8 @@ import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt b/app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt index 1d48ecfcf71..c85a4d1c524 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/recyclerview/BindableAdapterTest.kt @@ -98,8 +98,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt index 988cbe99df3..e1e8707c853 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonActivityTest.kt @@ -82,9 +82,9 @@ import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt index 7bbc505d9dc..cf138d0d1f3 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentTest.kt @@ -84,9 +84,9 @@ import org.oppia.android.domain.topic.RATIOS_STORY_ID_0 import org.oppia.android.domain.topic.RATIOS_TOPIC_ID import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt index ab1aa374f27..1b3a285f095 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditActivityTest.kt @@ -79,8 +79,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt index a6f02aa8d7c..72346233590 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileEditFragmentTest.kt @@ -84,10 +84,10 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt index fe93ebd5339..ec65e61024a 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListActivityTest.kt @@ -62,8 +62,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt index 5e571de6a91..d94a0d75a11 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileListFragmentTest.kt @@ -76,8 +76,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt index dc8534a913f..8aff6c18532 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameActivityTest.kt @@ -63,9 +63,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt index e95194f1de1..77f2aa4d7d0 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentTest.kt @@ -78,11 +78,11 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasNoErrorText +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt index 0a0d8c22316..1e473a5e4a9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinActivityTest.kt @@ -64,9 +64,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt index ce23631d2a0..a78db5e7ce2 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentTest.kt @@ -79,11 +79,11 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.TextInputAction.Companion.hasErrorText import org.oppia.android.testing.espresso.TextInputAction.Companion.hasNoErrorText +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/splash/SplashActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/splash/SplashActivityTest.kt index 2ccef97076a..5fa6d2d41eb 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/splash/SplashActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/splash/SplashActivityTest.kt @@ -95,10 +95,10 @@ import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.OppiaParameterizedTestRunner import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter diff --git a/app/src/sharedTest/java/org/oppia/android/app/spotlight/SpotlightFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/spotlight/SpotlightFragmentTest.kt index 36f978df8c1..35df5325f0e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/spotlight/SpotlightFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/spotlight/SpotlightFragmentTest.kt @@ -72,9 +72,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt index c4a1776e814..1dda62f55f4 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/story/StoryActivityTest.kt @@ -85,9 +85,9 @@ import org.oppia.android.domain.topic.TEST_TOPIC_ID_0 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.DisableAccessibilityChecks import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt index 1e30882456e..3a9760cec83 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/story/StoryFragmentTest.kt @@ -116,8 +116,8 @@ import org.oppia.android.domain.topic.TEST_TOPIC_ID_0 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.DisableAccessibilityChecks import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.mockito.anyOrNull import org.oppia.android.testing.mockito.capture diff --git a/app/src/sharedTest/java/org/oppia/android/app/survey/SurveyActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/survey/SurveyActivityTest.kt index 4af4459dfef..61ace850d0e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/survey/SurveyActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/survey/SurveyActivityTest.kt @@ -66,8 +66,8 @@ import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_2 import org.oppia.android.domain.topic.TEST_TOPIC_ID_0 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/survey/SurveyFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/survey/SurveyFragmentTest.kt index f1398787462..cf4de9db27c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/survey/SurveyFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/survey/SurveyFragmentTest.kt @@ -89,8 +89,8 @@ import org.oppia.android.domain.topic.TEST_TOPIC_ID_0 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.logging.EventLogSubject import org.oppia.android.testing.platformparameter.TestPlatformParameterModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt index 966ada83745..9e7aa64cd7e 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/DragDropTestActivityTest.kt @@ -72,8 +72,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt index 7f5c52581a6..fb4b7a677f4 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivityTest.kt @@ -72,9 +72,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.DisableAccessibilityChecks import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt index 11088d08c32..a2097b83928 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/ImageRegionSelectionInteractionViewTest.kt @@ -83,10 +83,10 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.mockito.capture import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt index 9041d7fa64d..2ce962ee356 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/InputInteractionViewTestActivityTest.kt @@ -72,9 +72,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.DisableAccessibilityChecks import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt index 0fac18cd543..6ede2fb1889 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityDebugTest.kt @@ -99,9 +99,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt index 9ec9f47ee79..2ac71b84993 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/NavigationDrawerActivityProdTest.kt @@ -107,9 +107,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivityTest.kt index 57b3c1b0604..3968ee5bda7 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivityTest.kt @@ -79,9 +79,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.DisableAccessibilityChecks import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt index 5815a6f0971..906d24f97a1 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivityTest.kt @@ -67,8 +67,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt b/app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt index 03c8b40c315..f59711ead38 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/testing/TopicTestActivityForStoryTest.kt @@ -71,8 +71,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt index cc6d13cc284..b73ce7a0773 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListActivityTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt index b50e60a6cfa..a8dd3ae36fd 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseListFragmentTest.kt @@ -78,8 +78,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt index e1545f34c32..fb424fd2440 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerActivityTest.kt @@ -71,8 +71,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt index 03d9b1c666a..07bb62e85c9 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/LicenseTextViewerFragmentTest.kt @@ -68,8 +68,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt index da5a3be066d..0a2fd1f4fa4 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListActivityTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt index 7691445e8a2..419fa4515ef 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/thirdparty/ThirdPartyDependencyListFragmentTest.kt @@ -77,8 +77,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt index 8cf06d4dfb4..a82efa5f8cb 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/TopicActivityTest.kt @@ -82,9 +82,9 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt index 0b42029e742..875d5936cb5 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/TopicFragmentTest.kt @@ -94,8 +94,8 @@ import org.oppia.android.domain.topic.RATIOS_TOPIC_ID import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat import org.oppia.android.testing.platformparameter.TestPlatformParameterModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt index 846884c529d..ac0c6ab72aa 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentTest.kt @@ -103,11 +103,11 @@ import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RichTextViewMatcher.Companion.containsRichText import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt index a8ea6bf7896..9cfb0cd31d6 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/info/TopicInfoFragmentTest.kt @@ -88,11 +88,11 @@ import org.oppia.android.domain.topic.RATIOS_TOPIC_ID import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.espresso.ImageViewMatcher.Companion.hasScaleType +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt index 45abdc11143..ed64716a398 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentTest.kt @@ -110,8 +110,8 @@ import org.oppia.android.domain.topic.RATIOS_STORY_ID_0 import org.oppia.android.domain.topic.RATIOS_TOPIC_ID import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.lightweightcheckpointing.ExplorationCheckpointTestHelper import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_STORY_0_EXPLORATION_0_CURRENT_VERSION diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt index 3f8b7eae213..c4ec0d84a88 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/practice/TopicPracticeFragmentTest.kt @@ -88,8 +88,8 @@ import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt index 9bd58c51e8c..03423d24c83 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityTest.kt @@ -126,11 +126,11 @@ import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.espresso.EditTextInputAction +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt index 2daf1860e6b..de936dccb21 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/revision/TopicRevisionFragmentTest.kt @@ -89,10 +89,10 @@ import org.oppia.android.domain.topic.FRACTIONS_TOPIC_ID import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.ImageViewMatcher.Companion.hasScaleType +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt index 278c43c94d8..d570e4ec204 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityTest.kt @@ -82,10 +82,10 @@ import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt index 7422990cea4..5831cc043b5 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/topic/revisioncard/RevisionCardFragmentTest.kt @@ -104,11 +104,11 @@ import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.DisableAccessibilityChecks import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt b/app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt index f8e1dedfdb9..fa2d84e008c 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/utility/RatioExtensionsTest.kt @@ -60,8 +60,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt index e289674673e..b583e012dc7 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughActivityTest.kt @@ -74,8 +74,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt index 79e0caf8e70..2b6ab7d39bc 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughFinalFragmentTest.kt @@ -76,8 +76,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt index d90dca2bb15..ee17909aa1d 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughTopicListFragmentTest.kt @@ -77,11 +77,11 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.environment.TestEnvironmentConfig import org.oppia.android.testing.espresso.GenericViewMatchers.Companion.withOpaqueBackground +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt index 0634f55de2b..288fa127272 100644 --- a/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt +++ b/app/src/sharedTest/java/org/oppia/android/app/walkthrough/WalkthroughWelcomeFragmentTest.kt @@ -72,8 +72,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt b/app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt index 47a343b0316..5d0844289a3 100644 --- a/app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt +++ b/app/src/test/java/org/oppia/android/app/activity/ActivityIntentFactoriesTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterModuleTest.kt b/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterModuleTest.kt index 104ee920e47..d90f9471261 100644 --- a/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterModuleTest.kt +++ b/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterModuleTest.kt @@ -64,8 +64,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt b/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt index bea5d205bc5..f644125b802 100644 --- a/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt +++ b/app/src/test/java/org/oppia/android/app/activity/route/ActivityRouterTest.kt @@ -74,8 +74,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt index 5c86e2b542c..d9eb01477ec 100644 --- a/app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/home/HomeActivityLocalTest.kt @@ -64,8 +64,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt b/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt index 1b5dbb6b44a..d22af58e95b 100644 --- a/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt +++ b/app/src/test/java/org/oppia/android/app/parser/FractionParsingUiErrorTest.kt @@ -58,8 +58,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt b/app/src/test/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt index 7aa3bba8f81..d993ffd3de8 100644 --- a/app/src/test/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/parser/ListItemLeadingMarginSpanTest.kt @@ -84,10 +84,10 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.TestPlatform +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt b/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt index 794be78f7bc..acbf5c9fec8 100644 --- a/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt +++ b/app/src/test/java/org/oppia/android/app/parser/StringToRatioParserTest.kt @@ -59,9 +59,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt index 9ba1741236e..edc6c0a91e3 100644 --- a/app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/player/exploration/ExplorationActivityLocalTest.kt @@ -70,8 +70,8 @@ import org.oppia.android.domain.topic.TEST_STORY_ID_0 import org.oppia.android.domain.topic.TEST_TOPIC_ID_0 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt index 1d278a6a9da..c5442bff54e 100644 --- a/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/player/state/StateFragmentLocalTest.kt @@ -138,7 +138,6 @@ import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.BuildEnvironment import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestImageLoaderModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor @@ -146,6 +145,7 @@ import org.oppia.android.testing.environment.TestEnvironmentConfig import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.KonfettiViewMatcher.Companion.hasActiveConfetti import org.oppia.android.testing.espresso.KonfettiViewMatcher.Companion.hasExpectedNumberOfActiveSystems +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule diff --git a/app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt index 35dd0310c63..9ac373f8edd 100644 --- a/app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/profile/ProfileChooserFragmentLocalTest.kt @@ -61,8 +61,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt index ee383f8ec5b..2b60ef54096 100644 --- a/app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/story/StoryActivityLocalTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt index 5ecdfdcf3cc..b837db394bf 100644 --- a/app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/CompletedStoryListSpanTest.kt @@ -64,8 +64,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt index 7ef9b806b93..1ed839774da 100644 --- a/app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/HomeSpanTest.kt @@ -64,8 +64,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt index b38e93506fd..6f4ecf14c9a 100644 --- a/app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/OngoingTopicListSpanTest.kt @@ -65,8 +65,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt b/app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt index 0941c35c37c..68f5e78c518 100644 --- a/app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/PlatformParameterIntegrationTest.kt @@ -81,8 +81,8 @@ import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUp import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.network.MockPlatformParameterService import org.oppia.android.testing.network.RetrofitTestModule diff --git a/app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt index bfea9b66185..e0f11812c55 100644 --- a/app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/ProfileChooserSpanTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt b/app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt index 83608031b85..4dd699158b9 100644 --- a/app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/ProfileProgressSpanCountTest.kt @@ -64,8 +64,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt index fed517d1912..8d05adc7ebf 100644 --- a/app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/RecentlyPlayedSpanTest.kt @@ -67,8 +67,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.story.StoryProgressTestHelper diff --git a/app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt b/app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt index 5fe8a3fb3c8..55574573642 100644 --- a/app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/TopicRevisionSpanTest.kt @@ -63,8 +63,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt b/app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt index f23ffd3dd6b..23e0211298b 100644 --- a/app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/activity/TestActivityTest.kt @@ -60,8 +60,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt b/app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt index e6d2a7f4812..c9d01ffbce5 100644 --- a/app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/administratorcontrols/AdministratorControlsFragmentTest.kt @@ -70,8 +70,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt b/app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt index bd942c2b0e4..462d087efd6 100644 --- a/app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/options/OptionsFragmentTest.kt @@ -66,8 +66,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.profile.ProfileTestHelper diff --git a/app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt b/app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt index 649ad5306b8..9e3c3edc499 100644 --- a/app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/player/split/PlayerSplitScreenTest.kt @@ -61,8 +61,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt b/app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt index 7b33b32cad0..fd39ae0660e 100644 --- a/app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt +++ b/app/src/test/java/org/oppia/android/app/testing/player/state/StateFragmentAccessibilityTest.kt @@ -70,8 +70,8 @@ import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_4 import org.oppia.android.domain.topic.TEST_STORY_ID_0 import org.oppia.android.domain.topic.TEST_TOPIC_ID_0 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt index cda806ffed1..f4e4081e436 100644 --- a/app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/topic/info/TopicInfoFragmentLocalTest.kt @@ -60,8 +60,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt b/app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt index b5ef86c5597..d48ad3f170c 100644 --- a/app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/topic/lessons/TopicLessonsFragmentLocalTest.kt @@ -60,8 +60,8 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt index b388ade740a..c5cfcca74d3 100644 --- a/app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityLocalTest.kt @@ -87,10 +87,10 @@ import org.oppia.android.domain.question.WrongAnswerScorePenalty import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.topic.TEST_SKILL_ID_1 import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.espresso.EditTextInputAction import org.oppia.android.testing.espresso.KonfettiViewMatcher.Companion.hasActiveConfetti +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt b/app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt index 42b14d83075..8667a942f21 100644 --- a/app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt +++ b/app/src/test/java/org/oppia/android/app/topic/revisioncard/RevisionCardActivityLocalTest.kt @@ -62,8 +62,8 @@ import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.topic.SUBTOPIC_TOPIC_ID import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.FakeAnalyticsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt b/app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt index b234a2ae58a..408d7df55fa 100644 --- a/app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/ActivityLanguageLocaleHandlerTest.kt @@ -73,9 +73,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.translation.TranslationController import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt b/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt index 9ce6d2ce22c..5689577c68c 100644 --- a/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/AppLanguageResourceHandlerTest.kt @@ -66,10 +66,10 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.translation.TranslationController import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.junit.OppiaParameterizedTestRunner import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration diff --git a/app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt b/app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt index 95f05fa2ebb..f3231f3ac7e 100644 --- a/app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt +++ b/app/src/test/java/org/oppia/android/app/translation/AppLanguageWatcherMixinTest.kt @@ -71,9 +71,9 @@ import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.translation.TranslationController import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.DefineAppLanguageLocaleContext import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.profile.ProfileTestHelper diff --git a/app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt b/app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt index 5cd6e77f8cf..ea9a9d89a34 100644 --- a/app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt +++ b/app/src/test/java/org/oppia/android/app/utility/datetime/DateTimeUtilTest.kt @@ -61,8 +61,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt b/app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt index 64800e1d5e8..97bff878691 100644 --- a/app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt +++ b/app/src/test/java/org/oppia/android/app/utility/math/MathExpressionAccessibilityUtilTest.kt @@ -78,8 +78,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule import org.oppia.android.testing.junit.OppiaParameterizedTestRunner import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration diff --git a/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt index dbf2d829fe1..f7652a7e08b 100644 --- a/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/audio/AudioPlayerControllerTest.kt @@ -53,11 +53,11 @@ import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_5 import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.FakeExceptionLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.data.AsyncResultSubject.Companion.assertThat import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/domain/src/test/java/org/oppia/android/domain/auth/AuthenticationControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/auth/AuthenticationControllerTest.kt index ca80f6e297d..4208244c46e 100644 --- a/domain/src/test/java/org/oppia/android/domain/auth/AuthenticationControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/auth/AuthenticationControllerTest.kt @@ -14,10 +14,10 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.testing.FakeFirebaseAuthWrapperImpl -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows +import org.oppia.android.testing.firebase.FakeFirebaseAuthWrapperImpl +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.time.FakeOppiaClockModule import org.oppia.android.util.data.DataProvidersInjector diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationDataControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationDataControllerTest.kt index 8aab3fe63ad..deee65f9f9a 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationDataControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationDataControllerTest.kt @@ -50,10 +50,10 @@ import org.oppia.android.domain.topic.TEST_STORY_ID_2 import org.oppia.android.domain.topic.TEST_TOPIC_ID_0 import org.oppia.android.domain.topic.TEST_TOPIC_ID_1 import org.oppia.android.testing.FakeExceptionLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt index f70c336f8bc..af38311d4b5 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressControllerTest.kt @@ -83,11 +83,11 @@ import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.FakeExceptionLogger import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.RunOn -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat import org.oppia.android.testing.robolectric.RobolectricModule diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/ExplorationCheckpointControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/ExplorationCheckpointControllerTest.kt index 6256ff55290..bfef2cedd25 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/ExplorationCheckpointControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/lightweightcheckpointing/ExplorationCheckpointControllerTest.kt @@ -49,10 +49,10 @@ import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.topic.FRACTIONS_EXPLORATION_ID_0 import org.oppia.android.domain.topic.FRACTIONS_EXPLORATION_ID_1 -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor import org.oppia.android.testing.environment.TestEnvironmentConfig +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.lightweightcheckpointing.ExplorationCheckpointTestHelper import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_EXPLORATION_0_TITLE import org.oppia.android.testing.lightweightcheckpointing.FRACTIONS_STORY_0_EXPLORATION_0_CURRENT_VERSION diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FirestoreDataControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FirestoreDataControllerTest.kt index 02b49b292a9..2de079ee3c0 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FirestoreDataControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/FirestoreDataControllerTest.kt @@ -27,9 +27,9 @@ import org.oppia.android.domain.oppialogger.FirestoreLogStorageCacheSize import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.FakeFirestoreEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt index 74ab58fe35e..a036c2a304d 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/LearnerAnalyticsLoggerTest.kt @@ -43,9 +43,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_2 import org.oppia.android.domain.topic.TEST_EXPLORATION_ID_5 import org.oppia.android.testing.FakeAnalyticsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.OppiaParameterizedTestRunner import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Iteration import org.oppia.android.testing.junit.OppiaParameterizedTestRunner.Parameter diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/SurveyEventsLoggerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/SurveyEventsLoggerTest.kt index f82ab30c03d..a8962bb0af4 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/SurveyEventsLoggerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/analytics/SurveyEventsLoggerTest.kt @@ -23,8 +23,8 @@ import org.oppia.android.domain.oppialogger.survey.SurveyEventsLogger import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.FakeFirestoreEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject.Companion.assertThat import org.oppia.android.testing.logging.SyncStatusTestModule import org.oppia.android.testing.platformparameter.TestPlatformParameterModule diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt index 50450041a09..9f9443e1708 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogReportWorkManagerInitializerTest.kt @@ -38,8 +38,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.testing.oppialogger.loguploader.FakeLogUploader import org.oppia.android.testing.FakeExceptionLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerTest.kt index 1b715670f33..6ecf7a83e28 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/loguploader/LogUploadWorkerTest.kt @@ -44,8 +44,8 @@ import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.FakeExceptionLogger import org.oppia.android.testing.FakeFirestoreEventLogger import org.oppia.android.testing.FakePerformanceMetricsEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.SyncStatusTestModule import org.oppia.android.testing.logging.TestSyncStatusManager import org.oppia.android.testing.mockito.anyOrNull diff --git a/domain/src/test/java/org/oppia/android/domain/survey/SurveyControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/survey/SurveyControllerTest.kt index 4517b0b6504..8ea319426f5 100644 --- a/domain/src/test/java/org/oppia/android/domain/survey/SurveyControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/survey/SurveyControllerTest.kt @@ -19,9 +19,9 @@ import org.oppia.android.domain.oppialogger.ApplicationIdSeed import org.oppia.android.domain.oppialogger.LogStorageModule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.testing.FakeExceptionLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers import org.oppia.android.testing.threading.TestDispatcherModule diff --git a/domain/src/test/java/org/oppia/android/domain/survey/SurveyProgressControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/survey/SurveyProgressControllerTest.kt index e0e8e1deade..ea336df027a 100644 --- a/domain/src/test/java/org/oppia/android/domain/survey/SurveyProgressControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/survey/SurveyProgressControllerTest.kt @@ -25,9 +25,9 @@ import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.testing.FakeAnalyticsEventLogger import org.oppia.android.testing.FakeExceptionLogger import org.oppia.android.testing.FakeFirestoreEventLogger -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.data.DataProviderTestMonitor +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.logging.EventLogSubject import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestCoroutineDispatchers diff --git a/instrumentation/BUILD.bazel b/instrumentation/BUILD.bazel index eeb4f436d50..f6ffffcdc8a 100644 --- a/instrumentation/BUILD.bazel +++ b/instrumentation/BUILD.bazel @@ -6,10 +6,10 @@ Note that: of the test suite. """ -exports_files(["src/javatests/AndroidManifest.xml"]) - load("@bazel_skylib//rules:build_test.bzl", "build_test") +exports_files(["src/javatests/AndroidManifest.xml"]) + # Used for end-to-end tests android_binary( name = "oppia_test", diff --git a/instrumentation/oppia_instrumentation_test.bzl b/instrumentation/oppia_instrumentation_test.bzl index 8a3f74b64ce..6319bbf0ba3 100644 --- a/instrumentation/oppia_instrumentation_test.bzl +++ b/instrumentation/oppia_instrumentation_test.bzl @@ -2,8 +2,8 @@ Instrumentation macros to define up end-to-end tests. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") def oppia_instrumentation_test( name, diff --git a/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel b/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel index 5d9fe4ac612..5e9c6382d77 100644 --- a/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel +++ b/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel @@ -25,7 +25,7 @@ kt_android_library( "//app/src/main/java/org/oppia/android/app/application/testing:testing_build_flavor_module", "//data/src/main/java/org/oppia/android/data/backends/gae:network_config_annotations", "//domain", - "//testing", + "//testing/src/main/java/org/oppia/android/testing/firebase:test_authentication_module", "//utility", "//utility/src/main/java/org/oppia/android/util/logging:standard_event_logging_configuration_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_module", diff --git a/instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt b/instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt index fbf99ee8103..fe588b21105 100644 --- a/instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt +++ b/instrumentation/src/java/org/oppia/android/instrumentation/application/TestApplicationComponent.kt @@ -45,7 +45,7 @@ import org.oppia.android.domain.platformparameter.syncup.PlatformParameterSyncUp import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.util.accessibility.AccessibilityProdModule import org.oppia.android.util.caching.AssetModule import org.oppia.android.util.caching.CachingModule diff --git a/testing/BUILD.bazel b/testing/BUILD.bazel index 9bed8754f08..95a90957cfd 100644 --- a/testing/BUILD.bazel +++ b/testing/BUILD.bazel @@ -40,6 +40,7 @@ kt_android_library( "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//testing/src/main/java/org/oppia/android/testing/data:async_result_subject", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", + "//testing/src/main/java/org/oppia/android/testing/firebase:test_authentication_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_coroutine_dispatchers", "//testing/src/main/java/org/oppia/android/testing/time:fake_oppia_clock", "//third_party:androidx_core_core-ktx", diff --git a/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel new file mode 100644 index 00000000000..78b9c0ffb82 --- /dev/null +++ b/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel @@ -0,0 +1,22 @@ +""" +Package for test-only Firebase utilities. +""" + +load("@dagger//:workspace_defs.bzl", "dagger_rules") +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") + +kt_android_library( + name = "test_authentication_module", + testonly = True, + srcs = [ + "FakeFirebaseAuthWrapperImpl.kt", + "TestAuthenticationModule.kt", + ], + visibility = ["//:oppia_testing_visibility"], + deps = [ + ":dagger", + "//domain/src/main/java/org/oppia/android/domain/auth:firebase_auth_wrapper", + ], +) + +dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/FakeFirebaseAuthWrapperImpl.kt b/testing/src/main/java/org/oppia/android/testing/firebase/FakeFirebaseAuthWrapperImpl.kt similarity index 97% rename from testing/src/main/java/org/oppia/android/testing/FakeFirebaseAuthWrapperImpl.kt rename to testing/src/main/java/org/oppia/android/testing/firebase/FakeFirebaseAuthWrapperImpl.kt index 8f8a9d54b53..616448ce4a2 100644 --- a/testing/src/main/java/org/oppia/android/testing/FakeFirebaseAuthWrapperImpl.kt +++ b/testing/src/main/java/org/oppia/android/testing/firebase/FakeFirebaseAuthWrapperImpl.kt @@ -1,4 +1,4 @@ -package org.oppia.android.testing +package org.oppia.android.testing.firebase import org.oppia.android.domain.auth.FirebaseAuthWrapper import org.oppia.android.domain.auth.FirebaseUserWrapper diff --git a/testing/src/main/java/org/oppia/android/testing/TestAuthenticationModule.kt b/testing/src/main/java/org/oppia/android/testing/firebase/TestAuthenticationModule.kt similarity index 90% rename from testing/src/main/java/org/oppia/android/testing/TestAuthenticationModule.kt rename to testing/src/main/java/org/oppia/android/testing/firebase/TestAuthenticationModule.kt index ed973730f5a..649f684b064 100644 --- a/testing/src/main/java/org/oppia/android/testing/TestAuthenticationModule.kt +++ b/testing/src/main/java/org/oppia/android/testing/firebase/TestAuthenticationModule.kt @@ -1,4 +1,4 @@ -package org.oppia.android.testing +package org.oppia.android.testing.firebase import dagger.Module import dagger.Provides diff --git a/testing/src/test/java/org/oppia/android/testing/firebase/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/firebase/BUILD.bazel new file mode 100644 index 00000000000..c6d5f002b6d --- /dev/null +++ b/testing/src/test/java/org/oppia/android/testing/firebase/BUILD.bazel @@ -0,0 +1,48 @@ +""" +Tests for test-only Firebase utilities. +""" + +load("@dagger//:workspace_defs.bzl", "dagger_rules") +load("//:oppia_android_test.bzl", "oppia_android_test") + +oppia_android_test( + name = "FakeFirebaseAuthWrapperImplTest", + srcs = ["FakeFirebaseAuthWrapperImplTest.kt"], + custom_package = "org.oppia.android.testing.firebase", + test_class = "org.oppia.android.testing.firebase.FakeFirebaseAuthWrapperImplTest", + test_manifest = "//testing:test_manifest", + deps = [ + ":dagger", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", + "//testing", + "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", + "//testing/src/main/java/org/oppia/android/testing/threading:test_module", + "//testing/src/main/java/org/oppia/android/testing/time:test_module", + "//third_party:com_google_truth_truth", + "//third_party:junit_junit", + "//third_party:org_robolectric_robolectric", + "//third_party:robolectric_android-all", + ], +) + +oppia_android_test( + name = "TestAuthenticationModuleTest", + srcs = ["TestAuthenticationModuleTest.kt"], + custom_package = "org.oppia.android.testing.firebase", + test_class = "org.oppia.android.testing.firebase.TestAuthenticationModuleTest", + test_manifest = "//testing:test_manifest", + deps = [ + ":dagger", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", + "//testing", + "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", + "//testing/src/main/java/org/oppia/android/testing/threading:test_module", + "//testing/src/main/java/org/oppia/android/testing/time:test_module", + "//third_party:com_google_truth_truth", + "//third_party:junit_junit", + "//third_party:org_robolectric_robolectric", + "//third_party:robolectric_android-all", + ], +) + +dagger_rules() diff --git a/testing/src/test/java/org/oppia/android/testing/FakeFirebaseAuthWrapperImplTest.kt b/testing/src/test/java/org/oppia/android/testing/firebase/FakeFirebaseAuthWrapperImplTest.kt similarity index 95% rename from testing/src/test/java/org/oppia/android/testing/FakeFirebaseAuthWrapperImplTest.kt rename to testing/src/test/java/org/oppia/android/testing/firebase/FakeFirebaseAuthWrapperImplTest.kt index 3da520b2da4..d26d56c8480 100644 --- a/testing/src/test/java/org/oppia/android/testing/FakeFirebaseAuthWrapperImplTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/firebase/FakeFirebaseAuthWrapperImplTest.kt @@ -1,4 +1,4 @@ -package org.oppia.android.testing +package org.oppia.android.testing.firebase import android.app.Application import android.content.Context @@ -14,7 +14,8 @@ import org.junit.Test import org.junit.runner.RunWith import org.oppia.android.domain.auth.FirebaseUserWrapper import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule -import org.oppia.android.testing.FakeFirebaseAuthWrapperImpl.FakeAuthState +import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.FakeFirebaseAuthWrapperImpl.FakeAuthState import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule import org.oppia.android.testing.time.FakeOppiaClockModule diff --git a/testing/src/test/java/org/oppia/android/testing/TestAuthenticationModuleTest.kt b/testing/src/test/java/org/oppia/android/testing/firebase/TestAuthenticationModuleTest.kt similarity index 98% rename from testing/src/test/java/org/oppia/android/testing/TestAuthenticationModuleTest.kt rename to testing/src/test/java/org/oppia/android/testing/firebase/TestAuthenticationModuleTest.kt index e9a9a5f9b23..284f0b27bc4 100644 --- a/testing/src/test/java/org/oppia/android/testing/TestAuthenticationModuleTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/firebase/TestAuthenticationModuleTest.kt @@ -1,4 +1,4 @@ -package org.oppia.android.testing +package org.oppia.android.testing.firebase import android.app.Application import android.content.Context diff --git a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt index 71f53946331..b5076ee912e 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleCustomContextTest.kt @@ -60,8 +60,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule import org.oppia.android.testing.time.FakeOppiaClockModule diff --git a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt index 385742c3a2c..5463cb0e542 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleOmissionTest.kt @@ -57,9 +57,9 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule import org.oppia.android.testing.assertThrows +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule import org.oppia.android.testing.time.FakeOppiaClockModule diff --git a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt index 896afc9b13e..3a8f7eaf441 100644 --- a/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt +++ b/testing/src/test/java/org/oppia/android/testing/junit/InitializeDefaultLocaleRuleTest.kt @@ -61,8 +61,8 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.topic.PrimeTopicAssetsControllerModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule -import org.oppia.android.testing.TestAuthenticationModule import org.oppia.android.testing.TestLogReportingModule +import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.threading.TestDispatcherModule import org.oppia.android.testing.time.FakeOppiaClockModule From 8dbf4dc04a95d95f394c25ab75755f945702b0d7 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 7 Feb 2024 23:42:43 +0000 Subject: [PATCH 36/63] Add missing CODEOWNERS line. --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 00aff7fcea9..fb5866d071e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -110,6 +110,7 @@ /testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricAssessorTest.kt @oppia/android-app-infrastructure-reviewers /testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt @oppia/android-app-infrastructure-reviewers +/testing/src/*/java/org/oppia/android/testing/firebase/ @oppia/android-app-infrastructure-reviewers /testing/src/*/java/org/oppia/android/testing/lightweightcheckpointing/ @oppia/android-app-infrastructure-reviewers /testing/src/*/java/org/oppia/android/testing/logging/ @oppia/android-app-infrastructure-reviewers /testing/src/*/java/org/oppia/android/testing/math/ @oppia/android-app-infrastructure-reviewers From 9c3805711833cb1b315f63abadd6ea0c8b5fd4f3 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 7 Feb 2024 23:44:20 +0000 Subject: [PATCH 37/63] Remove old files from CODEOWNERS. --- .github/CODEOWNERS | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fb5866d071e..b4a1de1c04a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -94,18 +94,14 @@ /testing/src/main/java/org/oppia/android/testing/FakeAnalyticsEventLogger.kt @oppia/android-app-infrastructure-reviewers /testing/src/main/java/org/oppia/android/testing/FakeExceptionLogger.kt @oppia/android-app-infrastructure-reviewers /testing/src/main/java/org/oppia/android/testing/FakeFirebaseAuthInstanceWrapperImpl.kt @oppia/android-app-infrastructure-reviewers -/testing/src/main/java/org/oppia/android/testing/FakeFirebaseAuthWrapperImpl.kt @oppia/android-app-infrastructure-reviewers /testing/src/main/java/org/oppia/android/testing/FakeFirestoreEventLogger.kt @oppia/android-app-infrastructure-reviewers /testing/src/main/java/org/oppia/android/testing/FakeFirestoreInstanceWrapperImpl.kt @oppia/android-app-infrastructure-reviewers /testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricAssessor.kt @oppia/android-app-infrastructure-reviewers /testing/src/main/java/org/oppia/android/testing/FakePerformanceMetricsEventLogger.kt @oppia/android-app-infrastructure-reviewers -/testing/src/main/java/org/oppia/android/testing/TestAuthenticationModule.kt @oppia/android-app-infrastructure-reviewers -/testing/src/test/java/org/oppia/android/testing/TestAuthenticationModuleTest.kt @oppia/android-app-infrastructure-reviewers /testing/src/main/java/org/oppia/android/testing/TestImageLoaderModule.kt @oppia/android-app-infrastructure-reviewers /testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt @oppia/android-app-infrastructure-reviewers /testing/src/test/java/org/oppia/android/testing/FakeAnalyticsEventLoggerTest.kt @oppia/android-app-infrastructure-reviewers /testing/src/test/java/org/oppia/android/testing/FakeExceptionLoggerTest.kt @oppia/android-app-infrastructure-reviewers -/testing/src/test/java/org/oppia/android/testing/FakeFirebaseAuthWrapperImplTest.kt @oppia/android-app-infrastructure-reviewers /testing/src/test/java/org/oppia/android/testing/FakeFirestoreEventLoggerTest.kt @oppia/android-app-infrastructure-reviewers /testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricAssessorTest.kt @oppia/android-app-infrastructure-reviewers /testing/src/test/java/org/oppia/android/testing/FakePerformanceMetricsEventLoggerTest.kt @oppia/android-app-infrastructure-reviewers From fad48ede88b6cdd4fc81dfa387e8b9bd0a6f8659 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 8 Feb 2024 00:46:30 +0000 Subject: [PATCH 38/63] Add missing tests for TestBlazeWorkspace changes. Also includes some minor clean-ups within TestBazelWorkspaceTest. --- .../scripts/testing/TestBazelWorkspace.kt | 3 +- .../scripts/testing/TestBazelWorkspaceTest.kt | 217 ++++++++++++------ 2 files changed, 148 insertions(+), 72 deletions(-) diff --git a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt index f1230c0f63d..7bec4b85889 100644 --- a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt +++ b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt @@ -123,7 +123,8 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { withExtraDependency: String? = null, subpackage: String? = null ): Iterable { - initEmptyWorkspace() // Ensure the workspace is at least initialized. + // Note that the workspace doesn't need to be explicitly initialized here since the call below + // to addTestToBuildFile() will initialize it. check(testName !in testFileMap) { "Test '$testName' already exists" } val testFile = if (subpackage != null) { diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt index 00cbba1f19c..e20b633bbc9 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt @@ -23,9 +23,7 @@ import java.lang.IllegalStateException // Function name: test names are conventionally named with underscores. @Suppress("FunctionName") class TestBazelWorkspaceTest { - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Test fun testCreateTestUtility_doesNotImmediatelyCreateAnyFiles() { @@ -37,7 +35,7 @@ class TestBazelWorkspaceTest { } @Test - fun testInitEmptyWorkspace_emptyDirectory_createsEmptyWorkspace() { + fun testInitEmptyWorkspace_emptyDirectory_createsEmptyWorkspaceFile() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.initEmptyWorkspace() @@ -48,6 +46,30 @@ class TestBazelWorkspaceTest { assertThat(workspaceFile.readLines()).isEmpty() } + @Test + fun testInitEmptyWorkspace_emptyDirectory_createsBazelVersionFile() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.initEmptyWorkspace() + + // A .bazelversion file should now exist with the correct version. + val bazelVersionFile = File(tempFolder.root, ".bazelversion") + assertThat(bazelVersionFile.exists()).isTrue() + assertThat(bazelVersionFile.readText().trim()).isEqualTo("4.0.0") + } + + @Test + fun testInitEmptyWorkspace_emptyDirectory_createsBazelRcFile() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.initEmptyWorkspace() + + // A .bazelversion file should now exist with the correct flags. + val bazelRcFile = File(tempFolder.root, ".bazelrc") + assertThat(bazelRcFile.exists()).isTrue() + assertThat(bazelRcFile.readText().trim()).isEqualTo("--noenable_bzlmod") + } + @Test fun testInitEmptyWorkspace_fileCreationFails_throwsAssertionError() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) @@ -85,11 +107,34 @@ class TestBazelWorkspaceTest { ) val workspaceFile = testBazelWorkspace.workspaceFile - val workspaceContent = workspaceFile.readAsJoinedString() - + val workspaceContent = workspaceFile.readText() assertThat(workspaceContent).contains("com.android.support:support-annotations:28.0.0") } + @Test + fun testSetupWorkspaceForRulesJvmExternal_withOneDep_setsUpBazelVersion() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( + listOf("com.android.support:support-annotations:28.0.0") + ) + + val bazelVersionContent = tempFolder.getBazelVersionFile().readText().trim() + assertThat(bazelVersionContent).isEqualTo("4.0.0") + } + + @Test + fun testSetupWorkspaceForRulesJvmExternal_withOneDep_setsUpBazelRc() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( + listOf("com.android.support:support-annotations:28.0.0") + ) + + val bazelRcContent = tempFolder.getBazelRcFile().readText().trim() + assertThat(bazelRcContent).isEqualTo("--noenable_bzlmod") + } + @Test fun testSetupWorkspaceForRulesJvmExternal_withTwoDeps_containsCorrectList() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) @@ -102,7 +147,7 @@ class TestBazelWorkspaceTest { ) val workspaceFile = testBazelWorkspace.workspaceFile - val workspaceContent = workspaceFile.readAsJoinedString() + val workspaceContent = workspaceFile.readText() assertThat(workspaceContent).contains("com.android.support:support-annotations:28.0.0") assertThat(workspaceContent).contains("io.fabric.sdk.android:fabric:1.4.7") @@ -122,7 +167,7 @@ class TestBazelWorkspaceTest { ) val workspaceFile = testBazelWorkspace.workspaceFile - val workspaceContent = workspaceFile.readAsJoinedString() + val workspaceContent = workspaceFile.readText() assertThat(workspaceContent).contains("com.android.support:support-annotations:28.0.0") assertThat(workspaceContent).contains("io.fabric.sdk.android:fabric:1.4.7") @@ -143,7 +188,7 @@ class TestBazelWorkspaceTest { ) val workspaceFile = testBazelWorkspace.workspaceFile - val workspaceContent = workspaceFile.readAsJoinedString() + val workspaceContent = workspaceFile.readText() assertThat(workspaceContent).contains("com.android.support:support-annotations:28.0.0") assertThat(workspaceContent).doesNotContain("io.fabric.sdk.android:fabric:1.4.7") @@ -158,7 +203,7 @@ class TestBazelWorkspaceTest { ) val workspaceFile = testBazelWorkspace.workspaceFile - val workspaceContent = workspaceFile.readAsJoinedString() + val workspaceContent = workspaceFile.readText() assertThat(workspaceContent).contains( """ @@ -212,7 +257,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_reusedTestName_throwsException() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") val exception = assertThrows() { @@ -228,21 +272,45 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_firstTest_setsUpWorkspace() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", testFile = tempFolder.newFile("FirstTest.kt") ) - val workspaceContent = tempFolder.getWorkspaceFile().readAsJoinedString() + val workspaceContent = tempFolder.getWorkspaceFile().readText() assertThat(workspaceContent).contains("kt_register_toolchains()") } + @Test + fun testAddTestToBuildFile_firstTest_setsUpBazelVersion() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.addTestToBuildFile( + testName = "FirstTest", + testFile = tempFolder.newFile("FirstTest.kt") + ) + + val bazelVersionContent = tempFolder.getBazelVersionFile().readText().trim() + assertThat(bazelVersionContent).isEqualTo("4.0.0") + } + + @Test + fun testAddTestToBuildFile_firstTest_setsUpBazelRc() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.addTestToBuildFile( + testName = "FirstTest", + testFile = tempFolder.newFile("FirstTest.kt") + ) + + val bazelRcContent = tempFolder.getBazelRcFile().readText().trim() + assertThat(bazelRcContent).isEqualTo("--noenable_bzlmod") + } + @Test fun testAddTestToBuildFile_firstTest_returnsTestBuildWorkspaceFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() val files = testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", @@ -255,7 +323,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_secondTest_doesNotChangeWorkspace() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", testFile = tempFolder.newFile("FirstTest.kt") @@ -275,14 +342,13 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_firstTest_initializesBuildFileOnlyForTests() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", testFile = tempFolder.newFile("FirstTest.kt") ) - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("load\\(.+?kt_jvm_test")).isEqualTo(1) assertThat(buildContent.countMatches("load\\(.+?kt_jvm_library")).isEqualTo(0) } @@ -290,7 +356,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_secondTest_doesNotReinitializeBuildFile() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", testFile = tempFolder.newFile("FirstTest.kt") @@ -302,14 +367,13 @@ class TestBazelWorkspaceTest { ) // The load line should only exist once in the file. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("load\\(.+?kt_jvm_test")).isEqualTo(1) } @Test fun testAddTestToBuildFile_unusedTestName_appendsBasicTest() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", @@ -317,7 +381,7 @@ class TestBazelWorkspaceTest { ) // There should be 1 test in the file with empty deps and correct source. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_test\\(")).isEqualTo(1) assertThat(buildContent).contains("srcs = [\"FirstTest.kt\"]") assertThat(buildContent).contains("deps = []") @@ -326,7 +390,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_unusedTestName_withGeneratedDep_configuresBuildFileForLibraries() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", @@ -335,14 +398,13 @@ class TestBazelWorkspaceTest { ) // The build file should now be initialized for libraries. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("load\\(.+?kt_jvm_library")).isEqualTo(1) } @Test fun testAddTestToBuildFile_unusedTestName_withGeneratedDep_appendsLibraryAndTestWithDep() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", @@ -351,7 +413,7 @@ class TestBazelWorkspaceTest { ) // Ensure the test is arranged correctly. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_test\\(")).isEqualTo(1) assertThat(buildContent).contains("srcs = [\"FirstTest.kt\"]") assertThat(buildContent).contains("deps = [\"//:FirstTestDependency_lib\",]") @@ -363,7 +425,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_firstTest_withGeneratedDep_returnsTestDepBuildWorkspaceFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() val files = testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", @@ -378,7 +439,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_secondTest_withGeneratedDep_returnsTestDepBuildWorkspaceFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", testFile = tempFolder.newFile("FirstTest.kt") @@ -397,7 +457,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_unusedTestName_withExtraDep_appendsTestWithDep() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", @@ -406,7 +465,7 @@ class TestBazelWorkspaceTest { ) // Ensure the test is arranged correctly. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_test\\(")).isEqualTo(1) assertThat(buildContent).contains("srcs = [\"FirstTest.kt\"]") assertThat(buildContent).contains("deps = [\"//:ExtraDep\",]") @@ -415,7 +474,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_unusedTestName_withSubpackage_appendsToSubpackageBuildFile() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() tempFolder.newFolder("subpackage") testBazelWorkspace.addTestToBuildFile( @@ -437,7 +495,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_unusedTestName_withSubpackage_returnsNewBuildAndTestFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() tempFolder.newFolder("subpackage") val files = testBazelWorkspace.addTestToBuildFile( @@ -453,7 +510,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_unusedTestName_withMultipleSubpackages_returnsNewBuildAndTestFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() val subpackage = "subpackage.first.second" tempFolder.newFolder(*(subpackage.split(".")).toTypedArray()) val files = testBazelWorkspace.addTestToBuildFile( @@ -471,7 +527,6 @@ class TestBazelWorkspaceTest { @Test fun testAddTestToBuildFile_unusedTestName_withGeneratedAndExtraDeps_includesBothInTestDeps() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.addTestToBuildFile( testName = "FirstTest", @@ -481,7 +536,7 @@ class TestBazelWorkspaceTest { ) // Both dependencies should be included in the test's deps. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_test\\(")).isEqualTo(1) assertThat(buildContent).contains("deps = [\"//:FirstTestDependency_lib\",\"//:ExtraDep\",]") } @@ -489,7 +544,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_reusedTestName_throwsException() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") val exception = assertThrows() { @@ -502,18 +556,36 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_firstTest_setsUpWorkspace() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") - val workspaceContent = tempFolder.getWorkspaceFile().readAsJoinedString() + val workspaceContent = tempFolder.getWorkspaceFile().readText() assertThat(workspaceContent).contains("kt_register_toolchains()") } + @Test + fun testCreateTest_firstTest_setsUpBazelVersion() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.createTest(testName = "FirstTest") + + val bazelVersionContent = tempFolder.getBazelVersionFile().readText().trim() + assertThat(bazelVersionContent).isEqualTo("4.0.0") + } + + @Test + fun testCreateTest_firstTest_setsUpBazelRc() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.createTest(testName = "FirstTest") + + val bazelRcContent = tempFolder.getBazelRcFile().readText().trim() + assertThat(bazelRcContent).isEqualTo("--noenable_bzlmod") + } + @Test fun testCreateTest_firstTest_returnsTestBuildWorkspaceFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() val files = testBazelWorkspace.createTest(testName = "FirstTest") @@ -523,7 +595,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_secondTest_doesNotChangeWorkspace() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") val workspaceSize = tempFolder.getWorkspaceFile().length() @@ -537,11 +608,10 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_firstTest_initializesBuildFileOnlyForTests() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("load\\(.+?kt_jvm_test")).isEqualTo(1) assertThat(buildContent.countMatches("load\\(.+?kt_jvm_library")).isEqualTo(0) } @@ -549,25 +619,23 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_secondTest_doesNotReinitializeBuildFile() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") testBazelWorkspace.createTest(testName = "SecondTest") // The load line should only exist once in the file. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("load\\(.+?kt_jvm_test")).isEqualTo(1) } @Test fun testCreateTest_unusedTestName_appendsBasicTest() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") // There should be 1 test in the file with empty deps and correct source. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_test\\(")).isEqualTo(1) assertThat(buildContent).contains("srcs = [\"FirstTest.kt\"]") assertThat(buildContent).contains("deps = []") @@ -576,7 +644,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_unusedTestName_withGeneratedDep_configuresBuildFileForLibraries() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest( testName = "FirstTest", @@ -584,14 +651,13 @@ class TestBazelWorkspaceTest { ) // The build file should now be initialized for libraries. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("load\\(.+?kt_jvm_library")).isEqualTo(1) } @Test fun testCreateTest_unusedTestName_withGeneratedDep_appendsLibraryAndTestWithDep() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest( testName = "FirstTest", @@ -599,7 +665,7 @@ class TestBazelWorkspaceTest { ) // Ensure the test is arranged correctly. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_test\\(")).isEqualTo(1) assertThat(buildContent).contains("srcs = [\"FirstTest.kt\"]") assertThat(buildContent).contains("deps = [\"//:FirstTestDependency_lib\",]") @@ -611,7 +677,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_firstTest_withGeneratedDep_returnsTestDepBuildWorkspaceFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() val files = testBazelWorkspace.createTest( testName = "FirstTest", @@ -625,7 +690,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_secondTest_withGeneratedDep_returnsTestDepBuildWorkspaceFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest") val files = testBazelWorkspace.createTest( @@ -640,12 +704,11 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_unusedTestName_withExtraDep_appendsTestWithDep() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest", withExtraDependency = "//:ExtraDep") // Ensure the test is arranged correctly. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_test\\(")).isEqualTo(1) assertThat(buildContent).contains("srcs = [\"FirstTest.kt\"]") assertThat(buildContent).contains("deps = [\"//:ExtraDep\",]") @@ -654,7 +717,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_unusedTestName_withSubpackage_appendsToSubpackageBuildFile() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest(testName = "FirstTest", subpackage = "subpackage") @@ -671,7 +733,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_unusedTestName_withSubpackage_returnsNewBuildAndTestFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() val files = testBazelWorkspace.createTest(testName = "FirstTest", subpackage = "subpackage") @@ -682,7 +743,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_unusedTestName_withMultipleSubpackages_returnsNewBuildAndTestFiles() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() val files = testBazelWorkspace.createTest( testName = "FirstTest", @@ -698,7 +758,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateTest_unusedTestName_withGeneratedAndExtraDeps_includesBothInTestDeps() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest( testName = "FirstTest", @@ -707,7 +766,7 @@ class TestBazelWorkspaceTest { ) // Both dependencies should be included in the test's deps. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_test\\(")).isEqualTo(1) assertThat(buildContent).contains("deps = [\"//:FirstTestDependency_lib\",\"//:ExtraDep\",]") } @@ -715,24 +774,42 @@ class TestBazelWorkspaceTest { @Test fun testCreateLibrary_firstLib_unusedName_configuresWorkspaceAndBuild() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary(dependencyName = "ExampleDep") - val workspaceContent = tempFolder.getWorkspaceFile().readAsJoinedString() - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val workspaceContent = tempFolder.getWorkspaceFile().readText() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(workspaceContent).contains("kt_register_toolchains()") assertThat(buildContent.countMatches("load\\(.+?kt_jvm_library")).isEqualTo(1) } + @Test + fun testCreateLibrary_firstLib_unusedName_setsUpBazelVersion() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.createLibrary(dependencyName = "ExampleDep") + + val bazelVersionContent = tempFolder.getBazelVersionFile().readText().trim() + assertThat(bazelVersionContent).isEqualTo("4.0.0") + } + + @Test + fun testCreateLibrary_firstLib_unusedName_setsUpBazelRc() { + val testBazelWorkspace = TestBazelWorkspace(tempFolder) + + testBazelWorkspace.createLibrary(dependencyName = "ExampleDep") + + val bazelRcContent = tempFolder.getBazelRcFile().readText().trim() + assertThat(bazelRcContent).isEqualTo("--noenable_bzlmod") + } + @Test fun testCreateLibrary_firstLib_unusedName_appendsJvmLibraryDeclaration() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary(dependencyName = "ExampleDep") - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("kt_jvm_library\\(")).isEqualTo(1) assertThat(buildContent).contains("name = \"ExampleDep_lib\"") assertThat(buildContent).contains("srcs = [\"ExampleDep.kt\"]") @@ -741,7 +818,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateLibrary_firstLib_unusedName_returnsBuildLibAndWorkspaceFilesWithTargetName() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() val (targetName, files) = testBazelWorkspace.createLibrary(dependencyName = "ExampleDep") @@ -752,7 +828,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateLibrary_secondLib_unusedName_doesNotChangeWorkspace() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary(dependencyName = "FirstLib") val workspaceSize = tempFolder.getWorkspaceFile().length() @@ -765,13 +840,12 @@ class TestBazelWorkspaceTest { @Test fun testCreateLibrary_secondLib_unusedName_appendsJvmLibraryDeclaration() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary(dependencyName = "FirstLib") testBazelWorkspace.createLibrary(dependencyName = "SecondLib") // The kt_jvm_library declaration should only exist once, and both libraries should exist. - val buildContent = testBazelWorkspace.rootBuildFile.readAsJoinedString() + val buildContent = testBazelWorkspace.rootBuildFile.readText() assertThat(buildContent.countMatches("load\\(.+?kt_jvm_library")).isEqualTo(1) assertThat(buildContent.countMatches("kt_jvm_library\\(")).isEqualTo(2) assertThat(buildContent).contains("name = \"FirstLib_lib\"") @@ -783,7 +857,6 @@ class TestBazelWorkspaceTest { @Test fun testCreateLibrary_secondLib_reusedName_throwsException() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) - testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary(dependencyName = "FirstLib") val exception = assertThrows() { @@ -801,7 +874,7 @@ class TestBazelWorkspaceTest { testBazelWorkspace.createTest(testName = "FirstTest") // The workspace should only be configured once (due to the library initialization). - val workspaceContent = tempFolder.getWorkspaceFile().readAsJoinedString() + val workspaceContent = tempFolder.getWorkspaceFile().readText() assertThat(workspaceContent.countMatches("http_archive\\(")).isEqualTo(1) } @@ -813,7 +886,7 @@ class TestBazelWorkspaceTest { testBazelWorkspace.createLibrary(dependencyName = "FirstLib") // The workspace should only be configured once (due to the test initialization). - val workspaceContent = tempFolder.getWorkspaceFile().readAsJoinedString() + val workspaceContent = tempFolder.getWorkspaceFile().readText() assertThat(workspaceContent.countMatches("http_archive\\(")).isEqualTo(1) } @@ -901,7 +974,9 @@ class TestBazelWorkspaceTest { private fun TemporaryFolder.getWorkspaceFile(): File = File(root, "WORKSPACE") - private fun File.readAsJoinedString(): String = readLines().joinToString(separator = "\n") + private fun TemporaryFolder.getBazelVersionFile(): File = File(root, ".bazelversion") + + private fun TemporaryFolder.getBazelRcFile(): File = File(root, ".bazelrc") private fun File.isRelativeTo(base: File): Boolean = relativeToOrNull(base) != null From e1802c8242eaa7877360c8301177a1e8980f722b Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 8 Feb 2024 01:14:07 +0000 Subject: [PATCH 39/63] Add missing Firebase auth tests. --- .../org/oppia/android/domain/auth/BUILD.bazel | 46 +++++++++++++++++++ .../auth/FirebaseAuthWrapperImplTest.kt | 1 - 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel index 61f22c5ed07..7b549aa2c45 100644 --- a/domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel @@ -5,6 +5,29 @@ Tests for libraries providing authentication with Firebase functionality. load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") +oppia_android_test( + name = "AuthenticationControllerTest", + srcs = ["AuthenticationControllerTest.kt"], + custom_package = "org.oppia.android.domain.auth", + test_class = "org.oppia.android.domain.auth.AuthenticationControllerTest", + test_manifest = "//domain:test_manifest", + deps = [ + ":dagger", + "//domain/src/main/java/org/oppia/android/domain/auth:auth_module", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", + "//testing", + "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", + "//testing/src/main/java/org/oppia/android/testing/threading:test_module", + "//testing/src/main/java/org/oppia/android/testing/time:test_module", + "//third_party:androidx_test_ext_junit", + "//third_party:com_google_truth_truth", + "//third_party:junit_junit", + "//third_party:org_mockito_mockito-core", + "//third_party:org_robolectric_robolectric", + "//third_party:robolectric_android-all", + ], +) + oppia_android_test( name = "AuthenticationModuleTest", srcs = ["AuthenticationModuleTest.kt"], @@ -27,4 +50,27 @@ oppia_android_test( ], ) +oppia_android_test( + name = "FirebaseAuthWrapperImplTest", + srcs = ["FirebaseAuthWrapperImplTest.kt"], + custom_package = "org.oppia.android.domain.auth", + test_class = "org.oppia.android.domain.auth.FirebaseAuthWrapperImplTest", + test_manifest = "//domain:test_manifest", + deps = [ + ":dagger", + "//domain/src/main/java/org/oppia/android/domain/auth:auth_module", + "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:prod_module", + "//testing", + "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", + "//testing/src/main/java/org/oppia/android/testing/threading:test_module", + "//testing/src/main/java/org/oppia/android/testing/time:test_module", + "//third_party:androidx_test_ext_junit", + "//third_party:com_google_truth_truth", + "//third_party:junit_junit", + "//third_party:org_mockito_mockito-core", + "//third_party:org_robolectric_robolectric", + "//third_party:robolectric_android-all", + ], +) + dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/auth/FirebaseAuthWrapperImplTest.kt b/domain/src/test/java/org/oppia/android/domain/auth/FirebaseAuthWrapperImplTest.kt index 28a07b49b39..8983ae92125 100644 --- a/domain/src/test/java/org/oppia/android/domain/auth/FirebaseAuthWrapperImplTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/auth/FirebaseAuthWrapperImplTest.kt @@ -31,7 +31,6 @@ import javax.inject.Singleton @RunWith(AndroidJUnit4::class) @LooperMode(LooperMode.Mode.PAUSED) @Config(application = FirebaseAuthWrapperImplTest.TestApplication::class) - class FirebaseAuthWrapperImplTest { @Inject From d3cbd9356aadd3197101ca446d904863245f76af Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 8 Feb 2024 01:34:40 +0000 Subject: [PATCH 40/63] Post-merge fixes for previously missed tests. --- .../auth/AuthenticationControllerTest.kt | 78 +++++++++++-------- 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/domain/src/test/java/org/oppia/android/domain/auth/AuthenticationControllerTest.kt b/domain/src/test/java/org/oppia/android/domain/auth/AuthenticationControllerTest.kt index 4208244c46e..2b69a7e7c76 100644 --- a/domain/src/test/java/org/oppia/android/domain/auth/AuthenticationControllerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/auth/AuthenticationControllerTest.kt @@ -11,13 +11,21 @@ import dagger.Module import dagger.Provides import kotlinx.coroutines.CoroutineDispatcher import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoInteractions +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule import org.oppia.android.testing.TestLogReportingModule -import org.oppia.android.testing.assertThrows import org.oppia.android.testing.firebase.FakeFirebaseAuthWrapperImpl import org.oppia.android.testing.firebase.TestAuthenticationModule +import org.oppia.android.testing.mockito.capture import org.oppia.android.testing.robolectric.RobolectricModule import org.oppia.android.testing.time.FakeOppiaClockModule import org.oppia.android.util.data.DataProvidersInjector @@ -36,17 +44,16 @@ import javax.inject.Singleton @LooperMode(LooperMode.Mode.PAUSED) @Config(application = AuthenticationControllerTest.TestApplication::class) class AuthenticationControllerTest { - @Inject - lateinit var firebaseAuthWrapper: FirebaseAuthWrapper + @field:[Rule JvmField] val mockitoRule: MockitoRule = MockitoJUnit.rule() - @Inject - lateinit var fakeFirebaseAuthWrapperImpl: FakeFirebaseAuthWrapperImpl + @Inject lateinit var firebaseAuthWrapper: FirebaseAuthWrapper + @Inject lateinit var fakeFirebaseAuthWrapperImpl: FakeFirebaseAuthWrapperImpl + @Inject lateinit var authenticationController: AuthenticationController + @field:[Inject BackgroundDispatcher] lateinit var backgroundDispatcher: CoroutineDispatcher - @Inject - lateinit var authenticationController: AuthenticationController - - @field:[Inject BackgroundDispatcher] - lateinit var backgroundDispatcher: CoroutineDispatcher + @Mock lateinit var mockFakeSuccessCallback: FakeSuccessCallback + @Mock lateinit var mockFakeFailureCallback: FakeFailureCallback + @Captor lateinit var throwableCaptor: ArgumentCaptor @Before fun setUp() { @@ -54,48 +61,49 @@ class AuthenticationControllerTest { } @Test - fun testAuthentication_getCurrentUser_userSignedIn_returnsInstanceOfFirebaseUserWrapper() { + fun testAuthentication_signInAnonymously_onlyOnSuccessCalled() { fakeFirebaseAuthWrapperImpl.simulateSignInSuccess() firebaseAuthWrapper.signInAnonymously( - onSuccess = {}, - onFailure = {} + onSuccess = mockFakeSuccessCallback::onSuccess, + onFailure = mockFakeFailureCallback::onFailure ) - val user = authenticationController.currentFirebaseUser - - assertThat(user).isInstanceOf(FirebaseUserWrapper::class.java) + // onSuccess should be called. + verify(mockFakeSuccessCallback).onSuccess() + verifyNoInteractions(mockFakeFailureCallback) } @Test - fun testAuthentication_signInAnonymously_succeeds() { - fakeFirebaseAuthWrapperImpl.simulateSignInSuccess() + fun testAuthentication_signInAnonymously_onlyOnFailureCalled() { + fakeFirebaseAuthWrapperImpl.simulateSignInFailure() firebaseAuthWrapper.signInAnonymously( - onSuccess = {}, - onFailure = {} + onSuccess = mockFakeSuccessCallback::onSuccess, + onFailure = mockFakeFailureCallback::onFailure ) - val user = authenticationController.currentFirebaseUser - - assertThat(user).isInstanceOf(FirebaseUserWrapper::class.java) + // onFailure should be called with the failure details. + verify(mockFakeFailureCallback).onFailure(capture(throwableCaptor)) + verifyNoInteractions(mockFakeSuccessCallback) + assertThat(throwableCaptor.value).hasMessageThat().contains("Sign-in failure") } @Test - fun testAuthentication_signInAnonymously_failure_returnsException() { - fakeFirebaseAuthWrapperImpl.simulateSignInFailure() + fun testAuthentication_getCurrentUser_userSignedIn_returnsInstanceOfFirebaseUserWrapper() { + fakeFirebaseAuthWrapperImpl.simulateSignInSuccess() + firebaseAuthWrapper.signInAnonymously( + onSuccess = mockFakeSuccessCallback::onSuccess, + onFailure = mockFakeFailureCallback::onFailure + ) - assertThrows(Throwable::class) { - firebaseAuthWrapper.signInAnonymously( - onSuccess = {}, - onFailure = {} - ) - } + val user = authenticationController.currentFirebaseUser + + assertThat(user).isInstanceOf(FirebaseUserWrapper::class.java) } private fun setUpTestApplicationComponent() { - ApplicationProvider.getApplicationContext() - .inject(this) + ApplicationProvider.getApplicationContext().inject(this) } @Module @@ -141,4 +149,8 @@ class AuthenticationControllerTest { override fun getDataProvidersInjector(): DataProvidersInjector = component } + + interface FakeSuccessCallback { fun onSuccess() } + + interface FakeFailureCallback { fun onFailure(failure: Throwable) } } From 8de4d5162d49232f045e10105eac5a3cfacc872e Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Fri, 9 Feb 2024 23:24:27 +0000 Subject: [PATCH 41/63] Improve new test robustness. Required upgrade of kotlinx-coroutines-core. --- ...ScriptBackgroundCoroutineDispatcherTest.kt | 2 + third_party/maven_install.json | 112 ++++++++++++------ third_party/versions.bzl | 2 +- 3 files changed, 79 insertions(+), 37 deletions(-) diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt index 68329ac15fa..c1d4f98314b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/ScriptBackgroundCoroutineDispatcherTest.kt @@ -72,6 +72,8 @@ class ScriptBackgroundCoroutineDispatcherTest { runBlocking { taskStartedChannel.receive() } dispatcher.close() + // This slows down the test, but provides assurance that the task was definitely cancelled. + runBlocking { delay(2_000L) } // The task should not have run since it was cancelled, but no exception will be thrown. verifyNoMoreInteractions(mockRunnable) diff --git a/third_party/maven_install.json b/third_party/maven_install.json index 24221d97d55..42841194450 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,8 +1,8 @@ { "dependency_tree": { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": -1629412368, - "__RESOLVED_ARTIFACTS_HASH": 1784154617, + "__INPUT_ARTIFACTS_HASH": -1278449106, + "__RESOLVED_ARTIFACTS_HASH": 896273545, "conflict_resolution": { "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", @@ -1783,12 +1783,12 @@ { "coord": "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0", "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", "androidx.lifecycle:lifecycle-common:2.2.0", "androidx.annotation:annotation:1.1.0", "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", "androidx.lifecycle:lifecycle-livedata-core:aar:2.2.0", "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:2.2.0", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3", "androidx.arch.core:core-common:2.1.0", "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", "androidx.arch.core:core-runtime:aar:2.1.0" @@ -1797,7 +1797,7 @@ "androidx.lifecycle:lifecycle-livedata:aar:2.2.0", "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:2.2.0", "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" + "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3" ], "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0.aar", "mirror_urls": [ @@ -1813,12 +1813,12 @@ { "coord": "androidx.lifecycle:lifecycle-livedata-ktx:jar:sources:2.2.0", "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", "androidx.arch.core:core-runtime:aar:sources:2.1.0", "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", "androidx.lifecycle:lifecycle-livedata-core:aar:sources:2.2.0", "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:sources:2.2.0", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.3", "androidx.annotation:annotation:jar:sources:1.1.0", "androidx.arch.core:core-common:jar:sources:2.1.0", "androidx.lifecycle:lifecycle-common:jar:sources:2.2.0" @@ -1827,7 +1827,7 @@ "androidx.lifecycle:lifecycle-livedata:aar:sources:2.2.0", "androidx.lifecycle:lifecycle-livedata-core-ktx:aar:sources:2.2.0", "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1" + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.3" ], "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-livedata-ktx/2.2.0/lifecycle-livedata-ktx-2.2.0-sources.jar", "mirror_urls": [ @@ -9637,13 +9637,12 @@ { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1", "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", - "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" + "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3" ], "directDependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" + "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3" ], "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1.jar", "mirror_urls": [ @@ -9660,12 +9659,11 @@ "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-android:jar:sources:1.4.1", "dependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", - "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.3" ], "directDependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1" + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.3" ], "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar", "mirror_urls": [ @@ -9679,7 +9677,7 @@ "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-android/1.4.1/kotlinx-coroutines-android-1.4.1-sources.jar" }, { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", + "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.3", "dependencies": [ "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" @@ -9688,19 +9686,19 @@ "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0" ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3.jar", "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar" + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3.jar", + "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3.jar", + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3.jar" ], - "sha256": "6d2f87764b6638f27aff12ed380db4b63c9d46ba55dc32683a650598fa5a3e22", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1.jar" + "sha256": "f7be08ddf86bd88020da7b78adbf44228799cca54d5c0c4396d850bc66725163", + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3.jar" }, { - "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", + "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:jar:sources:1.4.3", "dependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" @@ -9709,16 +9707,58 @@ "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" ], - "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3-sources.jar", + "mirror_urls": [ + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3-sources.jar", + "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3-sources.jar", + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3-sources.jar" + ], + "sha256": "6f1a3f8be952a3c7c003cb32eca36a92a7afc4affea6cd8b769dd23d7f14bad2", + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/1.4.3/kotlinx-coroutines-core-jvm-1.4.3-sources.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib-common:1.5.0", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.3", + "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" + ], + "directDependencies": [ + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.3" + ], + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3.jar", + "mirror_urls": [ + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3.jar", + "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3.jar", + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3.jar" + ], + "sha256": "de487d57b156e4e237abbc9cf7fff8777b2495aff6caa8bc4e9cf6ec859f0224", + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3.jar" + }, + { + "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.3", + "dependencies": [ + "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:jar:sources:1.4.3", + "org.jetbrains.kotlin:kotlin-stdlib-common:jar:sources:1.5.0" + ], + "directDependencies": [ + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:jar:sources:1.4.3" + ], + "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3-sources.jar", "mirror_urls": [ - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar", - "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar" + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3-sources.jar", + "https://maven.fabric.io/public/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3-sources.jar", + "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3-sources.jar", + "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3-sources.jar" ], - "sha256": "bb339efebc2d9141401f1aa43a035abe929210e362cfff13d03c6b7b11dc0469", - "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.1/kotlinx-coroutines-core-1.4.1-sources.jar" + "sha256": "315d99f5b340ceaba2cb898eff7e6414fd615b27e3f093b84ac13ac31c2f7dc0", + "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-core/1.4.3/kotlinx-coroutines-core-1.4.3-sources.jar" }, { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-debug:1.2.2", @@ -9753,13 +9793,13 @@ { "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.2.2", "dependencies": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", "org.jetbrains.kotlinx:kotlinx-coroutines-debug:1.2.2", - "org.jetbrains.kotlin:kotlin-stdlib:1.5.0" + "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3" ], "directDependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3", "org.jetbrains.kotlinx:kotlinx-coroutines-debug:1.2.2" ], "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2.jar", @@ -9777,12 +9817,12 @@ "coord": "org.jetbrains.kotlinx:kotlinx-coroutines-test:jar:sources:1.2.2", "dependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.3", "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources:1.2.2" ], "directDependencies": [ "org.jetbrains.kotlin:kotlin-stdlib:jar:sources:1.5.0", - "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core:jar:sources:1.4.3", "org.jetbrains.kotlinx:kotlinx-coroutines-debug:jar:sources:1.2.2" ], "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-test/1.2.2/kotlinx-coroutines-test-1.2.2-sources.jar", diff --git a/third_party/versions.bzl b/third_party/versions.bzl index 24195afce9e..e07eaec259e 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -76,7 +76,7 @@ MAVEN_PRODUCTION_DEPENDENCY_VERSIONS = { "org.checkerframework:checker-qual": "3.13.0", "org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar": "1.3.72", "org.jetbrains.kotlinx:kotlinx-coroutines-android": "1.4.1", - "org.jetbrains.kotlinx:kotlinx-coroutines-core": "1.4.1", + "org.jetbrains.kotlinx:kotlinx-coroutines-core": "1.4.3", "org.jetbrains:annotations:jar": "13.0", } From 3f69f11ced1150056ebf1e2cdc708f2ef8acd7e6 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Fri, 9 Feb 2024 23:27:15 +0000 Subject: [PATCH 42/63] Fix updated Maven license deps. --- scripts/assets/maven_dependencies.textproto | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/scripts/assets/maven_dependencies.textproto b/scripts/assets/maven_dependencies.textproto index 7305bccdd78..1477c40a73b 100644 --- a/scripts/assets/maven_dependencies.textproto +++ b/scripts/assets/maven_dependencies.textproto @@ -1017,8 +1017,19 @@ maven_dependency { } } maven_dependency { - artifact_name: "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" - artifact_version: "1.4.1" + artifact_name: "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.3" + artifact_version: "1.4.3" + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" + scrapable_link { + url: "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } +} +maven_dependency { + artifact_name: "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3" + artifact_version: "1.4.3" license { license_name: "The Apache Software License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" From 2916770e765507917c24844f88830f591fcd7b4f Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 14 Feb 2024 12:24:01 -0800 Subject: [PATCH 43/63] Update scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com> --- .../javatests/org/oppia/android/scripts/common/GitClientTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt index 5cbda509373..c3126339eca 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/GitClientTest.kt @@ -35,7 +35,7 @@ class GitClientTest { @After fun tearDown() { // Print the status of the git repository to help with debugging in the cases of test failures - // and to help manually verify the expect git state at the end of each test. + // and to help manually verify the expected git state at the end of each test. println("git status (at end of test):") println(testGitRepository.status(checkForGitRepository = false)) } From af51395a86adfcaf9e8e05062647173ddf2a3919 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 14 Feb 2024 23:29:28 +0000 Subject: [PATCH 44/63] Add tests for GitHubClient & TodoOpenCheck. Add new FakeCommandExecutor utility + tests. Add missing GitHub workflow update. --- .github/workflows/static_checks.yml | 3 +- scripts/assets/todo_open_exemptions.textproto | 86 +++- .../scripts/common/testing/BUILD.bazel | 15 + .../common/testing/FakeCommandExecutor.kt | 163 +++++++ .../oppia/android/scripts/common/BUILD.bazel | 12 + .../scripts/common/GitHubClientTest.kt | 252 +++++++++++ .../scripts/common/testing/BUILD.bazel | 15 + .../common/testing/FakeCommandExecutorTest.kt | 277 ++++++++++++ .../android/scripts/todo/TodoOpenCheckTest.kt | 416 +++++++++++++++++- wiki/Static-Analysis-Checks.md | 2 +- 10 files changed, 1214 insertions(+), 27 deletions(-) create mode 100644 scripts/src/java/org/oppia/android/scripts/common/testing/BUILD.bazel create mode 100644 scripts/src/java/org/oppia/android/scripts/common/testing/FakeCommandExecutor.kt create mode 100644 scripts/src/javatests/org/oppia/android/scripts/common/GitHubClientTest.kt create mode 100644 scripts/src/javatests/org/oppia/android/scripts/common/testing/BUILD.bazel create mode 100644 scripts/src/javatests/org/oppia/android/scripts/common/testing/FakeCommandExecutorTest.kt diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index d8469d7a1d4..cd99def2b9d 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -177,8 +177,7 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} run: | - gh issue list --limit 2000 --repo oppia/oppia-android --json number > $(pwd)/open_issues.json - bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb open_issues.json + bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb - name: String Resource Validation Check if: always() diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index 38b2655fe3e..dc7d7fe5e1c 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -253,38 +253,86 @@ todo_open_exemption { } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" - line_number: 57 line_number: 58 - line_number: 64 - line_number: 66 - line_number: 83 + line_number: 59 + line_number: 65 + line_number: 67 line_number: 84 line_number: 85 line_number: 86 line_number: 87 - line_number: 116 + line_number: 88 line_number: 117 - line_number: 120 - line_number: 148 + line_number: 118 + line_number: 121 line_number: 149 line_number: 150 - line_number: 155 - line_number: 157 - line_number: 191 + line_number: 151 + line_number: 156 + line_number: 158 line_number: 192 line_number: 193 - line_number: 198 - line_number: 200 - line_number: 206 - line_number: 240 - line_number: 244 - line_number: 277 + line_number: 194 + line_number: 199 + line_number: 201 + line_number: 207 + line_number: 241 + line_number: 245 line_number: 278 - line_number: 282 - line_number: 326 + line_number: 279 + line_number: 283 line_number: 327 line_number: 328 - line_number: 332 + line_number: 329 + line_number: 333 + line_number: 402 + line_number: 403 + line_number: 409 + line_number: 411 + line_number: 429 + line_number: 430 + line_number: 431 + line_number: 432 + line_number: 433 + line_number: 448 + line_number: 449 + line_number: 452 + line_number: 467 + line_number: 468 + line_number: 469 + line_number: 470 + line_number: 471 + line_number: 472 + line_number: 473 + line_number: 476 + line_number: 477 + line_number: 478 + line_number: 496 + line_number: 500 + line_number: 560 + line_number: 561 + line_number: 567 + line_number: 569 + line_number: 590 + line_number: 591 + line_number: 592 + line_number: 593 + line_number: 594 + line_number: 631 + line_number: 632 + line_number: 635 + line_number: 668 + line_number: 669 + line_number: 670 + line_number: 671 + line_number: 672 + line_number: 673 + line_number: 674 + line_number: 677 + line_number: 678 + line_number: 679 + line_number: 727 + line_number: 731 } todo_open_exemption { exempted_file_path: "scripts/static_checks.sh" diff --git a/scripts/src/java/org/oppia/android/scripts/common/testing/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/testing/BUILD.bazel new file mode 100644 index 00000000000..8e1428bfaee --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/testing/BUILD.bazel @@ -0,0 +1,15 @@ +""" +Package for test-only utilities that correspond to common script utilities. +""" + +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") + +kt_jvm_library( + name = "fake_command_executor", + testonly = True, + srcs = ["FakeCommandExecutor.kt"], + visibility = ["//scripts:oppia_script_test_visibility"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/common:command_executor", + ], +) diff --git a/scripts/src/java/org/oppia/android/scripts/common/testing/FakeCommandExecutor.kt b/scripts/src/java/org/oppia/android/scripts/common/testing/FakeCommandExecutor.kt new file mode 100644 index 00000000000..2485f3ac8fb --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/common/testing/FakeCommandExecutor.kt @@ -0,0 +1,163 @@ +package org.oppia.android.scripts.common.testing + +import org.oppia.android.scripts.common.CommandExecutor +import org.oppia.android.scripts.common.CommandResult +import java.io.ByteArrayOutputStream +import java.io.Closeable +import java.io.File +import java.io.IOException +import java.io.PrintStream +import java.util.concurrent.ConcurrentHashMap + +/** + * Test-only fake [CommandExecutor] that can be orchestrated to avoid introducing a real dependency + * on the local runtime environment. + * + * This executor works by delegating incoming commands to registered [CommandHandler]s (via + * [registerHandler]). If no handler exists for a specific command, an [IOException] is thrown + * (since the command can't be found) for parity with a production implementation of + * [CommandExecutor]. + */ +class FakeCommandExecutor : CommandExecutor { + private val handlers = ConcurrentHashMap() + + override fun executeCommand( + workingDir: File, + command: String, + vararg arguments: String, + includeErrorOutput: Boolean + ): CommandResult { + val handler = handlers[command] ?: DefaultCommandHandler + val argList = arguments.toList() + return OutputLogger.createLogger(ignoreErrorOutput = !includeErrorOutput).use { logger -> + CommandResult( + exitCode = handler.handleCommand(command, argList, logger.outputStream, logger.errorStream), + output = logger.outputLines, + errorOutput = logger.errorLines, + command = listOf(command) + argList + ) + } + } + + /** Registers a new [CommandHandler] for the specified [command]. */ + fun registerHandler(command: String, handler: CommandHandler) { + handlers[command] = handler + } + + /** Registers a new [CommandHandler] for the specified [command]. */ + fun registerHandler( + command: String, + handle: (String, List, PrintStream, PrintStream) -> Int + ) { + val handler = object : CommandHandler { + override fun handleCommand( + command: String, + args: List, + outputStream: PrintStream, + errorStream: PrintStream + ): Int = handle(command, args, outputStream, errorStream) + } + registerHandler(command, handler) + } + + // TODO(#4122): Convert this to a fun interface & remove the second registerHandler method above. + /** Handles commands that come to a [FakeCommandExecutor] via [executeCommand]. */ + interface CommandHandler { + /** + * Handles the request to execute a command. + * + * @param command the specific, case-sensitive command that's to be executed + * @param args the list of arguments to pass to the command + * @param outputStream where standard output for the command should be printed + * @param errorStream where error output for the command should be printed + * @return the status code of the command's execution + */ + fun handleCommand( + command: String, + args: List, + outputStream: PrintStream, + errorStream: PrintStream + ): Int + } + + /** + * [Closeable] logger for tracking standard & error output in [CommandHandler]s. + * + * New instances can be created using [createLogger]. + * + * Loggers should be [close]d prior to consuming [outputLines] or [errorLines], otherwise some + * lines may not be included. + */ + private sealed class OutputLogger : Closeable { + /** + * The destination for standard output from the [CommandHandler], only if this logger isn't + * [close]d. + */ + abstract val outputStream: PrintStream + + /** + * The destination for error output from the [CommandHandler], only if this logger isn't + * [close]d. + */ + abstract val errorStream: PrintStream + + /** The tracked standard output lines from the [CommandHandler]. */ + abstract val outputLines: List + + /** The tracked error output lines from the [CommandHandler]. */ + abstract val errorLines: List + + override fun close() { + outputStream.close() + errorStream.close() + } + + /** [OutputLogger] that only tracks standard output and ignores error output. */ + protected class DropErrorsLogger : OutputLogger() { + override val outputStream by lazy { PrintStream(outStreamBufferTracker) } + override val errorStream by lazy { PrintStream(errStreamBufferTracker) } + override val outputLines get() = outStreamBufferString.split("\n") + override val errorLines = emptyList() + + private val outStreamBufferTracker by lazy { ByteArrayOutputStream() } + private val errStreamBufferTracker by lazy { ByteArrayOutputStream() } + private val outStreamBufferString + get() = outStreamBufferTracker.toByteArray().toString(Charsets.UTF_8) + } + + /** [OutputLogger] that only tracks both standard and error ouput. */ + protected class SplitLogger : OutputLogger() { + override val outputStream by lazy { PrintStream(outStreamBufferTracker) } + override val errorStream by lazy { PrintStream(errStreamBufferTracker) } + override val outputLines get() = outStreamBufferString.split("\n") + override val errorLines get() = errStreamBufferString.split("\n") + + private val outStreamBufferTracker by lazy { ByteArrayOutputStream() } + private val errStreamBufferTracker by lazy { ByteArrayOutputStream() } + private val outStreamBufferString + get() = outStreamBufferTracker.toByteArray().toString(Charsets.UTF_8) + private val errStreamBufferString + get() = errStreamBufferTracker.toByteArray().toString(Charsets.UTF_8) + } + + companion object { + /** + * Returns a new [OutputLogger] that either tracks standard and error output, or only standard + * output (ignoring error output) depending on the provided [ignoreErrorOutput] parameter. + */ + fun createLogger(ignoreErrorOutput: Boolean): OutputLogger = + if (ignoreErrorOutput) DropErrorsLogger() else SplitLogger() + } + } + + private companion object { + private object DefaultCommandHandler : CommandHandler { + override fun handleCommand( + command: String, + args: List, + outputStream: PrintStream, + errorStream: PrintStream + ): Int = throw IOException("Command doesn't exist.") + } + } +} diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel index bb2009d98bd..03d24a11d19 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel @@ -40,6 +40,18 @@ kt_jvm_test( ], ) +kt_jvm_test( + name = "GitHubClientTest", + srcs = ["GitHubClientTest.kt"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/common:github_client", + "//scripts/src/java/org/oppia/android/scripts/common/testing:fake_command_executor", + "//testing:assertion_helpers", + "//third_party:com_google_truth_truth", + "//third_party:com_squareup_okhttp3_mockwebserver", + ], +) + kt_jvm_test( name = "ProtoStringEncoderTest", srcs = ["ProtoStringEncoderTest.kt"], diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/GitHubClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/GitHubClientTest.kt new file mode 100644 index 00000000000..112fba48291 --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/common/GitHubClientTest.kt @@ -0,0 +1,252 @@ +package org.oppia.android.scripts.common + +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.runBlocking +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import org.oppia.android.scripts.common.testing.FakeCommandExecutor +import org.oppia.android.testing.assertThrows +import java.lang.IllegalStateException + +/** Tests for [GitHubClient]. */ +// Function name: test names are conventionally named with underscores. +@Suppress("FunctionName") +class GitHubClientTest { + private companion object { + private const val TEST_AUTH_TOKEN = "abcdef1234567890" + } + + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val fakeCommandExecutor by lazy { FakeCommandExecutor() } + private lateinit var mockWebServer: MockWebServer + + @Before + fun setUp() { + mockWebServer = MockWebServer() + GitHubClient.remoteApiUrl = mockWebServer.url("/").toString() + } + + @After + fun tearDown() { + scriptBgDispatcher.close() + } + + @Test + fun testFetchAllOpenIssuesAsync_noGhTool_throwsException() { + setGitHubServiceNextResponseWithNoIssues() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + val exception = assertThrows() { + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + } + + assertThat(exception).hasMessageThat().contains("Failed to interact with gh tool.") + } + + @Test + fun testFetchAllOpenIssuesAsync_ghTool_missingAuthToken_throwsException() { + setUpSupportForGhAuthWithMissingToken() + setGitHubServiceNextResponseWithNoIssues() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + val exception = assertThrows() { + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + } + + assertThat(exception).hasMessageThat().contains("Failed to retrieve auth token from GH tool.") + } + + @Test + fun testFetchAllOpenIssuesAsync_withInvalidAuthToken_throwsException() { + setUpSupportForGhAuth(authToken = "Invalid") + setGitHubServiceNextResponseWithFailureCode(errorCode = 401) // Simulate invalid auth token. + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + val exception = assertThrows() { + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + } + + assertThat(exception).hasMessageThat().contains("Failed to fetch issues at page") + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_requestHasCorrectPath() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithNoIssues() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + + val request = mockWebServer.takeRequest() + assertThat(request.requestUrl?.encodedPath).isEqualTo("/repos/oppia/oppia-android/issues") + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_requestIncludesAuthorizationBearer() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithNoIssues() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + + val request = mockWebServer.takeRequest() + assertThat(request.getHeader("Authorization")).isEqualTo("Bearer $TEST_AUTH_TOKEN") + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_requestIncludesDataFormat() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithNoIssues() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + + val request = mockWebServer.takeRequest() + assertThat(request.getHeader("Accept")).isEqualTo("application/vnd.github+json") + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_requestIncludesApiVersion() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithNoIssues() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + + val request = mockWebServer.takeRequest() + assertThat(request.getHeader("X-GitHub-Api-Version")).isEqualTo("2022-11-28") + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_requestsQueriesIssuesInAscendingOrder() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithNoIssues() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + + val request = mockWebServer.takeRequest() + assertThat(request.requestUrl?.queryParameter("direction")).isEqualTo("asc") + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_missingResourceResponse_throwsException() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithFailureCode(errorCode = 404) + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + val exception = assertThrows() { + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + } + + assertThat(exception).hasMessageThat().contains("Failed to fetch issues at page") + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_nullBody_throwsException() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithNullResponse() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + val exception = assertThrows() { + runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + } + + assertThat(exception).hasMessageThat().contains("No issues response from GitHub for page") + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_noIssues_returnEmptyList() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithNoIssues() + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + val openIssues = runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + + assertThat(openIssues).isEmpty() + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_someIssues_returnIssuesList() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithSinglePageOfIssues(11, 57) + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + val openIssues = runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + + assertThat(openIssues).hasSize(2) + assertThat(openIssues[0].number).isEqualTo(11) + assertThat(openIssues[1].number).isEqualTo(57) + } + + @Test + fun testFetchAllOpenIssuesAsync_withAuthToken_multiplePagesOfIssues_returnsAllIssues() { + setUpSupportForGhAuth(authToken = TEST_AUTH_TOKEN) + setGitHubServiceNextResponseWithPagesOfIssues(listOf(11, 57), listOf(42), listOf(77, 28)) + val gitHubClient = GitHubClient(tempFolder.root, scriptBgDispatcher, fakeCommandExecutor) + + val openIssues = runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + + assertThat(openIssues).hasSize(5) + assertThat(openIssues[0].number).isEqualTo(11) + assertThat(openIssues[1].number).isEqualTo(57) + assertThat(openIssues[2].number).isEqualTo(42) + assertThat(openIssues[3].number).isEqualTo(77) + assertThat(openIssues[4].number).isEqualTo(28) + } + + private fun setUpSupportForGhAuthWithMissingToken() { + fakeCommandExecutor.registerHandler("gh") { _, args, _, errorStream -> + when (args) { + listOf("help") -> 0 + listOf("auth", "token") -> 1.also { errorStream.println("No auth token configured.") } + else -> 1 + } + } + } + + private fun setUpSupportForGhAuth(authToken: String) { + fakeCommandExecutor.registerHandler("gh") { _, args, outputStream, _ -> + when (args) { + listOf("help") -> 0 + listOf("auth", "token") -> 0.also { outputStream.print(authToken) } + else -> 1 + } + } + } + + private fun setGitHubServiceNextResponseWithNoIssues() { + setGitHubServiceNextResponseWithSinglePageOfIssues(/* no issues */) + } + + private fun setGitHubServiceNextResponseWithSinglePageOfIssues(vararg issueNumbers: Int) { + setGitHubServiceNextResponseWithPagesOfIssues(issueNumbers.toList()) + } + + private fun setGitHubServiceNextResponseWithPagesOfIssues(vararg issuePages: List) { + issuePages.forEach { issueNumbers -> + val issueJsons = issueNumbers.joinToString(separator = ",") { "{\"number\":$it}" } + setGitHubServiceNextResponseWithJsonResponse("[$issueJsons]") + } + setGitHubServiceNextResponseWithJsonResponse("[]") // No more issues. + } + + private fun setGitHubServiceNextResponseWithNullResponse() { + setGitHubServiceNextResponseWithJsonResponse(rawJson = "null") + } + + private fun setGitHubServiceNextResponseWithJsonResponse(rawJson: String) { + mockWebServer.enqueue(MockResponse().setBody(rawJson)) + } + + private fun setGitHubServiceNextResponseWithFailureCode(errorCode: Int) { + mockWebServer.enqueue(MockResponse().setResponseCode(errorCode)) + } +} diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/testing/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/common/testing/BUILD.bazel new file mode 100644 index 00000000000..f81195ad233 --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/common/testing/BUILD.bazel @@ -0,0 +1,15 @@ +""" +Tests corresponding to test-only utilities that correspond to common script utilities. +""" + +load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") + +kt_jvm_test( + name = "FakeCommandExecutorTest", + srcs = ["FakeCommandExecutorTest.kt"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/common/testing:fake_command_executor", + "//testing:assertion_helpers", + "//third_party:com_google_truth_truth", + ], +) diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/testing/FakeCommandExecutorTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/testing/FakeCommandExecutorTest.kt new file mode 100644 index 00000000000..406103f3a15 --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/common/testing/FakeCommandExecutorTest.kt @@ -0,0 +1,277 @@ +package org.oppia.android.scripts.common.testing + +import com.google.common.truth.Truth.assertThat +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder +import org.oppia.android.testing.assertThrows +import java.io.IOException + +/** Tests for [FakeCommandExecutor]. */ +// Function name: test names are conventionally named with underscores. +@Suppress("FunctionName") +class FakeCommandExecutorTest { + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + + @Test + fun testRegisterCommand_doesNotThrowException() { + val commandExecutor = FakeCommandExecutor() + + commandExecutor.registerHandler("test") { _, _, _, _ -> 0 } + + // The verification is that no exception is thrown. + } + + @Test + fun testRegisterTwoCommands_doesNotThrowException() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test1") { _, _, _, _ -> 0 } + + // Register a second, different command. + commandExecutor.registerHandler("test2") { _, _, _, _ -> 1 } + + // The verification is that no exception is thrown. + } + + @Test + fun testRegisterCommandTwice_doesNotThrowException() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test1") { _, _, _, _ -> 0 } + + // Register the same command a second time. + commandExecutor.registerHandler("test1") { _, _, _, _ -> 1 } + + // The verification is that no exception is thrown. + } + + @Test + fun testExecuteCommand_unregisteredCommand_throwsIoException() { + val commandExecutor = FakeCommandExecutor() + + val exception = assertThrows() { + commandExecutor.executeCommand(tempFolder.root, "test") + } + + assertThat(exception).hasMessageThat().contains("Command doesn't exist.") + } + + @Test + fun testExecuteCommand_diffCaseFromRegistered_throwsIoException() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, _, _ -> 0 } + + val exception = assertThrows() { + commandExecutor.executeCommand(tempFolder.root, "TEST") + } + + // Commands are case-sensitive. + assertThat(exception).hasMessageThat().contains("Command doesn't exist.") + } + + @Test + fun testExecuteCommand_registeredCommand_noArgs_returnsResultWithCorrectCommandLine() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, _, _ -> 0 } + + val result = commandExecutor.executeCommand(tempFolder.root, "test") + + assertThat(result.command).containsExactly("test").inOrder() + } + + @Test + fun testExecuteCommand_registeredCommand_oneArg_returnsResultWithCorrectCommandLine() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, _, _ -> 0 } + + val result = commandExecutor.executeCommand(tempFolder.root, "test", "arg1") + + assertThat(result.command).containsExactly("test", "arg1").inOrder() + } + + @Test + fun testExecuteCommand_registeredCommand_multipleArgs_returnsResultWithCorrectCommandLine() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, _, _ -> 0 } + + val result = commandExecutor.executeCommand(tempFolder.root, "test", "arg1", "arg3", "arg2") + + assertThat(result.command).containsExactly("test", "arg1", "arg3", "arg2").inOrder() + } + + @Test + fun testExecuteCommand_registeredCommand_returnsResultWithCorrectExitCode() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, _, _ -> 0 } + + val result = commandExecutor.executeCommand(tempFolder.root, "test") + + assertThat(result.exitCode).isEqualTo(0) + } + + @Test + fun testExecuteCommand_registeredCommand_noArgs_returnsCorrectExitCodeUsingArgs() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, args, _, _ -> 1 + args.sumOf { it.length } } + + val result = commandExecutor.executeCommand(tempFolder.root, "test") + + // No args passed. + assertThat(result.exitCode).isEqualTo(1) + } + + @Test + fun testExecuteCommand_registeredCommand_oneArg_returnsCorrectExitCodeUsingArgs() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, args, _, _ -> 1 + args.sumOf { it.length } } + + val result = commandExecutor.executeCommand(tempFolder.root, "test", "aa") + + // One arg contributes to the exit code value. + assertThat(result.exitCode).isEqualTo(3) + } + + @Test + fun testExecuteCommand_registeredCommand_multipleArgs_returnsCorrectExitCodeUsingArgs() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, args, _, _ -> 1 + args.sumOf { it.length } } + + val result = commandExecutor.executeCommand(tempFolder.root, "test", "aa", "b", "ccc") + + // All args contribute to the exit code value. + assertThat(result.exitCode).isEqualTo(7) + } + + @Test + fun testExecuteCommand_registeredCommand_returnsResultWithCorrectStandardOutput() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, standardStream, errorStream -> + standardStream.println("Line one") + errorStream.println("Error line one") + standardStream.println("Line two") + errorStream.println("Error line two") + errorStream.println("Error line three") + return@registerHandler 0 + } + + val result = commandExecutor.executeCommand(tempFolder.root, "test") + + assertThat(result.output).hasSize(3) + assertThat(result.output[0]).isEqualTo("Line one") + assertThat(result.output[1]).isEqualTo("Line two") + assertThat(result.output[2]).isEmpty() + } + + @Test + fun testExecuteCommand_registeredCommand_returnsResultWithCorrectErrorOutput() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, standardStream, errorStream -> + standardStream.println("Line one") + errorStream.println("Error line one") + standardStream.println("Line two") + errorStream.println("Error line two") + errorStream.println("Error line three") + return@registerHandler 0 + } + + val result = commandExecutor.executeCommand(tempFolder.root, "test") + + assertThat(result.errorOutput).hasSize(4) + assertThat(result.errorOutput[0]).isEqualTo("Error line one") + assertThat(result.errorOutput[1]).isEqualTo("Error line two") + assertThat(result.errorOutput[2]).isEqualTo("Error line three") + assertThat(result.errorOutput[3]).isEmpty() + } + + @Test + fun testExecuteCommand_registeredCommand_includeErrorOutput_returnsResultWithErrorOutput() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, standardStream, errorStream -> + standardStream.println("Line one") + errorStream.println("Error line one") + standardStream.println("Line two") + errorStream.println("Error line two") + errorStream.println("Error line three") + return@registerHandler 0 + } + + val result = commandExecutor.executeCommand(tempFolder.root, "test", includeErrorOutput = true) + + // The result should include error output. + assertThat(result.errorOutput).hasSize(4) + assertThat(result.errorOutput[0]).isEqualTo("Error line one") + assertThat(result.errorOutput[1]).isEqualTo("Error line two") + assertThat(result.errorOutput[2]).isEqualTo("Error line three") + assertThat(result.errorOutput[3]).isEmpty() + assertThat(result.output).hasSize(3) + assertThat(result.output[0]).isEqualTo("Line one") + assertThat(result.output[1]).isEqualTo("Line two") + assertThat(result.output[2]).isEmpty() + } + + @Test + fun testExecuteCommand_registeredCommand_doNotIncludeErrorOutput_returnsResultWithNoErrorLines() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test") { _, _, standardStream, errorStream -> + standardStream.println("Line one") + errorStream.println("Error line one") + standardStream.println("Line two") + errorStream.println("Error line two") + errorStream.println("Error line three") + return@registerHandler 0 + } + + val result = commandExecutor.executeCommand(tempFolder.root, "test", includeErrorOutput = false) + + // The result should include no error output. + assertThat(result.errorOutput).isEmpty() + assertThat(result.output).hasSize(3) + assertThat(result.output[0]).isEqualTo("Line one") + assertThat(result.output[1]).isEqualTo("Line two") + assertThat(result.output[2]).isEmpty() + } + + @Test + fun testExecuteCommand_secondRegisteredCommand_returnsCorrectCommandLine() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test1") { _, _, _, _ -> 0 } + commandExecutor.registerHandler("test2") { _, _, _, _ -> 1 } + + val result = commandExecutor.executeCommand(tempFolder.root, "test2", "arg1", "arg3", "arg2") + + assertThat(result.command).containsExactly("test2", "arg1", "arg3", "arg2").inOrder() + } + + @Test + fun testExecuteCommand_secondRegisteredCommand_returnsCorrectExitCode() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test1") { _, _, _, _ -> 0 } + commandExecutor.registerHandler("test2") { _, _, _, _ -> 1 } + + val result = commandExecutor.executeCommand(tempFolder.root, "test2", "arg1", "arg3", "arg2") + + assertThat(result.exitCode).isEqualTo(1) + } + + @Test + fun testExecuteCommand_replacedRegisteredCommand_returnsCorrectCommandLine() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test1") { _, _, _, _ -> 0 } + commandExecutor.registerHandler("test1") { _, _, _, _ -> 1 } + + val result = commandExecutor.executeCommand(tempFolder.root, "test1", "arg1", "arg3", "arg2") + + assertThat(result.command).containsExactly("test1", "arg1", "arg3", "arg2").inOrder() + } + + @Test + fun testExecuteCommand_replacedRegisteredCommand_returnsCorrectExitCode() { + val commandExecutor = FakeCommandExecutor() + commandExecutor.registerHandler("test1") { _, _, _, _ -> 0 } + commandExecutor.registerHandler("test1") { _, _, _, _ -> 1 } + + val result = commandExecutor.executeCommand(tempFolder.root, "test1", "arg1", "arg3", "arg2") + + // The replaced command handler should be used, instead. + assertThat(result.exitCode).isEqualTo(1) + } +} diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index c0fe90e51bd..2d12a51558d 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -18,10 +18,11 @@ import java.io.PrintStream /** Tests for [TodoOpenCheck]. */ class TodoOpenCheckTest { - private val outContent: ByteArrayOutputStream = ByteArrayOutputStream() - private val originalOut: PrintStream = System.out - private val TODO_CHECK_PASSED_OUTPUT_INDICATOR: String = "TODO CHECK PASSED" - private val TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR: String = "TODO CHECK FAILED" + private val outContent = ByteArrayOutputStream() + private val originalOut = System.out + private val TODO_CHECK_PASSED_OUTPUT_INDICATOR = "TODO CHECK PASSED" + private val TODO_SYNTAX_CHECK_FAILED_OUTPUT_INDICATOR = "TODO CHECK FAILED" + private val TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR = "TODO CHECK SKIPPED" private val pathToProtoBinary = "scripts/assets/todo_exemptions.pb" private val wikiReferenceNote = "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + @@ -368,6 +369,404 @@ class TodoOpenCheckTest { assertThat(outContent.toString().trim()).isEqualTo(failureMessage) } + @Test + fun testRegenerate_noTodos_checkShouldSkip() { + setUpGitHubService(issueNumbers = listOf(11004, 11003, 11002, 11001)) + val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") + val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") + val testContent1 = + """ + test Todo + test TODO + """.trimIndent() + val testContent2 = + """ + todo + """.trimIndent() + tempFile1.writeText(testContent1) + tempFile2.writeText(testContent2) + + val exception = assertThrows() { runScriptWithRegenerate() } + + // 'regenerate' always throws an exception since it's regenerating everything. + assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) + } + + @Test + fun testRegenerate_onlyValidTodos_checkShouldSkip() { + setUpGitHubService(issueNumbers = listOf(11004, 11003, 11002, 11001)) + val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") + val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") + val testContent1 = + """ + // TODO(#11002): test summary 1. + # TODO(#11004): test summary 2. + test Todo + test TODO + """.trimIndent() + val testContent2 = + """ + // TODO(#11001): test summary 3. + todo + + + """.trimIndent() + tempFile1.writeText(testContent1) + tempFile2.writeText(testContent2) + + val exception = assertThrows() { runScriptWithRegenerate() } + + // 'regenerate' always throws an exception since it's regenerating everything. + assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) + } + + @Test + fun testRegenerate_poorlyFormattedTodos_checkShouldSkip() { + setUpGitHubService(issueNumbers = emptyList()) + val tempFile = tempFolder.newFile("testfiles/TempFile.txt") + val testContent = + """ + // TODO (#1044): test + # TODO(102) + + // some test conent TODO(#1020000): test description. + some test content TODO(#100002): some description. + """.trimIndent() + tempFile.writeText(testContent) + + val exception = assertThrows() { runScriptWithRegenerate() } + + assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) + } + + @Test + fun testRegenerate_openIssuesTodos_checkShouldSkip() { + setUpGitHubService(issueNumbers = listOf(10000000, 100000004)) + val tempFile = tempFolder.newFile("testfiles/TempFile.txt") + val testContent = + """ + // TODO(#104444444): test summary 1. + # TODO(#10210110): test summary 2. + test todo + some test content Todo + + """.trimIndent() + tempFile.writeText(testContent) + + val exception = assertThrows() { runScriptWithRegenerate() } + + assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) + } + + @Test + fun testRegenerate_mixedBadFormattingAndOpenAndValidTodos_checkShouldSkip() { + setUpGitHubService(issueNumbers = listOf(10000000, 100000004, 11002, 11004)) + val tempFile = tempFolder.newFile("testfiles/TempFile.txt") + val testContent = + """ + // TODO (#1044): test + # TODO(102) + + // some test conent TODO(#1020000): test description. + some test content TODO(#100002): some description. + // TODO(#104444444): test summary 1. + # TODO(#10210110): test summary 2. + test todo + some test content Todo + + // TODO(#11002): test summary 1. + # TODO(#11004): test summary 2. + test Todo + test TODO + """.trimIndent() + tempFile.writeText(testContent) + + val exception = assertThrows() { runScriptWithRegenerate() } + + assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) + } + + @Test + fun testRegenerate_todosWithExemptions_checkShouldSkip() { + setUpGitHubService(issueNumbers = listOf(11004, 11003, 11002, 11001)) + val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") + val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") + val testContent1 = + """ + // TODO (152440222): test description 1 + """.trimIndent() + val testContent2 = + """ + # TODO(#1000000): test description 2 + """.trimIndent() + tempFile1.writeText(testContent1) + tempFile2.writeText(testContent2) + val exemptionFile = File("${tempFolder.root}/$pathToProtoBinary") + val exemptions = TodoOpenExemptions.newBuilder().apply { + this.addAllTodoOpenExemption( + listOf( + TodoOpenExemption.newBuilder().apply { + this.exemptedFilePath = "TempFile1.kt" + this.addAllLineNumber(listOf(1)).build() + }.build(), + TodoOpenExemption.newBuilder().apply { + this.exemptedFilePath = "TempFile2.kt" + this.addAllLineNumber(listOf(1)).build() + }.build() + ) + ) + }.build() + exemptions.writeTo(exemptionFile.outputStream()) + + val exception = assertThrows() { runScriptWithRegenerate() } + + // 'regenerate' always throws an exception since it's regenerating everything. + assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) + } + + @Test + fun testRegenerate_noTodos_shouldOutputEmptyTextProto() { + setUpGitHubService(issueNumbers = listOf(11004, 11003, 11002, 11001)) + val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") + val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") + val testContent1 = + """ + test Todo + test TODO + """.trimIndent() + val testContent2 = + """ + todo + """.trimIndent() + tempFile1.writeText(testContent1) + tempFile2.writeText(testContent2) + + assertThrows() { runScriptWithRegenerate() } + + val failureMessage = + """ + Regenerated exemptions: + """.trimIndent() + assertThat(outContent.toString().trim()).isEqualTo(failureMessage) + } + + @Test + fun testRegenerate_onlyValidTodos_shouldOutputEmptyTextProto() { + setUpGitHubService(issueNumbers = listOf(11004, 11003, 11002, 11001)) + val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") + val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") + val testContent1 = + """ + // TODO(#11002): test summary 1. + # TODO(#11004): test summary 2. + test Todo + test TODO + """.trimIndent() + val testContent2 = + """ + // TODO(#11001): test summary 3. + todo + + + """.trimIndent() + tempFile1.writeText(testContent1) + tempFile2.writeText(testContent2) + + assertThrows() { runScriptWithRegenerate() } + + val failureMessage = + """ + Regenerated exemptions: + """.trimIndent() + assertThat(outContent.toString().trim()).isEqualTo(failureMessage) + } + + @Test + fun testRegenerate_poorlyFormattedTodos_shouldOutputNewTextProto() { + setUpGitHubService(issueNumbers = emptyList()) + val tempFile = tempFolder.newFile("testfiles/TempFile.txt") + val testContent = + """ + // TODO (#1044): test + # TODO(102) + + // some test conent TODO(#1020000): test description. + some test content TODO(#100002): some description. + """.trimIndent() + tempFile.writeText(testContent) + + assertThrows() { runScriptWithRegenerate() } + + val failureMessage = + """ + TODOs not in correct format: + - TempFile.txt:1 + - TempFile.txt:2 + - TempFile.txt:3 + - TempFile.txt:4 + - TempFile.txt:5 + + $wikiReferenceNote + + Regenerated exemptions: + + todo_open_exemption { + exempted_file_path: "TempFile.txt" + line_number: 1 + line_number: 2 + line_number: 3 + line_number: 4 + line_number: 5 + } + """.trimIndent() + assertThat(outContent.toString().trim()).isEqualTo(failureMessage) + } + + @Test + fun testRegenerate_openIssuesTodos_shouldOutputNewTextProto() { + setUpGitHubService(issueNumbers = listOf(10000000, 100000004)) + val tempFile = tempFolder.newFile("testfiles/TempFile.txt") + val testContent = + """ + // TODO(#104444444): test summary 1. + # TODO(#10210110): test summary 2. + test todo + some test content Todo + + """.trimIndent() + tempFile.writeText(testContent) + + assertThrows() { runScriptWithRegenerate() } + + val failureMessage = + """ + TODOs not corresponding to open issues on GitHub: + - TempFile.txt:1 + - TempFile.txt:2 + - TempFile.txt:5 + + $wikiReferenceNote + + Regenerated exemptions: + + todo_open_exemption { + exempted_file_path: "TempFile.txt" + line_number: 1 + line_number: 2 + line_number: 5 + } + """.trimIndent() + assertThat(outContent.toString().trim()).isEqualTo(failureMessage) + } + + @Test + fun testRegenerate_mixedBadFormattingAndOpenAndValidTodos_shouldOutputNewTextProto() { + setUpGitHubService(issueNumbers = listOf(10000000, 100000004, 11002, 11004)) + val tempFile = tempFolder.newFile("testfiles/TempFile.txt") + val testContent = + """ + // TODO (#1044): test + # TODO(102) + + // some test conent TODO(#1020000): test description. + some test content TODO(#100002): some description. + // TODO(#104444444): test summary 1. + # TODO(#10210110): test summary 2. + test todo + some test content Todo + + // TODO(#11002): test summary 1. + # TODO(#11004): test summary 2. + test Todo + test TODO + """.trimIndent() + tempFile.writeText(testContent) + + assertThrows() { runScriptWithRegenerate() } + + val failureMessage = + """ + TODOs not in correct format: + - TempFile.txt:1 + - TempFile.txt:2 + - TempFile.txt:3 + - TempFile.txt:4 + - TempFile.txt:5 + + TODOs not corresponding to open issues on GitHub: + - TempFile.txt:6 + - TempFile.txt:7 + - TempFile.txt:10 + + $wikiReferenceNote + + Regenerated exemptions: + + todo_open_exemption { + exempted_file_path: "TempFile.txt" + line_number: 1 + line_number: 2 + line_number: 3 + line_number: 4 + line_number: 5 + line_number: 6 + line_number: 7 + line_number: 10 + } + """.trimIndent() + assertThat(outContent.toString().trim()).isEqualTo(failureMessage) + } + + @Test + fun testRegenerate_todosWithExemptions_shouldOutputNewTextProtoIncludingExemptions() { + setUpGitHubService(issueNumbers = listOf(11004, 11003, 11002, 11001)) + val tempFile1 = tempFolder.newFile("testfiles/TempFile1.kt") + val tempFile2 = tempFolder.newFile("testfiles/TempFile2.kt") + val testContent1 = + """ + // TODO (152440222): test description 1 + """.trimIndent() + val testContent2 = + """ + # TODO(#1000000): test description 2 + """.trimIndent() + tempFile1.writeText(testContent1) + tempFile2.writeText(testContent2) + val exemptionFile = File("${tempFolder.root}/$pathToProtoBinary") + val exemptions = TodoOpenExemptions.newBuilder().apply { + this.addAllTodoOpenExemption( + listOf( + TodoOpenExemption.newBuilder().apply { + this.exemptedFilePath = "TempFile1.kt" + this.addAllLineNumber(listOf(1)).build() + }.build(), + TodoOpenExemption.newBuilder().apply { + this.exemptedFilePath = "TempFile2.kt" + this.addAllLineNumber(listOf(1)).build() + }.build() + ) + ) + }.build() + exemptions.writeTo(exemptionFile.outputStream()) + + assertThrows() { runScriptWithRegenerate() } + + val failureMessage = + """ + Regenerated exemptions: + + todo_open_exemption { + exempted_file_path: "TempFile1.kt" + line_number: 1 + } + todo_open_exemption { + exempted_file_path: "TempFile2.kt" + line_number: 1 + } + """.trimIndent() + assertThat(outContent.toString().trim()).isEqualTo(failureMessage) + } + private fun setUpGitHubService(issueNumbers: List) { val issueJsons = issueNumbers.joinToString(separator = ",") { "{\"number\":$it}" } val mockWebServer = MockWebServer() @@ -376,11 +775,18 @@ class TodoOpenCheckTest { GitHubClient.remoteApiUrl = mockWebServer.url("/").toString() } - /** Runs the todo_open_check. */ private fun runScript() { main( "${tempFolder.root}/testfiles", "${tempFolder.root}/$pathToProtoBinary" ) } + + private fun runScriptWithRegenerate() { + main( + "${tempFolder.root}/testfiles", + "${tempFolder.root}/$pathToProtoBinary", + "regenerate" + ) + } } diff --git a/wiki/Static-Analysis-Checks.md b/wiki/Static-Analysis-Checks.md index dc15ce4231d..1c560dda976 100644 --- a/wiki/Static-Analysis-Checks.md +++ b/wiki/Static-Analysis-Checks.md @@ -223,7 +223,7 @@ todo_open_exemption { } ``` -Alternatively, the textproto can be entirely generated +Alternatively, the textproto can be entirely generated ## TODO issue resolved check The check ensures that a TODO issue is not closed until all of its corresponding TODO items are resolved. From 280b3ecb5e6dcdc7fb99040dd00424b13b5e2acb Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Wed, 14 Feb 2024 23:39:45 +0000 Subject: [PATCH 45/63] Add missing docs. --- wiki/Static-Analysis-Checks.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wiki/Static-Analysis-Checks.md b/wiki/Static-Analysis-Checks.md index 1c560dda976..372a9b27bc1 100644 --- a/wiki/Static-Analysis-Checks.md +++ b/wiki/Static-Analysis-Checks.md @@ -223,7 +223,11 @@ todo_open_exemption { } ``` -Alternatively, the textproto can be entirely generated +Alternatively, the textproto can be entirely generated by passing ``regenerate`` to the command as so: + +```sh +bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb regenerate +``` ## TODO issue resolved check The check ensures that a TODO issue is not closed until all of its corresponding TODO items are resolved. From 5951c0f73efe07c9d080bdc875dae8f9575f7f00 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 15 Feb 2024 00:02:42 +0000 Subject: [PATCH 46/63] Post-merge fixes. --- .../oppia/android/scripts/todo/TodoOpenCheckTest.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index 9f80935edf9..ee24c47383c 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -775,18 +775,10 @@ class TodoOpenCheckTest { } private fun runScript() { - main( - "${tempFolder.root}/testfiles", - "${tempFolder.root}/$pathToProtoBinary", - if (regenerateFile) "regenerate" else "" - ) + main("${tempFolder.root}/testfiles", "${tempFolder.root}/$pathToProtoBinary") } private fun runScriptWithRegenerate() { - main( - "${tempFolder.root}/testfiles", - "${tempFolder.root}/$pathToProtoBinary", - "regenerate" - ) + main("${tempFolder.root}/testfiles", "${tempFolder.root}/$pathToProtoBinary", "regenerate") } } From 3627067f46f84ba6147e9c4743ab90a78198fb15 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 15 Feb 2024 22:30:55 +0000 Subject: [PATCH 47/63] Update Maven dep list checker & updater scripts. Updates the utilities for the Maven dep list & updater scripts to have much more robustness when trying to verify the correct repository URLs for artifact coordinates, and when downloading artifact POM files. The main robustness changes come in the form of retries and smarter parallelization and error checking. These changes were necessary due to one of my workstations frequently flaking out on large numbers of URL blocks during verification, and this helps considerably. --- .../license/MavenArtifactPropertyFetcher.kt | 3 +- .../MavenArtifactPropertyFetcherImpl.kt | 13 +- .../license/MavenDependenciesRetriever.kt | 112 ++++++++++++++---- 3 files changed, 101 insertions(+), 27 deletions(-) diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt index fac6c57181d..17fec4b6c37 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt @@ -2,8 +2,9 @@ package org.oppia.android.scripts.license /** Utility class to extract specific Maven artifact properties from remote sources. */ interface MavenArtifactPropertyFetcher { + // TODO: Update docs. /** Scrapes and returns the text from a given URL. */ - fun scrapeText(link: String): String + fun scrapeText(link: String): String? /** Returns whether the specified URL corresponds to a real Maven artifact file. */ fun isValidArtifactFileUrl(url: String): Boolean diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt index 27c53f1cd9f..20af4997f4c 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt @@ -2,11 +2,15 @@ package org.oppia.android.scripts.license import java.net.HttpURLConnection import java.net.URL +import java.net.ConnectException +import java.net.SocketTimeoutException /** Default implementation of [MavenArtifactPropertyFetcher]. */ class MavenArtifactPropertyFetcherImpl : MavenArtifactPropertyFetcher { - override fun scrapeText(link: String): String { - return URL(link).openStream().bufferedReader().readText() + override fun scrapeText(link: String): String? { + return try { + URL(link).openStream().bufferedReader().readText() + } catch (e: ConnectException) { null } } override fun isValidArtifactFileUrl(url: String): Boolean { @@ -14,8 +18,13 @@ class MavenArtifactPropertyFetcherImpl : MavenArtifactPropertyFetcher { val connection = URL(url).openConnection() as? HttpURLConnection val responseCode = try { connection?.requestMethod = "HEAD" + connection?.setConnectTimeout(5_000) connection?.connect() connection?.responseCode + } catch (e: ConnectException) { + return false + } catch (e: SocketTimeoutException) { + return false } finally { connection?.disconnect() } ?: error("Failed to connect to URL: $url.") diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt index e90419c2259..f4a8f9b76cd 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt @@ -32,7 +32,6 @@ class MavenDependenciesRetriever( private val commandExecutor: CommandExecutor ) { private val bazelClient by lazy { BazelClient(File(rootPath), commandExecutor) } - private val coroutineScope by lazy { CoroutineScope(coroutineDispatcher) } /** Returns the list of third-party dependency names per Bazel. */ fun retrieveThirdPartyMavenDependenciesList(): List { @@ -188,21 +187,52 @@ class MavenDependenciesRetriever( * the list generated by Bazel Query and the list generated from maven_install.json * @return mavenDependencyList that has dependencies with licenses extracted from their POM files */ - fun retrieveDependencyListFromPom( + suspend fun retrieveDependencyListFromPom( finalDependenciesList: List ): MavenDependencyList { - val mavenDependencyList = finalDependenciesList.map { - val repoBaseUrl = it.repoUrls.firstOrNull() ?: error("No repo URL found for artifact: $it.") - val pomFileUrl = it.coord.computePomUrl(repoBaseUrl) - val pomFile = mavenArtifactPropertyFetcher.scrapeText(pomFileUrl) - val mavenDependency = MavenDependency.newBuilder().apply { - this.artifactName = it.coord.reducedCoordinateString - this.artifactVersion = it.coord.version - this.addAllLicense(extractLicenseLinksFromPom(pomFile)) + val pomCandidates = finalDependenciesList.map { MavenListDependencyPomCandidate(it) } + var attemptCount = 0 + var pomCandidatesToUpdate = pomCandidates.filter { it.latestPomFileText == null && it.downloadTryCount < 10 } + while (pomCandidatesToUpdate.isNotEmpty()) { + println("Attempt ${++attemptCount} to download POM files for ${pomCandidatesToUpdate.size}/${pomCandidates.size} Maven artifacts...") + pomCandidatesToUpdate.map { pomCandidate -> + CoroutineScope(coroutineDispatcher).async { + // Run blocking I/O operations on the I/O thread pool. + withContext(Dispatchers.IO) { + mavenArtifactPropertyFetcher.scrapeText(pomCandidate.pomFileUrl) + } + } + }.awaitAll().forEachIndexed { index, pomFileText -> + val pomCandidate = pomCandidatesToUpdate[index] + pomCandidate.latestPomFileText = pomFileText + pomCandidate.downloadTryCount++ } - mavenDependency.build() + pomCandidatesToUpdate = pomCandidates.filter { it.latestPomFileText == null && it.downloadTryCount < 10 } } - return MavenDependencyList.newBuilder().addAllMavenDependency(mavenDependencyList).build() + val failedToDownload = pomCandidates.filter { it.latestPomFileText == null } + check(failedToDownload.isEmpty()) { "Failed to download ${failedToDownload.size}/${pomCandidates.size} POM files: $failedToDownload." } + return MavenDependencyList.newBuilder().apply { + this.addAllMavenDependency( + pomCandidates.map { pomCandidate -> + MavenDependency.newBuilder().apply { + this.artifactName = pomCandidate.dep.coord.reducedCoordinateString + this.artifactVersion = pomCandidate.dep.coord.version + // NB: the '!!' is fine here since previous checks should ensure the POM file text is + // impossible to be null at this point. + this.addAllLicense(extractLicenseLinksFromPom(pomCandidate.latestPomFileText!!)) + }.build() + } + ) + }.build() + } + + // TODO: Move into correct location. + private data class MavenListDependencyPomCandidate( + val dep: MavenListDependency, var latestPomFileText: String? = null, var downloadTryCount: Int = 0 + ) { + private val repoBaseUrl: String + get() = dep.repoUrls.firstOrNull() ?: error("No repo URL found for artifact: $dep.") + val pomFileUrl: String by lazy { dep.coord.computePomUrl(repoBaseUrl) } } /** @@ -274,25 +304,59 @@ class MavenDependenciesRetriever( artifactCoordStr }.mapValues { (_, coordUrlToRepoUrlPairs) -> coordUrlToRepoUrlPairs.map { it.second } } - val coordToPossibleUrls = mavenInstallJson.artifacts.map { (partialCoord, artifact) -> + val coordCandidates = mavenInstallJson.artifacts.map { (partialCoord, artifact) -> val coord = MavenCoordinate.parseFrom("$partialCoord:${artifact.version}") - return@map coord to artifactPartialCoordToRepoUrls.getValue(partialCoord) + val repoUrls = artifactPartialCoordToRepoUrls.getValue(partialCoord) + val urlCandidates = repoUrls.map { repoUrl -> + ArtifactUrlCandidate(repoUrl, coord.computeArtifactUrl(repoUrl)) + } + return@map DownloadableCoordCandidate(coord, urlCandidates) } - val filteredCoordToPossibleUrls = coordToPossibleUrls.map { (coord, possibleUrls) -> - coroutineScope.async { - coord to possibleUrls.filter { + var remainingCandidates = coordCandidates.map { it.computeUrlsToTry() }.filter { it.isNotEmpty() } + var urlsToTry = remainingCandidates.flatten() + var attemptCount = 0 + while (urlsToTry.isNotEmpty()) { + println("Attempt ${++attemptCount} to resolve ${remainingCandidates.size}/${coordCandidates.size} Maven coordinates with ${urlsToTry.size} possible download URLs...") + val urlResolutions = urlsToTry.map { urlCandidate -> + CoroutineScope(coroutineDispatcher).async { // Run blocking I/O operations on the I/O thread pool. - withContext(Dispatchers.IO) { - mavenArtifactPropertyFetcher.isValidArtifactFileUrl(coord.computeArtifactUrl(it)) + urlCandidate to withContext(Dispatchers.IO) { + mavenArtifactPropertyFetcher.isValidArtifactFileUrl(urlCandidate.artifactUrl) } } } - } - // Wait for all repo URL checks to finish (parallely). - return runBlocking { - filteredCoordToPossibleUrls.awaitAll().map { (coord, validRepoUrls) -> - MavenListDependency(coord, validRepoUrls) + // Process all remaining repo URL checks parallely. + urlResolutions.awaitAll().forEach { (urlCandidate, status) -> + urlCandidate.checkAttemptCount++ + urlCandidate.latestDownloadStatus = status } + + remainingCandidates = coordCandidates.map { it.computeUrlsToTry() }.filter { it.isNotEmpty() } + urlsToTry = remainingCandidates.flatten() + } + val fullyFailingCandidates = coordCandidates.filter { it.computeSuccessfulUrls().isEmpty() } + check(fullyFailingCandidates.isEmpty()) { + "Failed to find viable artifact download URL for candidates (${fullyFailingCandidates.size}/${coordCandidates.size} failed): $fullyFailingCandidates." + } + return coordCandidates.map { candidate -> + MavenListDependency(candidate.coord, candidate.computeSuccessfulUrls().map { it.repoUrl }) + } + } + + // TODO: Move into correct location. + private data class ArtifactUrlCandidate(val repoUrl: String, val artifactUrl: String, var latestDownloadStatus: Boolean = false, var checkAttemptCount: Int = 0) + + private data class DownloadableCoordCandidate( + val coord: MavenCoordinate, val urlCandidates: List + ) { + fun computeSuccessfulUrls(): Set { + return urlCandidates.filterTo(mutableSetOf()) { it.latestDownloadStatus } + } + + fun computeUrlsToTry(): Set { + val successfulUrls = computeSuccessfulUrls() + if (successfulUrls.isNotEmpty()) return emptySet() // Only one URL is needed. + return urlCandidates.filterTo(mutableSetOf()) { it.checkAttemptCount < 10 } } } From 34ea6aa2e4e8abdebb6de936ffc5647b8bcf8e66 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Tue, 20 Feb 2024 22:57:17 +0000 Subject: [PATCH 48/63] Fix broken TodoOpenCheck tests & check exemptions. For the former, this mainly involved isolating the gh auth tool dependency in the same way as GitHubClientTest. This improves environment independence and test performance. --- scripts/assets/todo_open_exemptions.textproto | 150 +++---- .../android/scripts/todo/TodoOpenCheck.kt | 399 +++++++++--------- .../oppia/android/scripts/todo/BUILD.bazel | 1 + .../android/scripts/todo/TodoOpenCheckTest.kt | 65 +-- 4 files changed, 326 insertions(+), 289 deletions(-) diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index dc7d7fe5e1c..f7dbbc0cdb9 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -253,86 +253,86 @@ todo_open_exemption { } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" - line_number: 58 - line_number: 59 - line_number: 65 line_number: 67 - line_number: 84 - line_number: 85 - line_number: 86 - line_number: 87 - line_number: 88 - line_number: 117 - line_number: 118 - line_number: 121 - line_number: 149 - line_number: 150 - line_number: 151 - line_number: 156 + line_number: 68 + line_number: 74 + line_number: 76 + line_number: 93 + line_number: 94 + line_number: 95 + line_number: 96 + line_number: 97 + line_number: 126 + line_number: 127 + line_number: 130 line_number: 158 - line_number: 192 - line_number: 193 - line_number: 194 - line_number: 199 + line_number: 159 + line_number: 160 + line_number: 165 + line_number: 167 line_number: 201 - line_number: 207 - line_number: 241 - line_number: 245 - line_number: 278 - line_number: 279 - line_number: 283 - line_number: 327 - line_number: 328 - line_number: 329 - line_number: 333 - line_number: 402 - line_number: 403 - line_number: 409 + line_number: 202 + line_number: 203 + line_number: 208 + line_number: 210 + line_number: 216 + line_number: 250 + line_number: 254 + line_number: 287 + line_number: 288 + line_number: 292 + line_number: 336 + line_number: 337 + line_number: 338 + line_number: 342 line_number: 411 - line_number: 429 - line_number: 430 - line_number: 431 - line_number: 432 - line_number: 433 - line_number: 448 - line_number: 449 - line_number: 452 - line_number: 467 - line_number: 468 - line_number: 469 - line_number: 470 - line_number: 471 - line_number: 472 - line_number: 473 + line_number: 412 + line_number: 418 + line_number: 420 + line_number: 438 + line_number: 439 + line_number: 440 + line_number: 441 + line_number: 442 + line_number: 457 + line_number: 458 + line_number: 461 line_number: 476 line_number: 477 line_number: 478 - line_number: 496 - line_number: 500 - line_number: 560 - line_number: 561 - line_number: 567 + line_number: 479 + line_number: 480 + line_number: 481 + line_number: 482 + line_number: 485 + line_number: 486 + line_number: 487 + line_number: 505 + line_number: 509 line_number: 569 - line_number: 590 - line_number: 591 - line_number: 592 - line_number: 593 - line_number: 594 - line_number: 631 - line_number: 632 - line_number: 635 - line_number: 668 - line_number: 669 - line_number: 670 - line_number: 671 - line_number: 672 - line_number: 673 - line_number: 674 + line_number: 570 + line_number: 576 + line_number: 578 + line_number: 599 + line_number: 600 + line_number: 601 + line_number: 602 + line_number: 603 + line_number: 640 + line_number: 641 + line_number: 644 line_number: 677 line_number: 678 line_number: 679 - line_number: 727 - line_number: 731 + line_number: 680 + line_number: 681 + line_number: 682 + line_number: 683 + line_number: 686 + line_number: 687 + line_number: 688 + line_number: 736 + line_number: 740 } todo_open_exemption { exempted_file_path: "scripts/static_checks.sh" @@ -350,10 +350,10 @@ todo_open_exemption { line_number: 204 line_number: 208 line_number: 210 - line_number: 228 - line_number: 238 - line_number: 241 - line_number: 244 - line_number: 247 - line_number: 250 + line_number: 232 + line_number: 242 + line_number: 245 + line_number: 248 + line_number: 251 + line_number: 254 } diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt index 97664dfa242..545a9077dd2 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt @@ -2,6 +2,8 @@ package org.oppia.android.scripts.todo import com.google.protobuf.TextFormat import kotlinx.coroutines.runBlocking +import org.oppia.android.scripts.common.CommandExecutor +import org.oppia.android.scripts.common.CommandExecutorImpl import org.oppia.android.scripts.common.GitHubClient import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher import org.oppia.android.scripts.common.model.GitHubIssue @@ -33,231 +35,250 @@ import java.io.FileInputStream * bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb regenerate */ fun main(vararg args: String) { - // Path of the repo to be analyzed. val repoRoot = File(args[0]).absoluteFile.normalize() - val repoPath = "${repoRoot.path}/" - val pathToProtoBinary = args[1] val regenerateFile = args.getOrNull(2) == "regenerate" - - val todoExemptionTextProtoFilePath = "scripts/assets/todo_exemptions" - - // List of all the open issues on GitHub of this repository. - val openIssueList = ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> - val gitHubClient = GitHubClient(repoRoot, scriptBgDispatcher) - runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + TodoOpenCheck(repoRoot, scriptBgDispatcher).runTodoOpenCheck(pathToProtoBinary, regenerateFile) } +} - val todoExemptionList = - loadTodoExemptionsProto(pathToProtoBinary).getTodoOpenExemptionList() +/** + * Utility used to determine whether TODOs in the specified repository are correctly formatted and + * correspond to open issues on GitHub. + */ +class TodoOpenCheck( + private val repoRoot: File, + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, + private val commandExecutor: CommandExecutor = CommandExecutorImpl(scriptBgDispatcher) +) { + private val gitHubClient by lazy { GitHubClient(repoRoot, scriptBgDispatcher, commandExecutor) } - val allTodos = TodoCollector.collectTodos(repoPath) + /** + * Determines whether the TODOs in the configured repository are correctly formatted and + * correspond to open issues on GitHub. + * + * @param pathToProtoBinary the absolute path to the exemptions proto that defines lines on which + * it's okay for the issue to either not exist or not be correctly formatted + * @param regenerateFile whether, regardless of an existing failure, the exemptions file should be + * regenerated and printed to the standard output in textproto format + */ + fun runTodoOpenCheck(pathToProtoBinary: String, regenerateFile: Boolean) { + // List of all the open issues on GitHub of this repository. + val openIssueList = runBlocking { gitHubClient.fetchAllOpenIssuesAsync().await() } - val poorlyFormattedTodos = TodoCollector.collectPoorlyFormattedTodos(allTodos) + val todoExemptionList = + loadTodoExemptionsProto(pathToProtoBinary).getTodoOpenExemptionList() - val correctlyFormattedTodos = TodoCollector.collectCorrectlyFormattedTodos( - allTodos - poorlyFormattedTodos - ) + val allTodos = TodoCollector.collectTodos(repoPath = "${repoRoot.path}/") - val openIssueFailureTodos = correctlyFormattedTodos.filter { todo -> - checkIfIssueDoesNotMatchOpenIssue(codeLine = todo.lineContent, openIssueList = openIssueList) - } + val poorlyFormattedTodos = TodoCollector.collectPoorlyFormattedTodos(allTodos) - val redundantExemptions = retrieveRedundantExemptions( - todos = poorlyFormattedTodos + openIssueFailureTodos, todoExemptionList, repoRoot - ) + val correctlyFormattedTodos = TodoCollector.collectCorrectlyFormattedTodos( + allTodos - poorlyFormattedTodos + ) - val poorlyFormattedTodosAfterExemption = - retrieveTodosAfterExemption(todos = poorlyFormattedTodos, todoExemptionList, repoRoot) + val openIssueFailureTodos = correctlyFormattedTodos.filter { todo -> + checkIfIssueDoesNotMatchOpenIssue(codeLine = todo.lineContent, openIssueList = openIssueList) + } - val openIssueFailureTodosAfterExemption = - retrieveTodosAfterExemption(todos = openIssueFailureTodos, todoExemptionList, repoRoot) + val redundantExemptions = retrieveRedundantExemptions( + todos = poorlyFormattedTodos + openIssueFailureTodos, todoExemptionList, repoRoot + ) - logRedundantExemptions(redundantExemptions, todoExemptionTextProtoFilePath) + val poorlyFormattedTodosAfterExemption = + retrieveTodosAfterExemption(todos = poorlyFormattedTodos, todoExemptionList, repoRoot) - logFailures( - invalidTodos = poorlyFormattedTodosAfterExemption, - repoRoot, - failureMessage = "TODOs not in correct format:", - ) + val openIssueFailureTodosAfterExemption = + retrieveTodosAfterExemption(todos = openIssueFailureTodos, todoExemptionList, repoRoot) - logFailures( - invalidTodos = openIssueFailureTodosAfterExemption, - repoRoot, - failureMessage = "TODOs not corresponding to open issues on GitHub:", - ) + val todoExemptionTextProtoFilePath = "scripts/assets/todo_exemptions" + logRedundantExemptions(redundantExemptions, todoExemptionTextProtoFilePath) - if (poorlyFormattedTodosAfterExemption.isNotEmpty() || - openIssueFailureTodosAfterExemption.isNotEmpty() - ) { - println( - "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + - "#todo-open-checks for more details on how to fix this.\n" + logFailures( + invalidTodos = poorlyFormattedTodosAfterExemption, + repoRoot, + failureMessage = "TODOs not in correct format:", ) - } - - if (regenerateFile) { - println("Regenerated exemptions:") - println() - val allProblematicTodos = poorlyFormattedTodos + openIssueFailureTodos - val newExemptions = allProblematicTodos.convertToExemptions(repoRoot) - println(newExemptions.convertToExemptionTextProto()) - throw Exception("TODO CHECK SKIPPED") - } - if ( - redundantExemptions.isNotEmpty() || - poorlyFormattedTodosAfterExemption.isNotEmpty() || - openIssueFailureTodosAfterExemption.isNotEmpty() - ) { - println( - "There were failures. Re-run the command with \"regenerate\" at the end to regenerate the" + - " exemption file with all failures as exempted." + logFailures( + invalidTodos = openIssueFailureTodosAfterExemption, + repoRoot, + failureMessage = "TODOs not corresponding to open issues on GitHub:", ) - println() - throw Exception("TODO CHECK FAILED") - } else { - println("TODO CHECK PASSED") - } -} -/** - * Retrieves the TODO open check failures list after filtering them from the exemptions. - * - * @param todos the list of all the failure causing TODOs - * @param todoExemptionList the list contating the TODO exemptions - * @param repoRoot the root directory of the repository - * @return list obtained after filtering the exemptions - */ -private fun retrieveTodosAfterExemption( - todos: List, - todoExemptionList: List, - repoRoot: File -): List { - return todos.filter { todo -> - todoExemptionList.none { - it.exemptedFilePath == todo.file.toRelativeString(repoRoot) && - todo.lineNumber in it.lineNumberList + if (poorlyFormattedTodosAfterExemption.isNotEmpty() || + openIssueFailureTodosAfterExemption.isNotEmpty() + ) { + println( + "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + + "#todo-open-checks for more details on how to fix this.\n" + ) + } + + if (regenerateFile) { + println("Regenerated exemptions:") + println() + val allProblematicTodos = poorlyFormattedTodos + openIssueFailureTodos + val newExemptions = allProblematicTodos.convertToExemptions(repoRoot) + println(newExemptions.convertToExemptionTextProto()) + throw Exception("TODO CHECK SKIPPED") + } + + if ( + redundantExemptions.isNotEmpty() || + poorlyFormattedTodosAfterExemption.isNotEmpty() || + openIssueFailureTodosAfterExemption.isNotEmpty() + ) { + println( + "There were failures. Re-run the command with \"regenerate\" at the end to regenerate the" + + " exemption file with all failures as exempted." + ) + println() + throw Exception("TODO CHECK FAILED") + } else { + println("TODO CHECK PASSED") } } -} -/** - * Retrieves a list of redundant exemptions. - * - * @param todos the list of all the failure causing TODOs - * @param todoExemptionList the list contating the TODO exemptions - * @param repoRoot the root directory of the repository - * @return a list of all the redundant exemptions - */ -private fun retrieveRedundantExemptions( - todos: List, - todoExemptionList: List, - repoRoot: File -): List> { - return todoExemptionList.flatMap { exemption -> - exemption.lineNumberList.mapNotNull { exemptedLineNumber -> - val isRedundantExemption = todos.none { - it.file.toRelativeString(repoRoot) == exemption.exemptedFilePath && - it.lineNumber == exemptedLineNumber + /** + * Retrieves the TODO open check failures list after filtering them from the exemptions. + * + * @param todos the list of all the failure causing TODOs + * @param todoExemptionList the list contating the TODO exemptions + * @param repoRoot the root directory of the repository + * @return list obtained after filtering the exemptions + */ + private fun retrieveTodosAfterExemption( + todos: List, + todoExemptionList: List, + repoRoot: File + ): List { + return todos.filter { todo -> + todoExemptionList.none { + it.exemptedFilePath == todo.file.toRelativeString(repoRoot) && + todo.lineNumber in it.lineNumberList } - if (isRedundantExemption) { - Pair(exemption.exemptedFilePath, exemptedLineNumber) - } else { - null + } + } + + /** + * Retrieves a list of redundant exemptions. + * + * @param todos the list of all the failure causing TODOs + * @param todoExemptionList the list contating the TODO exemptions + * @param repoRoot the root directory of the repository + * @return a list of all the redundant exemptions + */ + private fun retrieveRedundantExemptions( + todos: List, + todoExemptionList: List, + repoRoot: File + ): List> { + return todoExemptionList.flatMap { exemption -> + exemption.lineNumberList.mapNotNull { exemptedLineNumber -> + val isRedundantExemption = todos.none { + it.file.toRelativeString(repoRoot) == exemption.exemptedFilePath && + it.lineNumber == exemptedLineNumber + } + if (isRedundantExemption) { + Pair(exemption.exemptedFilePath, exemptedLineNumber) + } else { + null + } } } } -} -/** - * Checks whether a TODO does not corresponds to open issues on GitHub. - * - * @param codeLine the line of code to be checked - * @param openIssueList the list of all the open issues of this repository on GitHub - * @return whether the TODO does not corresponds to open issues on GitHub - */ -private fun checkIfIssueDoesNotMatchOpenIssue( - codeLine: String, - openIssueList: List, -): Boolean { - val parsedIssueNumberFromTodo = TodoCollector.parseIssueNumberFromTodo(codeLine) - return openIssueList.none { it -> it.number == parsedIssueNumberFromTodo } -} + /** + * Checks whether a TODO does not corresponds to open issues on GitHub. + * + * @param codeLine the line of code to be checked + * @param openIssueList the list of all the open issues of this repository on GitHub + * @return whether the TODO does not corresponds to open issues on GitHub + */ + private fun checkIfIssueDoesNotMatchOpenIssue( + codeLine: String, + openIssueList: List, + ): Boolean { + val parsedIssueNumberFromTodo = TodoCollector.parseIssueNumberFromTodo(codeLine) + return openIssueList.none { it -> it.number == parsedIssueNumberFromTodo } + } -/** - * Logs the redundant exemptions. - * - * @param redundantExemptions list of redundant exemptions - * @param todoExemptionTextProtoFilePath the location of the TODO exemption textproto file - */ -private fun logRedundantExemptions( - redundantExemptions: List>, - todoExemptionTextProtoFilePath: String -) { - if (redundantExemptions.isNotEmpty()) { - println("Redundant exemptions (there are no TODOs corresponding to these lines):") - redundantExemptions.sortedWith(compareBy({ it.first }, { it.second })).forEach { exemption -> - println("- ${exemption.first}:${exemption.second}") + /** + * Logs the redundant exemptions. + * + * @param redundantExemptions list of redundant exemptions + * @param todoExemptionTextProtoFilePath the location of the TODO exemption textproto file + */ + private fun logRedundantExemptions( + redundantExemptions: List>, + todoExemptionTextProtoFilePath: String + ) { + if (redundantExemptions.isNotEmpty()) { + println("Redundant exemptions (there are no TODOs corresponding to these lines):") + redundantExemptions.sortedWith(compareBy({ it.first }, { it.second })).forEach { exemption -> + println("- ${exemption.first}:${exemption.second}") + } + println( + "Please remove them from $todoExemptionTextProtoFilePath.textproto" + ) + println() } - println( - "Please remove them from $todoExemptionTextProtoFilePath.textproto" - ) - println() } -} -/** - * Logs the TODO open check failures. - * - * @param invalidTodos a list of all the invalid TODOs present in the repository. A TODO is - * considered to be invalid if it is poorly formatted or if it does not corresponds to open - * issues on GitHub. - * @param repoRoot the root directory of the repository - * @param failureMessage the failure message to be logged - */ -private fun logFailures(invalidTodos: List, repoRoot: File, failureMessage: String) { - if (invalidTodos.isNotEmpty()) { - println(failureMessage) - invalidTodos.sortedWith(compareBy({ it.file.path }, { it.lineNumber })).forEach { - println("- ${it.file.toRelativeString(repoRoot)}:${it.lineNumber}") + /** + * Logs the TODO open check failures. + * + * @param invalidTodos a list of all the invalid TODOs present in the repository. A TODO is + * considered to be invalid if it is poorly formatted or if it does not corresponds to open + * issues on GitHub. + * @param repoRoot the root directory of the repository + * @param failureMessage the failure message to be logged + */ + private fun logFailures(invalidTodos: List, repoRoot: File, failureMessage: String) { + if (invalidTodos.isNotEmpty()) { + println(failureMessage) + invalidTodos.sortedWith(compareBy({ it.file.path }, { it.lineNumber })).forEach { + println("- ${it.file.toRelativeString(repoRoot)}:${it.lineNumber}") + } + println() } - println() } -} -private fun List.convertToExemptions(repoRoot: File): List { - return groupBy { it.file.path }.map { (_, todos) -> - TodoOpenExemption.newBuilder().apply { - exemptedFilePath = todos.first().file.toRelativeString(repoRoot) - addAllLineNumber(todos.map { it.lineNumber }.sorted()) - }.build() - }.sortedBy { it.exemptedFilePath } -} + private fun List.convertToExemptions(repoRoot: File): List { + return groupBy { it.file.path }.map { (_, todos) -> + TodoOpenExemption.newBuilder().apply { + exemptedFilePath = todos.first().file.toRelativeString(repoRoot) + addAllLineNumber(todos.map { it.lineNumber }.sorted()) + }.build() + }.sortedBy { it.exemptedFilePath } + } -private fun List.convertToExemptionTextProto(): String { - val baseProto = TodoOpenExemptions.newBuilder().apply { - addAllTodoOpenExemption(this@convertToExemptionTextProto) - }.build() - return TextFormat.printer().printToString(baseProto) -} + private fun List.convertToExemptionTextProto(): String { + val baseProto = TodoOpenExemptions.newBuilder().apply { + addAllTodoOpenExemption(this@convertToExemptionTextProto) + }.build() + return TextFormat.printer().printToString(baseProto) + } -/** - * Loads the TODO open check exemptions list corresponding to a text proto file. - * - * @param pathToProtoBinary the location of the exemption textproto file - * @return proto class from the parsed textproto file - */ -private fun loadTodoExemptionsProto(pathToProtoBinary: String): TodoOpenExemptions { - val protoBinaryFile = File(pathToProtoBinary) - val builder = TodoOpenExemptions.getDefaultInstance().newBuilderForType() + /** + * Loads the TODO open check exemptions list corresponding to a text proto file. + * + * @param pathToProtoBinary the location of the exemption textproto file + * @return proto class from the parsed textproto file + */ + private fun loadTodoExemptionsProto(pathToProtoBinary: String): TodoOpenExemptions { + val protoBinaryFile = File(pathToProtoBinary) + val builder = TodoOpenExemptions.getDefaultInstance().newBuilderForType() - // This cast is type-safe since proto guarantees type consistency from mergeFrom(), - // and this method is bounded by the generic type T. - @Suppress("UNCHECKED_CAST") - val protoObj: TodoOpenExemptions = - FileInputStream(protoBinaryFile).use { - builder.mergeFrom(it) - }.build() as TodoOpenExemptions - return protoObj + // This cast is type-safe since proto guarantees type consistency from mergeFrom(), + // and this method is bounded by the generic type T. + @Suppress("UNCHECKED_CAST") + val protoObj: TodoOpenExemptions = + FileInputStream(protoBinaryFile).use { + builder.mergeFrom(it) + }.build() as TodoOpenExemptions + return protoObj + } } diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel index 55e7c6fb79e..d206ecde80e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel @@ -19,6 +19,7 @@ kt_jvm_test( name = "TodoOpenCheckTest", srcs = ["TodoOpenCheckTest.kt"], deps = [ + "//scripts/src/java/org/oppia/android/scripts/common/testing:fake_command_executor", "//scripts/src/java/org/oppia/android/scripts/todo:todo_open_check_lib", "//testing:assertion_helpers", "//third_party:com_google_truth_truth", diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index 2d12a51558d..d032814c076 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -9,6 +9,8 @@ import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder import org.oppia.android.scripts.common.GitHubClient +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher +import org.oppia.android.scripts.common.testing.FakeCommandExecutor import org.oppia.android.scripts.proto.TodoOpenExemption import org.oppia.android.scripts.proto.TodoOpenExemptions import org.oppia.android.testing.assertThrows @@ -18,6 +20,10 @@ import java.io.PrintStream /** Tests for [TodoOpenCheck]. */ class TodoOpenCheckTest { + private companion object { + private const val TEST_AUTH_TOKEN = "abcdef1234567890" + } + private val outContent = ByteArrayOutputStream() private val originalOut = System.out private val TODO_CHECK_PASSED_OUTPUT_INDICATOR = "TODO CHECK PASSED" @@ -31,21 +37,24 @@ class TodoOpenCheckTest { "There were failures. Re-run the command with \"regenerate\" at the end to regenerate the " + "exemption file with all failures as exempted." - @Rule - @JvmField - var tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() + + private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } + private val fakeCommandExecutor by lazy { FakeCommandExecutor() } @Before fun setUp() { tempFolder.newFolder("testfiles") tempFolder.newFolder("scripts", "assets") tempFolder.newFile(pathToProtoBinary) + setUpSupportForGhAuth(TEST_AUTH_TOKEN) System.setOut(PrintStream(outContent)) } @After fun restoreStreams() { System.setOut(originalOut) + scriptBgDispatcher.close() } @Test @@ -386,7 +395,7 @@ class TodoOpenCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - val exception = assertThrows() { runScriptWithRegenerate() } + val exception = assertThrows() { runScript(regenerateFile = true) } // 'regenerate' always throws an exception since it's regenerating everything. assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) @@ -414,7 +423,7 @@ class TodoOpenCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - val exception = assertThrows() { runScriptWithRegenerate() } + val exception = assertThrows() { runScript(regenerateFile = true) } // 'regenerate' always throws an exception since it's regenerating everything. assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) @@ -434,7 +443,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - val exception = assertThrows() { runScriptWithRegenerate() } + val exception = assertThrows() { runScript(regenerateFile = true) } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) } @@ -453,7 +462,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - val exception = assertThrows() { runScriptWithRegenerate() } + val exception = assertThrows() { runScript(regenerateFile = true) } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) } @@ -481,7 +490,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - val exception = assertThrows() { runScriptWithRegenerate() } + val exception = assertThrows() { runScript(regenerateFile = true) } assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) } @@ -518,7 +527,7 @@ class TodoOpenCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - val exception = assertThrows() { runScriptWithRegenerate() } + val exception = assertThrows() { runScript(regenerateFile = true) } // 'regenerate' always throws an exception since it's regenerating everything. assertThat(exception).hasMessageThat().contains(TODO_SYNTAX_CHECK_SKIPPED_OUTPUT_INDICATOR) @@ -541,7 +550,7 @@ class TodoOpenCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - assertThrows() { runScriptWithRegenerate() } + assertThrows() { runScript(regenerateFile = true) } val failureMessage = """ @@ -572,7 +581,7 @@ class TodoOpenCheckTest { tempFile1.writeText(testContent1) tempFile2.writeText(testContent2) - assertThrows() { runScriptWithRegenerate() } + assertThrows() { runScript(regenerateFile = true) } val failureMessage = """ @@ -595,7 +604,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - assertThrows() { runScriptWithRegenerate() } + assertThrows() { runScript(regenerateFile = true) } val failureMessage = """ @@ -636,7 +645,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - assertThrows() { runScriptWithRegenerate() } + assertThrows() { runScript(regenerateFile = true) } val failureMessage = """ @@ -682,7 +691,7 @@ class TodoOpenCheckTest { """.trimIndent() tempFile.writeText(testContent) - assertThrows() { runScriptWithRegenerate() } + assertThrows() { runScript(regenerateFile = true) } val failureMessage = """ @@ -749,7 +758,7 @@ class TodoOpenCheckTest { }.build() exemptions.writeTo(exemptionFile.outputStream()) - assertThrows() { runScriptWithRegenerate() } + assertThrows() { runScript(regenerateFile = true) } val failureMessage = """ @@ -775,18 +784,24 @@ class TodoOpenCheckTest { GitHubClient.remoteApiUrl = mockWebServer.url("/").toString() } - private fun runScript() { - main( - "${tempFolder.root}/testfiles", - "${tempFolder.root}/$pathToProtoBinary" - ) + private fun setUpSupportForGhAuth(authToken: String) { + fakeCommandExecutor.registerHandler("gh") { _, args, outputStream, _ -> + when (args) { + listOf("help") -> 0 + listOf("auth", "token") -> 0.also { outputStream.print(authToken) } + else -> 1 + } + } } - private fun runScriptWithRegenerate() { - main( - "${tempFolder.root}/testfiles", - "${tempFolder.root}/$pathToProtoBinary", - "regenerate" + // TODO(#5314): Replace this (& other script tests) with using main() directly and swap out + // dependencies using Dagger rather than needing to call into a separately created instance of an + // internal helper class for the script. + private fun runScript(regenerateFile: Boolean = false) { + val repoRoot = File(tempFolder.root, "testfiles") + TodoOpenCheck(repoRoot, scriptBgDispatcher, fakeCommandExecutor).runTodoOpenCheck( + pathToProtoBinary = "${tempFolder.root}/$pathToProtoBinary", + regenerateFile ) } } From 8c8799335fb357d5acd43369194ec7fad9d1c85b Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 22 Feb 2024 22:15:25 +0000 Subject: [PATCH 49/63] Fix broken checks & failing static checks. --- scripts/assets/test_file_exemptions.textproto | 3 + .../license/MavenArtifactPropertyFetcher.kt | 7 +- .../MavenArtifactPropertyFetcherImpl.kt | 4 +- .../license/MavenDependenciesListCheck.kt | 12 +- .../license/MavenDependenciesRetriever.kt | 179 +++++++++++------- .../maven/GenerateMavenDependenciesList.kt | 6 +- .../scripts/maven/RetrieveLicenseTexts.kt | 10 +- .../license/MavenDependenciesListCheckTest.kt | 16 ++ .../license/MavenDependenciesRetrieverTest.kt | 96 +++++----- 9 files changed, 196 insertions(+), 137 deletions(-) diff --git a/scripts/assets/test_file_exemptions.textproto b/scripts/assets/test_file_exemptions.textproto index 41fd0c52141..e643534c13d 100644 --- a/scripts/assets/test_file_exemptions.textproto +++ b/scripts/assets/test_file_exemptions.textproto @@ -754,6 +754,9 @@ exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/LicenseF exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/LicenseFetcherImpl.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/model/CopyrightLicense.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/license/model/Dependency.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/maven/model/MavenArtifact.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/maven/model/MavenInstallJson.kt" +exempted_file_path: "scripts/src/java/org/oppia/android/scripts/telemetry/DecodeUserStudyEventString.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Issue.kt" exempted_file_path: "scripts/src/java/org/oppia/android/scripts/todo/model/Todo.kt" exempted_file_path: "testing/src/main/java/org/oppia/android/testing/AccessibilityTestRule.kt" diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt index 17fec4b6c37..6e5d1d452a2 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcher.kt @@ -2,8 +2,11 @@ package org.oppia.android.scripts.license /** Utility class to extract specific Maven artifact properties from remote sources. */ interface MavenArtifactPropertyFetcher { - // TODO: Update docs. - /** Scrapes and returns the text from a given URL. */ + /** + * Scrapes and returns the text from a given URL, or null if the link failed to be resolved. Note + * that a failure in this case can indicate a network flake and doesn't necessarily mean that the + * link is invalid. + */ fun scrapeText(link: String): String? /** Returns whether the specified URL corresponds to a real Maven artifact file. */ diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt index 20af4997f4c..ca940e0d301 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenArtifactPropertyFetcherImpl.kt @@ -1,9 +1,9 @@ package org.oppia.android.scripts.license -import java.net.HttpURLConnection -import java.net.URL import java.net.ConnectException +import java.net.HttpURLConnection import java.net.SocketTimeoutException +import java.net.URL /** Default implementation of [MavenArtifactPropertyFetcher]. */ class MavenArtifactPropertyFetcherImpl : MavenArtifactPropertyFetcher { diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt index 2e515c197a0..4db0c1d7f45 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt @@ -72,14 +72,16 @@ class MavenDependenciesListCheck( val bazelQueryDepsList = mavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() - val mavenInstallDepsList = mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( - pathToMavenInstallJson, - bazelQueryDepsList - ) + val mavenInstallDepsList = + mavenDependenciesRetriever.generateDependenciesListFromMavenInstallAsync( + pathToMavenInstallJson, + bazelQueryDepsList + ).await() val dependenciesListFromPom = mavenDependenciesRetriever - .retrieveDependencyListFromPom(mavenInstallDepsList) + .retrieveDependencyListFromPomAsync(mavenInstallDepsList) + .await() .mavenDependencyList val dependenciesListFromTextProto = diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt index f4a8f9b76cd..7f6e5a1a0f7 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt @@ -3,10 +3,10 @@ package org.oppia.android.scripts.license import com.google.protobuf.TextFormat import com.squareup.moshi.Moshi import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll -import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import org.oppia.android.scripts.common.BazelClient import org.oppia.android.scripts.common.CommandExecutor @@ -28,7 +28,7 @@ private const val MAVEN_PREFIX = "@maven//:" class MavenDependenciesRetriever( private val rootPath: String, private val mavenArtifactPropertyFetcher: MavenArtifactPropertyFetcher, - private val coroutineDispatcher: ScriptBackgroundCoroutineDispatcher, + private val scriptBgDispatcher: ScriptBackgroundCoroutineDispatcher, private val commandExecutor: CommandExecutor ) { private val bazelClient by lazy { BazelClient(File(rootPath), commandExecutor) } @@ -184,55 +184,59 @@ class MavenDependenciesRetriever( * files. * * @param finalDependenciesList list of dependencies that is obtained by the intersection of - * the list generated by Bazel Query and the list generated from maven_install.json - * @return mavenDependencyList that has dependencies with licenses extracted from their POM files + * the list generated by Bazel Query and the list generated from maven_install.json + * @return a [Deferred] of a list of [MavenListDependency] that has dependencies with licenses + * extracted from their POM files */ - suspend fun retrieveDependencyListFromPom( + fun retrieveDependencyListFromPomAsync( finalDependenciesList: List - ): MavenDependencyList { - val pomCandidates = finalDependenciesList.map { MavenListDependencyPomCandidate(it) } - var attemptCount = 0 - var pomCandidatesToUpdate = pomCandidates.filter { it.latestPomFileText == null && it.downloadTryCount < 10 } - while (pomCandidatesToUpdate.isNotEmpty()) { - println("Attempt ${++attemptCount} to download POM files for ${pomCandidatesToUpdate.size}/${pomCandidates.size} Maven artifacts...") - pomCandidatesToUpdate.map { pomCandidate -> - CoroutineScope(coroutineDispatcher).async { - // Run blocking I/O operations on the I/O thread pool. - withContext(Dispatchers.IO) { - mavenArtifactPropertyFetcher.scrapeText(pomCandidate.pomFileUrl) + ): Deferred { + return CoroutineScope(scriptBgDispatcher).async { + val pomCandidates = finalDependenciesList.map { MavenListDependencyPomCandidate(it) } + var attemptCount = 0 + var pomCandidatesToUpdate = pomCandidates.filter { + it.latestPomFileText == null && it.downloadTryCount < 10 + } + while (pomCandidatesToUpdate.isNotEmpty()) { + println( + "Attempt ${++attemptCount} to download POM files for" + + " ${pomCandidatesToUpdate.size}/${pomCandidates.size} Maven artifacts..." + ) + pomCandidatesToUpdate.map { pomCandidate -> + CoroutineScope(scriptBgDispatcher).async { + // Run blocking I/O operations on the I/O thread pool. + withContext(Dispatchers.IO) { + mavenArtifactPropertyFetcher.scrapeText(pomCandidate.pomFileUrl) + } } + }.awaitAll().forEachIndexed { index, pomFileText -> + val pomCandidate = pomCandidatesToUpdate[index] + pomCandidate.latestPomFileText = pomFileText + pomCandidate.downloadTryCount++ + } + pomCandidatesToUpdate = pomCandidates.filter { + it.latestPomFileText == null && it.downloadTryCount < 10 } - }.awaitAll().forEachIndexed { index, pomFileText -> - val pomCandidate = pomCandidatesToUpdate[index] - pomCandidate.latestPomFileText = pomFileText - pomCandidate.downloadTryCount++ } - pomCandidatesToUpdate = pomCandidates.filter { it.latestPomFileText == null && it.downloadTryCount < 10 } + val failedToDownload = pomCandidates.filter { it.latestPomFileText == null } + check(failedToDownload.isEmpty()) { + "Failed to download ${failedToDownload.size}/${pomCandidates.size} POM files:" + + " $failedToDownload." + } + return@async MavenDependencyList.newBuilder().apply { + this.addAllMavenDependency( + pomCandidates.map { pomCandidate -> + MavenDependency.newBuilder().apply { + this.artifactName = pomCandidate.dep.coord.reducedCoordinateString + this.artifactVersion = pomCandidate.dep.coord.version + // NB: the '!!' is fine here since previous checks should ensure the POM file text is + // impossible to be null at this point. + this.addAllLicense(extractLicenseLinksFromPom(pomCandidate.latestPomFileText!!)) + }.build() + } + ) + }.build() } - val failedToDownload = pomCandidates.filter { it.latestPomFileText == null } - check(failedToDownload.isEmpty()) { "Failed to download ${failedToDownload.size}/${pomCandidates.size} POM files: $failedToDownload." } - return MavenDependencyList.newBuilder().apply { - this.addAllMavenDependency( - pomCandidates.map { pomCandidate -> - MavenDependency.newBuilder().apply { - this.artifactName = pomCandidate.dep.coord.reducedCoordinateString - this.artifactVersion = pomCandidate.dep.coord.version - // NB: the '!!' is fine here since previous checks should ensure the POM file text is - // impossible to be null at this point. - this.addAllLicense(extractLicenseLinksFromPom(pomCandidate.latestPomFileText!!)) - }.build() - } - ) - }.build() - } - - // TODO: Move into correct location. - private data class MavenListDependencyPomCandidate( - val dep: MavenListDependency, var latestPomFileText: String? = null, var downloadTryCount: Int = 0 - ) { - private val repoBaseUrl: String - get() = dep.repoUrls.firstOrNull() ?: error("No repo URL found for artifact: $dep.") - val pomFileUrl: String by lazy { dep.coord.computePomUrl(repoBaseUrl) } } /** @@ -240,15 +244,17 @@ class MavenDependenciesRetriever( * * @param pathToMavenInstall path to the maven_install.json file * @param bazelQueryDepsNames list of dependency names obtained from the bazel query - * @return list of [MavenListDependency]s that contains the artifact name and a URL that is used - * to obtain the URL of the POM file of the dependency + * @return a [Deferred] of a list of [MavenListDependency]s that contains the artifact name and a + * URL that is used to obtain the URL of the POM file of the dependency */ - suspend fun generateDependenciesListFromMavenInstall( + suspend fun generateDependenciesListFromMavenInstallAsync( pathToMavenInstall: String, bazelQueryDepsNames: List - ): List { - return computeMavenDependencies(pathToMavenInstall).filter { dep -> - dep.coord.bazelTarget in bazelQueryDepsNames + ): Deferred> { + return CoroutineScope(scriptBgDispatcher).async { + computeMavenDependencies(pathToMavenInstall).filter { dep -> + dep.coord.bazelTarget in bazelQueryDepsNames + } } } @@ -312,13 +318,20 @@ class MavenDependenciesRetriever( } return@map DownloadableCoordCandidate(coord, urlCandidates) } - var remainingCandidates = coordCandidates.map { it.computeUrlsToTry() }.filter { it.isNotEmpty() } + var remainingCandidates = coordCandidates.map { + it.computeUrlsToTry() + }.filter { + it.isNotEmpty() + } var urlsToTry = remainingCandidates.flatten() var attemptCount = 0 while (urlsToTry.isNotEmpty()) { - println("Attempt ${++attemptCount} to resolve ${remainingCandidates.size}/${coordCandidates.size} Maven coordinates with ${urlsToTry.size} possible download URLs...") + println( + "Attempt ${++attemptCount} to resolve ${remainingCandidates.size}/${coordCandidates.size}" + + " Maven coordinates with ${urlsToTry.size} possible download URLs..." + ) val urlResolutions = urlsToTry.map { urlCandidate -> - CoroutineScope(coroutineDispatcher).async { + CoroutineScope(scriptBgDispatcher).async { // Run blocking I/O operations on the I/O thread pool. urlCandidate to withContext(Dispatchers.IO) { mavenArtifactPropertyFetcher.isValidArtifactFileUrl(urlCandidate.artifactUrl) @@ -336,30 +349,14 @@ class MavenDependenciesRetriever( } val fullyFailingCandidates = coordCandidates.filter { it.computeSuccessfulUrls().isEmpty() } check(fullyFailingCandidates.isEmpty()) { - "Failed to find viable artifact download URL for candidates (${fullyFailingCandidates.size}/${coordCandidates.size} failed): $fullyFailingCandidates." + "Failed to find viable artifact download URL for candidates" + + " (${fullyFailingCandidates.size}/${coordCandidates.size} failed): $fullyFailingCandidates." } return coordCandidates.map { candidate -> MavenListDependency(candidate.coord, candidate.computeSuccessfulUrls().map { it.repoUrl }) } } - // TODO: Move into correct location. - private data class ArtifactUrlCandidate(val repoUrl: String, val artifactUrl: String, var latestDownloadStatus: Boolean = false, var checkAttemptCount: Int = 0) - - private data class DownloadableCoordCandidate( - val coord: MavenCoordinate, val urlCandidates: List - ) { - fun computeSuccessfulUrls(): Set { - return urlCandidates.filterTo(mutableSetOf()) { it.latestDownloadStatus } - } - - fun computeUrlsToTry(): Set { - val successfulUrls = computeSuccessfulUrls() - if (successfulUrls.isNotEmpty()) return emptySet() // Only one URL is needed. - return urlCandidates.filterTo(mutableSetOf()) { it.checkAttemptCount < 10 } - } - } - private fun parseMavenInstallJson(pathToMavenInstall: String): MavenInstallJson { val mavenInstallJsonText = File(pathToMavenInstall).inputStream().bufferedReader().use { it.readText() } @@ -483,4 +480,42 @@ class MavenDependenciesRetriever( * Note that these repositories have been confirmed to include this specific dependency. */ data class MavenListDependency(val coord: MavenCoordinate, val repoUrls: List) + + private data class MavenListDependencyPomCandidate( + val dep: MavenListDependency, + var latestPomFileText: String? = null, + var downloadTryCount: Int = 0 + ) { + private val repoBaseUrl: String + get() = dep.repoUrls.firstOrNull() ?: error("No repo URL found for artifact: $dep.") + /** The URL to the .pom file corresponding to the Maven artifact represented by this object. */ + val pomFileUrl: String by lazy { dep.coord.computePomUrl(repoBaseUrl) } + } + + private data class ArtifactUrlCandidate( + val repoUrl: String, + val artifactUrl: String, + var latestDownloadStatus: Boolean = false, + var checkAttemptCount: Int = 0 + ) + + private data class DownloadableCoordCandidate( + val coord: MavenCoordinate, + val urlCandidates: List + ) { + /** Return the set of [ArtifactUrlCandidate]s that have been successfully resolved. */ + fun computeSuccessfulUrls(): Set { + return urlCandidates.filterTo(mutableSetOf()) { it.latestDownloadStatus } + } + + /** + * Returns the set of [ArtifactUrlCandidate]s that need to yet be attempted (or reattempted) to + * download. + */ + fun computeUrlsToTry(): Set { + val successfulUrls = computeSuccessfulUrls() + if (successfulUrls.isNotEmpty()) return emptySet() // Only one URL is needed. + return urlCandidates.filterTo(mutableSetOf()) { it.checkAttemptCount < 10 } + } + } } diff --git a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt index 8c3903d034b..3d1292b94d1 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt +++ b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt @@ -80,10 +80,12 @@ class GenerateMavenDependenciesList( val bazelQueryDepsList = retriever.retrieveThirdPartyMavenDependenciesList() val mavenInstallDepsList = - retriever.generateDependenciesListFromMavenInstall(pathToMavenInstallJson, bazelQueryDepsList) + retriever.generateDependenciesListFromMavenInstallAsync( + pathToMavenInstallJson, bazelQueryDepsList + ).await() val dependenciesListFromPom = - retriever.retrieveDependencyListFromPom(mavenInstallDepsList).mavenDependencyList + retriever.retrieveDependencyListFromPomAsync(mavenInstallDepsList).await().mavenDependencyList val dependenciesListFromTextProto = retriever.retrieveMavenDependencyList(pathToMavenDependenciesPb) diff --git a/scripts/src/java/org/oppia/android/scripts/maven/RetrieveLicenseTexts.kt b/scripts/src/java/org/oppia/android/scripts/maven/RetrieveLicenseTexts.kt index b6f29bc58f0..c7ce282c995 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/RetrieveLicenseTexts.kt +++ b/scripts/src/java/org/oppia/android/scripts/maven/RetrieveLicenseTexts.kt @@ -59,7 +59,7 @@ class RetrieveLicenseTexts( println( """ Usage: bazel run //scripts:generate_license_texts -- - + """.trimIndent() ) throw Exception("Too few arguments passed.") @@ -172,7 +172,9 @@ class RetrieveLicenseTexts( } private fun fetchViewableLicenseText(licenseLink: String): String { - val licenseText = fetchLicenseText(licenseLink) + val licenseText = checkNotNull(fetchLicenseText(licenseLink)) { + "Failed to fetch license text from link: $licenseLink." + } // TODO(#3738): Ensure entire license text is displayed for all the copyright licenses return if (licenseText.length <= MAX_LICENSE_LENGTH) { licenseText @@ -393,9 +395,7 @@ class RetrieveLicenseTexts( return arrayElement } - private fun fetchLicenseText(url: String): String { - return mavenArtifactPropertyFetcher.scrapeText(url) - } + private fun fetchLicenseText(url: String): String? = mavenArtifactPropertyFetcher.scrapeText(url) private fun omitVersion(artifactName: String): String { return artifactName.substring(0, artifactName.lastIndexOf(':')) diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt index 399b8d98315..7040ef42b1c 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt @@ -76,6 +76,8 @@ class MavenDependenciesListCheckTest { assertThat(exception).hasMessageThat().contains(MISSING_DEPENDENCIES_ONLY_FAILURE) assertThat(outContent.toString()).isEqualTo( """ + Attempt 1 to resolve 5/5 Maven coordinates with 5 possible download URLs... + Attempt 1 to download POM files for 2/2 Maven artifacts... Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Missing dependencies that need to be added: @@ -153,6 +155,8 @@ class MavenDependenciesListCheckTest { assertThat(exception).hasMessageThat().contains(MISSING_DEPENDENCIES_ONLY_FAILURE) assertThat(outContent.toString()).isEqualTo( """ + Attempt 1 to resolve 5/5 Maven coordinates with 5 possible download URLs... + Attempt 1 to download POM files for 3/3 Maven artifacts... Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Missing dependencies that need to be added: @@ -218,6 +222,8 @@ class MavenDependenciesListCheckTest { assertThat(exception).hasMessageThat().contains(MISSING_DEPENDENCIES_ONLY_FAILURE) assertThat(outContent.toString()).isEqualTo( """ + Attempt 1 to resolve 5/5 Maven coordinates with 5 possible download URLs... + Attempt 1 to download POM files for 3/3 Maven artifacts... Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Missing dependencies that need to be added: @@ -295,6 +301,8 @@ class MavenDependenciesListCheckTest { assertThat(exception).hasMessageThat().contains(REDUNDANT_DEPENDENCIES_ONLY_FAILURE) assertThat(outContent.toString()).isEqualTo( """ + Attempt 1 to resolve 5/5 Maven coordinates with 5 possible download URLs... + Attempt 1 to download POM files for 1/1 Maven artifacts... Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Redundant dependencies that need to be removed: @@ -375,6 +383,8 @@ class MavenDependenciesListCheckTest { assertThat(exception).hasMessageThat().contains(REDUNDANT_DEPENDENCIES_ONLY_FAILURE) assertThat(outContent.toString()).isEqualTo( """ + Attempt 1 to resolve 5/5 Maven coordinates with 5 possible download URLs... + Attempt 1 to download POM files for 1/1 Maven artifacts... Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Redundant dependencies that need to be removed: @@ -452,6 +462,8 @@ class MavenDependenciesListCheckTest { assertThat(exception).hasMessageThat().contains(MISSING_AND_REDUNDANT_DEPENDENCIES_FAILURE) assertThat(outContent.toString()).isEqualTo( """ + Attempt 1 to resolve 5/5 Maven coordinates with 5 possible download URLs... + Attempt 1 to download POM files for 2/2 Maven artifacts... Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Redundant dependencies that need to be removed: @@ -531,6 +543,8 @@ class MavenDependenciesListCheckTest { assertThat(exception).hasMessageThat().contains(MISSING_AND_REDUNDANT_DEPENDENCIES_FAILURE) assertThat(outContent.toString()).isEqualTo( """ + Attempt 1 to resolve 5/5 Maven coordinates with 5 possible download URLs... + Attempt 1 to download POM files for 2/2 Maven artifacts... Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Redundant dependencies that need to be removed: @@ -610,6 +624,8 @@ class MavenDependenciesListCheckTest { assertThat(exception).hasMessageThat().contains(MISSING_AND_REDUNDANT_DEPENDENCIES_FAILURE) assertThat(outContent.toString()).isEqualTo( """ + Attempt 1 to resolve 5/5 Maven coordinates with 5 possible download URLs... + Attempt 1 to download POM files for 2/2 Maven artifacts... Errors were encountered. Please run script GenerateMavenDependenciesList.kt to fix. Redundant dependencies that need to be removed: diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt index 9b17c85da45..4eabf3e26dd 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt @@ -37,7 +37,7 @@ class MavenDependenciesRetrieverTest { private val mockArtifactPropertyFetcher by lazy { initializeArtifactPropertyFetcher() } private val commandExecutor by lazy { initializeCommandExecutorWithLongProcessWaitTime() } - private val mavenDependenciesRetriever by lazy { initializeMavenDependenciesRetriever() } + private val retriever by lazy { initializeMavenDependenciesRetriever() } private val scriptBgDispatcher by lazy { ScriptBackgroundCoroutineDispatcher() } private lateinit var testBazelWorkspace: TestBazelWorkspace @@ -66,7 +66,7 @@ class MavenDependenciesRetrieverTest { createThirdPartyAndroidBinary(thirdPartyPrefixCoordList) writeThirdPartyBuildFile(coordsList, thirdPartyPrefixCoordList) - val depsList = mavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() + val depsList = retriever.retrieveThirdPartyMavenDependenciesList() assertThat(depsList).contains(DATA_BINDING_DEP) } @@ -87,7 +87,7 @@ class MavenDependenciesRetrieverTest { createThirdPartyAndroidBinary(thirdPartyPrefixCoordList) writeThirdPartyBuildFile(coordsList, thirdPartyPrefixCoordList) - val depsList = mavenDependenciesRetriever.retrieveThirdPartyMavenDependenciesList() + val depsList = retriever.retrieveThirdPartyMavenDependenciesList() assertThat(depsList).contains(DATA_BINDING_DEP) assertThat(depsList).contains(IO_FABRIC_DEP) @@ -139,7 +139,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val finalDepsList = mavenDependenciesRetriever.addChangesFromTextProto( + val finalDepsList = retriever.addChangesFromTextProto( mavenDependenciesList, updatedMavenDependenciesList ) @@ -197,7 +197,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val finalDepsList = mavenDependenciesRetriever.addChangesFromTextProto( + val finalDepsList = retriever.addChangesFromTextProto( dependencyListFromPom = mavenDependenciesList, dependencyListFromProto = mavenDependenciesList ) @@ -249,9 +249,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val licenseSet = mavenDependenciesRetriever.retrieveManuallyUpdatedLicensesSet( - mavenDependenciesList - ) + val licenseSet = retriever.retrieveManuallyUpdatedLicensesSet(mavenDependenciesList) assertThat(licenseSet).isEmpty() } @@ -281,9 +279,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val licenseSet = mavenDependenciesRetriever.retrieveManuallyUpdatedLicensesSet( - mavenDependenciesList - ) + val licenseSet = retriever.retrieveManuallyUpdatedLicensesSet(mavenDependenciesList) assertThat(licenseSet).hasSize(1) verifyLicenseHasScrapableVerifiedLink( license = licenseSet.elementAt(0), @@ -334,9 +330,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val licenseSet = mavenDependenciesRetriever.retrieveManuallyUpdatedLicensesSet( - mavenDependenciesList - ) + val licenseSet = retriever.retrieveManuallyUpdatedLicensesSet(mavenDependenciesList) assertThat(licenseSet).hasSize(3) verifyLicenseHasScrapableVerifiedLink( license = licenseSet.elementAt(0), @@ -385,7 +379,7 @@ class MavenDependenciesRetrieverTest { ) val finalDepsList = - mavenDependenciesRetriever.updateMavenDependenciesList( + retriever.updateMavenDependenciesList( mavenDependenciesList, manuallyUpdatedLicenses = setOf() ) assertThat(finalDepsList).isEqualTo(mavenDependenciesList) @@ -424,7 +418,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val finalDepsList = mavenDependenciesRetriever.updateMavenDependenciesList( + val finalDepsList = retriever.updateMavenDependenciesList( mavenDependenciesList, setOf(updatedLicense2) ) @@ -458,7 +452,7 @@ class MavenDependenciesRetrieverTest { val textProtoFile = tempFolder.newFile("scripts/assets/maven_dependencies.textproto") val mavenDependencyList = MavenDependencyList.newBuilder().build() - mavenDependenciesRetriever.writeTextProto( + retriever.writeTextProto( "${tempFolder.root}/scripts/assets/maven_dependencies.textproto", mavenDependencyList ) @@ -498,7 +492,7 @@ class MavenDependenciesRetrieverTest { ) }.build() - mavenDependenciesRetriever.writeTextProto( + retriever.writeTextProto( "${tempFolder.root}/scripts/assets/maven_dependencies.textproto", mavenDependencyList ) @@ -564,7 +558,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val brokenLicenses = mavenDependenciesRetriever.getAllBrokenLicenses(mavenDependenciesList) + val brokenLicenses = retriever.getAllBrokenLicenses(mavenDependenciesList) assertThat(brokenLicenses).isEmpty() } @@ -591,7 +585,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val brokenLicenses = mavenDependenciesRetriever.getAllBrokenLicenses(mavenDependenciesList) + val brokenLicenses = retriever.getAllBrokenLicenses(mavenDependenciesList) assertThat(brokenLicenses).hasSize(2) verifyLicenseHasVerifiedLinkNotSet( license = brokenLicenses.elementAt(0), @@ -632,7 +626,7 @@ class MavenDependenciesRetrieverTest { }.build() ) - val brokenLicenses = mavenDependenciesRetriever.getAllBrokenLicenses(mavenDependenciesList) + val brokenLicenses = retriever.getAllBrokenLicenses(mavenDependenciesList) assertThat(brokenLicenses).doesNotContain(license2) } @@ -666,7 +660,7 @@ class MavenDependenciesRetrieverTest { ) val licenseToDepNameMap = - mavenDependenciesRetriever.findFirstDependenciesWithBrokenLicenses( + retriever.findFirstDependenciesWithBrokenLicenses( mavenDependenciesList, brokenLicenses = setOf() ) assertThat(licenseToDepNameMap).isEmpty() @@ -706,7 +700,7 @@ class MavenDependenciesRetrieverTest { ) val licenseToDepNameMap = - mavenDependenciesRetriever.findFirstDependenciesWithBrokenLicenses( + retriever.findFirstDependenciesWithBrokenLicenses( mavenDependenciesList, setOf(license1, license2) ) @@ -750,7 +744,7 @@ class MavenDependenciesRetrieverTest { ) val depsThatNeedInterventionSet = - mavenDependenciesRetriever.getDependenciesThatNeedIntervention(mavenDependenciesList) + retriever.getDependenciesThatNeedIntervention(mavenDependenciesList) assertThat(depsThatNeedInterventionSet).isEmpty() } @@ -786,7 +780,7 @@ class MavenDependenciesRetrieverTest { ) val depsThatNeedInterventionSet = - mavenDependenciesRetriever.getDependenciesThatNeedIntervention(mavenDependenciesList) + retriever.getDependenciesThatNeedIntervention(mavenDependenciesList) assertThat(depsThatNeedInterventionSet).hasSize(2) assertIsDependency( dependency = depsThatNeedInterventionSet.elementAt(0), @@ -807,7 +801,7 @@ class MavenDependenciesRetrieverTest { pbFile.outputStream().use { mavenDependencyList.writeTo(it) } - val mavenDependenciesList = mavenDependenciesRetriever.retrieveMavenDependencyList( + val mavenDependenciesList = retriever.retrieveMavenDependencyList( "${tempFolder.root}/scripts/assets/maven_dependencies.pb" ) @@ -848,7 +842,7 @@ class MavenDependenciesRetrieverTest { pbFile.outputStream().use { mavenDependencyList.writeTo(it) } - val mavenDependenciesList = mavenDependenciesRetriever.retrieveMavenDependencyList( + val mavenDependenciesList = retriever.retrieveMavenDependencyList( "${tempFolder.root}/scripts/assets/maven_dependencies.pb" ) @@ -884,10 +878,10 @@ class MavenDependenciesRetrieverTest { writeMavenInstallJson(mavenInstallFile) val mavenListDependencies = runBlocking { - mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( + retriever.generateDependenciesListFromMavenInstallAsync( "${tempFolder.root}/third_party/maven_install.json", listOf() - ) + ).await() } assertThat(mavenListDependencies).isEmpty() @@ -899,10 +893,10 @@ class MavenDependenciesRetrieverTest { writeMavenInstallJson(mavenInstallFile) val mavenListDependencies = runBlocking { - mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( + retriever.generateDependenciesListFromMavenInstallAsync( "${tempFolder.root}/third_party/maven_install.json", listOf(DATA_BINDING_DEP, FIREBASE_DEP) - ) + ).await() } assertThat(mavenListDependencies).containsExactly( @@ -919,26 +913,30 @@ class MavenDependenciesRetrieverTest { @Test fun testRetrieveDepListFromPom_emptyMavenListDependencies_returnsEmptyMavenDepList() { - val mavenDependencyList = mavenDependenciesRetriever.retrieveDependencyListFromPom( - listOf() - ) + val mavenDependencyList = runBlocking { + retriever.retrieveDependencyListFromPomAsync(listOf()).await() + } + assertThat(mavenDependencyList.mavenDependencyList).isEmpty() } @Test fun testRetrieveDepListFromPom_mixedDepTypes_returnsCorrectMavenDepList() { - val mavenDependencyList = mavenDependenciesRetriever.retrieveDependencyListFromPom( - listOf( - MavenListDependency( - coord = DEP_WITH_SCRAPABLE_LICENSE.coordStrToMavenCoord(), - repoUrls = listOf(GOOGLE_MAVEN_URL) - ), - MavenListDependency( - coord = DEP_WITH_NO_LICENSE.coordStrToMavenCoord(), - repoUrls = listOf(PUBLIC_MAVEN_URL) + val mavenDependencyList = runBlocking { + retriever.retrieveDependencyListFromPomAsync( + listOf( + MavenListDependency( + coord = DEP_WITH_SCRAPABLE_LICENSE.coordStrToMavenCoord(), + repoUrls = listOf(GOOGLE_MAVEN_URL) + ), + MavenListDependency( + coord = DEP_WITH_NO_LICENSE.coordStrToMavenCoord(), + repoUrls = listOf(PUBLIC_MAVEN_URL) + ) ) - ) - ) + ).await() + } + assertThat(mavenDependencyList.mavenDependencyList.size).isEqualTo(2) val dependency1 = mavenDependencyList.mavenDependencyList[0] val dependency2 = mavenDependencyList.mavenDependencyList[1] @@ -967,10 +965,10 @@ class MavenDependenciesRetrieverTest { writeMavenInstallJson(mavenInstallFile) val mavenListDependencies = runBlocking { - mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( + retriever.generateDependenciesListFromMavenInstallAsync( "${tempFolder.root}/third_party/maven_install.json", listOf() - ) + ).await() } assertThat(mavenListDependencies).isEmpty() @@ -982,10 +980,10 @@ class MavenDependenciesRetrieverTest { writeMavenInstallJson(mavenInstallFile) val mavenListDependencies = runBlocking { - mavenDependenciesRetriever.generateDependenciesListFromMavenInstall( + retriever.generateDependenciesListFromMavenInstallAsync( "${tempFolder.root}/third_party/maven_install.json", listOf(DATA_BINDING_DEP, FIREBASE_DEP) - ) + ).await() } assertThat(mavenListDependencies).containsExactly( From 5c812a157bc8d8386ba3f0bd215a248778121049 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Fri, 23 Feb 2024 00:13:57 +0000 Subject: [PATCH 50/63] Post merge build, test, and static check fixes. --- .../main/java/org/oppia/android/domain/auth/BUILD.bazel | 6 +++--- .../domain/exploration/ExplorationProgressModuleTest.kt | 7 ------- third_party/versions.bzl | 2 +- .../org/oppia/android/util/logging/firebase/BUILD.bazel | 2 +- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel index 2887b6ebfc7..9f5b60d0fd1 100644 --- a/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel @@ -43,8 +43,8 @@ kt_android_library( visibility = ["//:oppia_prod_module_visibility"], deps = [ ":authentication_controller", - "//:dagger", ":firebase_auth_wrapper_impl", + "//:dagger", ], ) @@ -55,8 +55,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - "//:dagger", ":firebase_auth_instance_wrapper_impl", + "//:dagger", ], ) @@ -67,8 +67,8 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - "//:dagger", ":firebase_auth_wrapper", + "//:dagger", ], ) diff --git a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressModuleTest.kt b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressModuleTest.kt index cf7eef40556..eea2f6708ee 100644 --- a/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressModuleTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/exploration/ExplorationProgressModuleTest.kt @@ -10,7 +10,6 @@ import dagger.BindsInstance import dagger.Component import dagger.Module import dagger.Provides -import dagger.multibindings.IntoSet import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -63,12 +62,6 @@ class ExplorationProgressModuleTest { interface TestModule { @Binds fun provideContext(application: Application): Context - - @Binds - @IntoSet - fun bindExplorationProgressListener( - activeTimeController: ExplorationActiveTimeController - ): ExplorationProgressListener } @Module diff --git a/third_party/versions.bzl b/third_party/versions.bzl index 39c1b582c09..76b07edd469 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -53,8 +53,8 @@ MAVEN_PRODUCTION_DEPENDENCY_VERSIONS = { "com.github.bumptech.glide:glide": "4.11.0", "com.google.android.flexbox:flexbox": "3.0.0", "com.google.android.material:material": "1.3.0", - "com.google.errorprone:error_prone_annotations": "2.11.0", "com.google.auto.value:auto-value-annotations": "1.8.1", + "com.google.errorprone:error_prone_annotations": "2.11.0", "com.google.firebase:firebase-analytics": "17.5.0", "com.google.firebase:firebase-appcheck": "16.0.0", "com.google.firebase:firebase-appcheck-debug": "16.0.0", diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel index 0b6550b0732..b0d26ebc6c7 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel @@ -149,7 +149,7 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ - "//:dagger", ":firestore_wrapper", + "//:dagger", ], ) From c301eed19c913d29fa728773d1b8369c61795e5e Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 14 Mar 2024 23:43:06 +0000 Subject: [PATCH 51/63] Address reviewer comment. --- .../src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt | 4 ++-- .../org/oppia/android/scripts/todo/TodoOpenCheckTest.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt index 545a9077dd2..ddc7c2e5602 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/todo/TodoOpenCheck.kt @@ -131,8 +131,8 @@ class TodoOpenCheck( openIssueFailureTodosAfterExemption.isNotEmpty() ) { println( - "There were failures. Re-run the command with \"regenerate\" at the end to regenerate the" + - " exemption file with all failures as exempted." + "There were failures. Re-run //scripts:todo_open_check with \"regenerate\" at the end" + + " to regenerate the exemption file with all failures as exempted." ) println() throw Exception("TODO CHECK FAILED") diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt index d032814c076..f23c2a01bb4 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt @@ -34,8 +34,8 @@ class TodoOpenCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#todo-open-checks for more details on how to fix this." private val regenerateNote = - "There were failures. Re-run the command with \"regenerate\" at the end to regenerate the " + - "exemption file with all failures as exempted." + "There were failures. Re-run //scripts:todo_open_check with \"regenerate\" at the end to " + + "regenerate the exemption file with all failures as exempted." @field:[Rule JvmField] val tempFolder = TemporaryFolder() From 4cf06d4bf26628791ab968858ffc1b95924500fa Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Thu, 16 May 2024 23:56:20 +0000 Subject: [PATCH 52/63] Address self-review comments. --- scripts/assets/todo_open_exemptions.textproto | 32 +++++++++---------- .../scripts/testing/TestBazelWorkspaceTest.kt | 23 ++++--------- .../todo/TodoIssueResolvedCheckTest.kt | 3 +- 3 files changed, 24 insertions(+), 34 deletions(-) diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index caeaa700657..715fdf0bf32 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -232,24 +232,24 @@ todo_open_exemption { } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt" - line_number: 70 - line_number: 72 - line_number: 78 - line_number: 94 - line_number: 96 - line_number: 102 - line_number: 129 - line_number: 131 - line_number: 137 - line_number: 141 + line_number: 69 + line_number: 71 + line_number: 77 + line_number: 93 + line_number: 95 + line_number: 101 + line_number: 128 + line_number: 130 + line_number: 136 + line_number: 140 + line_number: 142 line_number: 143 - line_number: 144 - line_number: 173 - line_number: 175 - line_number: 181 - line_number: 185 + line_number: 172 + line_number: 174 + line_number: 180 + line_number: 184 + line_number: 186 line_number: 187 - line_number: 188 } todo_open_exemption { exempted_file_path: "scripts/src/javatests/org/oppia/android/scripts/todo/TodoOpenCheckTest.kt" diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt index 4cdebd53c24..cab5a24d7ef 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt @@ -99,16 +99,7 @@ class TestBazelWorkspaceTest { } @Test - fun testInitEmptyWorkspace_createsBazelVersionFileWithCorrectVersion() { - val testBazelWorkspace = TestBazelWorkspace(tempFolder) - - testBazelWorkspace.initEmptyWorkspace() - - assertThat(File(tempFolder.root, ".bazelversion").readText().trim()).isEqualTo("4.0.0") - } - - @Test - fun testSetupWorkspaceForRulesJvmExternal_withOneDep_containsCorrectList() { + fun testSetUpWorkspaceForRulesJvmExternal_withOneDep_containsCorrectList() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( @@ -121,7 +112,7 @@ class TestBazelWorkspaceTest { } @Test - fun testSetupWorkspaceForRulesJvmExternal_withOneDep_setsUpBazelVersion() { + fun testSetUpWorkspaceForRulesJvmExternal_withOneDep_setsUpBazelVersion() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( @@ -133,7 +124,7 @@ class TestBazelWorkspaceTest { } @Test - fun testSetupWorkspaceForRulesJvmExternal_withOneDep_setsUpBazelRc() { + fun testSetUpWorkspaceForRulesJvmExternal_withOneDep_setsUpBazelRc() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( @@ -145,7 +136,7 @@ class TestBazelWorkspaceTest { } @Test - fun testSetupWorkspaceForRulesJvmExternal_withTwoDeps_containsCorrectList() { + fun testSetUpWorkspaceForRulesJvmExternal_withTwoDeps_containsCorrectList() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( @@ -163,7 +154,7 @@ class TestBazelWorkspaceTest { } @Test - fun testSetupWorkspaceForRulesJvmExternal_withMultipleDeps_containsCorrectList() { + fun testSetUpWorkspaceForRulesJvmExternal_withMultipleDeps_containsCorrectList() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( @@ -185,7 +176,7 @@ class TestBazelWorkspaceTest { } @Test - fun testSetupWorkspaceForRulesJvmExternal_multipleCalls_containsOnlyFirstTimeContent() { + fun testSetUpWorkspaceForRulesJvmExternal_multipleCalls_containsOnlyFirstTimeContent() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( @@ -204,7 +195,7 @@ class TestBazelWorkspaceTest { } @Test - fun testSetupWorkspaceForRulesJvmExternal_addsMavenInstall() { + fun testSetUpWorkspaceForRulesJvmExternal_addsMavenInstall() { val testBazelWorkspace = TestBazelWorkspace(tempFolder) testBazelWorkspace.setUpWorkspaceForRulesJvmExternal( diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt index 3e948769972..608294bb226 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/TodoIssueResolvedCheckTest.kt @@ -23,8 +23,7 @@ class TodoIssueResolvedCheckTest { "Refer to https://github.com/oppia/oppia-android/wiki/Static-Analysis-Checks" + "#todo-issue-resolved-check for more details on how to fix this." - @field:[Rule JvmField] - val tempFolder = TemporaryFolder() + @field:[Rule JvmField] val tempFolder = TemporaryFolder() @Before fun setUp() { From c43c03634de41dad95f71a20d5aa9d864ce200cd Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Fri, 17 May 2024 01:10:08 +0000 Subject: [PATCH 53/63] Address review comment. --- app/BUILD.bazel | 1 + scripts/assets/maven_dependencies.textproto | 78 ++++++++++++++++++++- third_party/maven_install.json | 53 +++++++++++++- third_party/versions.bzl | 1 + 4 files changed, 130 insertions(+), 3 deletions(-) diff --git a/app/BUILD.bazel b/app/BUILD.bazel index badd9add857..b2b9ae0ecae 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -1006,6 +1006,7 @@ crashlytics_android_library( android_library( name = "crashlytics_deps", exports = [ + "//third_party:com_crashlytics_sdk_android_crashlytics", "//third_party:com_google_firebase_firebase-analytics", "//third_party:com_google_firebase_firebase-crashlytics", "//third_party:io_fabric_sdk_android_fabric", diff --git a/scripts/assets/maven_dependencies.textproto b/scripts/assets/maven_dependencies.textproto index 01939062de8..156750ab011 100644 --- a/scripts/assets/maven_dependencies.textproto +++ b/scripts/assets/maven_dependencies.textproto @@ -603,6 +603,82 @@ maven_dependency { } } } +maven_dependency { + artifact_name: "com.crashlytics.sdk.android:answers:1.4.6" + artifact_version: "1.4.6" + license { + license_name: "Crashlytics Terms of Service" + original_link: "https://answers.io/terms" + direct_link_only { + url: "https://firebase.google.com/terms/crashlytics" + } + is_original_link_invalid: true + } + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/master/LICENSE" + scrapable_link { + url: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/52e1cf89efd795d798ae5485b8503e04e4a936b8/LICENSE" + } + } +} +maven_dependency { + artifact_name: "com.crashlytics.sdk.android:beta:1.2.10" + artifact_version: "1.2.10" + license { + license_name: "Crashlytics Terms of Service" + original_link: "https://try.crashlytics.com/terms/terms-of-service.pdf" + direct_link_only { + url: "https://firebase.google.com/terms/crashlytics" + } + is_original_link_invalid: true + } + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/master/LICENSE" + scrapable_link { + url: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/52e1cf89efd795d798ae5485b8503e04e4a936b8/LICENSE" + } + } +} +maven_dependency { + artifact_name: "com.crashlytics.sdk.android:crashlytics-core:2.6.7" + artifact_version: "2.6.7" + license { + license_name: "Crashlytics Terms of Service" + original_link: "https://try.crashlytics.com/terms/terms-of-service.pdf" + direct_link_only { + url: "https://firebase.google.com/terms/crashlytics" + } + is_original_link_invalid: true + } + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/master/LICENSE" + scrapable_link { + url: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/52e1cf89efd795d798ae5485b8503e04e4a936b8/LICENSE" + } + } +} +maven_dependency { + artifact_name: "com.crashlytics.sdk.android:crashlytics:2.9.8" + artifact_version: "2.9.8" + license { + license_name: "Crashlytics Terms of Service" + original_link: "https://try.crashlytics.com/terms/terms-of-service.pdf" + direct_link_only { + url: "https://firebase.google.com/terms/crashlytics" + } + is_original_link_invalid: true + } + license { + license_name: "The Apache Software License, Version 2.0" + original_link: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/master/LICENSE" + scrapable_link { + url: "https://raw.githubusercontent.com/firebase/firebase-android-sdk/52e1cf89efd795d798ae5485b8503e04e4a936b8/LICENSE" + } + } +} maven_dependency { artifact_name: "com.github.bumptech.glide:annotations:4.11.0" artifact_version: "4.11.0" @@ -875,7 +951,7 @@ maven_dependency { license { license_name: "Play Integrity API Terms of Service" original_link: "https://developer.android.com/google/play/integrity/overview#tos" - direct_link_only: { + direct_link_only { url: "https://developer.android.com/google/play/integrity/overview#tos" } } diff --git a/third_party/maven_install.json b/third_party/maven_install.json index 686607e963a..6ff77b7d640 100644 --- a/third_party/maven_install.json +++ b/third_party/maven_install.json @@ -1,7 +1,7 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": 919358351, - "__RESOLVED_ARTIFACTS_HASH": 874060466, + "__INPUT_ARTIFACTS_HASH": -28532950, + "__RESOLVED_ARTIFACTS_HASH": -1835137249, "conflict_resolution": { "androidx.constraintlayout:constraintlayout:1.1.3": "androidx.constraintlayout:constraintlayout:2.0.1", "androidx.core:core:1.0.1": "androidx.core:core:1.3.1", @@ -557,6 +557,30 @@ }, "version": "26.4.2" }, + "com.crashlytics.sdk.android:answers:aar": { + "shasums": { + "jar": "5a05ddeda9f421b73727f4287a5d89e981a45e3feb7fac458cfddf29b97e3df8" + }, + "version": "1.4.6" + }, + "com.crashlytics.sdk.android:beta:aar": { + "shasums": { + "jar": "2a6b77374ebe6168588bd9116cdd66f60f7c151bd931b9a0f8b2012c06b1cd4d" + }, + "version": "1.2.10" + }, + "com.crashlytics.sdk.android:crashlytics-core:aar": { + "shasums": { + "jar": "4c055e1ad07fbe65a3e315bd27712be715962fb3c065d286a1d19f4f5db6768a" + }, + "version": "2.6.7" + }, + "com.crashlytics.sdk.android:crashlytics:aar": { + "shasums": { + "jar": "06d90c9d6693f302deae19f4cba67d724b44e8efcfc3c57308a78eead874dfeb" + }, + "version": "2.9.8" + }, "com.github.bumptech.glide:annotations": { "shasums": { "jar": "d219d238006d824962176229d4708abcdddcfe342c6a18a5d0fa48d6f0479b3e" @@ -1899,6 +1923,19 @@ "com.android.tools.build:aapt2-proto": [ "com.google.protobuf:protobuf-java" ], + "com.crashlytics.sdk.android:answers:aar": [ + "io.fabric.sdk.android:fabric:aar" + ], + "com.crashlytics.sdk.android:crashlytics-core:aar": [ + "com.crashlytics.sdk.android:answers:aar", + "io.fabric.sdk.android:fabric:aar" + ], + "com.crashlytics.sdk.android:crashlytics:aar": [ + "com.crashlytics.sdk.android:answers:aar", + "com.crashlytics.sdk.android:beta:aar", + "com.crashlytics.sdk.android:crashlytics-core:aar", + "io.fabric.sdk.android:fabric:aar" + ], "com.github.bumptech.glide:compiler": [ "com.github.bumptech.glide:annotations" ], @@ -4532,6 +4569,10 @@ "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools:annotations", + "com.crashlytics.sdk.android:answers:aar", + "com.crashlytics.sdk.android:beta:aar", + "com.crashlytics.sdk.android:crashlytics-core:aar", + "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", "com.github.bumptech.glide:compiler", "com.github.bumptech.glide:disklrucache", @@ -4780,6 +4821,10 @@ "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools:annotations", + "com.crashlytics.sdk.android:answers:aar", + "com.crashlytics.sdk.android:beta:aar", + "com.crashlytics.sdk.android:crashlytics-core:aar", + "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", "com.github.bumptech.glide:compiler", "com.github.bumptech.glide:disklrucache", @@ -5028,6 +5073,10 @@ "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools:annotations", + "com.crashlytics.sdk.android:answers:aar", + "com.crashlytics.sdk.android:beta:aar", + "com.crashlytics.sdk.android:crashlytics-core:aar", + "com.crashlytics.sdk.android:crashlytics:aar", "com.github.bumptech.glide:annotations", "com.github.bumptech.glide:compiler", "com.github.bumptech.glide:disklrucache", diff --git a/third_party/versions.bzl b/third_party/versions.bzl index a46a36b3e5f..af797590404 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -49,6 +49,7 @@ MAVEN_PRODUCTION_DEPENDENCY_VERSIONS = { "androidx.work:work-runtime-ktx": "2.4.0", "com.android.support:support-annotations": "28.0.0", "com.android.tools.build:aapt2-proto": "7.3.1-8691043", + "com.crashlytics.sdk.android:crashlytics": "2.9.8", "com.github.bumptech.glide:compiler": "4.11.0", "com.github.bumptech.glide:glide": "4.11.0", "com.google.android.flexbox:flexbox": "3.0.0", From fbac9a2d5393044ad97f5448b08c6bd1c25325ae Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Fri, 17 May 2024 01:55:20 +0000 Subject: [PATCH 54/63] Post-merge fixes. --- .../main/java/org/oppia/android/data/backends/gae/BUILD.bazel | 2 +- domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel | 3 --- .../org/oppia/android/domain/oppialogger/survey/BUILD.bazel | 3 --- .../src/main/java/org/oppia/android/domain/survey/BUILD.bazel | 3 --- domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel | 3 --- .../src/test/java/org/oppia/android/domain/survey/BUILD.bazel | 3 --- .../main/java/org/oppia/android/testing/firebase/BUILD.bazel | 3 --- .../test/java/org/oppia/android/testing/firebase/BUILD.bazel | 3 --- .../src/main/java/org/oppia/android/util/logging/BUILD.bazel | 2 +- 9 files changed, 2 insertions(+), 23 deletions(-) diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel b/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel index 1285130d5a0..ed01ed8eae1 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel @@ -19,8 +19,8 @@ kt_android_library( ], deps = [ ":constants", - ":dagger", ":network_config_annotations", + "//:dagger", "//model/src/main/proto:arguments_java_proto_lite", "//model/src/main/proto:event_logger_java_proto_lite", "//third_party:com_squareup_okhttp3_okhttp", diff --git a/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel index 9f5b60d0fd1..37503b05060 100644 --- a/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel @@ -2,7 +2,6 @@ Library for providing authentication with Firebase functionality. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -71,5 +70,3 @@ kt_android_library( "//:dagger", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/survey/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/survey/BUILD.bazel index 1568c5914b9..dca0f23dfa2 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/survey/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/survey/BUILD.bazel @@ -2,7 +2,6 @@ Library for providing logging functionality in a survey. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -16,5 +15,3 @@ kt_android_library( "//third_party:javax_inject_javax_inject", ], ) - -dagger_rules() diff --git a/domain/src/main/java/org/oppia/android/domain/survey/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/survey/BUILD.bazel index 7e6da66527e..92c999a4a8b 100644 --- a/domain/src/main/java/org/oppia/android/domain/survey/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/survey/BUILD.bazel @@ -2,7 +2,6 @@ Library for providing survey functionality in the app. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -60,5 +59,3 @@ kt_android_library( "//model/src/main/proto:survey_java_proto_lite", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel index 57b5c669df3..fecc92c1cb3 100644 --- a/domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/auth/BUILD.bazel @@ -2,7 +2,6 @@ Tests for libraries providing authentication with Firebase functionality. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -72,5 +71,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/domain/src/test/java/org/oppia/android/domain/survey/BUILD.bazel b/domain/src/test/java/org/oppia/android/domain/survey/BUILD.bazel index c6929efdb0c..a3fbfdef517 100644 --- a/domain/src/test/java/org/oppia/android/domain/survey/BUILD.bazel +++ b/domain/src/test/java/org/oppia/android/domain/survey/BUILD.bazel @@ -2,7 +2,6 @@ Tests for survey domain components. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -87,5 +86,3 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) - -dagger_rules() diff --git a/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel index 70231b46cd3..bf9882c63b3 100644 --- a/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel @@ -2,7 +2,6 @@ Package for test-only Firebase utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") kt_android_library( @@ -18,5 +17,3 @@ kt_android_library( "//domain/src/main/java/org/oppia/android/domain/auth:firebase_auth_wrapper", ], ) - -dagger_rules() diff --git a/testing/src/test/java/org/oppia/android/testing/firebase/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/firebase/BUILD.bazel index 21ade4e0464..6eeeb67df1b 100644 --- a/testing/src/test/java/org/oppia/android/testing/firebase/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/firebase/BUILD.bazel @@ -2,7 +2,6 @@ Tests for test-only Firebase utilities. """ -load("@dagger//:workspace_defs.bzl", "dagger_rules") load("//:oppia_android_test.bzl", "oppia_android_test") oppia_android_test( @@ -44,5 +43,3 @@ oppia_android_test( "//third_party:robolectric_android-all", ], ) - -dagger_rules() diff --git a/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel index f17c41d8b35..8a05f5c64cd 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel @@ -23,8 +23,8 @@ kt_android_library( visibility = ["//:oppia_api_visibility"], deps = [ ":annotations", - ":dagger", ":log_level", + "//:dagger", "//model/src/main/proto:event_logger_java_proto_lite", "//third_party:javax_inject_javax_inject", "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", From 956b3588812cb9b0484967b0b24801a4e799e5c1 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Tue, 21 May 2024 20:25:49 +0000 Subject: [PATCH 55/63] Upgrade to rules_kotlin 1.5.0 beta 3. This is in preparation for the codebase-wide upgrade to Kotlin 1.6. --- WORKSPACE | 9 +++------ app/BUILD.bazel | 2 +- .../java/org/oppia/android/app/activity/BUILD.bazel | 2 +- .../org/oppia/android/app/activity/route/BUILD.bazel | 2 +- .../org/oppia/android/app/application/BUILD.bazel | 2 +- .../oppia/android/app/application/alpha/BUILD.bazel | 2 +- .../android/app/application/alphakenya/BUILD.bazel | 2 +- .../oppia/android/app/application/beta/BUILD.bazel | 2 +- .../oppia/android/app/application/dev/BUILD.bazel | 2 +- .../org/oppia/android/app/application/ga/BUILD.bazel | 2 +- .../android/app/application/testing/BUILD.bazel | 2 +- .../java/org/oppia/android/app/fragment/BUILD.bazel | 2 +- .../org/oppia/android/app/notice/testing/BUILD.bazel | 2 +- .../app/player/exploration/testing/BUILD.bazel | 2 +- .../main/java/org/oppia/android/app/shim/BUILD.bazel | 2 +- .../java/org/oppia/android/app/spotlight/BUILD.bazel | 2 +- .../oppia/android/app/testing/activity/BUILD.bazel | 2 +- .../org/oppia/android/app/translation/BUILD.bazel | 2 +- .../android/app/translation/testing/BUILD.bazel | 2 +- .../oppia/android/app/utility/datetime/BUILD.bazel | 2 +- .../oppia/android/app/utility/lifecycle/BUILD.bazel | 2 +- .../org/oppia/android/app/utility/math/BUILD.bazel | 2 +- .../main/java/org/oppia/android/app/view/BUILD.bazel | 2 +- .../java/org/oppia/android/app/viewmodel/BUILD.bazel | 2 +- .../org/oppia/android/data/backends/gae/BUILD.bazel | 2 +- .../oppia/android/data/backends/gae/api/BUILD.bazel | 2 +- .../android/data/backends/gae/model/BUILD.bazel | 2 +- .../org/oppia/android/data/persistence/BUILD.bazel | 2 +- domain/BUILD.bazel | 2 +- .../java/org/oppia/android/domain/audio/BUILD.bazel | 2 +- .../java/org/oppia/android/domain/auth/BUILD.bazel | 2 +- .../org/oppia/android/domain/classify/BUILD.bazel | 2 +- .../oppia/android/domain/classify/rules/BUILD.bazel | 2 +- .../rules/algebraicexpressioninput/BUILD.bazel | 2 +- .../classify/rules/continueinteraction/BUILD.bazel | 2 +- .../classify/rules/dragAndDropSortInput/BUILD.bazel | 2 +- .../domain/classify/rules/fractioninput/BUILD.bazel | 2 +- .../classify/rules/imageClickInput/BUILD.bazel | 2 +- .../classify/rules/itemselectioninput/BUILD.bazel | 2 +- .../classify/rules/mathequationinput/BUILD.bazel | 2 +- .../classify/rules/multiplechoiceinput/BUILD.bazel | 2 +- .../classify/rules/numberwithunits/BUILD.bazel | 2 +- .../rules/numericexpressioninput/BUILD.bazel | 2 +- .../domain/classify/rules/numericinput/BUILD.bazel | 2 +- .../domain/classify/rules/ratioinput/BUILD.bazel | 2 +- .../domain/classify/rules/textinput/BUILD.bazel | 2 +- .../org/oppia/android/domain/clipboard/BUILD.bazel | 2 +- .../android/domain/exploration/testing/BUILD.bazel | 2 +- .../android/domain/feedbackreporting/BUILD.bazel | 2 +- .../java/org/oppia/android/domain/locale/BUILD.bazel | 2 +- .../org/oppia/android/domain/onboarding/BUILD.bazel | 2 +- .../android/domain/onboarding/testing/BUILD.bazel | 2 +- .../org/oppia/android/domain/oppialogger/BUILD.bazel | 2 +- .../android/domain/oppialogger/analytics/BUILD.bazel | 2 +- .../domain/oppialogger/analytics/testing/BUILD.bazel | 2 +- .../domain/oppialogger/exceptions/BUILD.bazel | 2 +- .../domain/oppialogger/logscheduler/BUILD.bazel | 2 +- .../domain/oppialogger/loguploader/BUILD.bazel | 2 +- .../android/domain/oppialogger/survey/BUILD.bazel | 2 +- .../org/oppia/android/domain/profile/BUILD.bazel | 2 +- .../org/oppia/android/domain/spotlight/BUILD.bazel | 2 +- .../java/org/oppia/android/domain/state/BUILD.bazel | 2 +- .../java/org/oppia/android/domain/survey/BUILD.bazel | 2 +- .../testing/oppialogger/loguploader/BUILD.bazel | 2 +- .../org/oppia/android/domain/translation/BUILD.bazel | 2 +- .../java/org/oppia/android/domain/util/BUILD.bazel | 2 +- instrumentation/oppia_instrumentation_test.bzl | 2 +- .../android/instrumentation/application/BUILD.bazel | 2 +- .../android/instrumentation/testing/BUILD.bazel | 2 +- oppia_android_test.bzl | 2 +- scripts/BUILD.bazel | 2 +- .../java/org/oppia/android/scripts/build/BUILD.bazel | 2 +- .../java/org/oppia/android/scripts/ci/BUILD.bazel | 2 +- .../org/oppia/android/scripts/common/BUILD.bazel | 2 +- .../oppia/android/scripts/common/model/BUILD.bazel | 2 +- .../oppia/android/scripts/common/remote/BUILD.bazel | 2 +- .../oppia/android/scripts/common/testing/BUILD.bazel | 2 +- .../java/org/oppia/android/scripts/docs/BUILD.bazel | 2 +- .../java/org/oppia/android/scripts/label/BUILD.bazel | 2 +- .../org/oppia/android/scripts/license/BUILD.bazel | 2 +- .../oppia/android/scripts/license/model/BUILD.bazel | 2 +- .../java/org/oppia/android/scripts/maven/BUILD.bazel | 2 +- .../oppia/android/scripts/maven/model/BUILD.bazel | 2 +- .../java/org/oppia/android/scripts/regex/BUILD.bazel | 2 +- .../org/oppia/android/scripts/telemetry/BUILD.bazel | 2 +- .../org/oppia/android/scripts/testfile/BUILD.bazel | 2 +- .../org/oppia/android/scripts/testing/BUILD.bazel | 2 +- .../android/scripts/testing/TestBazelWorkspace.kt | 9 ++++----- .../java/org/oppia/android/scripts/todo/BUILD.bazel | 2 +- .../org/oppia/android/scripts/todo/model/BUILD.bazel | 2 +- .../java/org/oppia/android/scripts/xml/BUILD.bazel | 2 +- .../org/oppia/android/scripts/build/BUILD.bazel | 2 +- .../org/oppia/android/scripts/ci/BUILD.bazel | 2 +- .../org/oppia/android/scripts/common/BUILD.bazel | 2 +- .../oppia/android/scripts/common/BazelClientTest.kt | 2 +- .../oppia/android/scripts/common/testing/BUILD.bazel | 2 +- .../org/oppia/android/scripts/docs/BUILD.bazel | 2 +- .../org/oppia/android/scripts/label/BUILD.bazel | 2 +- .../org/oppia/android/scripts/license/BUILD.bazel | 2 +- .../org/oppia/android/scripts/maven/BUILD.bazel | 2 +- .../org/oppia/android/scripts/regex/BUILD.bazel | 2 +- .../org/oppia/android/scripts/testfile/BUILD.bazel | 2 +- .../org/oppia/android/scripts/testing/BUILD.bazel | 2 +- .../org/oppia/android/scripts/todo/BUILD.bazel | 2 +- .../org/oppia/android/scripts/xml/BUILD.bazel | 2 +- testing/BUILD.bazel | 2 +- .../java/org/oppia/android/testing/data/BUILD.bazel | 2 +- .../org/oppia/android/testing/espresso/BUILD.bazel | 2 +- .../org/oppia/android/testing/firebase/BUILD.bazel | 2 +- .../java/org/oppia/android/testing/junit/BUILD.bazel | 2 +- .../org/oppia/android/testing/logging/BUILD.bazel | 2 +- .../java/org/oppia/android/testing/math/BUILD.bazel | 2 +- .../org/oppia/android/testing/mockito/BUILD.bazel | 2 +- .../org/oppia/android/testing/network/BUILD.bazel | 2 +- .../org/oppia/android/testing/networking/BUILD.bazel | 2 +- .../android/testing/platformparameter/BUILD.bazel | 2 +- .../oppia/android/testing/robolectric/BUILD.bazel | 2 +- .../org/oppia/android/testing/threading/BUILD.bazel | 2 +- .../java/org/oppia/android/testing/time/BUILD.bazel | 2 +- .../org/oppia/android/testing/threading/BUILD.bazel | 2 +- third_party/versions.bzl | 4 ++-- utility/BUILD.bazel | 2 +- .../org/oppia/android/util/accessibility/BUILD.bazel | 2 +- .../java/org/oppia/android/util/caching/BUILD.bazel | 2 +- .../oppia/android/util/caching/testing/BUILD.bazel | 2 +- .../java/org/oppia/android/util/data/BUILD.bazel | 2 +- .../org/oppia/android/util/extensions/BUILD.bazel | 2 +- .../org/oppia/android/util/gcsresource/BUILD.bazel | 2 +- .../java/org/oppia/android/util/locale/BUILD.bazel | 2 +- .../oppia/android/util/locale/testing/BUILD.bazel | 2 +- .../java/org/oppia/android/util/logging/BUILD.bazel | 2 +- .../oppia/android/util/logging/firebase/BUILD.bazel | 2 +- .../util/logging/performancemetrics/BUILD.bazel | 2 +- .../java/org/oppia/android/util/math/BUILD.bazel | 2 +- .../org/oppia/android/util/networking/BUILD.bazel | 2 +- .../org/oppia/android/util/parser/html/BUILD.bazel | 2 +- .../org/oppia/android/util/parser/image/BUILD.bazel | 2 +- .../org/oppia/android/util/parser/math/BUILD.bazel | 2 +- .../org/oppia/android/util/parser/svg/BUILD.bazel | 2 +- .../java/org/oppia/android/util/profile/BUILD.bazel | 2 +- .../org/oppia/android/util/statusbar/BUILD.bazel | 2 +- .../java/org/oppia/android/util/system/BUILD.bazel | 2 +- .../org/oppia/android/util/threading/BUILD.bazel | 2 +- .../java/org/oppia/android/util/logging/BUILD.bazel | 2 +- wiki/Oppia-Bazel-Setup-Instructions.md | 12 ++++++------ 145 files changed, 156 insertions(+), 160 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 56d95d2c8ad..f3658f7c92c 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -30,15 +30,12 @@ http_archive( urls = ["https://github.com/bazelbuild/rules_kotlin/releases/download/%s/rules_kotlin_release.tgz" % HTTP_DEPENDENCY_VERSIONS["rules_kotlin"]["version"]], ) -# TODO(#1535): Remove once rules_kotlin is released because these lines become unnecessary -load("@io_bazel_rules_kotlin//kotlin:dependencies.bzl", "kt_download_local_dev_dependencies") - -kt_download_local_dev_dependencies() - -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") +load("@io_bazel_rules_kotlin//kotlin:repositories.bzl", "kotlin_repositories") kotlin_repositories() +load("@io_bazel_rules_kotlin//kotlin:core.bzl", "kt_register_toolchains") + kt_register_toolchains() # The proto_compiler and proto_java_toolchain bindings load the protos rules needed for the model diff --git a/app/BUILD.bazel b/app/BUILD.bazel index 4dcef9d8be5..9cc7ada4641 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -10,7 +10,7 @@ order to build with Bazel. - All binding adapters must be written in Java. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") load("@tools_android//tools/crashlytics:defs.bzl", "crashlytics_android_library") load("@tools_android//tools/googleservices:defs.bzl", "google_services_xml") load("//app:app_test.bzl", "app_test") diff --git a/app/src/main/java/org/oppia/android/app/activity/BUILD.bazel b/app/src/main/java/org/oppia/android/app/activity/BUILD.bazel index 3a91a9ad7c2..6deef27629c 100644 --- a/app/src/main/java/org/oppia/android/app/activity/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/activity/BUILD.bazel @@ -2,7 +2,7 @@ Constructs for setting up activities for injection in the Dagger graph. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # TODO(#59): Define these exported files as separate libraries from top-level targets. exports_files([ diff --git a/app/src/main/java/org/oppia/android/app/activity/route/BUILD.bazel b/app/src/main/java/org/oppia/android/app/activity/route/BUILD.bazel index 5b248b75ef9..20065008968 100644 --- a/app/src/main/java/org/oppia/android/app/activity/route/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/activity/route/BUILD.bazel @@ -2,7 +2,7 @@ Constructs for setting up activity routing support in the Dagger graph. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # TODO(#59): Define these exported files as separate libraries from top-level targets. exports_files([ diff --git a/app/src/main/java/org/oppia/android/app/application/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/BUILD.bazel index 0d857c76241..064c317d50c 100644 --- a/app/src/main/java/org/oppia/android/app/application/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/BUILD.bazel @@ -5,7 +5,7 @@ Dagger graph. Specific application implementations can be found in subpackages. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "abstract_application", diff --git a/app/src/main/java/org/oppia/android/app/application/alpha/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/alpha/BUILD.bazel index 65399ed8697..d83972809b7 100644 --- a/app/src/main/java/org/oppia/android/app/application/alpha/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/alpha/BUILD.bazel @@ -2,7 +2,7 @@ This package contains the root application definitions for alpha builds of the app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "alpha_application", diff --git a/app/src/main/java/org/oppia/android/app/application/alphakenya/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/alphakenya/BUILD.bazel index bf55ea55214..33f82ca7469 100644 --- a/app/src/main/java/org/oppia/android/app/application/alphakenya/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/alphakenya/BUILD.bazel @@ -3,7 +3,7 @@ This package contains the root application definitions for a Kenya user study sp of the app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "alpha_kenya_application", diff --git a/app/src/main/java/org/oppia/android/app/application/beta/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/beta/BUILD.bazel index 2185c8137b9..e615e151ac2 100644 --- a/app/src/main/java/org/oppia/android/app/application/beta/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/beta/BUILD.bazel @@ -2,7 +2,7 @@ This package contains the root application definitions for beta builds of the app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "beta_application", diff --git a/app/src/main/java/org/oppia/android/app/application/dev/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/dev/BUILD.bazel index 889eb40580c..76e56e3bab1 100644 --- a/app/src/main/java/org/oppia/android/app/application/dev/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/dev/BUILD.bazel @@ -6,7 +6,7 @@ there are specially defined top-level build flavors which will select their corr application configuration. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "developer_application", diff --git a/app/src/main/java/org/oppia/android/app/application/ga/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/ga/BUILD.bazel index 84c3433e38c..da232f782d2 100644 --- a/app/src/main/java/org/oppia/android/app/application/ga/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/ga/BUILD.bazel @@ -2,7 +2,7 @@ This package contains the root application definitions for general availability builds of the app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "general_availability_application", diff --git a/app/src/main/java/org/oppia/android/app/application/testing/BUILD.bazel b/app/src/main/java/org/oppia/android/app/application/testing/BUILD.bazel index 4ebecb8b338..84c36d77c85 100644 --- a/app/src/main/java/org/oppia/android/app/application/testing/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/application/testing/BUILD.bazel @@ -3,7 +3,7 @@ This package contains testing utilities that may be needed to set up the root ap testing environments. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "testing_build_flavor_module", diff --git a/app/src/main/java/org/oppia/android/app/fragment/BUILD.bazel b/app/src/main/java/org/oppia/android/app/fragment/BUILD.bazel index 208f0313858..bce950a36e2 100644 --- a/app/src/main/java/org/oppia/android/app/fragment/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/fragment/BUILD.bazel @@ -2,7 +2,7 @@ Constructs for setting up fragments for injection in the Dagger graph. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # TODO(#59): Define these exported files as separate libraries from top-level targets. exports_files([ diff --git a/app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel b/app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel index 248b74fdfa8..68cdc7a25b6 100644 --- a/app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/notice/testing/BUILD.bazel @@ -2,7 +2,7 @@ Test-only utilities corresponding to app notices. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "beta_notice_dialog_frgment_test_activity", diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/testing/BUILD.bazel b/app/src/main/java/org/oppia/android/app/player/exploration/testing/BUILD.bazel index 6879af440e7..553af67894b 100644 --- a/app/src/main/java/org/oppia/android/app/player/exploration/testing/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/player/exploration/testing/BUILD.bazel @@ -2,7 +2,7 @@ Test-only utilities corresponding to BottomSheetOptionsMenu. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "bottom_sheet_options_menu_test_activity", diff --git a/app/src/main/java/org/oppia/android/app/shim/BUILD.bazel b/app/src/main/java/org/oppia/android/app/shim/BUILD.bazel index 88b2ec6e9a1..4957b2ceda9 100644 --- a/app/src/main/java/org/oppia/android/app/shim/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/shim/BUILD.bazel @@ -3,7 +3,7 @@ Temporary shims for providing indirection in the Bazel build graph to unblock mo parts of the app layer. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") IMPL_FILES = [ "IntentFactoryShimImpl.kt", diff --git a/app/src/main/java/org/oppia/android/app/spotlight/BUILD.bazel b/app/src/main/java/org/oppia/android/app/spotlight/BUILD.bazel index 3114c4f118c..f0f3d0a2840 100644 --- a/app/src/main/java/org/oppia/android/app/spotlight/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/spotlight/BUILD.bazel @@ -2,7 +2,7 @@ Constructs for setting up spotlights. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") genrule( name = "update_SpotlightFragment", diff --git a/app/src/main/java/org/oppia/android/app/testing/activity/BUILD.bazel b/app/src/main/java/org/oppia/android/app/testing/activity/BUILD.bazel index 5e670cb5c7e..b3f231830cf 100644 --- a/app/src/main/java/org/oppia/android/app/testing/activity/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/testing/activity/BUILD.bazel @@ -5,7 +5,7 @@ graph, and to simplify UI arrangement for tests that require an activity (such a fragments (such as views). """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # Resource shim needed so that TestActivity can build in both Gradle & Bazel. genrule( diff --git a/app/src/main/java/org/oppia/android/app/translation/BUILD.bazel b/app/src/main/java/org/oppia/android/app/translation/BUILD.bazel index de38cd46673..66d8832de03 100644 --- a/app/src/main/java/org/oppia/android/app/translation/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/translation/BUILD.bazel @@ -2,7 +2,7 @@ UI utilities for for managing languages & locales. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # Resource shim needed so that AppLanguageResourceHandler can build in both Gradle & Bazel. genrule( diff --git a/app/src/main/java/org/oppia/android/app/translation/testing/BUILD.bazel b/app/src/main/java/org/oppia/android/app/translation/testing/BUILD.bazel index eb7f84bda27..d0aafbd2007 100644 --- a/app/src/main/java/org/oppia/android/app/translation/testing/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/translation/testing/BUILD.bazel @@ -2,7 +2,7 @@ Testing utilities for languages & locales. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "test_activity_recreator", diff --git a/app/src/main/java/org/oppia/android/app/utility/datetime/BUILD.bazel b/app/src/main/java/org/oppia/android/app/utility/datetime/BUILD.bazel index 3c21abb2cb0..bc703e631de 100644 --- a/app/src/main/java/org/oppia/android/app/utility/datetime/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/utility/datetime/BUILD.bazel @@ -2,7 +2,7 @@ General purposes utilities to manage date and time in user-facing strings. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # Resource shim needed so that DateTimeUtil can build in both Gradle & Bazel. genrule( diff --git a/app/src/main/java/org/oppia/android/app/utility/lifecycle/BUILD.bazel b/app/src/main/java/org/oppia/android/app/utility/lifecycle/BUILD.bazel index 67d532a6a9b..c5de3371363 100644 --- a/app/src/main/java/org/oppia/android/app/utility/lifecycle/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/utility/lifecycle/BUILD.bazel @@ -2,7 +2,7 @@ Constructs for setting up lifecycle safe timer factory for injection in the Dagger graph. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "lifecycle_safe_timer_factory", diff --git a/app/src/main/java/org/oppia/android/app/utility/math/BUILD.bazel b/app/src/main/java/org/oppia/android/app/utility/math/BUILD.bazel index fa068ab78ea..5671f58a96f 100644 --- a/app/src/main/java/org/oppia/android/app/utility/math/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/utility/math/BUILD.bazel @@ -2,7 +2,7 @@ General purposes utilities corresponding to displaying math expressions & constructs. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # Resource shim needed so that MathExpressionAccessibilityUtil can build in both Gradle & Bazel. genrule( diff --git a/app/src/main/java/org/oppia/android/app/view/BUILD.bazel b/app/src/main/java/org/oppia/android/app/view/BUILD.bazel index b81f8639a09..4536d738082 100644 --- a/app/src/main/java/org/oppia/android/app/view/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/view/BUILD.bazel @@ -2,7 +2,7 @@ Constructs for setting up views for injection in the Dagger graph. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # TODO(#59): Define ViewComponentImpl as a library separate from views. exports_files([ diff --git a/app/src/main/java/org/oppia/android/app/viewmodel/BUILD.bazel b/app/src/main/java/org/oppia/android/app/viewmodel/BUILD.bazel index 769fb4c576a..d89b4acf356 100644 --- a/app/src/main/java/org/oppia/android/app/viewmodel/BUILD.bazel +++ b/app/src/main/java/org/oppia/android/app/viewmodel/BUILD.bazel @@ -2,7 +2,7 @@ Utilities corresponding to simplify using Jetpack's view model functionality. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "observable_array_list", diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel b/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel index ed01ed8eae1..a9e26231900 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/backends/gae/BUILD.bazel @@ -3,7 +3,7 @@ Library for providing top-level HTTP networking support for Oppia's App Engine backend. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "network_interceptors", diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/api/BUILD.bazel b/data/src/main/java/org/oppia/android/data/backends/gae/api/BUILD.bazel index d7088cf7935..c87c159e8d8 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/api/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/backends/gae/api/BUILD.bazel @@ -3,7 +3,7 @@ Library for providing a network API interface with Oppia's App Engine backend. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "api", diff --git a/data/src/main/java/org/oppia/android/data/backends/gae/model/BUILD.bazel b/data/src/main/java/org/oppia/android/data/backends/gae/model/BUILD.bazel index 485e0124e60..301ffbe089b 100644 --- a/data/src/main/java/org/oppia/android/data/backends/gae/model/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/backends/gae/model/BUILD.bazel @@ -3,7 +3,7 @@ Library for providing model definitions for Oppia's App Engine backend endpoints. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "model", diff --git a/data/src/main/java/org/oppia/android/data/persistence/BUILD.bazel b/data/src/main/java/org/oppia/android/data/persistence/BUILD.bazel index 8d4b3a4f783..95f2b472c81 100644 --- a/data/src/main/java/org/oppia/android/data/persistence/BUILD.bazel +++ b/data/src/main/java/org/oppia/android/data/persistence/BUILD.bazel @@ -2,7 +2,7 @@ This package provides persistence to the rest of the application. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "cache_store", diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index bf096edd4cf..770db0740c3 100755 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -3,7 +3,7 @@ This library contains the frontend controller and business service logic for the application. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") load("//domain:domain_assets.bzl", "generate_assets_list_from_text_protos") load("//domain:domain_test.bzl", "domain_test") diff --git a/domain/src/main/java/org/oppia/android/domain/audio/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/audio/BUILD.bazel index cf25c85cc5d..a3b9cbe29b4 100644 --- a/domain/src/main/java/org/oppia/android/domain/audio/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/audio/BUILD.bazel @@ -2,7 +2,7 @@ Domain services & definitions corresponding to managing and playing audio tracks. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "audio_player_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel index 37503b05060..252206babf9 100644 --- a/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/auth/BUILD.bazel @@ -2,7 +2,7 @@ Library for providing authentication with Firebase functionality. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "authentication_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/BUILD.bazel index 30be62200c9..f9911c1d88a 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/BUILD.bazel @@ -2,7 +2,7 @@ Domain components for answer classification. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "answer_classification_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/BUILD.bazel index c9a0c8ed31e..c27425ae0b6 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/BUILD.bazel @@ -2,7 +2,7 @@ Rule classifier providers for classify domain components. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "generic_rule_classifier", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel index 9f24847da82..60d301d71e0 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/algebraicexpressioninput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'AlgebraicExpressionInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "algebraic_expression_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction/BUILD.bazel index 479424f099e..b2d7277a874 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/continueinteraction/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'Continue' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "continue_module", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/BUILD.bazel index d1ad2995f17..a7fc591fa7f 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/dragAndDropSortInput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'DragAndDropSortInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "drag_and_drop_sort_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/fractioninput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/fractioninput/BUILD.bazel index 87b0f38ec3e..2af31f8c35b 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/fractioninput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/fractioninput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'FractionInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "fraction_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/imageClickInput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/imageClickInput/BUILD.bazel index 691670a9741..5eb2e80e6d7 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/imageClickInput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/imageClickInput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'ImageClickInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "image_click_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/itemselectioninput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/itemselectioninput/BUILD.bazel index 6b4752ca5e1..3d58a5ca869 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/itemselectioninput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/itemselectioninput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'ItemSelectionInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "item_selection_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel index 3dcf2a57cdb..0370d9fc8a3 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/mathequationinput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'MathEquationInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "math_equation_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/BUILD.bazel index ccbe9213512..2a960fa3ff7 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/multiplechoiceinput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'MultipleChoiceInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "multiple_choice_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/numberwithunits/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/numberwithunits/BUILD.bazel index eb4b0b00110..b97b86a3512 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/numberwithunits/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/numberwithunits/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'NumberWithUnits' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "number_with_units_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel index ded61c2a1dd..84c94c1b417 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/numericexpressioninput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'NumericExpressionInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "numeric_expression_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/numericinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/numericinput/BUILD.bazel index a25efd74a6d..51daabfb093 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/numericinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/numericinput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'NumericInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "numeric_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput/BUILD.bazel index be367bfdc7f..aa376304996 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/ratioinput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'RatioInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "ratio_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/classify/rules/textinput/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/classify/rules/textinput/BUILD.bazel index 763bffacd05..fb3008a109d 100644 --- a/domain/src/main/java/org/oppia/android/domain/classify/rules/textinput/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/classify/rules/textinput/BUILD.bazel @@ -2,7 +2,7 @@ Classifiers for the 'TextInput' interaction. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "text_input_providers", diff --git a/domain/src/main/java/org/oppia/android/domain/clipboard/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/clipboard/BUILD.bazel index 4285df8c762..97474cff9da 100644 --- a/domain/src/main/java/org/oppia/android/domain/clipboard/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/clipboard/BUILD.bazel @@ -3,7 +3,7 @@ Domain services & definitions corresponding to managing the system clipboard whe text. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "clipboard_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/exploration/testing/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/exploration/testing/BUILD.bazel index f2299ed6cd9..b74ba793220 100644 --- a/domain/src/main/java/org/oppia/android/domain/exploration/testing/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/exploration/testing/BUILD.bazel @@ -2,7 +2,7 @@ Test-only utilities for exploration management & loading domain components. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "fake_exploration_retriever", diff --git a/domain/src/main/java/org/oppia/android/domain/feedbackreporting/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/feedbackreporting/BUILD.bazel index 3a142430a7f..68c49091c26 100644 --- a/domain/src/main/java/org/oppia/android/domain/feedbackreporting/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/feedbackreporting/BUILD.bazel @@ -2,7 +2,7 @@ Domain services & definitions corresponding to user feedback reporting. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "prod_module", diff --git a/domain/src/main/java/org/oppia/android/domain/locale/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/locale/BUILD.bazel index 5db57463f86..5b54b96beee 100644 --- a/domain/src/main/java/org/oppia/android/domain/locale/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/locale/BUILD.bazel @@ -2,7 +2,7 @@ Domain definitions for managing languages & locales. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "locale_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/onboarding/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/onboarding/BUILD.bazel index 293ffa8f4fc..0c56bb8f283 100644 --- a/domain/src/main/java/org/oppia/android/domain/onboarding/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/onboarding/BUILD.bazel @@ -2,7 +2,7 @@ Utilities for onboarding domain components. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "state_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/onboarding/testing/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/onboarding/testing/BUILD.bazel index be23c119989..df230a3ec4c 100644 --- a/domain/src/main/java/org/oppia/android/domain/onboarding/testing/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/onboarding/testing/BUILD.bazel @@ -2,7 +2,7 @@ Test-only utilities for onboarding domain components. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "retriever_test_module", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel index 6180098f779..ea208554ded 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/BUILD.bazel @@ -2,7 +2,7 @@ Package for providing logging support. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "application_id_seed", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel index dcfae35e1ce..3c54e3d6c53 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/BUILD.bazel @@ -2,7 +2,7 @@ Library for providing logging analytics to the Oppia android app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "analytics_startup_listener", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel index 1f5645eed60..fc4d5c7a062 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/analytics/testing/BUILD.bazel @@ -2,7 +2,7 @@ Package for testing utilities for log uploading functionality. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "fake_log_scheduler", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/BUILD.bazel index d0805571dbd..b1123fa3999 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions/BUILD.bazel @@ -2,7 +2,7 @@ Package for providing logging support for exceptions. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "controller", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel index 2f8c93f1c40..88e30e105bc 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/logscheduler/BUILD.bazel @@ -2,7 +2,7 @@ Library for providing log scheduling functionality to the Oppia android app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "performance_metrics_log_scheduler", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel index 2348e0caead..822397af1e6 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/loguploader/BUILD.bazel @@ -2,7 +2,7 @@ Library for providing log uploading functionality to the Oppia android app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "initializer", diff --git a/domain/src/main/java/org/oppia/android/domain/oppialogger/survey/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/oppialogger/survey/BUILD.bazel index dca0f23dfa2..215f85d2212 100644 --- a/domain/src/main/java/org/oppia/android/domain/oppialogger/survey/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/oppialogger/survey/BUILD.bazel @@ -2,7 +2,7 @@ Library for providing logging functionality in a survey. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "survey_events_logger", diff --git a/domain/src/main/java/org/oppia/android/domain/profile/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/profile/BUILD.bazel index 23a3ba5f821..608e59c379c 100644 --- a/domain/src/main/java/org/oppia/android/domain/profile/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/profile/BUILD.bazel @@ -2,7 +2,7 @@ Domain definitions and controllers for managing profiles. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "profile_management_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/spotlight/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/spotlight/BUILD.bazel index a472d8e814d..7ff49ac38e6 100644 --- a/domain/src/main/java/org/oppia/android/domain/spotlight/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/spotlight/BUILD.bazel @@ -2,7 +2,7 @@ Domain definitions and controllers for managing spotlights. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "spotlight_state_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/state/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/state/BUILD.bazel index aa32d0a3110..f4409d57555 100644 --- a/domain/src/main/java/org/oppia/android/domain/state/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/state/BUILD.bazel @@ -2,7 +2,7 @@ Domain services & definitions corresponding to managing ephemeral states in play sessions. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "state_deck", diff --git a/domain/src/main/java/org/oppia/android/domain/survey/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/survey/BUILD.bazel index 92c999a4a8b..47dda37d050 100644 --- a/domain/src/main/java/org/oppia/android/domain/survey/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/survey/BUILD.bazel @@ -2,7 +2,7 @@ Library for providing survey functionality in the app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "gating_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader/BUILD.bazel index 241c5879b68..c2714676669 100644 --- a/domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/testing/oppialogger/loguploader/BUILD.bazel @@ -2,7 +2,7 @@ Package for testing utilities for log uploading functionality. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "fake_log_uploader", diff --git a/domain/src/main/java/org/oppia/android/domain/translation/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/translation/BUILD.bazel index 53cc31e391c..3b219829091 100644 --- a/domain/src/main/java/org/oppia/android/domain/translation/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/translation/BUILD.bazel @@ -2,7 +2,7 @@ Domain definitions for managing translations. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "translation_controller", diff --git a/domain/src/main/java/org/oppia/android/domain/util/BUILD.bazel b/domain/src/main/java/org/oppia/android/domain/util/BUILD.bazel index de927b14eaf..53c81d33ed0 100644 --- a/domain/src/main/java/org/oppia/android/domain/util/BUILD.bazel +++ b/domain/src/main/java/org/oppia/android/domain/util/BUILD.bazel @@ -2,7 +2,7 @@ General utilities for domain module. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "asset", diff --git a/instrumentation/oppia_instrumentation_test.bzl b/instrumentation/oppia_instrumentation_test.bzl index 6319bbf0ba3..91f36e625ef 100644 --- a/instrumentation/oppia_instrumentation_test.bzl +++ b/instrumentation/oppia_instrumentation_test.bzl @@ -3,7 +3,7 @@ Instrumentation macros to define up end-to-end tests. """ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") def oppia_instrumentation_test( name, diff --git a/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel b/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel index 7bbf3e45552..7e7ab58686e 100644 --- a/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel +++ b/instrumentation/src/java/org/oppia/android/instrumentation/application/BUILD.bazel @@ -2,7 +2,7 @@ This library contains the test application and modules used to build the test app for end-to-end tests. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "oppia_test_application", diff --git a/instrumentation/src/java/org/oppia/android/instrumentation/testing/BUILD.bazel b/instrumentation/src/java/org/oppia/android/instrumentation/testing/BUILD.bazel index 2ebb466bd56..a1d072a8285 100644 --- a/instrumentation/src/java/org/oppia/android/instrumentation/testing/BUILD.bazel +++ b/instrumentation/src/java/org/oppia/android/instrumentation/testing/BUILD.bazel @@ -2,7 +2,7 @@ This library contains the utilities used in end-to-end testing. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "e2e_test_helper", diff --git a/oppia_android_test.bzl b/oppia_android_test.bzl index 876f28975c5..8068c87bb16 100644 --- a/oppia_android_test.bzl +++ b/oppia_android_test.bzl @@ -2,7 +2,7 @@ Central macros pertaining to setting up tests across the codebase. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # TODO(#1620): Remove module-specific test macros once Gradle is removed def oppia_android_module_level_test( diff --git a/scripts/BUILD.bazel b/scripts/BUILD.bazel index 01390e600e7..2199e663d4e 100644 --- a/scripts/BUILD.bazel +++ b/scripts/BUILD.bazel @@ -2,7 +2,7 @@ Kotlin-based scripts to help developers or perform continuous integration tasks. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_binary", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_binary", "kt_jvm_library") load("@rules_java//java:defs.bzl", "java_binary") load( "//scripts:script_assets.bzl", diff --git a/scripts/src/java/org/oppia/android/scripts/build/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/build/BUILD.bazel index 9daa0c3551a..96e253fe75b 100644 --- a/scripts/src/java/org/oppia/android/scripts/build/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/build/BUILD.bazel @@ -2,7 +2,7 @@ Libraries corresponding to build pipeline scripts. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "filter_per_language_resources_lib", diff --git a/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel index f8b345eaa80..ff9990b866d 100644 --- a/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel @@ -2,7 +2,7 @@ Libraries corresponding to developer scripts that help with continuous integration workflows. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "compute_affected_tests_lib", diff --git a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel index b8cd2da2323..b9f8c452efb 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel @@ -3,7 +3,7 @@ Package for common libraries that potentially support multiple scripts by perfor generic operations. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "bazel_client", diff --git a/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel index af3cc0b52d7..989cbfb1a45 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/model/BUILD.bazel @@ -2,7 +2,7 @@ Data structures corresponding to common utilities, such as for GitHub API integration. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "github_issue", diff --git a/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel index fec47cca77b..f3a597add77 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/remote/BUILD.bazel @@ -2,7 +2,7 @@ Remote service endpoints for common shared utilities, such as for GitHub API integration. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "github_service", diff --git a/scripts/src/java/org/oppia/android/scripts/common/testing/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/common/testing/BUILD.bazel index 8e1428bfaee..c70adcf4a4e 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/testing/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/testing/BUILD.bazel @@ -2,7 +2,7 @@ Package for test-only utilities that correspond to common script utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "fake_command_executor", diff --git a/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel index 72ff0c07474..f1e33e9bfac 100644 --- a/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel @@ -2,7 +2,7 @@ Libraries corresponding to documentation-related scripts. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "kdoc_validity_check_lib", diff --git a/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel index 7ad9a92714b..3d221f7e0e3 100644 --- a/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel @@ -3,7 +3,7 @@ Libraries corresponding to accessibility label check that ensures all the activi are defined with labels. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "accessibility_label_check_lib", diff --git a/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel index 4d23d2f9f8a..db5ce6414fe 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel @@ -2,7 +2,7 @@ Libraries corresponding to maven dependencies and their licenses checks. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "maven_artifact_property_fetcher", diff --git a/scripts/src/java/org/oppia/android/scripts/license/model/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/license/model/BUILD.bazel index a54cd78d3d8..1b030956df4 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/model/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/license/model/BUILD.bazel @@ -2,7 +2,7 @@ Libraries corresponding to storing license details of the third-party dependencies. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "model", diff --git a/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel index efcf1965e7d..dfbf60e6710 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel @@ -2,7 +2,7 @@ Libraries corresponding to attributing third-party library copyright licenses in Oppia Android. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "generate_maven_dependencies_list_lib", diff --git a/scripts/src/java/org/oppia/android/scripts/maven/model/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/maven/model/BUILD.bazel index 39107193490..9e0180a3807 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/model/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/maven/model/BUILD.bazel @@ -2,7 +2,7 @@ Data structures corresponding to parsing maven_install.json. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "model", diff --git a/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel index 82867e55ee1..a0e21a4ae17 100644 --- a/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel @@ -3,7 +3,7 @@ Libraries corresponding to regex pattern based validation checks which ensures t file path/name and content are used in the codebase. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "regex_pattern_validation_check_lib", diff --git a/scripts/src/java/org/oppia/android/scripts/telemetry/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/telemetry/BUILD.bazel index 7afddfa12db..d826ace97d4 100644 --- a/scripts/src/java/org/oppia/android/scripts/telemetry/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/telemetry/BUILD.bazel @@ -2,7 +2,7 @@ Libraries corresponding to telemetry scripts, including tools for locally analyzing event data. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "decode_user_study_event_string_lib", diff --git a/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel index 6777296ae26..a4d8c7c0074 100644 --- a/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel @@ -3,7 +3,7 @@ Libraries corresponding to test file-related checks, such as ensuring that all t (all Kotlin files) files have a corresponding test file present. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "test_file_check_lib", diff --git a/scripts/src/java/org/oppia/android/scripts/testing/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/testing/BUILD.bazel index 78b4f12e169..d9ca45340c0 100644 --- a/scripts/src/java/org/oppia/android/scripts/testing/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/testing/BUILD.bazel @@ -3,7 +3,7 @@ Package for utility libraries that aid in script-related test suites by performi arrangement or operations. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "test_bazel_workspace", diff --git a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt index 7bec4b85889..386d5323fb7 100644 --- a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt +++ b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt @@ -246,7 +246,7 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { if (!isConfiguredForKotlin) { // Add support for Kotlin: https://github.com/bazelbuild/rules_kotlin. val rulesKotlinReleaseUrl = - "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.5.0-alpha-2" + + "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.5.0-beta-3" + "/rules_kotlin_release.tgz" val rulesKotlinArchiveName = "io_bazel_rules_kotlin" val rulesKotlinBazelPrefix = "@$rulesKotlinArchiveName//kotlin" @@ -256,13 +256,12 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "$rulesKotlinArchiveName", - sha256 = "6194a864280e1989b6d8118a4aee03bb50edeeae4076e5bc30eef8a98dcd4f07", + sha256 = "58edd86f0f3c5b959c54e656b8e7eb0b0becabd412465c37a2078693c2571f7f", urls = ["$rulesKotlinReleaseUrl"], ) - load("$rulesKotlinBazelPrefix:dependencies.bzl", "kt_download_local_dev_dependencies") - load("$rulesKotlinBazelPrefix:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains") - kt_download_local_dev_dependencies() + load("$rulesKotlinBazelPrefix:repositories.bzl", "kotlin_repositories") kotlin_repositories() + load("$rulesKotlinBazelPrefix:core.bzl", "kt_register_toolchains") kt_register_toolchains() """.trimIndent() + "\n" ) diff --git a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel index 351184690d0..bff6a523d44 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel @@ -3,7 +3,7 @@ Libraries corresponding to todo-related checks to ensure all TODOs are correctly and correspond to open issues on GitHub """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "todo_collector", diff --git a/scripts/src/java/org/oppia/android/scripts/todo/model/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/todo/model/BUILD.bazel index 34cd905db58..c4eedc1ea26 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/model/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/todo/model/BUILD.bazel @@ -2,7 +2,7 @@ Libraries corresponding to data structures for representing a parsed open_issues.json file. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "todo", diff --git a/scripts/src/java/org/oppia/android/scripts/xml/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/xml/BUILD.bazel index e31ea659e02..0657b000c49 100644 --- a/scripts/src/java/org/oppia/android/scripts/xml/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/xml/BUILD.bazel @@ -3,7 +3,7 @@ Libraries corresponding to XML syntax based check to ensure that all the XML fil are syntactically correct and consistent. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_library") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "string_language_translation_check_lib", diff --git a/scripts/src/javatests/org/oppia/android/scripts/build/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/build/BUILD.bazel index 572ba1f87ef..5e5127bae83 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/build/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/build/BUILD.bazel @@ -2,7 +2,7 @@ Tests corresponding to build pipeline scripts. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "FilterPerLanguageResourcesTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel index fcdb77f2f1d..fa1a3c2798a 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel @@ -2,7 +2,7 @@ Tests corresponding to developer scripts that help with continuous integration workflows. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "ComputeAffectedTestsTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel index 03d24a11d19..d021c5d4495 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel @@ -3,7 +3,7 @@ Tests corresponding to common libraries that potentially support multiple script common or generic operations. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "BazelClientTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt index 57b2f26964a..00aa6de7e9d 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt @@ -442,7 +442,7 @@ class BazelClientTest { val secondNewFile = File(tempFolder.root, secondFilename) firstNewFile.appendText( """ - load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") + load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") def custom_jvm_test_base(name, srcs, deps): kt_jvm_test( name = name, diff --git a/scripts/src/javatests/org/oppia/android/scripts/common/testing/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/common/testing/BUILD.bazel index f81195ad233..4b236ea4493 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/testing/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/common/testing/BUILD.bazel @@ -2,7 +2,7 @@ Tests corresponding to test-only utilities that correspond to common script utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "FakeCommandExecutorTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/docs/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/docs/BUILD.bazel index aacc8424486..4fc4b9a9d53 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/docs/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/docs/BUILD.bazel @@ -2,7 +2,7 @@ Tests corresponding to documentation-related scripts. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "KdocValidityCheckTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/label/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/label/BUILD.bazel index f67d999d8b7..e29f497fbf6 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/label/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/label/BUILD.bazel @@ -3,7 +3,7 @@ Tests corresponding to accessibility label check that ensures all the activities are defined with labels. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "AccessibilityLabelCheckTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel index 2c65ad810f8..a8019878db5 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel @@ -2,7 +2,7 @@ Tests corresponding to the maven dependencies and their license checks. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "LicenseTextsCheckTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel index 68b0d6fad28..b14648e3157 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel @@ -3,7 +3,7 @@ Tests corresponding to the scripts that compile third-party dependencies and ext license links. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "GenerateMavenDependenciesListTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/regex/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/regex/BUILD.bazel index 60aac88b9ef..2554607d2dc 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/regex/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/regex/BUILD.bazel @@ -3,7 +3,7 @@ Tests corresponding to regex pattern based validation checks which ensures that file path/name and content are used in the codebase. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "RegexPatternValidationCheckTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/testfile/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/testfile/BUILD.bazel index 237c59d402a..0f60064c09e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testfile/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/testfile/BUILD.bazel @@ -3,7 +3,7 @@ Tests corresponding to test file-related checks, such as ensuring that all the p (all Kotlin files) files have a corresponding test file present. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "TestFileCheckTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/testing/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/testing/BUILD.bazel index 5a18102f1f5..421e8a03b96 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/BUILD.bazel @@ -2,7 +2,7 @@ Tests corresponding to script test-only utility libraries. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "TestBazelWorkspaceTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel index d206ecde80e..02f414b73b0 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel @@ -3,7 +3,7 @@ Tests corresponding to todo-related checks to ensure all TODOs are correctly for and correspond to open issues on GitHub """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "TodoCollectorTest", diff --git a/scripts/src/javatests/org/oppia/android/scripts/xml/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/xml/BUILD.bazel index d1170300f87..1b2a3d64a69 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/BUILD.bazel @@ -3,7 +3,7 @@ Tests corresponding to XML syntax based check to ensure that all the XML files i syntactically correct and consistent. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_jvm_test") +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_test") kt_jvm_test( name = "StringLanguageTranslationCheckTest", diff --git a/testing/BUILD.bazel b/testing/BUILD.bazel index f24555b5e38..0df7d21484a 100644 --- a/testing/BUILD.bazel +++ b/testing/BUILD.bazel @@ -3,7 +3,7 @@ This library contains fake objects used for testing as well as tests for these objects. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") load("//testing:testing_test.bzl", "testing_test") # Source files that have been migrated to their own package-based libraries. Files added to this diff --git a/testing/src/main/java/org/oppia/android/testing/data/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/data/BUILD.bazel index 23574d297fa..3031525cb8f 100644 --- a/testing/src/main/java/org/oppia/android/testing/data/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/data/BUILD.bazel @@ -3,7 +3,7 @@ Package for common test utilities corresponding to data processing & data providers. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "async_result_subject", diff --git a/testing/src/main/java/org/oppia/android/testing/espresso/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/espresso/BUILD.bazel index 31f17410282..a1be1a8f705 100644 --- a/testing/src/main/java/org/oppia/android/testing/espresso/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/espresso/BUILD.bazel @@ -3,7 +3,7 @@ Package for common Espresso matchers & other test utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "edit_text_input_action", diff --git a/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel index bf9882c63b3..3412b5a1bae 100644 --- a/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/firebase/BUILD.bazel @@ -2,7 +2,7 @@ Package for test-only Firebase utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "test_authentication_module", diff --git a/testing/src/main/java/org/oppia/android/testing/junit/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/junit/BUILD.bazel index 759997e6df1..f029c9f3709 100644 --- a/testing/src/main/java/org/oppia/android/testing/junit/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/junit/BUILD.bazel @@ -3,7 +3,7 @@ Package for test-only JUnit utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "define_app_language_locale_context", diff --git a/testing/src/main/java/org/oppia/android/testing/logging/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/logging/BUILD.bazel index 01b0bded674..0080c8edc31 100644 --- a/testing/src/main/java/org/oppia/android/testing/logging/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/logging/BUILD.bazel @@ -2,7 +2,7 @@ Test utilities for broad logging functionality. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "event_log_subject", diff --git a/testing/src/main/java/org/oppia/android/testing/math/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/math/BUILD.bazel index feb90a7f810..d7dc58e8d05 100644 --- a/testing/src/main/java/org/oppia/android/testing/math/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/math/BUILD.bazel @@ -2,7 +2,7 @@ General testing utilities and truth subjects for math structures and utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # TODO(#2747): Move these libraries to be under utility/.../math/testing. diff --git a/testing/src/main/java/org/oppia/android/testing/mockito/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/mockito/BUILD.bazel index 009aa532a12..d8044049aa3 100644 --- a/testing/src/main/java/org/oppia/android/testing/mockito/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/mockito/BUILD.bazel @@ -3,7 +3,7 @@ Package for Mockito-specific test utilities and helpers. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") # Library for general-purpose testing fakes. kt_android_library( diff --git a/testing/src/main/java/org/oppia/android/testing/network/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/network/BUILD.bazel index 8d9f2088328..185cb9a268b 100644 --- a/testing/src/main/java/org/oppia/android/testing/network/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/network/BUILD.bazel @@ -3,7 +3,7 @@ Library for providing test-only HTTP mocks for the app's networking layer. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "network", diff --git a/testing/src/main/java/org/oppia/android/testing/networking/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/networking/BUILD.bazel index f10a196de80..e60af5c4489 100644 --- a/testing/src/main/java/org/oppia/android/testing/networking/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/networking/BUILD.bazel @@ -3,7 +3,7 @@ Package for test-specific networking utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "network_connection_test_util", diff --git a/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel index 3428020d28d..1ff35e43281 100644 --- a/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/platformparameter/BUILD.bazel @@ -3,7 +3,7 @@ Package for test-specific platform parameter utilities and helpers. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "test_constants", diff --git a/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel index a9a9b0a3143..11a059d491c 100644 --- a/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/robolectric/BUILD.bazel @@ -3,7 +3,7 @@ Package for Robolectric-specific utilities and configurations. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "is_on_robolectric", diff --git a/testing/src/main/java/org/oppia/android/testing/threading/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/threading/BUILD.bazel index 6877cfa3e4c..700ed274b87 100644 --- a/testing/src/main/java/org/oppia/android/testing/threading/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/threading/BUILD.bazel @@ -4,7 +4,7 @@ Package for test-only threading utilities, including classes to coordinate cross in a way that can improve test reliability, correctness, and performance. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "annotations", diff --git a/testing/src/main/java/org/oppia/android/testing/time/BUILD.bazel b/testing/src/main/java/org/oppia/android/testing/time/BUILD.bazel index a4d62682fe5..b68a4dd9f2e 100644 --- a/testing/src/main/java/org/oppia/android/testing/time/BUILD.bazel +++ b/testing/src/main/java/org/oppia/android/testing/time/BUILD.bazel @@ -4,7 +4,7 @@ Package for test-only utilities for coordinating time, particularly in simulated environments (i.e. Robolectric). """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "fake_oppia_clock", diff --git a/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel b/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel index 2c962fd3cd2..4c67acdc229 100644 --- a/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel +++ b/testing/src/test/java/org/oppia/android/testing/threading/BUILD.bazel @@ -3,7 +3,7 @@ Tests for threading-specific test utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") load("//:oppia_android_test.bzl", "oppia_android_test") kt_android_library( diff --git a/third_party/versions.bzl b/third_party/versions.bzl index e113a395247..324422685b4 100644 --- a/third_party/versions.bzl +++ b/third_party/versions.bzl @@ -153,8 +153,8 @@ HTTP_DEPENDENCY_VERSIONS = { "version": "5.1", }, "rules_kotlin": { - "sha": "6194a864280e1989b6d8118a4aee03bb50edeeae4076e5bc30eef8a98dcd4f07", - "version": "v1.5.0-alpha-2", + "sha": "58edd86f0f3c5b959c54e656b8e7eb0b0becabd412465c37a2078693c2571f7f", + "version": "v1.5.0-beta-3", }, "rules_proto": { "sha": "e0cab008a9cdc2400a1d6572167bf9c5afc72e19ee2b862d18581051efab42c9", diff --git a/utility/BUILD.bazel b/utility/BUILD.bazel index 81b8cd3d39d..40ff91d8c59 100644 --- a/utility/BUILD.bazel +++ b/utility/BUILD.bazel @@ -3,7 +3,7 @@ This library contains utilities that all other modules, minus model, depend on. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") load("//utility:utility_test.bzl", "utility_test") # Source files that have been migrated to their own package-based libraries. Files added to this diff --git a/utility/src/main/java/org/oppia/android/util/accessibility/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/accessibility/BUILD.bazel index 33f4143f887..95dd274e94d 100644 --- a/utility/src/main/java/org/oppia/android/util/accessibility/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/accessibility/BUILD.bazel @@ -2,7 +2,7 @@ General purposes utilities for Android accessibility checking. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "accessibility", diff --git a/utility/src/main/java/org/oppia/android/util/caching/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/caching/BUILD.bazel index 1a9ed34db7b..2fad5f70d6c 100644 --- a/utility/src/main/java/org/oppia/android/util/caching/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/caching/BUILD.bazel @@ -2,7 +2,7 @@ Utilities corresponding to caching. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "asset_repository", diff --git a/utility/src/main/java/org/oppia/android/util/caching/testing/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/caching/testing/BUILD.bazel index 524a5c7e53a..bf50d54f406 100644 --- a/utility/src/main/java/org/oppia/android/util/caching/testing/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/caching/testing/BUILD.bazel @@ -2,7 +2,7 @@ Testing utilities corresponding asset caching utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "caching_test_module", diff --git a/utility/src/main/java/org/oppia/android/util/data/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/data/BUILD.bazel index 46290b3b89c..01fa1d04016 100644 --- a/utility/src/main/java/org/oppia/android/util/data/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/data/BUILD.bazel @@ -2,7 +2,7 @@ Utilities corresponding to data. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "async_data_subscription_manager", diff --git a/utility/src/main/java/org/oppia/android/util/extensions/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/extensions/BUILD.bazel index cfc2be6bb6a..79fcf27af4a 100644 --- a/utility/src/main/java/org/oppia/android/util/extensions/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/extensions/BUILD.bazel @@ -2,7 +2,7 @@ General purposes utilities to manage extensions """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "bundle_extensions", diff --git a/utility/src/main/java/org/oppia/android/util/gcsresource/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/gcsresource/BUILD.bazel index 40b791ffc55..682d3f1ad45 100644 --- a/utility/src/main/java/org/oppia/android/util/gcsresource/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/gcsresource/BUILD.bazel @@ -2,7 +2,7 @@ Utilities for interacting with GCS backend resources. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "annotations", diff --git a/utility/src/main/java/org/oppia/android/util/locale/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/locale/BUILD.bazel index 5c4edcc7288..32ee431966b 100644 --- a/utility/src/main/java/org/oppia/android/util/locale/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/locale/BUILD.bazel @@ -2,7 +2,7 @@ Generic utilities for managing languages & locales. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "android_locale_profile", diff --git a/utility/src/main/java/org/oppia/android/util/locale/testing/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/locale/testing/BUILD.bazel index fa840ff6152..9ff8e85fb13 100644 --- a/utility/src/main/java/org/oppia/android/util/locale/testing/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/locale/testing/BUILD.bazel @@ -2,7 +2,7 @@ Testing utilities for language & locale general utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "test_oppia_bidi_formatter", diff --git a/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel index 8a05f5c64cd..0b8fc767cb7 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/BUILD.bazel @@ -2,7 +2,7 @@ General purpose utilities for logging. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "annotations", diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel index b0d26ebc6c7..cb3df472c2e 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/BUILD.bazel @@ -2,7 +2,7 @@ Logging utility implementations backed by Firebase. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "firebase_exception_logger", diff --git a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel index f2b674020e6..fa9589510e8 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/logging/performancemetrics/BUILD.bazel @@ -2,7 +2,7 @@ General purpose utilities for performance metrics logging. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "performance_metrics_event_logger", diff --git a/utility/src/main/java/org/oppia/android/util/math/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/math/BUILD.bazel index 5e88101712d..782cfdb7920 100644 --- a/utility/src/main/java/org/oppia/android/util/math/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/math/BUILD.bazel @@ -2,7 +2,7 @@ General-purpose mathematics utilities, especially for supporting math-based interactions. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") android_library( name = "extensions", diff --git a/utility/src/main/java/org/oppia/android/util/networking/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/networking/BUILD.bazel index 382ebf75f64..e7cce02878e 100644 --- a/utility/src/main/java/org/oppia/android/util/networking/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/networking/BUILD.bazel @@ -2,7 +2,7 @@ Package for networking utilities """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "connection_status", diff --git a/utility/src/main/java/org/oppia/android/util/parser/html/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/parser/html/BUILD.bazel index adb9af41640..959a1c43f69 100644 --- a/utility/src/main/java/org/oppia/android/util/parser/html/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/parser/html/BUILD.bazel @@ -2,7 +2,7 @@ General-purpose utilities for parsing & rendering HTML within the app. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "html_parser", diff --git a/utility/src/main/java/org/oppia/android/util/parser/image/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/parser/image/BUILD.bazel index e88fe61795f..f70cbe826ee 100644 --- a/utility/src/main/java/org/oppia/android/util/parser/image/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/parser/image/BUILD.bazel @@ -2,7 +2,7 @@ General-purpose utilities for image loading and processing. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "bitmap_blurrer", diff --git a/utility/src/main/java/org/oppia/android/util/parser/math/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/parser/math/BUILD.bazel index 14eee4919a5..47db75d1122 100644 --- a/utility/src/main/java/org/oppia/android/util/parser/math/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/parser/math/BUILD.bazel @@ -2,7 +2,7 @@ Components required to render LaTeX math expressions through Glide. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "math_latex_model", diff --git a/utility/src/main/java/org/oppia/android/util/parser/svg/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/parser/svg/BUILD.bazel index b9da8543c40..f2f68defbc7 100644 --- a/utility/src/main/java/org/oppia/android/util/parser/svg/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/parser/svg/BUILD.bazel @@ -2,7 +2,7 @@ General-purpose utilities for vector drawables and transcoders. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "block_picture_drawable", diff --git a/utility/src/main/java/org/oppia/android/util/profile/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/profile/BUILD.bazel index 1d98a6aa872..cb64f56dc4a 100644 --- a/utility/src/main/java/org/oppia/android/util/profile/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/profile/BUILD.bazel @@ -2,7 +2,7 @@ General purposes utilities to manage directories. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "directory_management_util", diff --git a/utility/src/main/java/org/oppia/android/util/statusbar/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/statusbar/BUILD.bazel index f2830b8c7ae..fdbf021dcdd 100644 --- a/utility/src/main/java/org/oppia/android/util/statusbar/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/statusbar/BUILD.bazel @@ -2,7 +2,7 @@ Utilities for managing the Android status bar. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "status_bar_color", diff --git a/utility/src/main/java/org/oppia/android/util/system/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/system/BUILD.bazel index 6b423da811c..122b93c364e 100644 --- a/utility/src/main/java/org/oppia/android/util/system/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/system/BUILD.bazel @@ -2,7 +2,7 @@ Utilities corresponding to system utilities such as the system clock. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "oppia_clock", diff --git a/utility/src/main/java/org/oppia/android/util/threading/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/threading/BUILD.bazel index 19d3ea5ad0c..61ee3d122a6 100644 --- a/utility/src/main/java/org/oppia/android/util/threading/BUILD.bazel +++ b/utility/src/main/java/org/oppia/android/util/threading/BUILD.bazel @@ -2,7 +2,7 @@ General purpose utilities for multi-threading and concurrency. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") kt_android_library( name = "annotations", diff --git a/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel index 03e0fdc9689..fca189182df 100644 --- a/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel @@ -2,7 +2,7 @@ Tests for logging utilities. """ -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") load("//:oppia_android_test.bzl", "oppia_android_test") kt_android_library( diff --git a/wiki/Oppia-Bazel-Setup-Instructions.md b/wiki/Oppia-Bazel-Setup-Instructions.md index 2ea14441319..b4d962636de 100644 --- a/wiki/Oppia-Bazel-Setup-Instructions.md +++ b/wiki/Oppia-Bazel-Setup-Instructions.md @@ -26,7 +26,7 @@ Bazel is an open-source build and test tool similar to Make, Maven, and Gradle. ### Building the app -After the installation completes you can build the app using Bazel. +After the installation completes you can build the app using Bazel. **Move your command line head to the `~/opensource/oppia-android`**, then run the below bazel command: @@ -59,7 +59,7 @@ See our [troubleshooting wiki page](https://github.com/oppia/oppia-android/wiki/ ## Concepts and Terminology **[Workspace](https://github.com/oppia/oppia-android/blob/develop/WORKSPACE)**
-A workspace is a directory where we add targeted SDK version, all the required dependencies and there required Rules. The directory containing the WORKSPACE file is the root of the main repository, which in our case is the `oppia-android` root directory is the main directory. +A workspace is a directory where we add targeted SDK version, all the required dependencies and there required Rules. The directory containing the WORKSPACE file is the root of the main repository, which in our case is the `oppia-android` root directory is the main directory. **[Packages](https://github.com/oppia/oppia-android/tree/develop/app)**
A package is defined as a directory containing a file named BUILD or BUILD.bazel. @@ -69,14 +69,14 @@ A rule specifies the relationship between inputs and outputs, and the steps to b In Android, rules are defined using `android_binary`. Android rules for testing are `android_instrumentation_test` and `android_local_test`. **[BUILD files](https://github.com/oppia/oppia-android/blob/develop/app/BUILD.bazel)**
-Every package contains a BUILD file. This file is written in Starlark Language. In this Build file for module-level, we generally define `android_library`, `kt_android_library` to build our package files as per the requirement. +Every package contains a BUILD file. This file is written in Starlark Language. In this Build file for module-level, we generally define `android_library`, `kt_android_library` to build our package files as per the requirement. **[Dependencies](https://github.com/oppia/oppia-android/blob/ba8d914480251e4a8543feb63a93b6c91e0a5a2f/BUILD.bazel#L16)**
A target A depends upon a target B if B is needed by A at build. `A -> B`
``` deps = [ "//app",] ``` -Here, `deps` is used to define the dependencies which is a type of dependencies called `deps dependencies` and it includes the files/directory/target which are dependent. From the above example the dependency is the `app` target which is defined in the [Build file of app package](https://github.com/oppia/oppia-android/blob/ba8d914480251e4a8543feb63a93b6c91e0a5a2f/app/BUILD.bazel#L616). +Here, `deps` is used to define the dependencies which is a type of dependencies called `deps dependencies` and it includes the files/directory/target which are dependent. From the above example the dependency is the `app` target which is defined in the [Build file of app package](https://github.com/oppia/oppia-android/blob/ba8d914480251e4a8543feb63a93b6c91e0a5a2f/app/BUILD.bazel#L616). Example of Dependencies 1. [srcs dependencies](https://github.com/oppia/oppia-android/blob/ba8d914480251e4a8543feb63a93b6c91e0a5a2f/app/BUILD.bazel#L617) @@ -85,9 +85,9 @@ Example of Dependencies **[Loading an extension](https://github.com/oppia/oppia-android/blob/ba8d914480251e4a8543feb63a93b6c91e0a5a2f/app/BUILD.bazel#L13)**
Bazel extensions are files ending in .bzl. Use the load statement to import a symbol from an extension.
``` -load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kt_android_library") +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") ``` -Here, we are loading `kotlin.bzl` and we are going to use it with a symbol name `kt_android_library`. +Here, we are loading `android.bzl` and we are going to use it with a symbol name `kt_android_library`. Arguments to the load function must be string literals. load statements must appear at top-level in the file. **[Visibility of a file target](https://github.com/oppia/oppia-android/blob/ba8d914480251e4a8543feb63a93b6c91e0a5a2f/app/BUILD.bazel#L621)**
From f5c07fcfe591ca74b65f62b4c441379749d0bb88 Mon Sep 17 00:00:00 2001 From: Ben Henning Date: Tue, 21 May 2024 18:46:28 -0700 Subject: [PATCH 56/63] Fix build-time Kotlin & Java warnings. This pulls in non-configuration changes from #4937 that are compatible with the current Kotlin 1.4.x. Kotlin 1.5 and 1.6 changes will need to come as part of a downstream PR. --- .../AdministratorControlsActivity.kt | 1 + .../AdministratorControlsActivityPresenter.kt | 16 +- .../appversion/AppVersionActivity.kt | 1 + .../appversion/AppVersionFragmentPresenter.kt | 9 +- .../ProfileAndDeviceIdActivity.kt | 1 + .../CompletedStoryListFragmentPresenter.kt | 8 +- .../AppCompatCheckBoxBindingAdapters.java | 2 +- .../CircularProgressIndicatorAdapters.java | 2 +- .../databinding/ConstraintLayoutAdapters.java | 4 +- .../databinding/DrawableBindingAdapters.java | 4 +- .../databinding/EditTextBindingAdapters.java | 2 +- .../databinding/GuidelineBindingAdapters.java | 4 +- .../databinding/ImageViewBindingAdapters.java | 8 +- .../databinding/MarginBindingAdapters.java | 10 +- .../StateAssemblerMarginBindingAdapters.java | 40 ++--- .../StateAssemblerPaddingBindingAdapters.java | 40 ++--- .../TextInputLayoutBindingAdapters.java | 2 +- .../databinding/TextViewBindingAdapters.java | 8 +- .../app/databinding/ViewBindingAdapters.java | 4 +- .../DeveloperOptionsActivityPresenter.kt | 3 +- .../ForceNetworkTypeFragmentPresenter.kt | 9 +- .../MarkChaptersCompletedActivity.kt | 1 + .../MarkStoriesCompletedActivity.kt | 1 + .../MarkTopicsCompletedActivity.kt | 1 + .../ViewEventLogsFragmentPresenter.kt | 9 +- .../NavigationDrawerFragmentPresenter.kt | 125 +++++++--------- .../app/drawer/NavigationDrawerItem.kt | 2 +- .../android/app/help/HelpFragmentPresenter.kt | 9 +- .../app/help/faq/FAQListFragmentPresenter.kt | 11 +- ...irdPartyDependencyListFragmentPresenter.kt | 12 +- ...HintsAndSolutionDialogFragmentPresenter.kt | 17 ++- .../android/app/home/HomeFragmentPresenter.kt | 2 +- .../onboarding/OnboardingFragmentPresenter.kt | 31 +--- .../OngoingTopicListFragmentPresenter.kt | 16 +- .../app/options/AppLanguageFragment.kt | 7 +- .../android/app/options/OptionsActivity.kt | 5 +- .../app/options/OptionsFragmentPresenter.kt | 60 +++----- .../ReadingTextSizeActivityPresenter.kt | 1 + .../player/audio/AudioFragmentPresenter.kt | 40 ++--- .../player/audio/LanguageDialogFragment.kt | 2 +- .../player/exploration/ExplorationActivity.kt | 7 +- .../ExplorationActivityPresenter.kt | 14 +- .../player/state/StateFragmentPresenter.kt | 63 ++++---- .../RouteToHintsAndSolutionListener.kt | 5 +- .../testing/StateFragmentTestActivity.kt | 7 +- .../StateFragmentTestActivityPresenter.kt | 13 +- .../app/profile/AdminAuthActivityPresenter.kt | 10 +- .../app/profile/AdminPinActivityPresenter.kt | 17 +-- .../AdminSettingsDialogFragmentPresenter.kt | 11 +- .../profile/PinPasswordActivityPresenter.kt | 29 ++-- .../ProfileChooserFragmentPresenter.kt | 11 +- .../ResetPinDialogFragmentPresenter.kt | 11 +- .../ResumeLessonActivityPresenter.kt | 1 + .../ResumeLessonFragmentPresenter.kt | 8 +- .../settings/profile/ProfileEditActivity.kt | 1 + .../profile/ProfileEditActivityPresenter.kt | 1 + .../ProfileEditDeletionDialogFragment.kt | 2 +- .../profile/ProfileEditFragmentPresenter.kt | 2 +- .../profile/ProfileListFragmentPresenter.kt | 9 +- .../profile/ProfileRenameActivityPresenter.kt | 10 +- .../profile/ProfileRenameFragmentPresenter.kt | 11 +- .../ProfileResetPinFragmentPresenter.kt | 44 +++--- .../app/spotlight/SpotlightFragment.kt | 2 + .../ExitSurveyConfirmationDialogFragment.kt | 14 +- .../app/survey/SurveyFragmentPresenter.kt | 1 + ...ractionInputInteractionViewTestActivity.kt | 1 + .../InputInteractionViewTestActivity.kt | 8 +- ...hExpressionInteractionsViewTestActivity.kt | 9 +- .../RatioInputInteractionViewTestActivity.kt | 1 + .../TestFontScaleConfigurationUtilActivity.kt | 1 + .../TextInputInteractionViewTestActivity.kt | 1 + .../app/topic/TopicFragmentPresenter.kt | 2 +- .../ConceptCardFragmentPresenter.kt | 14 +- .../topic/practice/TopicPracticeFragment.kt | 3 + .../QuestionPlayerActivityPresenter.kt | 1 + .../QuestionPlayerFragmentPresenter.kt | 9 +- .../app/utility/ClickableAreasImage.kt | 44 +++--- .../app/utility/FontScaleConfigurationUtil.kt | 2 + .../app/viewmodel/ObservableViewModel.kt | 5 +- .../WalkthroughActivityPresenter.kt | 27 ++-- .../end/WalkthroughFinalFragmentPresenter.kt | 1 + .../profile_chooser_profile_view.xml | 7 +- .../res/layout-land/profile_edit_fragment.xml | 7 +- .../layout-land/profile_progress_header.xml | 5 +- .../profile_chooser_profile_view.xml | 10 +- .../profile_chooser_profile_view.xml | 10 +- .../profile_progress_header.xml | 5 +- .../res/layout-sw600dp/story_chapter_view.xml | 5 +- .../activity_input_interaction_view_test.xml | 5 +- ..._math_expression_interaction_view_test.xml | 6 +- .../layout/nav_header_navigation_drawer.xml | 5 +- .../layout/profile_chooser_profile_view.xml | 7 +- .../main/res/layout/profile_edit_fragment.xml | 7 +- .../res/layout/profile_list_profile_view.xml | 5 +- .../res/layout/profile_picture_activity.xml | 3 +- .../res/layout/profile_progress_header.xml | 5 +- .../AdministratorControlsActivityTest.kt | 4 +- .../AdministratorControlsFragmentTest.kt | 4 +- .../AppVersionActivityTest.kt | 4 +- .../ProfileAndDeviceIdActivityTest.kt | 4 +- .../ProfileAndDeviceIdFragmentTest.kt | 4 +- .../CompletedStoryListActivityTest.kt | 4 +- .../LessonThumbnailImageViewTest.kt | 4 +- .../MathExpressionInteractionsViewTest.kt | 16 +- .../AppCompatCheckBoxBindingAdaptersTest.kt | 5 +- .../CircularProgressIndicatorAdaptersTest.kt | 4 +- .../DrawableBindingAdaptersTest.kt | 4 +- .../ImageViewBindingAdaptersTest.kt | 4 +- .../databinding/MarginBindingAdaptersTest.kt | 4 +- ...StateAssemblerMarginBindingAdaptersTest.kt | 4 +- ...tateAssemblerPaddingBindingAdaptersTest.kt | 4 +- .../TextViewBindingAdaptersTest.kt | 65 +++----- .../databinding/ViewBindingAdaptersTest.kt | 4 +- .../DeveloperOptionsActivityTest.kt | 4 +- .../DeveloperOptionsFragmentTest.kt | 4 +- .../MarkChaptersCompletedActivityTest.kt | 4 +- .../MarkChaptersCompletedFragmentTest.kt | 4 +- .../MarkStoriesCompletedActivityTest.kt | 4 +- .../MarkStoriesCompletedFragmentTest.kt | 4 +- .../MarkTopicsCompletedActivityTest.kt | 4 +- .../MarkTopicsCompletedFragmentTest.kt | 4 +- .../devoptions/ViewEventLogsActivityTest.kt | 4 +- .../devoptions/ViewEventLogsFragmentTest.kt | 4 +- .../ForceNetworkTypeActivityTest.kt | 4 +- .../ForceNetworkTypeFragmentTest.kt | 4 +- .../MathExpressionParserActivityTest.kt | 4 +- .../MathExpressionParserFragmentTest.kt | 4 +- .../android/app/faq/FAQListFragmentTest.kt | 4 +- .../android/app/faq/FAQSingleActivityTest.kt | 4 +- .../android/app/faq/FaqListActivityTest.kt | 4 +- .../android/app/help/HelpActivityTest.kt | 4 +- .../android/app/help/HelpFragmentTest.kt | 4 +- .../android/app/home/HomeActivityTest.kt | 4 +- .../app/home/RecentlyPlayedFragmentTest.kt | 4 +- .../app/home/TopicSummaryViewModelTest.kt | 4 +- .../android/app/home/WelcomeViewModelTest.kt | 4 +- .../PromotedStoryListViewModelTest.kt | 4 +- .../PromotedStoryViewModelTest.kt | 4 +- .../mydownloads/MyDownloadsActivityTest.kt | 4 +- .../mydownloads/MyDownloadsFragmentTest.kt | 4 +- .../app/onboarding/OnboardingActivityTest.kt | 4 +- .../app/onboarding/OnboardingFragmentTest.kt | 4 +- .../OngoingTopicListActivityTest.kt | 4 +- .../app/options/AppLanguageActivityTest.kt | 4 +- .../app/options/AppLanguageFragmentTest.kt | 4 +- .../app/options/AudioLanguageActivityTest.kt | 4 +- .../app/options/AudioLanguageFragmentTest.kt | 4 +- .../app/options/OptionsActivityTest.kt | 4 +- .../app/options/OptionsFragmentTest.kt | 4 +- .../options/ReadingTextSizeActivityTest.kt | 4 +- .../options/ReadingTextSizeFragmentTest.kt | 4 +- .../android/app/parser/HtmlParserTest.kt | 10 +- .../app/player/audio/AudioFragmentTest.kt | 18 ++- .../exploration/ExplorationActivityTest.kt | 4 +- .../app/player/state/StateFragmentTest.kt | 12 +- .../app/policies/PoliciesActivityTest.kt | 4 +- .../app/policies/PoliciesFragmentTest.kt | 4 +- .../app/profile/AddProfileActivityTest.kt | 4 +- .../app/profile/AdminAuthActivityTest.kt | 4 +- .../app/profile/AdminPinActivityTest.kt | 4 +- .../app/profile/PinPasswordActivityTest.kt | 4 +- .../app/profile/ProfileChooserActivityTest.kt | 4 +- .../app/profile/ProfileChooserFragmentTest.kt | 4 +- .../ProfilePictureActivityTest.kt | 4 +- .../ProfileProgressActivityTest.kt | 4 +- .../ProfileProgressFragmentTest.kt | 4 +- .../app/recyclerview/BindableAdapterTest.kt | 8 +- .../app/recyclerview/RecyclerViewMatcher.kt | 6 +- .../resumelesson/ResumeLessonActivityTest.kt | 4 +- .../resumelesson/ResumeLessonFragmentTest.kt | 4 +- .../profile/ProfileEditActivityTest.kt | 4 +- .../profile/ProfileEditFragmentTest.kt | 4 +- .../profile/ProfileListActivityTest.kt | 4 +- .../profile/ProfileListFragmentTest.kt | 4 +- .../profile/ProfileRenameActivityTest.kt | 4 +- .../profile/ProfileRenameFragmentTest.kt | 4 +- .../profile/ProfileResetPinActivityTest.kt | 4 +- .../profile/ProfileResetPinFragmentTest.kt | 4 +- .../app/spotlight/SpotlightFragmentTest.kt | 4 +- .../android/app/story/StoryActivityTest.kt | 4 +- .../android/app/story/StoryFragmentTest.kt | 6 +- .../app/testing/DragDropTestActivityTest.kt | 4 +- ...ImageRegionSelectionInteractionViewTest.kt | 4 +- .../InputInteractionViewTestActivityTest.kt | 4 +- .../NavigationDrawerActivityDebugTest.kt | 4 +- .../NavigationDrawerActivityProdTest.kt | 4 +- ...tFontScaleConfigurationUtilActivityTest.kt | 4 +- .../testing/TopicTestActivityForStoryTest.kt | 4 +- .../app/thirdparty/LicenseListActivityTest.kt | 4 +- .../app/thirdparty/LicenseListFragmentTest.kt | 4 +- .../LicenseTextViewerActivityTest.kt | 4 +- .../LicenseTextViewerFragmentTest.kt | 4 +- .../ThirdPartyDependencyListActivityTest.kt | 4 +- .../ThirdPartyDependencyListFragmentTest.kt | 4 +- .../android/app/topic/TopicActivityTest.kt | 6 +- .../android/app/topic/TopicFragmentTest.kt | 4 +- .../conceptcard/ConceptCardFragmentTest.kt | 4 +- .../app/topic/info/TopicInfoFragmentTest.kt | 4 +- .../topic/lessons/TopicLessonsFragmentTest.kt | 4 +- .../practice/TopicPracticeFragmentTest.kt | 4 +- .../QuestionPlayerActivityTest.kt | 5 +- .../revision/TopicRevisionFragmentTest.kt | 4 +- .../revisioncard/RevisionCardActivityTest.kt | 8 +- .../revisioncard/RevisionCardFragmentTest.kt | 4 +- .../android/app/utility/DrawableMatcher.kt | 4 +- .../app/utility/OrientationChangeAction.kt | 4 +- .../app/utility/RatioExtensionsTest.kt | 4 +- .../walkthrough/WalkthroughActivityTest.kt | 4 +- .../WalkthroughFinalFragmentTest.kt | 4 +- .../WalkthroughTopicListFragmentTest.kt | 4 +- .../WalkthroughWelcomeFragmentTest.kt | 4 +- .../android/app/home/HomeActivityLocalTest.kt | 4 +- .../app/parser/FractionParsingUiErrorTest.kt | 4 +- .../parser/ListItemLeadingMarginSpanTest.kt | 4 +- .../app/parser/StringToRatioParserTest.kt | 4 +- .../ExplorationActivityLocalTest.kt | 4 +- .../player/state/StateFragmentLocalTest.kt | 4 +- .../ProfileChooserFragmentLocalTest.kt | 4 +- .../app/story/StoryActivityLocalTest.kt | 4 +- .../app/testing/CompletedStoryListSpanTest.kt | 4 +- .../oppia/android/app/testing/HomeSpanTest.kt | 4 +- .../app/testing/OngoingTopicListSpanTest.kt | 4 +- .../PlatformParameterIntegrationTest.kt | 4 +- .../app/testing/ProfileChooserSpanTest.kt | 4 +- .../testing/ProfileProgressSpanCountTest.kt | 4 +- .../app/testing/RecentlyPlayedSpanTest.kt | 6 +- .../app/testing/TopicRevisionSpanTest.kt | 4 +- .../AdministratorControlsFragmentTest.kt | 4 +- .../testing/options/OptionsFragmentTest.kt | 4 +- .../player/split/PlayerSplitScreenTest.kt | 4 +- .../state/StateFragmentAccessibilityTest.kt | 4 +- .../topic/info/TopicInfoFragmentLocalTest.kt | 4 +- .../lessons/TopicLessonsFragmentLocalTest.kt | 4 +- .../QuestionPlayerActivityLocalTest.kt | 4 +- .../RevisionCardActivityLocalTest.kt | 4 +- .../AppLanguageResourceHandlerTest.kt | 2 +- .../gae/JsonPrefixNetworkInterceptor.kt | 4 +- .../gae/NetworkLoggingInterceptorTest.kt | 139 +++++++++--------- .../gae/RemoteAuthNetworkInterceptorTest.kt | 1 + .../ExplorationActiveTimeController.kt | 2 + .../ExplorationProgressController.kt | 4 + .../ExpirationMetaDataRetrieverImpl.kt | 2 + .../analytics/CpuPerformanceSnapshotter.kt | 2 + .../exceptions/ExceptionsController.kt | 30 ++-- .../UncaughtExceptionLoggerStartupListener.kt | 2 +- .../profile/ProfileManagementController.kt | 10 +- .../QuestionAssessmentProgressController.kt | 2 + .../domain/question/QuestionRetriever.kt | 11 +- .../domain/survey/SurveyProgressController.kt | 56 ++++--- .../domain/topic/ConceptCardRetriever.kt | 61 +++----- .../topic/PrimeTopicAssetsControllerImpl.kt | 23 ++- .../android/domain/topic/TopicController.kt | 68 ++++----- .../HintHandlerProdImplTest.kt | 2 +- .../PerformanceMetricsControllerTest.kt | 2 +- ...rameterSyncUpWorkManagerInitializerTest.kt | 1 + .../scripts/ci/ComputeAffectedTests.kt | 4 +- .../telemetry/DecodeUserStudyEventString.kt | 6 +- .../android/scripts/testfile/TestFileCheck.kt | 5 +- .../scripts/testing/TestBazelWorkspace.kt | 8 +- .../scripts/ci/ComputeAffectedTestsTest.kt | 15 +- .../android/scripts/common/BazelClientTest.kt | 18 +-- .../oppia/android/testing/OppiaTestRunner.kt | 6 +- .../testing/junit/ParameterizedMethod.kt | 4 +- .../ExplorationCheckpointTestHelper.kt | 1 + .../network/MockPlatformParameterService.kt | 2 +- .../networking/NetworkConnectionTestUtil.kt | 2 + .../robolectric/OppiaShadowActivityManager.kt | 1 + .../robolectric/OppiaShadowTrafficStats.kt | 1 + .../testing/story/StoryProgressTestHelper.kt | 1 + .../threading/CoroutineExecutorService.kt | 5 +- .../TestCoroutineDispatcherEspressoImpl.kt | 4 +- .../TestCoroutineDispatcherRobolectricImpl.kt | 6 +- ...TestCoroutineDispatchersRobolectricImpl.kt | 6 +- .../testing/threading/TestDispatcherModule.kt | 28 +--- .../android/testing/time/FakeSystemClock.kt | 51 ++++--- .../NetworkConnectionTestUtilTest.kt | 2 + .../threading/CoroutineExecutorServiceTest.kt | 25 +--- ...TestCoroutineDispatcherEspressoImplTest.kt | 4 - ...tCoroutineDispatcherRobolectricImplTest.kt | 9 +- .../threading/TestCoroutineDispatcherTest.kt | 18 --- .../TestCoroutineDispatcherTestBase.kt | 4 - .../util/extensions/BundleExtensions.kt | 23 ++- .../util/extensions/ContextExtensions.kt | 12 +- .../PerformanceMetricsAssessorImpl.kt | 2 + .../NetworkConnectionUtilProdImpl.kt | 1 + .../util/parser/image/BitmapBlurrer.kt | 9 +- .../util/parser/image/TestGlideImageLoader.kt | 8 +- .../util/parser/image/UrlImageParser.kt | 12 +- .../android/util/statusbar/StatusBarColor.kt | 2 + .../android/util/data/AsyncResultTest.kt | 5 +- .../android/util/data/DataProvidersTest.kt | 5 + .../util/data/InMemoryBlockingCacheTest.kt | 3 +- .../util/extensions/BundleExtensionsTest.kt | 3 +- .../android/util/logging/ConsoleLoggerTest.kt | 36 +++-- .../NetworkConnectionUtilDebugImplTest.kt | 2 + .../NetworkConnectionUtilProdImplTest.kt | 2 + .../parser/html/ConceptCardTagHandlerTest.kt | 4 +- 297 files changed, 1257 insertions(+), 1262 deletions(-) diff --git a/app/src/main/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivity.kt b/app/src/main/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivity.kt index 74e0f97ae89..fe9aca347f4 100644 --- a/app/src/main/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivity.kt +++ b/app/src/main/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivity.kt @@ -138,6 +138,7 @@ class AdministratorControlsActivity : if (fragment is ProfileEditFragment) { administratorControlsActivityPresenter.handleOnBackPressed() } else { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. super.onBackPressed() } } diff --git a/app/src/main/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityPresenter.kt index 0dfe9b50b9c..c152e484dad 100644 --- a/app/src/main/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/administratorcontrols/AdministratorControlsActivityPresenter.kt @@ -3,7 +3,6 @@ package org.oppia.android.app.administratorcontrols import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar import androidx.databinding.DataBindingUtil import org.oppia.android.R import org.oppia.android.app.activity.ActivityScope @@ -62,14 +61,11 @@ class AdministratorControlsActivityPresenter @Inject constructor( if (isMultipane) { val adminControlsActivity = activity as AdministratorControlsActivity when (lastLoadedFragment) { - PROFILE_LIST_FRAGMENT -> (activity as AdministratorControlsActivity).loadProfileList() - APP_VERSION_FRAGMENT -> (activity as AdministratorControlsActivity).loadAppVersion() + PROFILE_LIST_FRAGMENT -> activity.loadProfileList() + APP_VERSION_FRAGMENT -> activity.loadAppVersion() PROFILE_EDIT_FRAGMENT -> selectedProfileId.let { profileId -> if (extraControlsTitle != null) { - (activity as AdministratorControlsActivity).loadProfileEdit( - profileId = profileId, - profileName = extraControlsTitle - ) + activity.loadProfileEdit(profileId = profileId, profileName = extraControlsTitle) if (isProfileDeletionDialogVisible && profileId != 0) { val fragment = activity.supportFragmentManager.findFragmentById( R.id.administrator_controls_fragment_multipane_placeholder @@ -88,7 +84,7 @@ class AdministratorControlsActivityPresenter @Inject constructor( /** Sets up the navigation drawer. */ private fun setUpNavigationDrawer() { - val toolbar = binding.administratorControlsActivityToolbar as Toolbar + val toolbar = binding.administratorControlsActivityToolbar activity.setSupportActionBar(toolbar) activity.supportActionBar!!.setDisplayShowHomeEnabled(true) navigationDrawerFragment = activity @@ -206,9 +202,9 @@ class AdministratorControlsActivityPresenter @Inject constructor( outState.putString(SELECTED_CONTROLS_TITLE_SAVED_KEY, titleTextView.text.toString()) } outState.putString(LAST_LOADED_FRAGMENT_EXTRA_KEY, lastLoadedFragment) - isProfileDeletionDialogVisible?.let { + isProfileDeletionDialogVisible.let { outState.putBoolean(IS_PROFILE_DELETION_DIALOG_VISIBLE_KEY, it) } - selectedProfileId?.let { outState.putInt(SELECTED_PROFILE_ID_SAVED_KEY, it) } + selectedProfileId.let { outState.putInt(SELECTED_PROFILE_ID_SAVED_KEY, it) } } } diff --git a/app/src/main/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionActivity.kt b/app/src/main/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionActivity.kt index ec5dce2c206..0c80eac7390 100644 --- a/app/src/main/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionActivity.kt +++ b/app/src/main/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionActivity.kt @@ -23,6 +23,7 @@ class AppVersionActivity : InjectableAutoLocalizedAppCompatActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. onBackPressed() } return super.onOptionsItemSelected(item) diff --git a/app/src/main/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionFragmentPresenter.kt index 984296b4f88..125841f8f9f 100644 --- a/app/src/main/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/administratorcontrols/appversion/AppVersionFragmentPresenter.kt @@ -5,7 +5,6 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import org.oppia.android.app.fragment.FragmentScope -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.AppVersionFragmentBinding import javax.inject.Inject @@ -13,7 +12,7 @@ import javax.inject.Inject @FragmentScope class AppVersionFragmentPresenter @Inject constructor( private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider + private val appVersionViewModel: AppVersionViewModel ) { private lateinit var binding: AppVersionFragmentBinding @@ -26,12 +25,8 @@ class AppVersionFragmentPresenter @Inject constructor( ) binding.let { it.lifecycleOwner = fragment - it.viewModel = getAppVersionViewModel() + it.viewModel = appVersionViewModel } return binding.root } - - private fun getAppVersionViewModel(): AppVersionViewModel { - return viewModelProvider.getForFragment(fragment, AppVersionViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivity.kt b/app/src/main/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivity.kt index b890f3ebbb9..33f04e2687a 100644 --- a/app/src/main/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivity.kt +++ b/app/src/main/java/org/oppia/android/app/administratorcontrols/learneranalytics/ProfileAndDeviceIdActivity.kt @@ -28,6 +28,7 @@ class ProfileAndDeviceIdActivity : InjectableAutoLocalizedAppCompatActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. onBackPressed() } return super.onOptionsItemSelected(item) diff --git a/app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryListFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryListFragmentPresenter.kt index 91e43599cd0..ed1a566d4de 100644 --- a/app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryListFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/completedstorylist/CompletedStoryListFragmentPresenter.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.GridLayoutManager import org.oppia.android.R import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.CompletedStoryItemBinding import org.oppia.android.databinding.CompletedStoryListFragmentBinding import javax.inject.Inject @@ -17,7 +16,7 @@ import javax.inject.Inject class CompletedStoryListFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val viewModel: CompletedStoryListViewModel, private val singleTypeBuilderFactory: BindableAdapter.SingleTypeBuilder.Factory ) { @@ -29,7 +28,6 @@ class CompletedStoryListFragmentPresenter @Inject constructor( container: ViewGroup?, internalProfileId: Int ): View? { - val viewModel = getCompletedStoryListViewModel() viewModel.setProfileId(internalProfileId) binding = CompletedStoryListFragmentBinding @@ -61,8 +59,4 @@ class CompletedStoryListFragmentPresenter @Inject constructor( ) .build() } - - private fun getCompletedStoryListViewModel(): CompletedStoryListViewModel { - return viewModelProvider.getForFragment(fragment, CompletedStoryListViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdapters.java index 4e7f59b0bb3..fb7b85b19cf 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/AppCompatCheckBoxBindingAdapters.java @@ -12,7 +12,7 @@ */ public final class AppCompatCheckBoxBindingAdapters { /** Sets the button tint for the specified checkbox, via data-binding. */ - @BindingAdapter("app:buttonTint") + @BindingAdapter("buttonTint") public static void setButtonTint(@NonNull AppCompatCheckBox checkBox, @ColorInt int colorRgb) { CompoundButtonCompat.setButtonTintList(checkBox, ColorStateList.valueOf(colorRgb)); } diff --git a/app/src/main/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdapters.java index 2df902df0f1..ca6c0d61f58 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/CircularProgressIndicatorAdapters.java @@ -18,7 +18,7 @@ public final class CircularProgressIndicatorAdapters { * @param progress the numerical progress to set on the indicator (which will be displayed based * on the indicator's customized minimum and maximum progress values) */ - @BindingAdapter("app:animatedProgress") + @BindingAdapter("animatedProgress") public static void setAnimatedProgress(CircularProgressIndicator indicator, int progress) { if (progress > 0) { indicator.setProgressCompat(progress, /* animated = */ true); diff --git a/app/src/main/java/org/oppia/android/app/databinding/ConstraintLayoutAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/ConstraintLayoutAdapters.java index 734c29ea37e..657c811bf43 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/ConstraintLayoutAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/ConstraintLayoutAdapters.java @@ -10,7 +10,7 @@ public final class ConstraintLayoutAdapters { /** Binding adapter for setting a layout_constraintEnd_toEndOf to a view. */ - @BindingAdapter("app:layout_constraintEnd_toEndOf") + @BindingAdapter("layout_constraintEnd_toEndOf") public static void setConstraintEndToEndOf(@NonNull View view, int constraintToId) { ConstraintLayout constraintLayout = (ConstraintLayout) view.getParent(); ConstraintSet constraintSet = new ConstraintSet(); @@ -20,7 +20,7 @@ public static void setConstraintEndToEndOf(@NonNull View view, int constraintToI } /** Binding adapter for setting layout_constraintHorizontal_bias to a view. */ - @BindingAdapter("app:layout_constraintHorizontal_bias") + @BindingAdapter("layout_constraintHorizontal_bias") public static void setHorizontalBias(@NonNull View view, float value) { ConstraintLayout constraintLayout = (ConstraintLayout) view.getParent(); ConstraintSet constraintSet = new ConstraintSet(); diff --git a/app/src/main/java/org/oppia/android/app/databinding/DrawableBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/DrawableBindingAdapters.java index c256532ded2..8890dd4fbec 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/DrawableBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/DrawableBindingAdapters.java @@ -20,7 +20,7 @@ public static void setBackgroundColor(@NonNull View view, @ColorInt int colorRgb } /** Used to set a rounded-rect background drawable with a data-bound color. */ - @BindingAdapter("app:roundedRectDrawableWithColor") + @BindingAdapter("roundedRectDrawableWithColor") public static void setBackgroundDrawable(@NonNull View view, @ColorInt int colorRgb) { view.setBackgroundResource(R.drawable.rounded_rect_background); // The input color needs to have alpha channel prepended to it. @@ -29,7 +29,7 @@ public static void setBackgroundDrawable(@NonNull View view, @ColorInt int color } /** Used to set a top rounded-rect background drawable with a data-bound color. */ - @BindingAdapter("app:topRoundedRectDrawableWithColor") + @BindingAdapter("topRoundedRectDrawableWithColor") public static void setTopBackgroundDrawable(@NonNull View view, @ColorInt int colorRgb) { view.setBackgroundResource(R.drawable.top_rounded_rect_background); // The input color needs to have alpha channel prepended to it. diff --git a/app/src/main/java/org/oppia/android/app/databinding/EditTextBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/EditTextBindingAdapters.java index dad9dc8c84a..824af3b7e78 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/EditTextBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/EditTextBindingAdapters.java @@ -9,7 +9,7 @@ public final class EditTextBindingAdapters { /** Binding adapter for setting a [TextWatcher] as a change listener for an [EditText]. */ - @BindingAdapter("app:textChangedListener") + @BindingAdapter("textChangedListener") public static void bindTextWatcher(@NonNull EditText editText, TextWatcher textWatcher) { editText.addTextChangedListener(textWatcher); } diff --git a/app/src/main/java/org/oppia/android/app/databinding/GuidelineBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/GuidelineBindingAdapters.java index cc8f29fe95f..05b805d563c 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/GuidelineBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/GuidelineBindingAdapters.java @@ -9,7 +9,7 @@ public final class GuidelineBindingAdapters { /** Binding adapter for setting the `guidePercent` for a [Guideline]. */ - @BindingAdapter("app:layout_constraintGuide_percent") + @BindingAdapter("layout_constraintGuide_percent") public static void setGuidelinePercentage(@NonNull Guideline guideline, float percentage) { ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideline.getLayoutParams(); @@ -18,7 +18,7 @@ public static void setGuidelinePercentage(@NonNull Guideline guideline, float pe } /** Binding adapter for setting the `guideEnd` for a [Guideline]. */ - @BindingAdapter("app:layout_constraintGuide_end") + @BindingAdapter("layout_constraintGuide_end") public static void setConstraintGuidelineEnd(@NonNull Guideline guideline, float guideEndPx) { ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideline.getLayoutParams(); diff --git a/app/src/main/java/org/oppia/android/app/databinding/ImageViewBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/ImageViewBindingAdapters.java index 5f5df424537..7606551bae1 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/ImageViewBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/ImageViewBindingAdapters.java @@ -17,7 +17,7 @@ /** Holds all custom binding adapters that bind to [ImageView]. */ public final class ImageViewBindingAdapters { - @BindingAdapter("app:srcCompat") + @BindingAdapter("srcCompat") public static void setImageDrawableCompat( @NonNull ImageView imageView, @DrawableRes int drawableResourceId @@ -25,7 +25,7 @@ public static void setImageDrawableCompat( imageView.setImageResource(drawableResourceId); } - @BindingAdapter("app:srcCompat") + @BindingAdapter("srcCompat") public static void setImageDrawableCompat( @NonNull ImageView imageView, Drawable drawable @@ -40,7 +40,7 @@ public static void setImageDrawableCompat( * @param imageView view where the profile avatar will be loaded into * @param profileAvatar represents either a colorId or local image uri */ - @BindingAdapter("profile:src") + @BindingAdapter("profileImageSource") public static void setProfileImage(ImageView imageView, ProfileAvatar profileAvatar) { if (profileAvatar != null) { if (profileAvatar.getAvatarTypeCase() == ProfileAvatar.AvatarTypeCase.AVATAR_COLOR_RGB) { @@ -86,7 +86,7 @@ public boolean onResourceReady( *

* Reference: https://stackoverflow.com/a/35809319/3689782. */ - @BindingAdapter("playState:image") + @BindingAdapter("playStateImage") public static void setPlayStateDrawable( @NonNull ImageView imageView, ChapterPlayState chapterPlayState diff --git a/app/src/main/java/org/oppia/android/app/databinding/MarginBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/MarginBindingAdapters.java index 69dd1f379c4..2c7cd8be971 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/MarginBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/MarginBindingAdapters.java @@ -10,7 +10,7 @@ public final class MarginBindingAdapters { /** Sets the start margin for a view, accounting for RTL scenarios. */ - @BindingAdapter("app:layoutMarginStart") + @BindingAdapter("layoutMarginStart") public static void setLayoutMarginStart(@NonNull View view, float marginStart) { if (view.getLayoutParams() instanceof MarginLayoutParams) { MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); @@ -20,7 +20,7 @@ public static void setLayoutMarginStart(@NonNull View view, float marginStart) { } /** Sets the end margin for a view, accounting for RTL scenarios. */ - @BindingAdapter("app:layoutMarginEnd") + @BindingAdapter("layoutMarginEnd") public static void setLayoutMarginEnd(@NonNull View view, float marginEnd) { if (view.getLayoutParams() instanceof MarginLayoutParams) { MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); @@ -30,7 +30,7 @@ public static void setLayoutMarginEnd(@NonNull View view, float marginEnd) { } /** Used to set a margin-top for views. */ - @BindingAdapter("app:layoutMarginTop") + @BindingAdapter("layoutMarginTop") public static void setLayoutMarginTop(@NonNull View view, float marginTop) { if (view.getLayoutParams() instanceof MarginLayoutParams) { MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); @@ -41,7 +41,7 @@ public static void setLayoutMarginTop(@NonNull View view, float marginTop) { } /** Used to set a margin-bottom for views. */ - @BindingAdapter("app:layoutMarginBottom") + @BindingAdapter("layoutMarginBottom") public static void setLayoutMarginBottom(@NonNull View view, float marginBottom) { if (view.getLayoutParams() instanceof MarginLayoutParams) { MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); @@ -52,7 +52,7 @@ public static void setLayoutMarginBottom(@NonNull View view, float marginBottom) } /** Used to set a margin for views. */ - @BindingAdapter("app:layoutMargin") + @BindingAdapter("layoutMargin") public static void setLayoutMargin(@NonNull View view, float margin) { if (view.getLayoutParams() instanceof MarginLayoutParams) { MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); diff --git a/app/src/main/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdapters.java index 77bab0f3555..a5dd6a15c39 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/StateAssemblerMarginBindingAdapters.java @@ -14,11 +14,11 @@ public final class StateAssemblerMarginBindingAdapters { /** Used to set a margin for exploration split-view. */ @BindingAdapter( value = { - "app:explorationSplitViewMarginApplicable", - "app:explorationSplitViewMarginStart", - "app:explorationSplitViewMarginTop", - "app:explorationSplitViewMarginEnd", - "app:explorationSplitViewMarginBottom", + "explorationSplitViewMarginApplicable", + "explorationSplitViewMarginStart", + "explorationSplitViewMarginTop", + "explorationSplitViewMarginEnd", + "explorationSplitViewMarginBottom", }, requireAll = false ) @@ -36,11 +36,11 @@ public static void setExplorationSplitViewMargin( /** Used to set a margin for exploration view. */ @BindingAdapter( value = { - "app:explorationViewMarginApplicable", - "app:explorationViewMarginStart", - "app:explorationViewMarginTop", - "app:explorationViewMarginEnd", - "app:explorationViewMarginBottom", + "explorationViewMarginApplicable", + "explorationViewMarginStart", + "explorationViewMarginTop", + "explorationViewMarginEnd", + "explorationViewMarginBottom", }, requireAll = false ) @@ -58,11 +58,11 @@ public static void setExplorationViewMargin( /** Used to set a margin for question view. */ @BindingAdapter( value = { - "app:questionViewMarginApplicable", - "app:questionViewMarginStart", - "app:questionViewMarginTop", - "app:questionViewMarginEnd", - "app:questionViewMarginBottom", + "questionViewMarginApplicable", + "questionViewMarginStart", + "questionViewMarginTop", + "questionViewMarginEnd", + "questionViewMarginBottom", }, requireAll = false ) @@ -80,11 +80,11 @@ public static void setQuestionViewMargin( /** Used to set a margin for question split-view. */ @BindingAdapter( value = { - "app:questionSplitViewMarginApplicable", - "app:questionSplitViewMarginStart", - "app:questionSplitViewMarginTop", - "app:questionSplitViewMarginEnd", - "app:questionSplitViewMarginBottom", + "questionSplitViewMarginApplicable", + "questionSplitViewMarginStart", + "questionSplitViewMarginTop", + "questionSplitViewMarginEnd", + "questionSplitViewMarginBottom", }, requireAll = false ) diff --git a/app/src/main/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdapters.java index c1ab6d73911..44cdbe19e45 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/StateAssemblerPaddingBindingAdapters.java @@ -13,11 +13,11 @@ public final class StateAssemblerPaddingBindingAdapters { /** Used to set a padding for exploration split-view. */ @BindingAdapter( value = { - "app:explorationSplitViewPaddingApplicable", - "app:explorationSplitViewPaddingStart", - "app:explorationSplitViewPaddingTop", - "app:explorationSplitViewPaddingEnd", - "app:explorationSplitViewPaddingBottom", + "explorationSplitViewPaddingApplicable", + "explorationSplitViewPaddingStart", + "explorationSplitViewPaddingTop", + "explorationSplitViewPaddingEnd", + "explorationSplitViewPaddingBottom", }, requireAll = false ) @@ -35,11 +35,11 @@ public static void setExplorationSplitViewPadding( /** Used to set a padding for exploration view. */ @BindingAdapter( value = { - "app:explorationViewPaddingApplicable", - "app:explorationViewPaddingStart", - "app:explorationViewPaddingTop", - "app:explorationViewPaddingEnd", - "app:explorationViewPaddingBottom", + "explorationViewPaddingApplicable", + "explorationViewPaddingStart", + "explorationViewPaddingTop", + "explorationViewPaddingEnd", + "explorationViewPaddingBottom", }, requireAll = false ) @@ -57,11 +57,11 @@ public static void setExplorationViewPadding( /** Used to set a padding for question view. */ @BindingAdapter( value = { - "app:questionViewPaddingApplicable", - "app:questionViewPaddingStart", - "app:questionViewPaddingTop", - "app:questionViewPaddingEnd", - "app:questionViewPaddingBottom", + "questionViewPaddingApplicable", + "questionViewPaddingStart", + "questionViewPaddingTop", + "questionViewPaddingEnd", + "questionViewPaddingBottom", }, requireAll = false ) @@ -79,11 +79,11 @@ public static void setQuestionViewPadding( /** Used to set a padding for question split-view. */ @BindingAdapter( value = { - "app:questionSplitViewPaddingApplicable", - "app:questionSplitViewPaddingStart", - "app:questionSplitViewPaddingTop", - "app:questionSplitViewPaddingEnd", - "app:questionSplitViewPaddingBottom", + "questionSplitViewPaddingApplicable", + "questionSplitViewPaddingStart", + "questionSplitViewPaddingTop", + "questionSplitViewPaddingEnd", + "questionSplitViewPaddingBottom", }, requireAll = false ) diff --git a/app/src/main/java/org/oppia/android/app/databinding/TextInputLayoutBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/TextInputLayoutBindingAdapters.java index 9ec97b475ad..d0dd35c2a77 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/TextInputLayoutBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/TextInputLayoutBindingAdapters.java @@ -8,7 +8,7 @@ public final class TextInputLayoutBindingAdapters { /** Binding adapter for setting an error message. */ - @BindingAdapter("app:errorMessage") + @BindingAdapter("errorMessage") public static void setErrorMessage( @NonNull TextInputLayout textInputLayout, String errorMessage diff --git a/app/src/main/java/org/oppia/android/app/databinding/TextViewBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/TextViewBindingAdapters.java index 591e8c88738..e4584d7cad1 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/TextViewBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/TextViewBindingAdapters.java @@ -20,7 +20,7 @@ public final class TextViewBindingAdapters { /** Binds date text with relative time. */ - @BindingAdapter("profile:created") + @BindingAdapter("profileCreatedTime") public static void setProfileDataText(@NonNull TextView textView, long timestamp) { AppLanguageResourceHandler resourceHandler = getResourceHandler(textView); String time = resourceHandler.computeDateString(timestamp); @@ -31,7 +31,7 @@ public static void setProfileDataText(@NonNull TextView textView, long timestamp } /** Binds last used with relative timestamp. */ - @BindingAdapter("profile:lastVisited") + @BindingAdapter("profileLastVisitedTime") public static void setProfileLastVisitedText(@NonNull TextView textView, long timestamp) { AppLanguageResourceHandler resourceHandler = getResourceHandler(textView); String profileLastUsed = resourceHandler.getStringInLocale(R.string.profile_last_used); @@ -46,7 +46,7 @@ public static void setProfileLastVisitedText(@NonNull TextView textView, long ti // TODO(#4345): Add test for this method. /** Binds an AndroidX KitKat-compatible drawable top to the specified text view. */ - @BindingAdapter("app:drawableTopCompat") + @BindingAdapter("drawableTopCompat") public static void setDrawableTopCompat( @NonNull TextView imageView, Drawable drawable @@ -57,7 +57,7 @@ public static void setDrawableTopCompat( } /** Binds an AndroidX KitKat-compatible drawable end to the specified text view. */ - @BindingAdapter("app:drawableEndCompat") + @BindingAdapter("drawableEndCompat") public static void setDrawableEndCompat( @NonNull TextView imageView, Drawable drawable diff --git a/app/src/main/java/org/oppia/android/app/databinding/ViewBindingAdapters.java b/app/src/main/java/org/oppia/android/app/databinding/ViewBindingAdapters.java index fbe1b859e6f..6b0dea8b2b6 100644 --- a/app/src/main/java/org/oppia/android/app/databinding/ViewBindingAdapters.java +++ b/app/src/main/java/org/oppia/android/app/databinding/ViewBindingAdapters.java @@ -37,8 +37,8 @@ public static void setLayoutWidth(@NonNull View view, float width) { /** Adapter to animate-rotate a view by the specified angle in the specified direction. */ @BindingAdapter( value = { - "app:isRotationAnimationClockwise", - "app:rotationAnimationAngle" + "isRotationAnimationClockwise", + "rotationAnimationAngle" }, requireAll = true ) diff --git a/app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityPresenter.kt index edd4e952711..9caf3ee3bfb 100644 --- a/app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityPresenter.kt @@ -1,7 +1,6 @@ package org.oppia.android.app.devoptions import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar import androidx.databinding.DataBindingUtil import org.oppia.android.R import org.oppia.android.app.activity.ActivityScope @@ -33,7 +32,7 @@ class DeveloperOptionsActivityPresenter @Inject constructor( } private fun setUpNavigationDrawer() { - val toolbar = binding.developerOptionsActivityToolbar as Toolbar + val toolbar = binding.developerOptionsActivityToolbar activity.setSupportActionBar(toolbar) activity.supportActionBar!!.setDisplayShowHomeEnabled(true) navigationDrawerFragment = activity diff --git a/app/src/main/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentPresenter.kt index 1b09b469bb4..54db449bc89 100644 --- a/app/src/main/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/devoptions/forcenetworktype/ForceNetworkTypeFragmentPresenter.kt @@ -9,7 +9,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.google.common.base.Optional import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ForceNetworkTypeFragmentBinding import org.oppia.android.databinding.ForceNetworkTypeNetworkItemViewBinding import org.oppia.android.util.networking.NetworkConnectionDebugUtil @@ -21,7 +20,7 @@ class ForceNetworkTypeFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, private val networkConnectionUtil: Optional, - private val viewModelProvider: ViewModelProvider, + private val forceNetworkTypeViewModel: ForceNetworkTypeViewModel, private val singleTypeBuilderFactory: BindableAdapter.SingleTypeBuilder.Factory ) { @@ -46,7 +45,7 @@ class ForceNetworkTypeFragmentPresenter @Inject constructor( binding.apply { this.lifecycleOwner = fragment - this.viewModel = getForceNetworkTypeViewModel() + this.viewModel = forceNetworkTypeViewModel } linearLayoutManager = LinearLayoutManager(activity.applicationContext) @@ -83,8 +82,4 @@ class ForceNetworkTypeFragmentPresenter @Inject constructor( } } } - - private fun getForceNetworkTypeViewModel(): ForceNetworkTypeViewModel { - return viewModelProvider.getForFragment(fragment, ForceNetworkTypeViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivity.kt b/app/src/main/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivity.kt index 4509dedb942..e169d07a3d8 100644 --- a/app/src/main/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivity.kt +++ b/app/src/main/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivity.kt @@ -33,6 +33,7 @@ class MarkChaptersCompletedActivity : InjectableAutoLocalizedAppCompatActivity() override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. onBackPressed() } return super.onOptionsItemSelected(item) diff --git a/app/src/main/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedActivity.kt b/app/src/main/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedActivity.kt index 4e3b2f92a12..8633005dad6 100644 --- a/app/src/main/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedActivity.kt +++ b/app/src/main/java/org/oppia/android/app/devoptions/markstoriescompleted/MarkStoriesCompletedActivity.kt @@ -33,6 +33,7 @@ class MarkStoriesCompletedActivity : InjectableAutoLocalizedAppCompatActivity() override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. onBackPressed() } return super.onOptionsItemSelected(item) diff --git a/app/src/main/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedActivity.kt b/app/src/main/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedActivity.kt index 5274a993e7b..4e0b61991ca 100644 --- a/app/src/main/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedActivity.kt +++ b/app/src/main/java/org/oppia/android/app/devoptions/marktopicscompleted/MarkTopicsCompletedActivity.kt @@ -34,6 +34,7 @@ class MarkTopicsCompletedActivity : InjectableAutoLocalizedAppCompatActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { if (item.itemId == android.R.id.home) { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. onBackPressed() } return super.onOptionsItemSelected(item) diff --git a/app/src/main/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsFragmentPresenter.kt index 9fe0b2849f8..78635f02db3 100644 --- a/app/src/main/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsFragmentPresenter.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ViewEventLogsEventLogItemViewBinding import org.oppia.android.databinding.ViewEventLogsFragmentBinding import javax.inject.Inject @@ -18,7 +17,7 @@ import javax.inject.Inject class ViewEventLogsFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val viewEventLogsViewModel: ViewEventLogsViewModel, private val singleTypeBuilderFactory: BindableAdapter.SingleTypeBuilder.Factory ) { @@ -42,7 +41,7 @@ class ViewEventLogsFragmentPresenter @Inject constructor( binding.apply { this.lifecycleOwner = fragment - this.viewModel = getViewEventLogsViewModel() + this.viewModel = viewEventLogsViewModel } linearLayoutManager = LinearLayoutManager(activity.applicationContext) @@ -64,8 +63,4 @@ class ViewEventLogsFragmentPresenter @Inject constructor( ) .build() } - - private fun getViewEventLogsViewModel(): ViewEventLogsViewModel { - return viewModelProvider.getForFragment(fragment, ViewEventLogsViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt index 44fb2ec9945..f76c4cf919e 100644 --- a/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerFragmentPresenter.kt @@ -11,7 +11,6 @@ import androidx.core.view.forEach import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.Fragment import androidx.lifecycle.LiveData -import androidx.lifecycle.Observer import androidx.lifecycle.Transformations import com.google.android.material.navigation.NavigationView import com.google.common.base.Optional @@ -31,7 +30,6 @@ import org.oppia.android.app.mydownloads.MyDownloadsActivity import org.oppia.android.app.options.OptionsActivity import org.oppia.android.app.profileprogress.ProfileProgressActivity import org.oppia.android.app.topic.TopicActivity -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.DrawerFragmentBinding import org.oppia.android.databinding.NavHeaderNavigationDrawerBinding import org.oppia.android.domain.oppialogger.OppiaLogger @@ -54,8 +52,8 @@ class NavigationDrawerFragmentPresenter @Inject constructor( private val profileManagementController: ProfileManagementController, private val topicController: TopicController, private val oppiaLogger: OppiaLogger, - private val headerViewModelProvider: ViewModelProvider, - private val footerViewModelProvider: ViewModelProvider, + private val headerViewModel: NavigationDrawerHeaderViewModel, + private val footerViewModel: NavigationDrawerFooterViewModel, private val developerOptionsStarter: Optional ) : NavigationView.OnNavigationItemSelectedListener { private lateinit var drawerToggle: ActionBarDrawerToggle @@ -80,13 +78,13 @@ class NavigationDrawerFragmentPresenter @Inject constructor( container, /* attachToRoot= */ false ) - headerBinding.viewModel = getHeaderViewModel() + headerBinding.viewModel = headerViewModel subscribeToProfileLiveData() subscribeToCompletedStoryListLiveData() subscribeToOngoingTopicListLiveData() binding.fragmentDrawerNavView.addHeaderView(headerBinding.root) - binding.footerViewModel = getFooterViewModel() + binding.footerViewModel = footerViewModel binding.executePendingBindings() // TODO(#3382): Remove debug only code from prod build (also check imports, constructor and drawer_fragment.xml) @@ -98,15 +96,15 @@ class NavigationDrawerFragmentPresenter @Inject constructor( // TODO(#3382): Remove debug only code from prod build (also check imports, constructor and drawer_fragment.xml) private fun setIfDeveloperOptionsMenuItemListener() { developerOptionsStarter.asSet().forEach { starter -> - getFooterViewModel().isDebugMode.set(true) + footerViewModel.isDebugMode.set(true) binding.developerOptionsLinearLayout.setOnClickListener { - if (getFooterViewModel().isDeveloperOptionsSelected.get() == true) { + if (footerViewModel.isDeveloperOptionsSelected.get() == true) { drawerLayout.closeDrawers() return@setOnClickListener } uncheckAllMenuItemsWhenAdministratorControlsOrDeveloperOptionsIsSelected() drawerLayout.closeDrawers() - getFooterViewModel().isDeveloperOptionsSelected.set(true) + footerViewModel.isDeveloperOptionsSelected.set(true) val intent = starter.createIntent(activity, internalProfileId) fragment.activity!!.startActivity(intent) if (previousMenuItemId == 0) fragment.activity!!.finish() @@ -129,38 +127,35 @@ class NavigationDrawerFragmentPresenter @Inject constructor( } private fun subscribeToProfileLiveData() { - getProfileData().observe( - fragment, - Observer { - getHeaderViewModel().profile.set(it) - getFooterViewModel().isAdmin.set(it.isAdmin) - binding.administratorControlsLinearLayout.setOnClickListener { - if (getFooterViewModel().isAdministratorControlsSelected.get() == true) { - drawerLayout.closeDrawers() - return@setOnClickListener - } + getProfileData().observe(fragment) { + headerViewModel.profile.set(it) + footerViewModel.isAdmin.set(it.isAdmin) + binding.administratorControlsLinearLayout.setOnClickListener { + if (footerViewModel.isAdministratorControlsSelected.get() == true) { + drawerLayout.closeDrawers() + return@setOnClickListener + } - uncheckAllMenuItemsWhenAdministratorControlsOrDeveloperOptionsIsSelected() + uncheckAllMenuItemsWhenAdministratorControlsOrDeveloperOptionsIsSelected() - drawerLayout.closeDrawers() - getFooterViewModel().isAdministratorControlsSelected.set(true) - val intent = - AdministratorControlsActivity.createAdministratorControlsActivityIntent( - activity, - internalProfileId - ) - fragment.activity!!.startActivity(intent) - if (previousMenuItemId == -1) fragment.activity!!.finish() - else if (previousMenuItemId != null && - NavigationDrawerItem.valueFromNavId(previousMenuItemId!!) != - NavigationDrawerItem.HOME - ) { - fragment.activity!!.finish() - } - drawerLayout.closeDrawers() + drawerLayout.closeDrawers() + footerViewModel.isAdministratorControlsSelected.set(true) + val intent = + AdministratorControlsActivity.createAdministratorControlsActivityIntent( + activity, + internalProfileId + ) + fragment.activity!!.startActivity(intent) + if (previousMenuItemId == -1) fragment.activity!!.finish() + else if (previousMenuItemId != null && + NavigationDrawerItem.valueFromNavId(previousMenuItemId!!) != + NavigationDrawerItem.HOME + ) { + fragment.activity!!.finish() } + drawerLayout.closeDrawers() } - ) + } } private fun processGetProfileResult(profileResult: AsyncResult): Profile { @@ -182,12 +177,9 @@ class NavigationDrawerFragmentPresenter @Inject constructor( } private fun subscribeToCompletedStoryListLiveData() { - getCompletedStoryListCount().observe( - fragment, - { - getHeaderViewModel().setCompletedStoryProgress(it.completedStoryCount) - } - ) + getCompletedStoryListCount().observe(fragment) { + headerViewModel.setCompletedStoryProgress(it.completedStoryCount) + } } private fun processGetCompletedStoryListResult( @@ -215,12 +207,9 @@ class NavigationDrawerFragmentPresenter @Inject constructor( } private fun subscribeToOngoingTopicListLiveData() { - getOngoingTopicListCount().observe( - fragment, - { - getHeaderViewModel().setOngoingTopicProgress(it.topicCount) - } - ) + getOngoingTopicListCount().observe(fragment) { + headerViewModel.setOngoingTopicProgress(it.topicCount) + } } private fun processGetOngoingTopicListResult( @@ -286,12 +275,12 @@ class NavigationDrawerFragmentPresenter @Inject constructor( fragment.childFragmentManager.beginTransaction().remove(previousFragment).commitNow() } val exitProfileDialogArguments = - if (getFooterViewModel().isAdministratorControlsSelected.get() == true) { + if (footerViewModel.isAdministratorControlsSelected.get() == true) { ExitProfileDialogArguments .newBuilder() .setHighlightItem(HighlightItem.ADMINISTRATOR_CONTROLS_ITEM) .build() - } else if (getFooterViewModel().isDeveloperOptionsSelected.get() == true) { + } else if (footerViewModel.isDeveloperOptionsSelected.get() == true) { ExitProfileDialogArguments .newBuilder() .setHighlightItem(HighlightItem.DEVELOPER_OPTIONS_ITEM) @@ -302,8 +291,8 @@ class NavigationDrawerFragmentPresenter @Inject constructor( .setHighlightItem(HighlightItem.LAST_CHECKED_MENU_ITEM) .build() } - getFooterViewModel().isAdministratorControlsSelected.set(false) - getFooterViewModel().isDeveloperOptionsSelected.set(false) + footerViewModel.isAdministratorControlsSelected.set(false) + footerViewModel.isDeveloperOptionsSelected.set(false) binding.fragmentDrawerNavView.menu.getItem( NavigationDrawerItem.SWITCH_PROFILE.ordinal ).isChecked = @@ -342,13 +331,13 @@ class NavigationDrawerFragmentPresenter @Inject constructor( } fun highlightAdministratorControlsItem() { - getFooterViewModel().isAdministratorControlsSelected.set(true) + footerViewModel.isAdministratorControlsSelected.set(true) uncheckAllMenuItemsWhenAdministratorControlsOrDeveloperOptionsIsSelected() drawerLayout.closeDrawers() } fun highlightDeveloperOptionsItem() { - getFooterViewModel().isDeveloperOptionsSelected.set(true) + footerViewModel.isDeveloperOptionsSelected.set(true) uncheckAllMenuItemsWhenAdministratorControlsOrDeveloperOptionsIsSelected() drawerLayout.closeDrawers() } @@ -373,8 +362,8 @@ class NavigationDrawerFragmentPresenter @Inject constructor( fun setUpDrawer(drawerLayout: DrawerLayout, toolbar: Toolbar, menuItemId: Int) { previousMenuItemId = if (activity is TopicActivity) null else menuItemId if (menuItemId != 0 && menuItemId != -1) { - getFooterViewModel().isAdministratorControlsSelected.set(false) - getFooterViewModel().isDeveloperOptionsSelected.set(false) + footerViewModel.isAdministratorControlsSelected.set(false) + footerViewModel.isDeveloperOptionsSelected.set(false) when (NavigationDrawerItem.valueFromNavId(menuItemId)) { NavigationDrawerItem.HOME -> { binding.fragmentDrawerNavView.menu.getItem( @@ -437,14 +426,14 @@ class NavigationDrawerFragmentPresenter @Inject constructor( ) } } - drawerLayout.setDrawerListener(drawerToggle) + drawerLayout.addDrawerListener(drawerToggle) /* Synchronize the state of the drawer indicator/affordance with the linked [drawerLayout]. */ drawerLayout.post { drawerToggle.syncState() } } else { // For showing navigation drawer in AdministratorControlsActivity - if (menuItemId == 0) getFooterViewModel().isAdministratorControlsSelected.set(true) + if (menuItemId == 0) footerViewModel.isAdministratorControlsSelected.set(true) // For showing navigation drawer in DeveloperOptionsActivity - else if (menuItemId == -1) getFooterViewModel().isDeveloperOptionsSelected.set(true) + else if (menuItemId == -1) footerViewModel.isDeveloperOptionsSelected.set(true) uncheckAllMenuItemsWhenAdministratorControlsOrDeveloperOptionsIsSelected() this.drawerLayout = drawerLayout drawerToggle = object : ActionBarDrawerToggle( @@ -474,7 +463,7 @@ class NavigationDrawerFragmentPresenter @Inject constructor( ) } } - drawerLayout.setDrawerListener(drawerToggle) + drawerLayout.addDrawerListener(drawerToggle) /* Synchronize the state of the drawer indicator/affordance with the linked [drawerLayout]. */ drawerLayout.post { drawerToggle.syncState() } if (previousMenuItemId != NavigationDrawerItem.HOME.ordinal && previousMenuItemId != -1) { @@ -503,18 +492,4 @@ class NavigationDrawerFragmentPresenter @Inject constructor( openActivityByMenuItemId(menuItem.itemId) return true } - - private fun getHeaderViewModel(): NavigationDrawerHeaderViewModel { - return headerViewModelProvider.getForFragment( - fragment, - NavigationDrawerHeaderViewModel::class.java - ) - } - - private fun getFooterViewModel(): NavigationDrawerFooterViewModel { - return footerViewModelProvider.getForFragment( - fragment, - NavigationDrawerFooterViewModel::class.java - ) - } } diff --git a/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerItem.kt b/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerItem.kt index b8ee7cf62e4..bcd4a46b15a 100644 --- a/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerItem.kt +++ b/app/src/main/java/org/oppia/android/app/drawer/NavigationDrawerItem.kt @@ -17,7 +17,7 @@ enum class NavigationDrawerItem(val value: Int) { for (item: NavigationDrawerItem in values()) { if (item.value == id) return item } - return throw IllegalArgumentException("NavigationDrawerItem not found by $id") + throw IllegalArgumentException("NavigationDrawerItem not found by $id") } } } diff --git a/app/src/main/java/org/oppia/android/app/help/HelpFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/help/HelpFragmentPresenter.kt index 2748b323c4f..06af338f41b 100644 --- a/app/src/main/java/org/oppia/android/app/help/HelpFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/help/HelpFragmentPresenter.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.HelpFragmentBinding import org.oppia.android.databinding.HelpItemBinding import javax.inject.Inject @@ -18,7 +17,7 @@ import javax.inject.Inject class HelpFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val helpListViewModel: HelpListViewModel, private val singleTypeBuilderFactory: BindableAdapter.SingleTypeBuilder.Factory ) { private lateinit var binding: HelpFragmentBinding @@ -28,7 +27,7 @@ class HelpFragmentPresenter @Inject constructor( container: ViewGroup?, isMultipane: Boolean ): View? { - val viewModel = getHelpListViewModel() + val viewModel = helpListViewModel viewModel.isMultipane.set(isMultipane) binding = HelpFragmentBinding.inflate( @@ -55,8 +54,4 @@ class HelpFragmentPresenter @Inject constructor( setViewModel = HelpItemBinding::setViewModel ).build() } - - private fun getHelpListViewModel(): HelpListViewModel { - return viewModelProvider.getForFragment(fragment, HelpListViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/help/faq/FAQListFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/help/faq/FAQListFragmentPresenter.kt index ca0288a22bd..63db13ff594 100644 --- a/app/src/main/java/org/oppia/android/app/help/faq/FAQListFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/help/faq/FAQListFragmentPresenter.kt @@ -11,7 +11,6 @@ import org.oppia.android.app.help.faq.faqItemViewModel.FAQContentViewModel import org.oppia.android.app.help.faq.faqItemViewModel.FAQHeaderViewModel import org.oppia.android.app.help.faq.faqItemViewModel.FAQItemViewModel import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.FaqContentBinding import org.oppia.android.databinding.FaqItemHeaderBinding import org.oppia.android.databinding.FaqListFragmentBinding @@ -22,14 +21,12 @@ import javax.inject.Inject class FAQListFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val faqListViewModel: FAQListViewModel, private val multiTypeBuilderFactory: BindableAdapter.MultiTypeBuilder.Factory ) { private lateinit var binding: FaqListFragmentBinding fun handleCreateView(inflater: LayoutInflater, container: ViewGroup?): View? { - val viewModel = getFAQListViewModel() - binding = FaqListFragmentBinding.inflate( inflater, container, @@ -43,7 +40,7 @@ class FAQListFragmentPresenter @Inject constructor( binding.let { it.lifecycleOwner = fragment - it.viewModel = viewModel + it.viewModel = faqListViewModel } return binding.root } @@ -71,10 +68,6 @@ class FAQListFragmentPresenter @Inject constructor( .build() } - private fun getFAQListViewModel(): FAQListViewModel { - return viewModelProvider.getForFragment(fragment, FAQListViewModel::class.java) - } - private enum class ViewType { VIEW_TYPE_HEADER, VIEW_TYPE_CONTENT diff --git a/app/src/main/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListFragmentPresenter.kt index 50fa6374c40..cdc7151afb5 100644 --- a/app/src/main/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/help/thirdparty/ThirdPartyDependencyListFragmentPresenter.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ThirdPartyDependencyItemBinding import org.oppia.android.databinding.ThirdPartyDependencyListFragmentBinding import javax.inject.Inject @@ -18,7 +17,7 @@ import javax.inject.Inject class ThirdPartyDependencyListFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val thirdPartyDependencyListViewModel: ThirdPartyDependencyListViewModel, private val singleTypeBuilderFactory: BindableAdapter.SingleTypeBuilder.Factory ) { private lateinit var binding: ThirdPartyDependencyListFragmentBinding @@ -29,8 +28,7 @@ class ThirdPartyDependencyListFragmentPresenter @Inject constructor( container: ViewGroup?, isMultipane: Boolean ): View { - val viewModel = getThirdPartyDependencyListViewModel() - viewModel.isMultipane.set(isMultipane) + thirdPartyDependencyListViewModel.isMultipane.set(isMultipane) binding = ThirdPartyDependencyListFragmentBinding.inflate( inflater, container, @@ -45,7 +43,7 @@ class ThirdPartyDependencyListFragmentPresenter @Inject constructor( binding.let { it.lifecycleOwner = fragment - it.viewModel = viewModel + it.viewModel = thirdPartyDependencyListViewModel } return binding.root } @@ -58,8 +56,4 @@ class ThirdPartyDependencyListFragmentPresenter @Inject constructor( ) .build() } - - private fun getThirdPartyDependencyListViewModel(): ThirdPartyDependencyListViewModel { - return viewModelProvider.getForFragment(fragment, ThirdPartyDependencyListViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/hintsandsolution/HintsAndSolutionDialogFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/hintsandsolution/HintsAndSolutionDialogFragmentPresenter.kt index 670afb8c3c5..46d7c3fd9c7 100644 --- a/app/src/main/java/org/oppia/android/app/hintsandsolution/HintsAndSolutionDialogFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/hintsandsolution/HintsAndSolutionDialogFragmentPresenter.kt @@ -52,7 +52,7 @@ class HintsAndSolutionDialogFragmentPresenter @Inject constructor( private lateinit var profileId: ProfileId private lateinit var bindingAdapter: BindableAdapter private lateinit var explorationId: String - private lateinit var viewModel: HintsAndSolutionViewModel + private lateinit var hintsViewModel: HintsAndSolutionViewModel /** * Sets up data binding and toolbar. @@ -86,7 +86,8 @@ class HintsAndSolutionDialogFragmentPresenter @Inject constructor( this.explorationId = explorationId // Check if hints are available for this state. - viewModel = hintsAndSolutionViewModelFactory.create(state, helpIndex, writtenTranslationContext) + hintsViewModel = + hintsAndSolutionViewModelFactory.create(state, helpIndex, writtenTranslationContext) val binding = HintsAndSolutionFragmentBinding.inflate(inflater, container, /* attachToRoot= */ false) @@ -98,7 +99,7 @@ class HintsAndSolutionDialogFragmentPresenter @Inject constructor( (fragment.requireActivity() as? HintsAndSolutionListener)?.dismiss() } binding.let { - it.viewModel = this.viewModel + it.viewModel = hintsViewModel it.lifecycleOwner = fragment } @@ -147,7 +148,7 @@ class HintsAndSolutionDialogFragmentPresenter @Inject constructor( private fun bindHintViewModel(binding: HintSummaryBinding, hintViewModel: HintViewModel) { binding.viewModel = hintViewModel - val position: Int = viewModel.itemList.indexOf(hintViewModel) + val position: Int = hintsViewModel.itemList.indexOf(hintViewModel) binding.isListExpanded = position in expandedItemIndexes @@ -217,7 +218,7 @@ class HintsAndSolutionDialogFragmentPresenter @Inject constructor( ) { binding.viewModel = solutionViewModel - val position: Int = viewModel.itemList.indexOf(solutionViewModel) + val position: Int = hintsViewModel.itemList.indexOf(solutionViewModel) binding.isListExpanded = expandedItemIndexes.contains(position) solutionIndex?.let { solutionIndex -> @@ -300,13 +301,13 @@ class HintsAndSolutionDialogFragmentPresenter @Inject constructor( } fun handleRevealSolution() { - viewModel.isSolutionRevealed.set(true) + hintsViewModel.isSolutionRevealed.set(true) expandedHintListIndexListener.onRevealSolutionClicked( - solutionIndex = viewModel.solutionIndex, + solutionIndex = hintsViewModel.solutionIndex, isSolutionRevealed = true ) (fragment.requireActivity() as? RevealSolutionInterface)?.revealSolution() - expandOrCollapseItem(position = viewModel.solutionIndex) + expandOrCollapseItem(position = hintsViewModel.solutionIndex) } fun onRevealHintClicked(index: Int?, isHintRevealed: Boolean?) { diff --git a/app/src/main/java/org/oppia/android/app/home/HomeFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/home/HomeFragmentPresenter.kt index c58c3bdbbd5..b62c266612d 100644 --- a/app/src/main/java/org/oppia/android/app/home/HomeFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/home/HomeFragmentPresenter.kt @@ -115,7 +115,7 @@ class HomeFragmentPresenter @Inject constructor( object : Observer> { override fun onChanged(startUpStateResult: AsyncResult?) { when (startUpStateResult) { - is AsyncResult.Pending -> { + null, is AsyncResult.Pending -> { // Do nothing } is AsyncResult.Success -> { diff --git a/app/src/main/java/org/oppia/android/app/onboarding/OnboardingFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/onboarding/OnboardingFragmentPresenter.kt index 1551e6c4199..c9a37d9b391 100644 --- a/app/src/main/java/org/oppia/android/app/onboarding/OnboardingFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/onboarding/OnboardingFragmentPresenter.kt @@ -14,7 +14,6 @@ import org.oppia.android.app.model.PolicyPage import org.oppia.android.app.policies.RouteToPoliciesListener import org.oppia.android.app.recyclerview.BindableAdapter import org.oppia.android.app.translation.AppLanguageResourceHandler -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.OnboardingFragmentBinding import org.oppia.android.databinding.OnboardingSlideBinding import org.oppia.android.databinding.OnboardingSlideFinalBinding @@ -28,8 +27,8 @@ import javax.inject.Inject class OnboardingFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, - private val viewModelProviderFinalSlide: ViewModelProvider, + private val onboardingViewModel: OnboardingViewModel, + private val onboardingSlideFinalViewModel: OnboardingSlideFinalViewModel, private val resourceHandler: AppLanguageResourceHandler, private val htmlParserFactory: HtmlParser.Factory, private val multiTypeBuilderFactory: BindableAdapter.MultiTypeBuilder.Factory @@ -48,7 +47,7 @@ class OnboardingFragmentPresenter @Inject constructor( binding.let { it.lifecycleOwner = fragment it.presenter = this - it.viewModel = getOnboardingViewModel() + it.viewModel = onboardingViewModel } setUpViewPager() addDots() @@ -68,7 +67,7 @@ class OnboardingFragmentPresenter @Inject constructor( OnboardingSlideViewModel( context = activity, viewPagerSlide = ViewPagerSlide.SLIDE_2, resourceHandler ), - getOnboardingSlideFinalViewModel() + onboardingSlideFinalViewModel ) ) binding.onboardingSlideViewPager.adapter = onboardingViewPagerBindableAdapter @@ -87,12 +86,9 @@ class OnboardingFragmentPresenter @Inject constructor( override fun onPageSelected(position: Int) { if (position == TOTAL_NUMBER_OF_SLIDES - 1) { binding.onboardingSlideViewPager.currentItem = TOTAL_NUMBER_OF_SLIDES - 1 - getOnboardingViewModel().slideChanged(TOTAL_NUMBER_OF_SLIDES - 1) + onboardingViewModel.slideChanged(TOTAL_NUMBER_OF_SLIDES - 1) } else { - getOnboardingViewModel().slideChanged( - ViewPagerSlide.getSlideForPosition(position) - .ordinal - ) + onboardingViewModel.slideChanged(ViewPagerSlide.getSlideForPosition(position).ordinal) } selectDot(position) onboardingStatusBarColorUpdate(position) @@ -154,13 +150,6 @@ class OnboardingFragmentPresenter @Inject constructor( } } - private fun getOnboardingSlideFinalViewModel(): OnboardingSlideFinalViewModel { - return viewModelProviderFinalSlide.getForFragment( - fragment, - OnboardingSlideFinalViewModel::class.java - ) - } - private enum class ViewType { ONBOARDING_MIDDLE_SLIDE, ONBOARDING_FINAL_SLIDE @@ -204,17 +193,13 @@ class OnboardingFragmentPresenter @Inject constructor( val position: Int = binding.onboardingSlideViewPager.currentItem + 1 binding.onboardingSlideViewPager.currentItem = position if (position != TOTAL_NUMBER_OF_SLIDES - 1) { - getOnboardingViewModel().slideChanged(ViewPagerSlide.getSlideForPosition(position).ordinal) + onboardingViewModel.slideChanged(ViewPagerSlide.getSlideForPosition(position).ordinal) } else { - getOnboardingViewModel().slideChanged(TOTAL_NUMBER_OF_SLIDES - 1) + onboardingViewModel.slideChanged(TOTAL_NUMBER_OF_SLIDES - 1) } selectDot(position) } - private fun getOnboardingViewModel(): OnboardingViewModel { - return viewModelProvider.getForFragment(fragment, OnboardingViewModel::class.java) - } - private fun addDots() { val dotsLayout = binding.slideDotsContainer val dotIdList = ArrayList() diff --git a/app/src/main/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListFragmentPresenter.kt index 09968096fad..2f46bdab3fb 100644 --- a/app/src/main/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/ongoingtopiclist/OngoingTopicListFragmentPresenter.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import androidx.recyclerview.widget.GridLayoutManager import org.oppia.android.R import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.OngoingTopicItemBinding import org.oppia.android.databinding.OngoingTopicListFragmentBinding import javax.inject.Inject @@ -17,7 +16,7 @@ import javax.inject.Inject class OngoingTopicListFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val ongoingTopicListViewModel: OngoingTopicListViewModel, private val singleTypeBuilderFactory: BindableAdapter.SingleTypeBuilder.Factory ) { @@ -28,14 +27,13 @@ class OngoingTopicListFragmentPresenter @Inject constructor( container: ViewGroup?, internalProfileId: Int ): View? { - val viewModel = getOngoingTopicListViewModel() binding = OngoingTopicListFragmentBinding.inflate( inflater, container, /* attachToRoot= */ false ) - viewModel.setProfileId(internalProfileId) + ongoingTopicListViewModel.setProfileId(internalProfileId) binding.ongoingTopicListToolbar.setNavigationOnClickListener { (activity as OngoingTopicListActivity).finish() @@ -47,11 +45,11 @@ class OngoingTopicListFragmentPresenter @Inject constructor( layoutManager = GridLayoutManager(context, spanCount) } - // NB: Both the view model and lifecycle owner must be set in order to correctly bind LiveData elements to - // data-bound view models. + // NB: Both the view model and lifecycle owner must be set in order to correctly bind LiveData + // elements to data-bound view models. binding.let { it.lifecycleOwner = fragment - it.viewModel = viewModel + it.viewModel = ongoingTopicListViewModel } return binding.root } @@ -64,8 +62,4 @@ class OngoingTopicListFragmentPresenter @Inject constructor( ) .build() } - - private fun getOngoingTopicListViewModel(): OngoingTopicListViewModel { - return viewModelProvider.getForFragment(fragment, OngoingTopicListViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/options/AppLanguageFragment.kt b/app/src/main/java/org/oppia/android/app/options/AppLanguageFragment.kt index cad56a8bd96..34e25221b52 100644 --- a/app/src/main/java/org/oppia/android/app/options/AppLanguageFragment.kt +++ b/app/src/main/java/org/oppia/android/app/options/AppLanguageFragment.kt @@ -62,7 +62,6 @@ class AppLanguageFragment : InjectableFragment(), AppLanguageRadioButtonListener container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val oppiaLanguage = checkNotNull( savedInstanceState?.retrieveLanguageFromSavedState() @@ -73,7 +72,7 @@ class AppLanguageFragment : InjectableFragment(), AppLanguageRadioButtonListener return appLanguageFragmentPresenter.handleOnCreateView( inflater, container, - oppiaLanguage!!, + oppiaLanguage, profileId!! ) } @@ -86,7 +85,7 @@ class AppLanguageFragment : InjectableFragment(), AppLanguageRadioButtonListener outState.putProto(FRAGMENT_SAVED_STATE_KEY, state) } - override fun onLanguageSelected(selectedLanguage: OppiaLanguage) { - appLanguageFragmentPresenter.onLanguageSelected(selectedLanguage) + override fun onLanguageSelected(appLanguage: OppiaLanguage) { + appLanguageFragmentPresenter.onLanguageSelected(appLanguage) } } diff --git a/app/src/main/java/org/oppia/android/app/options/OptionsActivity.kt b/app/src/main/java/org/oppia/android/app/options/OptionsActivity.kt index 50484e5ff1e..874f0bb5916 100644 --- a/app/src/main/java/org/oppia/android/app/options/OptionsActivity.kt +++ b/app/src/main/java/org/oppia/android/app/options/OptionsActivity.kt @@ -83,6 +83,7 @@ class OptionsActivity : selectedFragment = if (savedInstanceState == null) { READING_TEXT_SIZE_FRAGMENT } else { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. savedInstanceState.get(SELECTED_FRAGMENT_SAVED_KEY) as String } val extraOptionsTitle = @@ -151,12 +152,12 @@ class OptionsActivity : optionActivityPresenter.loadReadingTextSizeFragment(textSize) } - override fun loadAppLanguageFragment(appLanguage: OppiaLanguage) { + override fun loadAppLanguageFragment(oppiaLanguage: OppiaLanguage) { selectedFragment = APP_LANGUAGE_FRAGMENT optionActivityPresenter.setExtraOptionTitle( resourceHandler.getStringInLocale(R.string.app_language) ) - optionActivityPresenter.loadAppLanguageFragment(appLanguage) + optionActivityPresenter.loadAppLanguageFragment(oppiaLanguage) } override fun loadAudioLanguageFragment(audioLanguage: AudioLanguage) { diff --git a/app/src/main/java/org/oppia/android/app/options/OptionsFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/options/OptionsFragmentPresenter.kt index 0e11f227c1e..462b67c8b13 100644 --- a/app/src/main/java/org/oppia/android/app/options/OptionsFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/options/OptionsFragmentPresenter.kt @@ -5,7 +5,6 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment -import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import org.oppia.android.app.drawer.NAVIGATION_PROFILE_ID_ARGUMENT_KEY import org.oppia.android.app.fragment.FragmentScope @@ -15,7 +14,6 @@ import org.oppia.android.app.model.OppiaLanguage import org.oppia.android.app.model.ProfileId import org.oppia.android.app.model.ReadingTextSize import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.OptionAppLanguageBinding import org.oppia.android.databinding.OptionAudioLanguageBinding import org.oppia.android.databinding.OptionStoryTextSizeBinding @@ -44,7 +42,7 @@ class OptionsFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, private val profileManagementController: ProfileManagementController, - private val viewModelProvider: ViewModelProvider, + private val optionControlsViewModel: OptionControlsViewModel, private val oppiaLogger: OppiaLogger, private val multiTypeBuilderFactory: BindableAdapter.MultiTypeBuilder.Factory, private val translationController: TranslationController @@ -55,7 +53,6 @@ class OptionsFragmentPresenter @Inject constructor( private lateinit var profileId: ProfileId private var appLanguage = OppiaLanguage.ENGLISH private var audioLanguage = AudioLanguage.NO_AUDIO - private val viewModel = getOptionControlsItemViewModel() /** Initializes and creates the views for [OptionsFragment]. */ fun handleCreateView( @@ -65,8 +62,8 @@ class OptionsFragmentPresenter @Inject constructor( isFirstOpen: Boolean, selectedFragment: String ): View? { - viewModel.isUIInitialized(false) - viewModel.isMultipane.set(isMultipane) + optionControlsViewModel.isUIInitialized(false) + optionControlsViewModel.isMultipane.set(isMultipane) binding = OptionsFragmentBinding.inflate( inflater, container, @@ -75,7 +72,7 @@ class OptionsFragmentPresenter @Inject constructor( internalProfileId = activity.intent.getIntExtra(NAVIGATION_PROFILE_ID_ARGUMENT_KEY, -1) profileId = ProfileId.newBuilder().setInternalId(internalProfileId).build() - viewModel.setProfileId(profileId) + optionControlsViewModel.setProfileId(profileId) val optionsRecyclerViewAdapter = createRecyclerViewAdapter(isMultipane) binding.optionsRecyclerview.apply { @@ -84,13 +81,13 @@ class OptionsFragmentPresenter @Inject constructor( recyclerViewAdapter = optionsRecyclerViewAdapter binding.let { it.lifecycleOwner = fragment - it.viewModel = viewModel + it.viewModel = optionControlsViewModel } setSelectedFragment(selectedFragment) - viewModel.isUIInitialized(true) + optionControlsViewModel.isUIInitialized(true) var hasDefaultInitializedFragment = false - viewModel.optionsListLiveData.observe(fragment) { viewModels -> + optionControlsViewModel.optionsListLiveData.observe(fragment) { viewModels -> if (!hasDefaultInitializedFragment) { viewModels.filterIsInstance().singleOrNull()?.let { if (isMultipane && isFirstOpen) { @@ -146,7 +143,7 @@ class OptionsFragmentPresenter @Inject constructor( binding: OptionStoryTextSizeBinding, model: OptionsReadingTextSizeViewModel ) { - binding.commonViewModel = viewModel + binding.commonViewModel = optionControlsViewModel binding.viewModel = model } @@ -154,7 +151,7 @@ class OptionsFragmentPresenter @Inject constructor( binding: OptionAppLanguageBinding, model: OptionsAppLanguageViewModel ) { - binding.commonViewModel = viewModel + binding.commonViewModel = optionControlsViewModel binding.viewModel = model } @@ -162,13 +159,13 @@ class OptionsFragmentPresenter @Inject constructor( binding: OptionAudioLanguageBinding, model: OptionsAudioLanguageViewModel ) { - binding.commonViewModel = viewModel + binding.commonViewModel = optionControlsViewModel binding.viewModel = model } /** Sets the selected fragment index in [OptionsControlViewModel]. */ fun setSelectedFragment(selectedFragment: String) { - viewModel.selectedFragmentIndex.set( + optionControlsViewModel.selectedFragmentIndex.set( getSelectedFragmentIndex( selectedFragment ) @@ -184,10 +181,6 @@ class OptionsFragmentPresenter @Inject constructor( } } - private fun getOptionControlsItemViewModel(): OptionControlsViewModel { - return viewModelProvider.getForFragment(fragment, OptionControlsViewModel::class.java) - } - private enum class ViewType { /** Represents view type for displaying [ReadingTextSize]. */ VIEW_TYPE_READING_TEXT_SIZE, @@ -204,19 +197,17 @@ class OptionsFragmentPresenter @Inject constructor( * @param textSize new textSize to be set as current */ fun updateReadingTextSize(textSize: ReadingTextSize) { - profileManagementController.updateReadingTextSize(profileId, textSize).toLiveData().observe( - fragment, - { - when (it) { - is AsyncResult.Failure -> { - oppiaLogger.e( - READING_TEXT_SIZE_TAG, "$READING_TEXT_SIZE_ERROR: updating to $textSize", it.error - ) - } - else -> {} // Nothing needs to be done unless the update failed. + val sizeUpdateResult = profileManagementController.updateReadingTextSize(profileId, textSize) + sizeUpdateResult.toLiveData().observe(fragment) { + when (it) { + is AsyncResult.Failure -> { + oppiaLogger.e( + READING_TEXT_SIZE_TAG, "$READING_TEXT_SIZE_ERROR: updating to $textSize", it.error + ) } + else -> {} // Nothing needs to be done unless the update failed. } - ) + } recyclerViewAdapter.notifyItemChanged(0) } @@ -272,13 +263,10 @@ class OptionsFragmentPresenter @Inject constructor( * @param action what to execute after the UI is initialized. */ fun runAfterUIInitialization(action: () -> Unit) { - viewModel.uiLiveData.observe( - fragment, - Observer { - if (it) { - action.invoke() - } + optionControlsViewModel.uiLiveData.observe(fragment) { + if (it) { + action.invoke() } - ) + } } } diff --git a/app/src/main/java/org/oppia/android/app/options/ReadingTextSizeActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/options/ReadingTextSizeActivityPresenter.kt index 3ab661a3ced..7617ffc53a9 100644 --- a/app/src/main/java/org/oppia/android/app/options/ReadingTextSizeActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/options/ReadingTextSizeActivityPresenter.kt @@ -28,6 +28,7 @@ class ReadingTextSizeActivityPresenter @Inject constructor( private fun setToolbar() { val readingTextSizeToolbar: Toolbar = activity.findViewById(R.id.reading_text_size_toolbar) readingTextSizeToolbar.setNavigationOnClickListener { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. activity.onBackPressed() } } diff --git a/app/src/main/java/org/oppia/android/app/player/audio/AudioFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/player/audio/AudioFragmentPresenter.kt index 02bcc3deb32..69b433d8aa9 100644 --- a/app/src/main/java/org/oppia/android/app/player/audio/AudioFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/player/audio/AudioFragmentPresenter.kt @@ -26,7 +26,6 @@ import org.oppia.android.app.spotlight.SpotlightManager import org.oppia.android.app.spotlight.SpotlightShape import org.oppia.android.app.spotlight.SpotlightTarget import org.oppia.android.app.translation.AppLanguageResourceHandler -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.AudioFragmentBinding import org.oppia.android.domain.audio.CellularAudioDialogController import org.oppia.android.domain.oppialogger.OppiaLogger @@ -51,7 +50,7 @@ class AudioFragmentPresenter @Inject constructor( private val cellularAudioDialogController: CellularAudioDialogController, private val profileManagementController: ProfileManagementController, private val networkConnectionUtil: NetworkConnectionUtil, - private val viewModelProvider: ViewModelProvider, + private val audioViewModel: AudioViewModel, private val oppiaLogger: OppiaLogger, private val resourceHandler: AppLanguageResourceHandler, @EnableSpotlightUi private val enableSpotlightUi: PlatformParameterValue @@ -63,9 +62,6 @@ class AudioFragmentPresenter @Inject constructor( private var showCellularDataDialog = true private var useCellularData = false private var prepared = false - private val viewModel by lazy { - getAudioViewModel() - } private var isPauseAudioRequestPending = false private lateinit var binding: AudioFragmentBinding @@ -102,11 +98,11 @@ class AudioFragmentPresenter @Inject constructor( } override fun onStopTrackingTouch(seekBar: SeekBar?) { - viewModel.handleSeekTo(userProgress) + audioViewModel.handleSeekTo(userProgress) userIsSeeking = false } }) - viewModel.playStatusLiveData.observe( + audioViewModel.playStatusLiveData.observe( fragment, Observer { prepared = it != UiAudioPlayStatus.LOADING && it != UiAudioPlayStatus.FAILED @@ -124,7 +120,7 @@ class AudioFragmentPresenter @Inject constructor( ) binding.let { - it.viewModel = viewModel + it.viewModel = audioViewModel it.audioFragment = fragment as AudioFragment it.lifecycleOwner = fragment } @@ -162,8 +158,8 @@ class AudioFragmentPresenter @Inject constructor( getProfileData().observe( activity, Observer { result -> - viewModel.selectedLanguageCode = result - viewModel.loadMainContentAudio(allowAutoPlay = false, reloadingContent = false) + audioViewModel.selectedLanguageCode = result + audioViewModel.loadMainContentAudio(allowAutoPlay = false, reloadingContent = false) } ) } @@ -196,8 +192,8 @@ class AudioFragmentPresenter @Inject constructor( /** Sets selected language code in presenter and ViewModel. */ fun languageSelected(language: String) { - if (viewModel.selectedLanguageCode != language) { - viewModel.setAudioLanguageCode(language) + if (audioViewModel.selectedLanguageCode != language) { + audioViewModel.setAudioLanguageCode(language) } } @@ -208,8 +204,8 @@ class AudioFragmentPresenter @Inject constructor( fragment.childFragmentManager.beginTransaction().remove(previousFragment).commitNow() } val dialogFragment = LanguageDialogFragment.newInstance( - ArrayList(viewModel.languages), - viewModel.selectedLanguageCode + ArrayList(audioViewModel.languages), + audioViewModel.selectedLanguageCode ) dialogFragment.showNow(fragment.childFragmentManager, TAG_LANGUAGE_DIALOG) } @@ -217,30 +213,30 @@ class AudioFragmentPresenter @Inject constructor( /** Pauses audio if in prepared state. */ fun handleOnStop() { if (!activity.isChangingConfigurations && prepared) { - viewModel.pauseAudio() + audioViewModel.pauseAudio() } } /** Releases audio player resources. */ fun handleOnDestroy() { if (!activity.isChangingConfigurations) { - viewModel.handleRelease() + audioViewModel.handleRelease() } } fun setStateAndExplorationId(newState: State, explorationId: String) = - viewModel.setStateAndExplorationId(newState, explorationId) + audioViewModel.setStateAndExplorationId(newState, explorationId) fun loadMainContentAudio(allowAutoPlay: Boolean, reloadingContent: Boolean) = - viewModel.loadMainContentAudio(allowAutoPlay, reloadingContent) + audioViewModel.loadMainContentAudio(allowAutoPlay, reloadingContent) fun loadFeedbackAudio(contentId: String, allowAutoPlay: Boolean) = - viewModel.loadFeedbackAudio(contentId, allowAutoPlay) + audioViewModel.loadFeedbackAudio(contentId, allowAutoPlay) fun pauseAudio() { isPauseAudioRequestPending = true if (prepared && isPauseAudioRequestPending) { - viewModel.pauseAudio() + audioViewModel.pauseAudio() isPauseAudioRequestPending = false } } @@ -343,8 +339,4 @@ class AudioFragmentPresenter @Inject constructor( dialog.dismiss() }.create().show() } - - private fun getAudioViewModel(): AudioViewModel { - return viewModelProvider.getForFragment(fragment, AudioViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/player/audio/LanguageDialogFragment.kt b/app/src/main/java/org/oppia/android/app/player/audio/LanguageDialogFragment.kt index 275705a0ed9..8480ce2a454 100644 --- a/app/src/main/java/org/oppia/android/app/player/audio/LanguageDialogFragment.kt +++ b/app/src/main/java/org/oppia/android/app/player/audio/LanguageDialogFragment.kt @@ -86,7 +86,7 @@ class LanguageDialogFragment : InjectableDialogFragment() { return AlertDialog .Builder(ContextThemeWrapper(activity as Context, R.style.OppiaDialogFragmentTheme)) .setTitle(R.string.audio_language_select_dialog_title) - .setSingleChoiceItems(options, selectedIndex) { dialog, which -> + .setSingleChoiceItems(options, selectedIndex) { _, which -> selectedIndex = which } .setPositiveButton(R.string.audio_language_select_dialog_okay_button) { _, _ -> diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivity.kt b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivity.kt index b20609b8e4d..c657a4a35fb 100755 --- a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivity.kt +++ b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivity.kt @@ -155,13 +155,10 @@ class ExplorationActivity : ) as HintsAndSolutionDialogFragment? } - override fun routeToHintsAndSolution( - explorationId: String, - helpIndex: HelpIndex - ) { + override fun routeToHintsAndSolution(id: String, helpIndex: HelpIndex) { if (getHintsAndSolution() == null) { val hintsAndSolutionDialogFragment = HintsAndSolutionDialogFragment.newInstance( - explorationId, + id, state, helpIndex, writtenTranslationContext diff --git a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt index a5464c34459..b2db7bfd960 100644 --- a/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/player/exploration/ExplorationActivityPresenter.kt @@ -33,7 +33,6 @@ import org.oppia.android.app.survey.TAG_SURVEY_WELCOME_DIALOG import org.oppia.android.app.topic.TopicActivity import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.FontScaleConfigurationUtil -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ExplorationActivityBinding import org.oppia.android.domain.exploration.ExplorationDataController import org.oppia.android.domain.oppialogger.OppiaLogger @@ -57,7 +56,7 @@ const val TAG_HINTS_AND_SOLUTION_EXPLORATION_MANAGER = "HINTS_AND_SOLUTION_EXPLO class ExplorationActivityPresenter @Inject constructor( private val activity: AppCompatActivity, private val explorationDataController: ExplorationDataController, - private val viewModelProvider: ViewModelProvider, + private val exploreViewModel: ExplorationViewModel, private val fontScaleConfigurationUtil: FontScaleConfigurationUtil, private val translationController: TranslationController, private val oppiaLogger: OppiaLogger, @@ -83,10 +82,6 @@ class ExplorationActivityPresenter @Inject constructor( private lateinit var oldestCheckpointExplorationTitle: String private lateinit var binding: ExplorationActivityBinding - private val exploreViewModel by lazy { - getExplorationViewModel() - } - fun handleOnCreate( context: Context, profileId: ProfileId, @@ -116,6 +111,7 @@ class ExplorationActivityPresenter @Inject constructor( } binding.explorationToolbar.setNavigationOnClickListener { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. activity.onBackPressed() } @@ -357,10 +353,6 @@ class ExplorationActivityPresenter @Inject constructor( } } - private fun getExplorationViewModel(): ExplorationViewModel { - return viewModelProvider.getForActivity(activity, ExplorationViewModel::class.java) - } - /** Helper for subscribeToExploration. */ private fun getEphemeralExploration( exploration: LiveData> @@ -535,7 +527,7 @@ class ExplorationActivityPresenter @Inject constructor( object : Observer> { override fun onChanged(gatingResult: AsyncResult?) { when (gatingResult) { - is AsyncResult.Pending -> { + null, is AsyncResult.Pending -> { oppiaLogger.d("ExplorationActivity", "A gating decision is pending") } is AsyncResult.Failure -> { diff --git a/app/src/main/java/org/oppia/android/app/player/state/StateFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/player/state/StateFragmentPresenter.kt index f1c00a6569a..8c9bd6cba4a 100755 --- a/app/src/main/java/org/oppia/android/app/player/state/StateFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/StateFragmentPresenter.kt @@ -78,7 +78,7 @@ class StateFragmentPresenter @Inject constructor( private val assemblerBuilderFactory: StatePlayerRecyclerViewAssembler.Builder.Factory, private val splitScreenManager: SplitScreenManager, private val oppiaClock: OppiaClock, - private val viewModel: StateViewModel, + private val stateViewModel: StateViewModel, private val accessibilityService: AccessibilityService, private val resourceHandler: AppLanguageResourceHandler, private val surveyGatingController: SurveyGatingController @@ -117,7 +117,7 @@ class StateFragmentPresenter @Inject constructor( this.topicId = topicId this.storyId = storyId this.explorationId = explorationId - viewModel.initializeProfile(profileId) + stateViewModel.initializeProfile(profileId) binding = StateFragmentBinding.inflate( inflater, @@ -142,7 +142,7 @@ class StateFragmentPresenter @Inject constructor( recyclerViewAdapter = stateRecyclerViewAdapter binding.let { it.lifecycleOwner = fragment - it.viewModel = this.viewModel + it.viewModel = stateViewModel } binding.stateRecyclerView.addOnLayoutChangeListener { _, _, _, _, bottom, _, _, _, oldBottom -> @@ -175,7 +175,7 @@ class StateFragmentPresenter @Inject constructor( } fun onContinueButtonClicked() { - viewModel.setHintBulbVisibility(false) + stateViewModel.setHintBulbVisibility(false) hideKeyboard() moveToNextState() } @@ -201,14 +201,14 @@ class StateFragmentPresenter @Inject constructor( fun onSubmitButtonClicked() { hideKeyboard() - val answer = viewModel.getPendingAnswer(recyclerViewAssembler::getPendingAnswerHandler) + val answer = stateViewModel.getPendingAnswer(recyclerViewAssembler::getPendingAnswerHandler) if (answer != null) { handleSubmitAnswer(answer) } } fun onResponsesHeaderClicked() { - recyclerViewAssembler.togglePreviousAnswers(viewModel.itemList) + recyclerViewAssembler.togglePreviousAnswers(stateViewModel.itemList) recyclerViewAssembler.adapter.notifyDataSetChanged() } @@ -216,8 +216,8 @@ class StateFragmentPresenter @Inject constructor( fun handleKeyboardAction() { hideKeyboard() - if (viewModel.getCanSubmitAnswer().get() == true) { - val answer = viewModel.getPendingAnswer(recyclerViewAssembler::getPendingAnswerHandler) + if (stateViewModel.getCanSubmitAnswer().get() == true) { + val answer = stateViewModel.getPendingAnswer(recyclerViewAssembler::getPendingAnswerHandler) if (answer != null) { handleSubmitAnswer(answer) } @@ -240,7 +240,7 @@ class StateFragmentPresenter @Inject constructor( .hasConversationView(hasConversationView) .addContentSupport() .addFeedbackSupport() - .addInteractionSupport(viewModel.getCanSubmitAnswer()) + .addInteractionSupport(stateViewModel.getCanSubmitAnswer()) .addPastAnswersSupport() .addWrongAnswerCollapsingSupport() .addBackwardNavigationSupport() @@ -257,7 +257,7 @@ class StateFragmentPresenter @Inject constructor( ) .addHintsAndSolutionsSupport() .addAudioVoiceoverSupport( - explorationId, viewModel.currentStateName, viewModel.isAudioBarVisible, + explorationId, stateViewModel.currentStateName, stateViewModel.isAudioBarVisible, this::getAudioUiManager ) .addConceptCardSupport() @@ -307,11 +307,11 @@ class StateFragmentPresenter @Inject constructor( explorationCheckpointState = ephemeralState.checkpointState val shouldSplit = splitScreenManager.shouldSplitScreen(ephemeralState.state.interaction.id) if (shouldSplit) { - viewModel.isSplitView.set(true) - viewModel.centerGuidelinePercentage.set(0.5f) + stateViewModel.isSplitView.set(true) + stateViewModel.centerGuidelinePercentage.set(0.5f) } else { - viewModel.isSplitView.set(false) - viewModel.centerGuidelinePercentage.set(1f) + stateViewModel.isSplitView.set(false) + stateViewModel.centerGuidelinePercentage.set(1f) } val isInNewState = @@ -328,10 +328,10 @@ class StateFragmentPresenter @Inject constructor( shouldSplit ) - viewModel.itemList.clear() - viewModel.itemList += dataPair.first - viewModel.rightItemList.clear() - viewModel.rightItemList += dataPair.second + stateViewModel.itemList.clear() + stateViewModel.itemList += dataPair.first + stateViewModel.rightItemList.clear() + stateViewModel.rightItemList += dataPair.second if (isInNewState) { (binding.stateRecyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset( @@ -377,7 +377,7 @@ class StateFragmentPresenter @Inject constructor( if (result.labelledAsCorrectAnswer) { recyclerViewAssembler.showCelebrationOnCorrectAnswer(result.feedback) } else { - viewModel.setCanSubmitAnswer(canSubmitAnswer = false) + stateViewModel.setCanSubmitAnswer(canSubmitAnswer = false) } recyclerViewAssembler.readOutAnswerFeedback(result.feedback) } @@ -417,7 +417,7 @@ class StateFragmentPresenter @Inject constructor( } private fun moveToNextState() { - viewModel.setCanSubmitAnswer(canSubmitAnswer = false) + stateViewModel.setCanSubmitAnswer(canSubmitAnswer = false) explorationProgressController.moveToNextState().toLiveData().observe( fragment, Observer { @@ -431,11 +431,12 @@ class StateFragmentPresenter @Inject constructor( activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputManager.hideSoftInputFromWindow( fragment.view!!.windowToken, + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. InputMethodManager.SHOW_FORCED ) } - fun setAudioBarVisibility(visibility: Boolean) = viewModel.setAudioBarVisibility(visibility) + fun setAudioBarVisibility(visibility: Boolean) = stateViewModel.setAudioBarVisibility(visibility) fun scrollToTop() { binding.stateRecyclerView.smoothScrollToPosition(0) @@ -444,9 +445,9 @@ class StateFragmentPresenter @Inject constructor( /** Updates submit button UI as active if pendingAnswerError null else inactive. */ fun updateSubmitButton(pendingAnswerError: String?, inputAnswerAvailable: Boolean) { if (inputAnswerAvailable) { - viewModel.setCanSubmitAnswer(pendingAnswerError == null) + stateViewModel.setCanSubmitAnswer(pendingAnswerError == null) } else { - viewModel.setCanSubmitAnswer(canSubmitAnswer = false) + stateViewModel.setCanSubmitAnswer(canSubmitAnswer = false) } } @@ -472,35 +473,35 @@ class StateFragmentPresenter @Inject constructor( if (!isCurrentStatePendingState) { // If current state is not the pending top state, hide the hint bulb. setHintOpenedAndUnRevealed(false) - viewModel.setHintBulbVisibility(false) + stateViewModel.setHintBulbVisibility(false) } else { when (helpIndex.indexTypeCase) { HelpIndex.IndexTypeCase.NEXT_AVAILABLE_HINT_INDEX -> { - viewModel.setHintBulbVisibility(true) + stateViewModel.setHintBulbVisibility(true) setHintOpenedAndUnRevealed(true) } HelpIndex.IndexTypeCase.LATEST_REVEALED_HINT_INDEX -> { - viewModel.setHintBulbVisibility(true) + stateViewModel.setHintBulbVisibility(true) setHintOpenedAndUnRevealed(false) } HelpIndex.IndexTypeCase.SHOW_SOLUTION -> { - viewModel.setHintBulbVisibility(true) + stateViewModel.setHintBulbVisibility(true) setHintOpenedAndUnRevealed(true) } HelpIndex.IndexTypeCase.EVERYTHING_REVEALED -> { setHintOpenedAndUnRevealed(false) - viewModel.setHintBulbVisibility(true) + stateViewModel.setHintBulbVisibility(true) } else -> { setHintOpenedAndUnRevealed(false) - viewModel.setHintBulbVisibility(false) + stateViewModel.setHintBulbVisibility(false) } } } } private fun setHintOpenedAndUnRevealed(isHintUnrevealed: Boolean) { - viewModel.setHintOpenedAndUnRevealedVisibility(isHintUnrevealed) + stateViewModel.setHintOpenedAndUnRevealedVisibility(isHintUnrevealed) if (isHintUnrevealed) { val hintBulbAnimation = AnimationUtils.loadAnimation( @@ -512,7 +513,7 @@ class StateFragmentPresenter @Inject constructor( // cases like configuration changes, or returning from a saved checkpoint. lifecycleSafeTimerFactory.run { activity.runPeriodically(delayMillis = 5_000, periodMillis = 30_000) { - return@runPeriodically viewModel.isHintOpenedAndUnRevealed.get()!!.also { playAnim -> + return@runPeriodically stateViewModel.isHintOpenedAndUnRevealed.get()!!.also { playAnim -> if (playAnim) binding.hintBulb.startAnimation(hintBulbAnimation) // Make a forced announcement when the hint bar becomes visible so that the non sighted // users know about the availability of hints. Instead of suddenly changing the focus of diff --git a/app/src/main/java/org/oppia/android/app/player/state/listener/RouteToHintsAndSolutionListener.kt b/app/src/main/java/org/oppia/android/app/player/state/listener/RouteToHintsAndSolutionListener.kt index 351e37b35c1..f0468d6c13a 100755 --- a/app/src/main/java/org/oppia/android/app/player/state/listener/RouteToHintsAndSolutionListener.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/listener/RouteToHintsAndSolutionListener.kt @@ -4,8 +4,5 @@ import org.oppia.android.app.model.HelpIndex /** Listener for when an [ExplorationActivity] should route to a [HintsAndSolution]. */ interface RouteToHintsAndSolutionListener { - fun routeToHintsAndSolution( - id: String, - helpIndex: HelpIndex - ) + fun routeToHintsAndSolution(id: String, helpIndex: HelpIndex) } diff --git a/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivity.kt b/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivity.kt index 07e0c179795..032849bd9d4 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivity.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivity.kt @@ -108,14 +108,11 @@ class StateFragmentTestActivity : override fun dismiss() {} - override fun routeToHintsAndSolution( - explorationId: String, - helpIndex: HelpIndex - ) { + override fun routeToHintsAndSolution(id: String, helpIndex: HelpIndex) { if (getHintsAndSolution() == null) { val hintsAndSolutionFragment = HintsAndSolutionDialogFragment.newInstance( - explorationId, + id, state, helpIndex, writtenTranslationContext diff --git a/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivityPresenter.kt index 482451ae6b7..dd1dbc96a80 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/testing/StateFragmentTestActivityPresenter.kt @@ -9,7 +9,6 @@ import org.oppia.android.app.model.ProfileId import org.oppia.android.app.player.exploration.HintsAndSolutionExplorationManagerFragment import org.oppia.android.app.player.exploration.TAG_HINTS_AND_SOLUTION_EXPLORATION_MANAGER import org.oppia.android.app.player.state.StateFragment -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.StateFragmentTestActivityBinding import org.oppia.android.domain.exploration.ExplorationDataController import org.oppia.android.domain.oppialogger.OppiaLogger @@ -28,7 +27,7 @@ class StateFragmentTestActivityPresenter @Inject constructor( private val activity: AppCompatActivity, private val explorationDataController: ExplorationDataController, private val oppiaLogger: OppiaLogger, - private val viewModelProvider: ViewModelProvider + private val stateFragmentTestViewModel: StateFragmentTestViewModel ) { private var profileId: Int = 1 @@ -44,7 +43,7 @@ class StateFragmentTestActivityPresenter @Inject constructor( ) binding.apply { lifecycleOwner = activity - viewModel = getStateFragmentTestViewModel() + viewModel = stateFragmentTestViewModel } profileId = activity.intent.getIntExtra(TEST_ACTIVITY_PROFILE_ID_EXTRA_KEY, 1) @@ -121,7 +120,7 @@ class StateFragmentTestActivityPresenter @Inject constructor( storyId: String, explorationId: String ) { - getStateFragmentTestViewModel().hasExplorationStarted.set(true) + stateFragmentTestViewModel.hasExplorationStarted.set(true) val stateFragment = StateFragment.newInstance(profileId, topicId, storyId, explorationId) activity.supportFragmentManager.beginTransaction().add( @@ -145,7 +144,7 @@ class StateFragmentTestActivityPresenter @Inject constructor( activity.supportFragmentManager.beginTransaction().remove(fragment).commitNow() } - getStateFragmentTestViewModel().hasExplorationStarted.set(false) + stateFragmentTestViewModel.hasExplorationStarted.set(false) } private fun getStateFragment(): StateFragment? { @@ -159,8 +158,4 @@ class StateFragmentTestActivityPresenter @Inject constructor( TAG_HINTS_AND_SOLUTION_EXPLORATION_MANAGER ) as HintsAndSolutionExplorationManagerFragment? } - - private fun getStateFragmentTestViewModel(): StateFragmentTestViewModel { - return viewModelProvider.getForActivity(activity, StateFragmentTestViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/profile/AdminAuthActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/profile/AdminAuthActivityPresenter.kt index 2651603478d..a4ff853487f 100644 --- a/app/src/main/java/org/oppia/android/app/profile/AdminAuthActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/profile/AdminAuthActivityPresenter.kt @@ -10,7 +10,6 @@ import org.oppia.android.app.activity.ActivityScope import org.oppia.android.app.administratorcontrols.AdministratorControlsActivity import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.TextInputEditTextHelper.Companion.onTextChanged -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.AdminAuthActivityBinding import javax.inject.Inject @@ -19,13 +18,10 @@ import javax.inject.Inject class AdminAuthActivityPresenter @Inject constructor( private val context: Context, private val activity: AppCompatActivity, - private val viewModelProvider: ViewModelProvider, + private val authViewModel: AdminAuthViewModel, private val resourceHandler: AppLanguageResourceHandler ) { private lateinit var binding: AdminAuthActivityBinding - private val authViewModel by lazy { - getAdminAuthViewModel() - } /** Binds ViewModel and sets up text and button listeners. */ fun handleOnCreate() { @@ -126,8 +122,4 @@ class AdminAuthActivityPresenter @Inject constructor( } } } - - private fun getAdminAuthViewModel(): AdminAuthViewModel { - return viewModelProvider.getForActivity(activity, AdminAuthViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/profile/AdminPinActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/profile/AdminPinActivityPresenter.kt index 5ab5624b99f..ba9f04ea197 100644 --- a/app/src/main/java/org/oppia/android/app/profile/AdminPinActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/profile/AdminPinActivityPresenter.kt @@ -12,7 +12,6 @@ import org.oppia.android.app.administratorcontrols.AdministratorControlsActivity import org.oppia.android.app.model.ProfileId import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.TextInputEditTextHelper.Companion.onTextChanged -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.AdminPinActivityBinding import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.util.data.AsyncResult @@ -25,17 +24,13 @@ class AdminPinActivityPresenter @Inject constructor( private val context: Context, private val activity: AppCompatActivity, private val profileManagementController: ProfileManagementController, - private val viewModelProvider: ViewModelProvider, + private val adminViewModel: AdminPinViewModel, private val resourceHandler: AppLanguageResourceHandler ) { private var inputtedPin = false private var inputtedConfirmPin = false - private val adminViewModel by lazy { - getAdminPinViewModel() - } - /** Binds ViewModel and sets up text and button listeners. */ fun handleOnCreate() { @@ -165,14 +160,6 @@ class AdminPinActivityPresenter @Inject constructor( } private fun setValidPin() { - if (inputtedPin && inputtedConfirmPin) { - getAdminPinViewModel().isButtonActive.set(true) - } else { - getAdminPinViewModel().isButtonActive.set(false) - } - } - - private fun getAdminPinViewModel(): AdminPinViewModel { - return viewModelProvider.getForActivity(activity, AdminPinViewModel::class.java) + adminViewModel.isButtonActive.set(inputtedPin && inputtedConfirmPin) } } diff --git a/app/src/main/java/org/oppia/android/app/profile/AdminSettingsDialogFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/profile/AdminSettingsDialogFragmentPresenter.kt index c0faded0563..e8509cbda09 100644 --- a/app/src/main/java/org/oppia/android/app/profile/AdminSettingsDialogFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/profile/AdminSettingsDialogFragmentPresenter.kt @@ -11,7 +11,6 @@ import org.oppia.android.R import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.TextInputEditTextHelper.Companion.onTextChanged -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.AdminSettingsDialogBinding import javax.inject.Inject @@ -20,13 +19,9 @@ import javax.inject.Inject class AdminSettingsDialogFragmentPresenter @Inject constructor( private val fragment: Fragment, private val activity: AppCompatActivity, - private val viewModelProvider: ViewModelProvider, + private val adminViewModel: AdminSettingsViewModel, private val resourceHandler: AppLanguageResourceHandler ) { - private val adminViewModel by lazy { - getAdminSettingsViewModel() - } - fun handleOnCreateDialog( routeDialogInterface: ProfileRouteDialogInterface, adminPin: String? @@ -100,8 +95,4 @@ class AdminSettingsDialogFragmentPresenter @Inject constructor( } return dialog } - - private fun getAdminSettingsViewModel(): AdminSettingsViewModel { - return viewModelProvider.getForFragment(fragment, AdminSettingsViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/profile/PinPasswordActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/profile/PinPasswordActivityPresenter.kt index 57c999e2586..2e5928fb4ac 100644 --- a/app/src/main/java/org/oppia/android/app/profile/PinPasswordActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/profile/PinPasswordActivityPresenter.kt @@ -12,7 +12,6 @@ import org.oppia.android.app.model.ProfileId import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.TextInputEditTextHelper.Companion.onTextChanged import org.oppia.android.app.utility.lifecycle.LifecycleSafeTimerFactory -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.PinPasswordActivityBinding import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.util.accessibility.AccessibilityService @@ -29,13 +28,10 @@ class PinPasswordActivityPresenter @Inject constructor( private val activity: AppCompatActivity, private val profileManagementController: ProfileManagementController, private val lifecycleSafeTimerFactory: LifecycleSafeTimerFactory, - private val viewModelProvider: ViewModelProvider, - private val resourceHandler: AppLanguageResourceHandler + private val pinViewModel: PinPasswordViewModel, + private val resourceHandler: AppLanguageResourceHandler, + private val accessibilityService: AccessibilityService ) { - @Inject lateinit var accessibilityService: AccessibilityService - private val pinViewModel by lazy { - getPinPasswordViewModel() - } private var profileId = -1 private lateinit var alertDialog: AlertDialog private var confirmedDeletion = false @@ -168,10 +164,6 @@ class PinPasswordActivityPresenter @Inject constructor( showSuccessDialog() } - private fun getPinPasswordViewModel(): PinPasswordViewModel { - return viewModelProvider.getForActivity(activity, PinPasswordViewModel::class.java) - } - private fun showAdminForgotPin() { val appName = resourceHandler.getStringInLocale(R.string.app_name) pinViewModel.showAdminPinForgotPasswordPopUp.set(true) @@ -214,15 +206,12 @@ class PinPasswordActivityPresenter @Inject constructor( pinViewModel.showAdminPinForgotPasswordPopUp.set(false) dialog.dismiss() } - .setPositiveButton(R.string.admin_confirm_app_wipe_positive_button_text) { dialog, _ -> - profileManagementController.deleteAllProfiles().toLiveData().observe( - activity, - { - // Regardless of the result of the operation, always restart the app. - confirmedDeletion = true - activity.finishAffinity() - } - ) + .setPositiveButton(R.string.admin_confirm_app_wipe_positive_button_text) { _, _ -> + profileManagementController.deleteAllProfiles().toLiveData().observe(activity) { + // Regardless of the result of the operation, always restart the app. + confirmedDeletion = true + activity.finishAffinity() + } }.create() alertDialog.setCanceledOnTouchOutside(false) alertDialog.show() diff --git a/app/src/main/java/org/oppia/android/app/profile/ProfileChooserFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/profile/ProfileChooserFragmentPresenter.kt index c9753662083..9ccd175ea45 100644 --- a/app/src/main/java/org/oppia/android/app/profile/ProfileChooserFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/profile/ProfileChooserFragmentPresenter.kt @@ -19,7 +19,6 @@ import org.oppia.android.app.home.HomeActivity import org.oppia.android.app.model.Profile import org.oppia.android.app.model.ProfileChooserUiModel import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ProfileChooserAddViewBinding import org.oppia.android.databinding.ProfileChooserFragmentBinding import org.oppia.android.databinding.ProfileChooserProfileViewBinding @@ -64,7 +63,7 @@ class ProfileChooserFragmentPresenter @Inject constructor( private val fragment: Fragment, private val activity: AppCompatActivity, private val context: Context, - private val viewModelProvider: ViewModelProvider, + private val chooserViewModel: ProfileChooserViewModel, private val profileManagementController: ProfileManagementController, private val oppiaLogger: OppiaLogger, private val analyticsController: AnalyticsController, @@ -73,10 +72,6 @@ class ProfileChooserFragmentPresenter @Inject constructor( private lateinit var binding: ProfileChooserFragmentBinding val hasProfileEverBeenAddedValue = ObservableField(true) - private val chooserViewModel: ProfileChooserViewModel by lazy { - getProfileChooserViewModel() - } - /** Binds ViewModel and sets up RecyclerView Adapter. */ fun handleCreateView(inflater: LayoutInflater, container: ViewGroup?): View? { StatusBarColor.statusBarColorUpdate( @@ -148,10 +143,6 @@ class ProfileChooserFragmentPresenter @Inject constructor( }.minus(chooserViewModel.usedColors).random() } - private fun getProfileChooserViewModel(): ProfileChooserViewModel { - return viewModelProvider.getForFragment(fragment, ProfileChooserViewModel::class.java) - } - private fun createRecyclerViewAdapter(): BindableAdapter { return multiTypeBuilderFactory.create( diff --git a/app/src/main/java/org/oppia/android/app/profile/ResetPinDialogFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/profile/ResetPinDialogFragmentPresenter.kt index bf81773b519..a4105ee19e4 100644 --- a/app/src/main/java/org/oppia/android/app/profile/ResetPinDialogFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/profile/ResetPinDialogFragmentPresenter.kt @@ -13,7 +13,6 @@ import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.model.ProfileId import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.TextInputEditTextHelper.Companion.onTextChanged -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ResetPinDialogBinding import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.util.data.AsyncResult @@ -26,13 +25,9 @@ class ResetPinDialogFragmentPresenter @Inject constructor( private val fragment: Fragment, private val activity: AppCompatActivity, private val profileManagementController: ProfileManagementController, - private val viewModelProvider: ViewModelProvider, + private val resetViewModel: ResetPinViewModel, private val resourceHandler: AppLanguageResourceHandler ) { - private val resetViewModel by lazy { - getResetPinViewModel() - } - fun handleOnCreateDialog( routeDialogInterface: ProfileRouteDialogInterface, profileId: Int, @@ -116,8 +111,4 @@ class ResetPinDialogFragmentPresenter @Inject constructor( } return dialog } - - private fun getResetPinViewModel(): ResetPinViewModel { - return viewModelProvider.getForFragment(fragment, ResetPinViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/resumelesson/ResumeLessonActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/resumelesson/ResumeLessonActivityPresenter.kt index f0425144d3b..ffb7771810f 100644 --- a/app/src/main/java/org/oppia/android/app/resumelesson/ResumeLessonActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/resumelesson/ResumeLessonActivityPresenter.kt @@ -33,6 +33,7 @@ class ResumeLessonActivityPresenter @Inject constructor( activity.setSupportActionBar(resumeLessonToolbar) resumeLessonToolbar.setNavigationOnClickListener { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. activity.onBackPressed() } diff --git a/app/src/main/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentPresenter.kt index 89173f4c236..b3775e5607f 100644 --- a/app/src/main/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/resumelesson/ResumeLessonFragmentPresenter.kt @@ -13,7 +13,6 @@ import org.oppia.android.app.model.ExplorationActivityParams import org.oppia.android.app.model.ExplorationCheckpoint import org.oppia.android.app.model.ProfileId import org.oppia.android.app.translation.AppLanguageResourceHandler -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ResumeLessonFragmentBinding import org.oppia.android.domain.exploration.ExplorationDataController import org.oppia.android.domain.oppialogger.OppiaLogger @@ -29,7 +28,7 @@ import javax.inject.Inject class ResumeLessonFragmentPresenter @Inject constructor( activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val resumeLessonViewModel: ResumeLessonViewModel, private val topicController: TopicController, private val explorationDataController: ExplorationDataController, private val htmlParserFactory: HtmlParser.Factory, @@ -42,7 +41,6 @@ class ResumeLessonFragmentPresenter @Inject constructor( private val routeToExplorationListener = activity as RouteToExplorationListener private lateinit var binding: ResumeLessonFragmentBinding - private val resumeLessonViewModel = getResumeLessonViewModel() private lateinit var profileId: ProfileId private lateinit var topicId: String private lateinit var storyId: String @@ -148,10 +146,6 @@ class ResumeLessonFragmentPresenter @Inject constructor( } } - private fun getResumeLessonViewModel(): ResumeLessonViewModel { - return viewModelProvider.getForFragment(fragment, ResumeLessonViewModel::class.java) - } - private fun getChapterSummary(): LiveData { return Transformations.map(chapterSummaryResultLiveData, ::processChapterSummaryResult) } diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivity.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivity.kt index b8cf2dcd2d5..28d7b57217e 100644 --- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivity.kt +++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivity.kt @@ -48,6 +48,7 @@ class ProfileEditActivity : InjectableAutoLocalizedAppCompatActivity() { override fun onBackPressed() { val isMultipane = intent.extras!!.getBoolean(IS_MULTIPANE_EXTRA_KEY, false) if (isMultipane) { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. super.onBackPressed() } else { val intent = Intent(this, ProfileListActivity::class.java) diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivityPresenter.kt index 05ad56e6a46..d1b1f07c9a8 100644 --- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditActivityPresenter.kt @@ -26,6 +26,7 @@ class ProfileEditActivityPresenter @Inject constructor( toolbar.setNavigationOnClickListener { if (isMultipane) { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. activity.onBackPressed() } else { val intent = Intent(activity, ProfileListActivity::class.java) diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditDeletionDialogFragment.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditDeletionDialogFragment.kt index 27b1914a650..aea5b10011d 100644 --- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditDeletionDialogFragment.kt +++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditDeletionDialogFragment.kt @@ -53,7 +53,7 @@ class ProfileEditDeletionDialogFragment : InjectableDialogFragment() { .setNegativeButton(R.string.profile_edit_delete_dialog_negative) { dialog, _ -> dialog.dismiss() } - .setPositiveButton(R.string.profile_edit_delete_dialog_positive) { dialog, _ -> + .setPositiveButton(R.string.profile_edit_delete_dialog_positive) { _, _ -> profileEditDialogInterface.deleteProfileByInternalProfileId(internalProfileId) } .create() diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt index f1fb73492b1..c5df7aa5439 100644 --- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileEditFragmentPresenter.kt @@ -75,7 +75,7 @@ class ProfileEditFragmentPresenter @Inject constructor( ) } - binding.profileMarkChaptersForCompletionButton?.setOnClickListener { + binding.profileMarkChaptersForCompletionButton.setOnClickListener { activity.startActivity( MarkChaptersCompletedActivity.createMarkChaptersCompletedIntent( activity, internalProfileId, showConfirmationNotice = true diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileListFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileListFragmentPresenter.kt index 41846084168..91fd34399d1 100644 --- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileListFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileListFragmentPresenter.kt @@ -9,7 +9,6 @@ import org.oppia.android.app.administratorcontrols.LoadProfileEditListener import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.model.Profile import org.oppia.android.app.recyclerview.BindableAdapter -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ProfileListFragmentBinding import org.oppia.android.databinding.ProfileListProfileViewBinding import javax.inject.Inject @@ -19,7 +18,7 @@ import javax.inject.Inject class ProfileListFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val profileListViewModel: ProfileListViewModel, private val singleTypeBuilderFactory: BindableAdapter.SingleTypeBuilder.Factory ) { @@ -42,7 +41,7 @@ class ProfileListFragmentPresenter @Inject constructor( (activity as ProfileListActivity).finish() } binding.apply { - viewModel = getProfileListViewModel() + viewModel = profileListViewModel lifecycleOwner = fragment } @@ -77,8 +76,4 @@ class ProfileListFragmentPresenter @Inject constructor( } } } - - private fun getProfileListViewModel(): ProfileListViewModel { - return viewModelProvider.getForFragment(fragment, ProfileListViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameActivityPresenter.kt index b32adbbba6c..10898a226c7 100644 --- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameActivityPresenter.kt @@ -4,16 +4,12 @@ import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil import org.oppia.android.R import org.oppia.android.app.activity.ActivityScope -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ProfileRenameActivityBinding import javax.inject.Inject /** The presenter for [ProfileRenameActivity]. */ @ActivityScope -class ProfileRenameActivityPresenter @Inject constructor( - private val activity: AppCompatActivity, - private val viewModelProvider: ViewModelProvider, -) { +class ProfileRenameActivityPresenter @Inject constructor(private val activity: AppCompatActivity) { /** Handles onCreate() of [ProfileRenameActivity]. */ fun handleOnCreate(profileId: Int) { @@ -46,8 +42,4 @@ class ProfileRenameActivityPresenter @Inject constructor( R.id.profile_rename_fragment_placeholder ) as ProfileRenameFragment? } - - private fun getProfileRenameViewModel(): ProfileRenameViewModel { - return viewModelProvider.getForActivity(activity, ProfileRenameViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentPresenter.kt index 6350c2e4581..3ad5bcd4f68 100644 --- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileRenameFragmentPresenter.kt @@ -13,7 +13,6 @@ import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.model.ProfileId import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.TextInputEditTextHelper.Companion.onTextChanged -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ProfileRenameFragmentBinding import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.util.data.AsyncResult @@ -26,13 +25,9 @@ class ProfileRenameFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, private val profileManagementController: ProfileManagementController, - private val viewModelProvider: ViewModelProvider, + private val renameViewModel: ProfileRenameViewModel, private val resourceHandler: AppLanguageResourceHandler ) { - private val renameViewModel: ProfileRenameViewModel by lazy { - getProfileRenameViewModel() - } - private lateinit var binding: ProfileRenameFragmentBinding /** Handles onCreateView() method of [ProfileRenameFragment]. */ @@ -122,8 +117,4 @@ class ProfileRenameFragmentPresenter @Inject constructor( } } } - - private fun getProfileRenameViewModel(): ProfileRenameViewModel { - return viewModelProvider.getForFragment(fragment, ProfileRenameViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentPresenter.kt index b4afe1d73e1..fb4e499fafd 100644 --- a/app/src/main/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/settings/profile/ProfileResetPinFragmentPresenter.kt @@ -13,7 +13,6 @@ import org.oppia.android.R import org.oppia.android.app.model.ProfileId import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.utility.TextInputEditTextHelper.Companion.onTextChanged -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ProfileResetPinFragmentBinding import org.oppia.android.domain.profile.ProfileManagementController import org.oppia.android.util.data.AsyncResult @@ -24,13 +23,10 @@ import javax.inject.Inject class ProfileResetPinFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val profileResetPinViewModel: ProfileResetPinViewModel, private val profileManagementController: ProfileManagementController, private val resourceHandler: AppLanguageResourceHandler ) { - private val viewModel: ProfileResetPinViewModel by lazy { - getProfileResetPinViewModel() - } private lateinit var binding: ProfileResetPinFragmentBinding private var inputtedPin = false private var inputtedConfirmPin = false @@ -44,24 +40,24 @@ class ProfileResetPinFragmentPresenter @Inject constructor( ): View? { binding = ProfileResetPinFragmentBinding.inflate(inflater, container, false) - viewModel.isAdmin.set(isAdmin) + profileResetPinViewModel.isAdmin.set(isAdmin) binding.let { it.lifecycleOwner = fragment - it.viewModel = viewModel + it.viewModel = profileResetPinViewModel } // [onTextChanged] is a extension function defined at [TextInputEditTextHelper] binding.profileResetInputPinEditText.onTextChanged { pin -> pin?.let { if ( - viewModel.pinErrorMsg.get()?.isNotEmpty()!! && - viewModel.inputPin.get() == it + profileResetPinViewModel.pinErrorMsg.get()?.isNotEmpty()!! && + profileResetPinViewModel.inputPin.get() == it ) { - viewModel.inputPin.set(it) + profileResetPinViewModel.inputPin.set(it) inputtedPin = pin.isNotEmpty() } else { - viewModel.inputPin.set(it) - viewModel.pinErrorMsg.set("") + profileResetPinViewModel.inputPin.set(it) + profileResetPinViewModel.pinErrorMsg.set("") inputtedPin = pin.isNotEmpty() setValidPin() } @@ -72,14 +68,14 @@ class ProfileResetPinFragmentPresenter @Inject constructor( binding.profileResetInputConfirmPinEditText.onTextChanged { confirmPin -> confirmPin?.let { if ( - viewModel.confirmErrorMsg.get()?.isNotEmpty()!! && - viewModel.inputConfirmPin.get() == it + profileResetPinViewModel.confirmErrorMsg.get()?.isNotEmpty()!! && + profileResetPinViewModel.inputConfirmPin.get() == it ) { - viewModel.inputConfirmPin.set(it) + profileResetPinViewModel.inputConfirmPin.set(it) inputtedConfirmPin = confirmPin.isNotEmpty() } else { - viewModel.inputConfirmPin.set(it) - viewModel.confirmErrorMsg.set("") + profileResetPinViewModel.inputConfirmPin.set(it) + profileResetPinViewModel.confirmErrorMsg.set("") inputtedConfirmPin = confirmPin.isNotEmpty() setValidPin() } @@ -101,7 +97,7 @@ class ProfileResetPinFragmentPresenter @Inject constructor( var failed = false if (isAdmin) { if (pin.length < 5) { - viewModel.pinErrorMsg.set( + profileResetPinViewModel.pinErrorMsg.set( resourceHandler.getStringInLocale( R.string.profile_reset_pin_error_admin_pin_length ) @@ -110,7 +106,7 @@ class ProfileResetPinFragmentPresenter @Inject constructor( } } else { if (pin.length < 3) { - viewModel.pinErrorMsg.set( + profileResetPinViewModel.pinErrorMsg.set( resourceHandler.getStringInLocale( R.string.profile_reset_pin_error_user_pin_length ) @@ -119,7 +115,7 @@ class ProfileResetPinFragmentPresenter @Inject constructor( } } if (pin != confirmPin) { - viewModel.confirmErrorMsg.set( + profileResetPinViewModel.confirmErrorMsg.set( resourceHandler.getStringInLocale( R.string.add_profile_error_pin_confirm_wrong ) @@ -147,13 +143,9 @@ class ProfileResetPinFragmentPresenter @Inject constructor( private fun setValidPin() { if (inputtedPin && inputtedConfirmPin) { - viewModel.isButtonActive.set(true) + profileResetPinViewModel.isButtonActive.set(true) } else { - viewModel.isButtonActive.set(false) + profileResetPinViewModel.isButtonActive.set(false) } } - - private fun getProfileResetPinViewModel(): ProfileResetPinViewModel { - return viewModelProvider.getForFragment(fragment, ProfileResetPinViewModel::class.java) - } } diff --git a/app/src/main/java/org/oppia/android/app/spotlight/SpotlightFragment.kt b/app/src/main/java/org/oppia/android/app/spotlight/SpotlightFragment.kt index 0c2203d4ae2..603f7b53a82 100644 --- a/app/src/main/java/org/oppia/android/app/spotlight/SpotlightFragment.kt +++ b/app/src/main/java/org/oppia/android/app/spotlight/SpotlightFragment.kt @@ -359,6 +359,8 @@ class SpotlightFragment : InjectableFragment(), SpotlightNavigationListener, Spo private fun calculateScreenSize() { val displayMetrics = DisplayMetrics() + // TODO(#3616): Migrate to the proper SDK 30+ APIs. + @Suppress("DEPRECATION") // The code is correct for targeted versions of Android. activity.windowManager.defaultDisplay.getMetrics(displayMetrics) screenHeight = displayMetrics.heightPixels diff --git a/app/src/main/java/org/oppia/android/app/survey/ExitSurveyConfirmationDialogFragment.kt b/app/src/main/java/org/oppia/android/app/survey/ExitSurveyConfirmationDialogFragment.kt index f111bafbec6..884ab15ed1e 100644 --- a/app/src/main/java/org/oppia/android/app/survey/ExitSurveyConfirmationDialogFragment.kt +++ b/app/src/main/java/org/oppia/android/app/survey/ExitSurveyConfirmationDialogFragment.kt @@ -9,7 +9,6 @@ import org.oppia.android.R import org.oppia.android.app.fragment.FragmentComponentImpl import org.oppia.android.app.fragment.InjectableDialogFragment import org.oppia.android.app.model.ProfileId -import org.oppia.android.util.extensions.getProto import org.oppia.android.util.extensions.putProto import javax.inject.Inject @@ -54,20 +53,9 @@ class ExitSurveyConfirmationDialogFragment : InjectableDialogFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - val args = - checkNotNull( - arguments - ) { "Expected arguments to be passed to ExitSurveyConfirmationDialogFragment" } - - val profileId = args.getProto(PROFILE_ID_KEY, ProfileId.getDefaultInstance()) - dialog?.setCanceledOnTouchOutside(false) dialog?.setCancelable(false) - - return exitSurveyConfirmationDialogFragmentPresenter.handleCreateView( - inflater, - container - ) + return exitSurveyConfirmationDialogFragmentPresenter.handleCreateView(inflater, container) } override fun onStart() { diff --git a/app/src/main/java/org/oppia/android/app/survey/SurveyFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/survey/SurveyFragmentPresenter.kt index 88789ee130d..c35491df56c 100644 --- a/app/src/main/java/org/oppia/android/app/survey/SurveyFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/survey/SurveyFragmentPresenter.kt @@ -334,6 +334,7 @@ class SurveyFragmentPresenter @Inject constructor( activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputManager.hideSoftInputFromWindow( fragment.view!!.windowToken, + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. InputMethodManager.SHOW_FORCED ) } diff --git a/app/src/main/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivity.kt b/app/src/main/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivity.kt index bb812a550a9..039e918d6a1 100644 --- a/app/src/main/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivity.kt +++ b/app/src/main/java/org/oppia/android/app/testing/FractionInputInteractionViewTestActivity.kt @@ -63,6 +63,7 @@ class FractionInputInteractionViewTestActivity : } /** Checks submit-time errors. */ + @Suppress("UNUSED_PARAMETER") // TODO: Fix this properly or file a bug. fun getPendingAnswerErrorOnSubmitClick(v: View) { fractionInteractionViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) } diff --git a/app/src/main/java/org/oppia/android/app/testing/InputInteractionViewTestActivity.kt b/app/src/main/java/org/oppia/android/app/testing/InputInteractionViewTestActivity.kt index 20706aa12a3..bda539ed689 100644 --- a/app/src/main/java/org/oppia/android/app/testing/InputInteractionViewTestActivity.kt +++ b/app/src/main/java/org/oppia/android/app/testing/InputInteractionViewTestActivity.kt @@ -3,7 +3,6 @@ package org.oppia.android.app.testing import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.View import androidx.databinding.DataBindingUtil import org.oppia.android.R import org.oppia.android.app.activity.ActivityComponentImpl @@ -58,10 +57,9 @@ class InputInteractionViewTestActivity : writtenTranslationContext = params.writtenTranslationContext binding.numericInputViewModel = numericInputViewModel - } - - fun getPendingAnswerErrorOnSubmitClick(v: View) { - numericInputViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) + binding.getPendingAnswerErrorOnSubmitClick = Runnable { + numericInputViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) + } } override fun onPendingAnswerErrorOrAvailabilityCheck( diff --git a/app/src/main/java/org/oppia/android/app/testing/MathExpressionInteractionsViewTestActivity.kt b/app/src/main/java/org/oppia/android/app/testing/MathExpressionInteractionsViewTestActivity.kt index 55219840ea9..aaa119915e3 100644 --- a/app/src/main/java/org/oppia/android/app/testing/MathExpressionInteractionsViewTestActivity.kt +++ b/app/src/main/java/org/oppia/android/app/testing/MathExpressionInteractionsViewTestActivity.kt @@ -3,7 +3,6 @@ package org.oppia.android.app.testing import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.View import androidx.databinding.DataBindingUtil import org.oppia.android.R import org.oppia.android.app.activity.ActivityComponentImpl @@ -93,11 +92,9 @@ class MathExpressionInteractionsViewTestActivity : } binding.mathExpressionInteractionsViewModel = mathExpressionViewModel - } - - /** Checks submit-time errors. */ - fun getPendingAnswerErrorOnSubmitClick(v: View) { - mathExpressionViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) + binding.getPendingAnswerErrorOnSubmitClick = Runnable { + mathExpressionViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) + } } override fun onPendingAnswerErrorOrAvailabilityCheck( diff --git a/app/src/main/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivity.kt b/app/src/main/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivity.kt index a16d8e7c12c..53a584fe15c 100644 --- a/app/src/main/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivity.kt +++ b/app/src/main/java/org/oppia/android/app/testing/RatioInputInteractionViewTestActivity.kt @@ -76,6 +76,7 @@ class RatioInputInteractionViewTestActivity : /** * Checks for submit time errors. */ + @Suppress("UNUSED_PARAMETER") // TODO: Fix this properly or file a bug. fun getPendingAnswerErrorOnSubmitClick(v: View) { ratioExpressionInputInteractionViewModel .checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) diff --git a/app/src/main/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivity.kt b/app/src/main/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivity.kt index b8aa02dcd3d..71f25dde212 100644 --- a/app/src/main/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivity.kt +++ b/app/src/main/java/org/oppia/android/app/testing/TestFontScaleConfigurationUtilActivity.kt @@ -17,6 +17,7 @@ class TestFontScaleConfigurationUtilActivity : InjectableAutoLocalizedAppCompatA override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (activityComponent as ActivityComponentImpl).inject(this) + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. val readingTextSize = checkNotNull( intent.getSerializableExtra(FONT_SCALE_EXTRA_KEY) as? ReadingTextSize ) { "Expected $FONT_SCALE_EXTRA_KEY to be in intent extras." } diff --git a/app/src/main/java/org/oppia/android/app/testing/TextInputInteractionViewTestActivity.kt b/app/src/main/java/org/oppia/android/app/testing/TextInputInteractionViewTestActivity.kt index 5308bac3f8e..04e25f4b8ac 100644 --- a/app/src/main/java/org/oppia/android/app/testing/TextInputInteractionViewTestActivity.kt +++ b/app/src/main/java/org/oppia/android/app/testing/TextInputInteractionViewTestActivity.kt @@ -54,6 +54,7 @@ class TextInputInteractionViewTestActivity : } /** Checks submit-time errors. */ + @Suppress("UNUSED_PARAMETER") // TODO: Fix this properly or file a bug. fun getPendingAnswerErrorOnSubmitClick(v: View) { textInputViewModel.checkPendingAnswerError(AnswerErrorCategory.SUBMIT_TIME) } diff --git a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt index b7bb9548635..76a43e98978 100644 --- a/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/TopicFragmentPresenter.kt @@ -86,7 +86,7 @@ class TopicFragmentPresenter @Inject constructor( viewModel.numberOfChaptersCompletedLiveData.observe(fragment) { numberOfChaptersCompleted -> if (numberOfChaptersCompleted != null) { val lessonsTabView = tabLayout.getTabAt(computeTabPosition(TopicTab.LESSONS))?.view - lessonsTabView?.let { lessonsTabView -> + lessonsTabView?.let { val lessonsTabSpotlightTarget = SpotlightTarget( lessonsTabView, resourceHandler.getStringInLocale(R.string.topic_lessons_tab_spotlight_hint), diff --git a/app/src/main/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentPresenter.kt index b33e85cba61..72862362b66 100644 --- a/app/src/main/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/conceptcard/ConceptCardFragmentPresenter.kt @@ -8,7 +8,6 @@ import org.oppia.android.R import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.model.ProfileId import org.oppia.android.app.translation.AppLanguageResourceHandler -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.ConceptCardFragmentBinding import org.oppia.android.domain.oppialogger.OppiaLogger import org.oppia.android.domain.oppialogger.analytics.AnalyticsController @@ -27,7 +26,7 @@ class ConceptCardFragmentPresenter @Inject constructor( private val htmlParserFactory: HtmlParser.Factory, @ConceptCardHtmlParserEntityType private val entityType: String, @DefaultResourceBucketName private val resourceBucketName: String, - private val viewModelProvider: ViewModelProvider, + private val conceptCardViewModel: ConceptCardViewModel, private val translationController: TranslationController, private val appLanguageResourceHandler: AppLanguageResourceHandler ) : HtmlParser.CustomOppiaTagActionListener { @@ -50,9 +49,8 @@ class ConceptCardFragmentPresenter @Inject constructor( /* attachToRoot= */ false ) val view = binding.conceptCardExplanationText - val viewModel = getConceptCardViewModel() - viewModel.initialize(skillId, profileId) + conceptCardViewModel.initialize(skillId, profileId) logConceptCardEvent(skillId) binding.conceptCardToolbar.setNavigationIcon(R.drawable.ic_close_white_24dp) @@ -64,11 +62,11 @@ class ConceptCardFragmentPresenter @Inject constructor( } binding.let { - it.viewModel = viewModel + it.viewModel = conceptCardViewModel it.lifecycleOwner = fragment } - viewModel.conceptCardLiveData.observe( + conceptCardViewModel.conceptCardLiveData.observe( fragment ) { ephemeralConceptCard -> val explanationHtml = @@ -95,10 +93,6 @@ class ConceptCardFragmentPresenter @Inject constructor( return binding.root } - private fun getConceptCardViewModel(): ConceptCardViewModel { - return viewModelProvider.getForFragment(fragment, ConceptCardViewModel::class.java) - } - private fun logConceptCardEvent(skillId: String) { analyticsController.logImportantEvent( oppiaLogger.createOpenConceptCardContext(skillId), profileId diff --git a/app/src/main/java/org/oppia/android/app/topic/practice/TopicPracticeFragment.kt b/app/src/main/java/org/oppia/android/app/topic/practice/TopicPracticeFragment.kt index 839ba92af07..dcd910b68a6 100644 --- a/app/src/main/java/org/oppia/android/app/topic/practice/TopicPracticeFragment.kt +++ b/app/src/main/java/org/oppia/android/app/topic/practice/TopicPracticeFragment.kt @@ -46,6 +46,9 @@ class TopicPracticeFragment : InjectableFragment() { var selectedSkillId = HashMap>() if (savedInstanceState != null) { selectedIdList = savedInstanceState.getIntegerArrayList(SUBTOPIC_ID_LIST_ARGUMENT_KEY)!! + // TODO(#4437): Convert this to a type-safe proto. + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. + @Suppress("UNCHECKED_CAST") // Not quite safe. selectedSkillId = savedInstanceState .getSerializable(SKILL_ID_LIST_ARGUMENT_KEY)!! as HashMap> } diff --git a/app/src/main/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityPresenter.kt index ee821d56b86..0bd9755d36c 100644 --- a/app/src/main/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerActivityPresenter.kt @@ -47,6 +47,7 @@ class QuestionPlayerActivityPresenter @Inject constructor( activity.setSupportActionBar(binding.questionPlayerToolbar) binding.questionPlayerToolbar.setNavigationOnClickListener { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. activity.onBackPressed() } diff --git a/app/src/main/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerFragmentPresenter.kt index 703dbbc95ed..d536d0fc97c 100644 --- a/app/src/main/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/topic/questionplayer/QuestionPlayerFragmentPresenter.kt @@ -27,7 +27,6 @@ import org.oppia.android.app.player.stopplaying.RestartPlayingSessionListener import org.oppia.android.app.player.stopplaying.StopStatePlayingSessionListener import org.oppia.android.app.topic.conceptcard.ConceptCardFragment import org.oppia.android.app.utility.SplitScreenManager -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.databinding.QuestionPlayerFragmentBinding import org.oppia.android.domain.oppialogger.OppiaLogger import org.oppia.android.domain.oppialogger.analytics.AnalyticsController @@ -43,7 +42,7 @@ import javax.inject.Inject class QuestionPlayerFragmentPresenter @Inject constructor( private val activity: AppCompatActivity, private val fragment: Fragment, - private val viewModelProvider: ViewModelProvider, + private val questionViewModel: QuestionPlayerViewModel, private val questionAssessmentProgressController: QuestionAssessmentProgressController, private val oppiaLogger: OppiaLogger, private val analyticsController: AnalyticsController, @@ -56,7 +55,6 @@ class QuestionPlayerFragmentPresenter @Inject constructor( private val routeToHintsAndSolutionListener = activity as RouteToHintsAndSolutionListener private val hasConversationView = false - private val questionViewModel by lazy { getQuestionPlayerViewModel() } private val ephemeralQuestionLiveData: LiveData> by lazy { questionAssessmentProgressController.getCurrentQuestion().toLiveData() } @@ -317,6 +315,7 @@ class QuestionPlayerFragmentPresenter @Inject constructor( activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputManager.hideSoftInputFromWindow( fragment.view!!.windowToken, + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. InputMethodManager.SHOW_FORCED ) } @@ -347,10 +346,6 @@ class QuestionPlayerFragmentPresenter @Inject constructor( .build() } - private fun getQuestionPlayerViewModel(): QuestionPlayerViewModel { - return viewModelProvider.getForFragment(fragment, QuestionPlayerViewModel::class.java) - } - private fun logQuestionPlayerEvent(questionId: String, skillIds: List) { analyticsController.logImportantEvent( oppiaLogger.createOpenQuestionPlayerContext(questionId, skillIds), diff --git a/app/src/main/java/org/oppia/android/app/utility/ClickableAreasImage.kt b/app/src/main/java/org/oppia/android/app/utility/ClickableAreasImage.kt index 5093290768b..1a0081db7ee 100644 --- a/app/src/main/java/org/oppia/android/app/utility/ClickableAreasImage.kt +++ b/app/src/main/java/org/oppia/android/app/utility/ClickableAreasImage.kt @@ -9,7 +9,7 @@ import androidx.core.view.children import androidx.core.view.forEachIndexed import androidx.core.view.isVisible import org.oppia.android.R -import org.oppia.android.app.model.ImageWithRegions +import org.oppia.android.app.model.ImageWithRegions.LabeledRegion import org.oppia.android.app.player.state.ImageRegionSelectionInteractionView import org.oppia.android.app.shim.ViewBindingShim import kotlin.math.roundToInt @@ -21,19 +21,11 @@ class ClickableAreasImage( private val listener: OnClickableAreaClickedListener, bindingInterface: ViewBindingShim, private val isAccessibilityEnabled: Boolean, - private val clickableAreas: List + private val clickableAreas: List ) { private val defaultRegionView by lazy { bindingInterface.getDefaultRegion(parentView) } - init { - imageView.setOnTouchListener { view, motionEvent -> - if (motionEvent.action == MotionEvent.ACTION_DOWN) { - onPhotoTap(motionEvent.x, motionEvent.y) - } - view.performClick() - return@setOnTouchListener false - } - } + init { imageView.initializeShowRegionTouchListener() } /** * Called when an image is clicked. @@ -111,13 +103,7 @@ class ClickableAreasImage( newView.isFocusable = true newView.isFocusableInTouchMode = true newView.tag = clickableArea.label - newView.setOnTouchListener { view, event -> - if (event.action == MotionEvent.ACTION_DOWN) { - showOrHideRegion(newView, clickableArea) - } - view.performClick() - return@setOnTouchListener true - } + newView.initializeToggleRegionTouchListener(clickableArea) if (isAccessibilityEnabled) { // Make default region visibility gone when talkback enabled to avoid any accidental touch. defaultRegionView.isVisible = false @@ -144,7 +130,7 @@ class ClickableAreasImage( } } - private fun showOrHideRegion(newView: View, clickableArea: ImageWithRegions.LabeledRegion) { + private fun showOrHideRegion(newView: View, clickableArea: LabeledRegion) { resetRegionSelectionViews() listener.onClickableAreaTouched( NamedRegionClickedEvent( @@ -154,4 +140,24 @@ class ClickableAreasImage( ) newView.setBackgroundResource(R.drawable.selected_region_background) } + + private fun View.initializeShowRegionTouchListener() { + setOnTouchListener { view, motionEvent -> + if (motionEvent.action == MotionEvent.ACTION_DOWN) { + onPhotoTap(motionEvent.x, motionEvent.y) + } + view.performClick() + return@setOnTouchListener false + } + } + + private fun View.initializeToggleRegionTouchListener(clickableArea: LabeledRegion) { + setOnTouchListener { view, event -> + if (event.action == MotionEvent.ACTION_DOWN) { + showOrHideRegion(this@initializeToggleRegionTouchListener, clickableArea) + } + view.performClick() + return@setOnTouchListener true + } + } } diff --git a/app/src/main/java/org/oppia/android/app/utility/FontScaleConfigurationUtil.kt b/app/src/main/java/org/oppia/android/app/utility/FontScaleConfigurationUtil.kt index 78731ab1ce5..80603b9fb95 100644 --- a/app/src/main/java/org/oppia/android/app/utility/FontScaleConfigurationUtil.kt +++ b/app/src/main/java/org/oppia/android/app/utility/FontScaleConfigurationUtil.kt @@ -18,6 +18,8 @@ class FontScaleConfigurationUtil @Inject constructor() { configuration.fontScale = getReadingTextSizeConfigurationUtil(readingTextSize) val metrics: DisplayMetrics = context.resources.displayMetrics val windowManager = context.getSystemService(WINDOW_SERVICE) as? WindowManager + // TODO(#3616): Migrate to the proper SDK 30+ APIs. + @Suppress("DEPRECATION") // The code is correct for targeted versions of Android. windowManager!!.defaultDisplay.getMetrics(metrics) metrics.scaledDensity = configuration.fontScale * metrics.density context.createConfigurationContext(configuration) diff --git a/app/src/main/java/org/oppia/android/app/viewmodel/ObservableViewModel.kt b/app/src/main/java/org/oppia/android/app/viewmodel/ObservableViewModel.kt index 558bb071d15..de168e7b3cd 100644 --- a/app/src/main/java/org/oppia/android/app/viewmodel/ObservableViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/viewmodel/ObservableViewModel.kt @@ -2,10 +2,9 @@ package org.oppia.android.app.viewmodel import androidx.databinding.Observable import androidx.databinding.PropertyChangeRegistry -import androidx.lifecycle.ViewModel -/** A [ViewModel] that behaves the same as [androidx.databinding.BaseObservable]. */ -open class ObservableViewModel : ViewModel(), Observable { +/** A view model that behaves the same as [androidx.databinding.BaseObservable]. */ +open class ObservableViewModel : Observable { private val callbacks by lazy { PropertyChangeRegistry() } diff --git a/app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughActivityPresenter.kt b/app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughActivityPresenter.kt index 9f7733df2fc..f1682fb4de2 100644 --- a/app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughActivityPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/walkthrough/WalkthroughActivityPresenter.kt @@ -4,7 +4,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil import org.oppia.android.R import org.oppia.android.app.activity.ActivityScope -import org.oppia.android.app.viewmodel.ViewModelProvider import org.oppia.android.app.walkthrough.end.WalkthroughFinalFragment import org.oppia.android.app.walkthrough.topiclist.WalkthroughTopicListFragment import org.oppia.android.app.walkthrough.welcome.WalkthroughWelcomeFragment @@ -16,7 +15,7 @@ import javax.inject.Inject @ActivityScope class WalkthroughActivityPresenter @Inject constructor( private val activity: AppCompatActivity, - private val viewModelProvider: ViewModelProvider + private val walkthroughViewModel: WalkthroughViewModel ) : WalkthroughActivityListener { private lateinit var topicId: String private lateinit var binding: WalkthroughActivityBinding @@ -25,7 +24,7 @@ class WalkthroughActivityPresenter @Inject constructor( binding = DataBindingUtil.setContentView(activity, R.layout.walkthrough_activity) binding.apply { - viewModel = getWalkthroughViewModel() + viewModel = walkthroughViewModel presenter = this@WalkthroughActivityPresenter lifecycleOwner = activity } @@ -34,14 +33,14 @@ class WalkthroughActivityPresenter @Inject constructor( activity, true ) - val currentFragmentIndex = getWalkthroughViewModel().currentProgress.get()?.minus(1) + val currentFragmentIndex = walkthroughViewModel.currentProgress.get()?.minus(1) if (currentFragmentIndex == -1 && getWalkthroughWelcomeFragment() == null) { activity.supportFragmentManager.beginTransaction().add( R.id.walkthrough_fragment_placeholder, WalkthroughWelcomeFragment() ).commitNow().also { - getWalkthroughViewModel().currentProgress.set(1) + walkthroughViewModel.currentProgress.set(1) } } else if (currentFragmentIndex != null) { when (currentFragmentIndex) { @@ -50,21 +49,21 @@ class WalkthroughActivityPresenter @Inject constructor( R.id.walkthrough_fragment_placeholder, getWalkthroughWelcomeFragment() ?: WalkthroughWelcomeFragment() ).commitNow().also { - getWalkthroughViewModel().currentProgress.set(1) + walkthroughViewModel.currentProgress.set(1) } 1 -> activity.supportFragmentManager.beginTransaction().replace( R.id.walkthrough_fragment_placeholder, getWalkthroughTopicListFragment() ?: WalkthroughTopicListFragment() ).commitNow().also { - getWalkthroughViewModel().currentProgress.set(2) + walkthroughViewModel.currentProgress.set(2) } 2 -> activity.supportFragmentManager.beginTransaction().replace( R.id.walkthrough_fragment_placeholder, getWalkthroughFinalFragment() ?: WalkthroughFinalFragment() ).commitNow().also { - getWalkthroughViewModel().currentProgress.set(3) + walkthroughViewModel.currentProgress.set(3) } } } @@ -78,10 +77,6 @@ class WalkthroughActivityPresenter @Inject constructor( } } - private fun getWalkthroughViewModel(): WalkthroughViewModel { - return viewModelProvider.getForActivity(activity, WalkthroughViewModel::class.java) - } - private fun getWalkthroughWelcomeFragment(): WalkthroughWelcomeFragment? { return activity .supportFragmentManager @@ -113,7 +108,7 @@ class WalkthroughActivityPresenter @Inject constructor( R.id.walkthrough_fragment_placeholder, WalkthroughWelcomeFragment() ).commitNow().also { - getWalkthroughViewModel().currentProgress.set(1) + walkthroughViewModel.currentProgress.set(1) } } WalkthroughPages.TOPIC_LIST.value -> { @@ -121,7 +116,7 @@ class WalkthroughActivityPresenter @Inject constructor( R.id.walkthrough_fragment_placeholder, WalkthroughTopicListFragment() ).commitNow().also { - getWalkthroughViewModel().currentProgress.set(2) + walkthroughViewModel.currentProgress.set(2) } } WalkthroughPages.FINAL.value -> { @@ -129,14 +124,14 @@ class WalkthroughActivityPresenter @Inject constructor( R.id.walkthrough_fragment_placeholder, WalkthroughFinalFragment.newInstance(topicId) ).commitNow().also { - getWalkthroughViewModel().currentProgress.set(3) + walkthroughViewModel.currentProgress.set(3) } } } } fun handleSystemBack() { - moveToPreviousPage(getWalkthroughViewModel().currentProgress.get() ?: 1) + moveToPreviousPage(walkthroughViewModel.currentProgress.get() ?: 1) } fun setTopicId(topicId: String) { diff --git a/app/src/main/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalFragmentPresenter.kt b/app/src/main/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalFragmentPresenter.kt index 1b2658ba0ff..f2c2a9f4f74 100644 --- a/app/src/main/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalFragmentPresenter.kt +++ b/app/src/main/java/org/oppia/android/app/walkthrough/end/WalkthroughFinalFragmentPresenter.kt @@ -106,6 +106,7 @@ class WalkthroughFinalFragmentPresenter @Inject constructor( } override fun goBack() { + @Suppress("DEPRECATION") // TODO: Fix this properly or file a bug. activity.onBackPressed() } } diff --git a/app/src/main/res/layout-land/profile_chooser_profile_view.xml b/app/src/main/res/layout-land/profile_chooser_profile_view.xml index d150c4cfd0f..637bae7983d 100644 --- a/app/src/main/res/layout-land/profile_chooser_profile_view.xml +++ b/app/src/main/res/layout-land/profile_chooser_profile_view.xml @@ -1,7 +1,6 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -44,7 +43,7 @@ app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.RoundedShape" app:strokeColor="@color/component_color_shared_divider_color" app:strokeWidth="1dp" - profile:src="@{viewModel.profile.avatar}" /> + app:profileImageSource="@{viewModel.profile.avatar}" /> + app:profileLastVisitedTime="@{viewModel.profile.lastLoggedInTimestampMs}" /> + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -44,7 +43,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.RoundedShape" - profile:src="@{viewModel.profile.avatar}" /> + app:profileImageSource="@{viewModel.profile.avatar}" /> + app:profileCreatedTime="@{viewModel.profile.dateCreatedTimestampMs}" />