diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d2c51eaa7e2..4b7b2fb8144 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -21,8 +21,6 @@ # ---=============================== MODULES ==============================--- # - - ################################################################################ # app module # ################################################################################ diff --git a/.github/workflows/static_checks.yml b/.github/workflows/static_checks.yml index b312a43f067..e1e89be28c4 100644 --- a/.github/workflows/static_checks.yml +++ b/.github/workflows/static_checks.yml @@ -197,17 +197,32 @@ jobs: with: version: 6.5.0 - - name: Maven Repin Check + - name: Dependency validation (app dependencies) if: always() run: | - REPIN=1 bazel run @unpinned_maven//:pin + bazel run //scripts:validate_maven_dependencies -- $(pwd) third_party/versions/direct_maven_versions.bzl third_party/versions/transitive_maven_versions.bzl third_party/versions/maven_install.json //third_party //... - - name: Maven Dependencies Update Check + - name: Dependency validation (scripts dependencies) if: always() run: | - bazel run //scripts:maven_dependencies_list_check -- $(pwd) third_party/maven_install.json scripts/assets/maven_dependencies.pb + bazel run //scripts:validate_maven_dependencies -- $(pwd) scripts/third_party/versions/direct_maven_versions.bzl scripts/third_party/versions/transitive_maven_versions.bzl scripts/third_party/versions/maven_install.json //scripts/third_party //scripts/... - - name: License Texts Check + - name: Maven re-pin check (app dependencies) + if: always() + run: | + REPIN=1 bazel run @unpinned_maven_app//:pin + + - name: Maven re-pin check (scripts dependencies) + if: always() + run: | + REPIN=1 bazel run @unpinned_maven_scripts//:pin + + - name: Maven dependencies update check (app dependencies) + if: always() + run: | + bazel run //scripts:maven_dependencies_list_check -- $(pwd) third_party/versions/maven_install.json scripts/assets/maven_dependencies.pb + + - name: License texts check if: always() run: | bazel run //scripts:license_texts_check -- $(pwd)/app/src/main/res/values/third_party_dependencies.xml diff --git a/BUILD.bazel b/BUILD.bazel index 5eb1f397a91..399c8b53aff 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -12,6 +12,8 @@ exports_files(["config/kitkat_main_dex_class_list.txt"]) package_group( name = "oppia_api_visibility", packages = [ + "-//scripts/...", + "-//third_party/...", "//...", ], ) @@ -33,13 +35,16 @@ package_group( # test targets. package_group( name = "oppia_testing_visibility", + includes = [ + "//app:app_testing_visibility", + "//domain:domain_testing_visibility", + "//scripts:oppia_script_test_visibility", + "//utility:utility_testing_visibility", + ], packages = [ - "//app/...", "//data/...", - "//domain/...", "//instrumentation/...", "//testing/...", - "//utility/...", ], ) @@ -70,6 +75,9 @@ package_group( ":oppia_binary_visibility", ":oppia_testing_visibility", ], + packages = [ + "//app/src/main/java/org/oppia/android/app/application/...", + ], ) # TODO(#1640): Move binary manifest to top-level package post-Gradle. @@ -135,8 +143,8 @@ package_group( # be installed on a local device or emulator using a 'bazel run' command like so: # bazel run //:install_oppia_dev [ - define_oppia_aab_binary_flavor(flavor = flavor) + define_oppia_aab_binary_flavor(name = flavor) for flavor in AVAILABLE_FLAVORS ] -dagger_rules() +dagger_rules(repo_name = "@maven_app") diff --git a/WORKSPACE b/WORKSPACE index e877ad78248..1534a4b12cd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,241 +1,55 @@ """ -This file lists and imports all external dependencies needed to build Oppia Android. +This file initializes all external dependencies & toolchains needed to build Oppia Android. """ -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("//:build_vars.bzl", "BUILD_SDK_VERSION", "BUILD_TOOLS_VERSION") -load("//third_party:versions.bzl", "HTTP_DEPENDENCY_VERSIONS", "MAVEN_REPOSITORIES", "get_maven_dependencies") +# Note to developer: The order of loads & calls below MUST NOT BE CHANGED--it will guarantee a +# breakage as subsequent loads depend on both previous loads & calls. There is no other order +# possible for the configuration below, and it ought to never need to be changed. -# Android SDK configuration. For more details, see: -# https://docs.bazel.build/versions/master/be/android.html#android_sdk_repository -# TODO(#1542): Sync Android SDK version with the manifest. -android_sdk_repository( - name = "androidsdk", - api_level = BUILD_SDK_VERSION, - build_tools_version = BUILD_TOOLS_VERSION, -) - -# Oppia's backend proto API definitions. -git_repository( - name = "oppia_proto_api", - commit = HTTP_DEPENDENCY_VERSIONS["oppia_proto_api"]["version"], - remote = "https://github.com/oppia/oppia-proto-api", - shallow_since = "1716846301 -0700", -) - -load("@oppia_proto_api//repo:deps.bzl", "initializeDepsForWorkspace") - -initializeDepsForWorkspace() - -load("@oppia_proto_api//repo:toolchains.bzl", "initializeToolchainsForWorkspace") - -initializeToolchainsForWorkspace() - -# Add support for JVM rules: https://github.com/bazelbuild/rules_jvm_external -http_archive( - name = "rules_jvm_external", - sha256 = HTTP_DEPENDENCY_VERSIONS["rules_jvm"]["sha"], - strip_prefix = "rules_jvm_external-%s" % HTTP_DEPENDENCY_VERSIONS["rules_jvm"]["version"], - url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % HTTP_DEPENDENCY_VERSIONS["rules_jvm"]["version"], -) - -# Add support for Kotlin: https://github.com/bazelbuild/rules_kotlin. -http_archive( - name = "io_bazel_rules_kotlin", - patches = ["//tools/kotlin:remove_processor_duplicates.patch"], - sha256 = HTTP_DEPENDENCY_VERSIONS["rules_kotlin"]["sha"], - urls = ["https://github.com/bazelbuild/rules_kotlin/releases/download/%s/rules_kotlin_release.tgz" % HTTP_DEPENDENCY_VERSIONS["rules_kotlin"]["version"]], -) - -load("@io_bazel_rules_kotlin//kotlin:repositories.bzl", "kotlin_repositories", "kotlinc_version") - -# Use the 1.6 compiler since Kotlin 1.6 is the current supported version in the repository. -kotlin_repositories( - compiler_release = kotlinc_version( - release = "1.6.10", - sha256 = "432267996d0d6b4b17ca8de0f878e44d4a099b7e9f1587a98edc4d27e76c215a", - ), -) - -register_toolchains("//tools/kotlin:kotlin_16_jdk9_toolchain") - -# The proto_compiler and proto_java_toolchain bindings load the protos rules needed for the model -# module while helping us avoid the unnecessary compilation of protoc. Referecences: -# - https://github.com/google/startup-os/blob/5f30a62/WORKSPACE#L179-L187 -# - https://github.com/bazelbuild/bazel/issues/7095 - -bind( - name = "proto_compiler", - actual = "//tools:protoc", -) - -bind( - name = "proto_java_toolchain", - actual = "//tools:java_toolchain", -) - -# The rules_java contains the java_lite_proto_library rule used in the model module. -http_archive( - name = "rules_java", - sha256 = HTTP_DEPENDENCY_VERSIONS["rules_java"]["sha"], - url = "https://github.com/bazelbuild/rules_java/releases/download/{0}/rules_java-{0}.tar.gz".format(HTTP_DEPENDENCY_VERSIONS["rules_java"]["version"]), -) - -load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") - -rules_java_dependencies() - -rules_java_toolchains() - -# The rules_proto contains the proto_library rule used in the model module. -http_archive( - name = "rules_proto", - sha256 = HTTP_DEPENDENCY_VERSIONS["rules_proto"]["sha"], - strip_prefix = "rules_proto-%s" % HTTP_DEPENDENCY_VERSIONS["rules_proto"]["version"], - urls = ["https://github.com/bazelbuild/rules_proto/archive/%s.tar.gz" % HTTP_DEPENDENCY_VERSIONS["rules_proto"]["version"]], -) +workspace(name = "oppia_android") -load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") - -rules_proto_dependencies() - -rules_proto_toolchains() - -# Add support for Dagger -http_archive( - name = "dagger", - sha256 = HTTP_DEPENDENCY_VERSIONS["dagger"]["sha"], - strip_prefix = "dagger-dagger-%s" % HTTP_DEPENDENCY_VERSIONS["dagger"]["version"], - urls = ["https://github.com/google/dagger/archive/dagger-%s.zip" % HTTP_DEPENDENCY_VERSIONS["dagger"]["version"]], -) - -load("@dagger//:workspace_defs.bzl", "DAGGER_ARTIFACTS", "DAGGER_REPOSITORIES") - -# Add support for Robolectric: https://github.com/robolectric/robolectric-bazel -http_archive( - name = "robolectric", - 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") - -robolectric_repositories() +# The list of repositories from which all Maven-tied dependencies may be downloaded. +_MAVEN_REPOSITORIES = [ + "https://maven.fabric.io/public", + "https://maven.google.com", + "https://repo1.maven.org/maven2", +] -# Add support for Firebase Crashlytics -git_repository( - name = "tools_android", - commit = "00e6f4b7bdd75911e33c618a9bc57bab7a6e8930", - remote = "https://github.com/bazelbuild/tools_android", - shallow_since = "1594238320 -0400", +load( + "//scripts/third_party/versions:direct_http_versions.bzl", + scripts_remote_deps = "DIRECT_REMOTE_DEPENDENCIES", ) - -load("@tools_android//tools/googleservices:defs.bzl", "google_services_workspace_dependencies") - -google_services_workspace_dependencies() - -# A custom version of Android SVG is needed since custom changes needed to be added to the library -# to correctly size in-line SVGs (such as those needed for LaTeX-based math expressions). -git_repository( - name = "androidsvg", - commit = "5bc9c7553e94c3476e8ea32baea3c77567228fcd", - remote = "https://github.com/oppia/androidsvg", - shallow_since = "1686304726 -0700", +load("//third_party/macros:direct_dep_downloader.bzl", "download_direct_workspace_dependencies") +load( + "//third_party/versions:direct_http_versions.bzl", + app_remote_deps = "DIRECT_REMOTE_DEPENDENCIES", ) -git_repository( - name = "android-spotlight", - commit = "cc23499d37dc8533a2876e45b5063e981a4583f4", - remote = "https://github.com/oppia/android-spotlight", - shallow_since = "1680147372 -0700", -) +download_direct_workspace_dependencies(app_remote_deps, _MAVEN_REPOSITORIES) -# A custom fork of KotliTeX that removes resources artifacts that break the build, and updates the -# min target SDK version to be compatible with Oppia. -git_repository( - name = "kotlitex", - commit = "ccdf4170817fa3b48b8e1e452772dd58ecb71cf2", - remote = "https://github.com/oppia/kotlitex", - shallow_since = "1679426649 -0700", -) +download_direct_workspace_dependencies(scripts_remote_deps, _MAVEN_REPOSITORIES) -git_repository( - name = "archive_patcher", - commit = "d1c18b0035d5f669ddaefadade49cae0748f9df2", - remote = "https://github.com/oppia/archive-patcher", - shallow_since = "1642022460 -0800", -) +load("//third_party/tools:toolchains.bzl", "initialize_toolchains_for_workspace") -bind( - name = "databinding_annotation_processor", - actual = "//tools/android:compiler_annotation_processor", -) +initialize_toolchains_for_workspace() -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"])], +load( + "//scripts/third_party/versions:maven_config.bzl", + scripts_maven_artifact_config = "MAVEN_ARTIFACT_CONFIGURATION", ) - -load("@rules_jvm_external//:defs.bzl", "maven_install") - -ATS_TAG = "1edfdab3134a7f01b37afabd3eebfd2c5bb05151" - -ATS_SHA256 = "dcd1ff76aef1a26329d77863972780c8fe1fc8ff625747342239f0489c2837ec" - -http_archive( - name = "android_test_support", - sha256 = ATS_SHA256, - strip_prefix = "android-test-%s" % ATS_TAG, - urls = ["https://github.com/android/android-test/archive/%s.tar.gz" % ATS_TAG], +load("//third_party/macros:direct_dep_loader.bzl", "download_maven_dependencies") +load( + "//third_party/versions:maven_config.bzl", + app_maven_artifact_config = "MAVEN_ARTIFACT_CONFIGURATION", ) -load("@android_test_support//:repo.bzl", "android_test_repositories") - -android_test_repositories() - -# Android bundle tool. -http_jar( - name = "android_bundletool", - sha256 = HTTP_DEPENDENCY_VERSIONS["android_bundletool"]["sha"], - url = "https://github.com/google/bundletool/releases/download/{0}/bundletool-all-{0}.jar".format(HTTP_DEPENDENCY_VERSIONS["android_bundletool"]["version"]), -) +download_maven_dependencies("maven_app", app_maven_artifact_config, _MAVEN_REPOSITORIES) -# 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, - maven_install_json = "//third_party:maven_install.json", - override_targets = { - "com.google.guava:guava": "@//third_party:com_google_guava_guava", - }, - repositories = DAGGER_REPOSITORIES + MAVEN_REPOSITORIES, - strict_visibility = True, -) +download_maven_dependencies("maven_scripts", scripts_maven_artifact_config, _MAVEN_REPOSITORIES) -load("@maven//:defs.bzl", "pinned_maven_install") +load("@maven_app//:defs.bzl", pinned_maven_install_app = "pinned_maven_install") +load("@maven_scripts//:defs.bzl", pinned_maven_install_scripts = "pinned_maven_install") -pinned_maven_install() +pinned_maven_install_app() -[ - http_jar( - name = "guava_%s" % guava_type, - sha256 = HTTP_DEPENDENCY_VERSIONS["guava_%s" % guava_type]["sha"], - urls = [ - "{0}/com/google/guava/guava/{1}-{2}/guava-{1}-{2}.jar".format( - url_base, - HTTP_DEPENDENCY_VERSIONS["guava_%s" % guava_type]["version"], - guava_type, - ) - for url_base in DAGGER_REPOSITORIES + MAVEN_REPOSITORIES - ], - ) - for guava_type in [ - "android", - "jre", - ] -] +pinned_maven_install_scripts() diff --git a/app/BUILD.bazel b/app/BUILD.bazel index cfa6c0b3c47..b612dd10724 100644 --- a/app/BUILD.bazel +++ b/app/BUILD.bazel @@ -35,6 +35,9 @@ package_group( package_group( name = "app_testing_visibility", packages = [ + "//app", + "//app/src/main/java/org/oppia/android/app/notice/testing", + "//app/src/main/java/org/oppia/android/app/player/exploration/testing", "//app/src/sharedTest/...", "//app/src/test/...", ], @@ -614,7 +617,7 @@ android_library( "//third_party:androidx_viewpager_viewpager", "//third_party:com_google_android_flexbox_flexbox", "//third_party:com_google_android_material_material", - "//third_party:javax_annotation_javax_annotation-api_jar", + "//third_party:javax_annotation_javax_annotation-api", "//third_party:nl_dionsegijn_konfetti", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock_injector_provider", @@ -704,7 +707,6 @@ kt_android_library( "//third_party:androidx_core_core", "//third_party:androidx_databinding_databinding-common", "//third_party:androidx_databinding_databinding-runtime", - "//utility", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_module", "//utility/src/main/java/org/oppia/android/util/math:fraction_parser", @@ -740,7 +742,6 @@ android_library( "//third_party:androidx_lifecycle_lifecycle-livedata-core", "//third_party:androidx_lifecycle_lifecycle-livedata-ktx", "//third_party:com_google_android_material_material", - "//utility", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock_injector_provider", ], @@ -771,6 +772,7 @@ kt_android_library( ":view_models", ":views", "//:dagger", + "//app:crashlytics", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", "//app/src/main/java/org/oppia/android/app/activity:injectable_auto_localized_app_compat_activity", "//app/src/main/java/org/oppia/android/app/activity:injectable_system_localized_app_compat_activity", @@ -799,8 +801,7 @@ kt_android_library( "//third_party:com_caverock_androidsvg", "//third_party:com_github_takusemba_spotlight", "//third_party:com_google_android_flexbox_flexbox", - "//third_party:javax_annotation_javax_annotation-api_jar", - "//utility", + "//third_party:javax_annotation_javax_annotation-api", "//utility/src/main/java/org/oppia/android/util/extensions:bundle_extensions", "//utility/src/main/java/org/oppia/android/util/parser/image:image_loader", "//utility/src/main/java/org/oppia/android/util/parser/image:image_parsing_annonations", @@ -918,7 +919,6 @@ TEST_DEPS = [ "//third_party:org_mockito_mockito-core", "//third_party:org_robolectric_annotations", "//third_party:robolectric_android-all", - "//utility", "//utility/src/main/java/org/oppia/android/util/accessibility", "//utility/src/main/java/org/oppia/android/util/accessibility:test_module", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", @@ -997,24 +997,3 @@ crashlytics_android_library( build_id = "48fc9d17-e102-444c-8e0d-638d75ec0942", resource_files = GOOGLE_SERVICES_RESOURCES, ) - -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", - ], -) - -android_library( - name = "firestore_deps", - exports = [ - "//third_party:com_google_auto_value_auto-value-annotations", - "//third_party:com_google_firebase_firebase-appcheck", - "//third_party:com_google_firebase_firebase-appcheck-debug", - "//third_party:com_google_firebase_firebase-appcheck-playintegrity", - "//third_party:org_checkerframework_checker-qual", - ], -) diff --git a/app/build.gradle b/app/build.gradle index 05fb3d39c25..48b9817089f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -146,20 +146,20 @@ if (project.gradle.startParameter?.taskRequests?.args[0]?.remove("--list-shards" dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation( - 'androidx.appcompat:appcompat:1.0.2', - 'androidx.constraintlayout:constraintlayout:1.1.3', + 'androidx.appcompat:appcompat:1.2.0', + 'androidx.constraintlayout:constraintlayout:2.0.1', 'androidx.core:core-ktx:1.0.2', 'androidx.legacy:legacy-support-v4:1.0.0', - 'androidx.lifecycle:lifecycle-extensions:2.0.0', - 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha03', + 'androidx.lifecycle:lifecycle-extensions:2.2.0', + 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0', 'androidx.navigation:navigation-fragment:2.0.0', 'androidx.navigation:navigation-fragment-ktx:2.0.0', 'androidx.navigation:navigation-ui:2.0.0', 'androidx.navigation:navigation-ui-ktx:2.0.0', "androidx.fragment:fragment:$fragment_version", - 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha03', + 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0', 'androidx.multidex:multidex:2.0.1', - 'androidx.recyclerview:recyclerview:1.0.0', + 'androidx.recyclerview:recyclerview:1.1.0', 'androidx.work:work-runtime-ktx:2.4.0', 'com.github.bumptech.glide:glide:4.11.0', 'com.google.android.flexbox:flexbox:3.0.0', @@ -170,17 +170,17 @@ dependencies { 'com.google.firebase:firebase-appcheck:16.0.0', 'com.google.firebase:firebase-appcheck-debug:16.0.0', 'com.google.firebase:firebase-appcheck-playintegrity:16.0.0', + 'com.google.firebase:firebase-auth-ktx:19.3.1', 'com.google.firebase:firebase-core:17.5.0', - 'com.google.firebase:firebase-crashlytics:17.0.0', + 'com.google.firebase:firebase-crashlytics:17.1.1', 'com.google.firebase:firebase-firestore-ktx:24.2.1', - 'com.google.firebase:firebase-auth-ktx:19.3.1', - 'com.google.guava:guava:28.1-android', + 'com.google.guava:guava:31.0.1-android', 'com.google.protobuf:protobuf-javalite:3.17.3', 'nl.dionsegijn:konfetti:1.2.5', "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4', 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4', - 'org.mockito:mockito-core:2.7.22', + 'org.mockito:mockito-core:3.9.0', 'com.github.oppia:android-spotlight:cc23499d37dc8533a2876e45b5063e981a4583f4' ) compileOnly( @@ -189,7 +189,7 @@ dependencies { 'org.glassfish.jaxb:jaxb-runtime:2.3.2', ) testImplementation( - 'androidx.test:core:1.2.0', + 'androidx.test:core:1.4.0', 'androidx.test.espresso:espresso-contrib:3.1.0', 'androidx.test.espresso:espresso-core:3.2.0', 'androidx.test.espresso:espresso-intents:3.1.0', @@ -203,11 +203,11 @@ dependencies { 'org.robolectric:robolectric:4.5', 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4', "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version", - 'org.mockito:mockito-core:2.7.22', + 'org.mockito:mockito-core:3.9.0', project(":testing"), ) androidTestImplementation( - 'androidx.test:core:1.2.0', + 'androidx.test:core:1.4.0', 'androidx.test.espresso:espresso-contrib:3.1.0', 'androidx.test.espresso:espresso-core:3.2.0', 'androidx.test.espresso:espresso-intents:3.1.0', 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 064c317d50c..e3a88e8936a 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 @@ -22,6 +22,9 @@ kt_android_library( ":application_injector_provider", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", "//third_party:androidx_work_work-runtime-ktx", + "//third_party:com_google_firebase_firebase-appcheck", + "//third_party:com_google_firebase_firebase-appcheck-debug", + "//third_party:com_google_firebase_firebase-appcheck-playintegrity", "//third_party:com_google_firebase_firebase-common", ], ) @@ -121,8 +124,10 @@ android_library( "//utility/src/main/java/org/oppia/android/util/accessibility:prod_module", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching:caching_prod_module", + "//utility/src/main/java/org/oppia/android/util/gcsresource:prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_util_module", @@ -130,5 +135,7 @@ android_library( "//utility/src/main/java/org/oppia/android/util/parser/image:glide_image_loader_module", "//utility/src/main/java/org/oppia/android/util/parser/image:image_parsing_module", "//utility/src/main/java/org/oppia/android/util/parser/image:repository_glide_module", + "//utility/src/main/java/org/oppia/android/util/system:prod_module", + "//utility/src/main/java/org/oppia/android/util/threading:prod_module", ], ) diff --git a/app/src/main/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsViewModel.kt b/app/src/main/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsViewModel.kt index 274079e2ce8..50641b157b0 100644 --- a/app/src/main/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/devoptions/vieweventlogs/ViewEventLogsViewModel.kt @@ -1,5 +1,6 @@ package org.oppia.android.app.devoptions.vieweventlogs +import com.google.common.base.Optional import org.oppia.android.app.fragment.FragmentScope import org.oppia.android.app.translation.AppLanguageResourceHandler import org.oppia.android.app.viewmodel.ObservableViewModel @@ -14,7 +15,7 @@ import javax.inject.Inject */ @FragmentScope class ViewEventLogsViewModel @Inject constructor( - debugAnalyticsEventLogger: DebugAnalyticsEventLogger, + debugAnalyticsEventLogger: Optional, debugFirestoreEventLogger: DebugFirestoreEventLoggerImpl, private val machineLocale: OppiaLocale.MachineLocale, private val resourceHandler: AppLanguageResourceHandler @@ -23,7 +24,7 @@ class ViewEventLogsViewModel @Inject constructor( private val firestoreEvents = debugFirestoreEventLogger.getEventList() // Retrieves events from cache that are meant to be uploaded to Firebase Analytics. - private val analyticsEvents = debugAnalyticsEventLogger.getEventList() + private val analyticsEvents = debugAnalyticsEventLogger.transform { it.getEventList() } /** * List of [EventLogItemViewModel] used to populate recyclerview of [ViewEventLogsFragment] @@ -34,7 +35,7 @@ class ViewEventLogsViewModel @Inject constructor( } private fun processEventLogsList(): List { - return (analyticsEvents + firestoreEvents) + return (analyticsEvents.or(emptyList()) + firestoreEvents) .map { EventLogItemViewModel(it, machineLocale, resourceHandler) } 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 4957b2ceda9..54cc3b723c9 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 @@ -62,7 +62,6 @@ kt_android_library( ":view_binding_shim", "//app:databinding_resources", "//app/src/main/java/org/oppia/android/app/activity:activity_intent_factories_shim", - "//utility", ], ) diff --git a/app/src/main/res/layout/downloads_tab_fragment.xml b/app/src/main/res/layout/downloads_tab_fragment.xml index 4384c3f5cdb..8652870c799 100644 --- a/app/src/main/res/layout/downloads_tab_fragment.xml +++ b/app/src/main/res/layout/downloads_tab_fragment.xml @@ -1,11 +1,6 @@ - - - - - diff --git a/app/src/main/res/layout/home_fragment.xml b/app/src/main/res/layout/home_fragment.xml index d7dfe561d70..03da6b1430c 100644 --- a/app/src/main/res/layout/home_fragment.xml +++ b/app/src/main/res/layout/home_fragment.xml @@ -3,7 +3,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - 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 8ea77d0c034..78a0b272878 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 @@ -14,7 +14,6 @@ import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.rule.ActivityTestRule import com.google.common.truth.Truth.assertThat -import com.google.firebase.FirebaseApp import dagger.Component import org.junit.Before import org.junit.Rule @@ -68,6 +67,7 @@ import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModu import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule import org.oppia.android.testing.OppiaTestRule +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 @@ -82,9 +82,7 @@ import org.oppia.android.util.logging.CurrentAppScreenNameIntentDecorator.extrac import org.oppia.android.util.logging.EventLoggingConfigurationModule import org.oppia.android.util.logging.LoggerModule import org.oppia.android.util.logging.SyncStatusModule -import org.oppia.android.util.logging.firebase.DebugLogReportingModule import org.oppia.android.util.logging.firebase.FirebaseLogUploaderModule -import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessorModule import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsConfigurationsModule import org.oppia.android.util.networking.NetworkConnectionDebugUtilModule import org.oppia.android.util.networking.NetworkConnectionUtilDebugModule @@ -175,7 +173,7 @@ class ViewEventLogsActivityTest { NumberWithUnitsRuleModule::class, NumericInputRuleModule::class, TextInputRuleModule::class, DragDropSortInputModule::class, ImageClickInputModule::class, InteractionsModule::class, GcsResourceModule::class, GlideImageLoaderModule::class, ImageParsingModule::class, - HtmlParserEntityTypeModule::class, QuestionModule::class, DebugLogReportingModule::class, + HtmlParserEntityTypeModule::class, QuestionModule::class, TestLogReportingModule::class, AccessibilityTestModule::class, LogStorageModule::class, CachingTestModule::class, ExpirationMetaDataRetrieverModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, @@ -191,7 +189,7 @@ class ViewEventLogsActivityTest { MathEquationInputModule::class, SplitScreenInteractionModule::class, LoggingIdentifierModule::class, ApplicationLifecycleModule::class, SyncStatusModule::class, MetricLogSchedulerModule::class, - PerformanceMetricsAssessorModule::class, PerformanceMetricsConfigurationsModule::class, + PerformanceMetricsConfigurationsModule::class, TestingBuildFlavorModule::class, EventLoggingConfigurationModule::class, ActivityRouterModule::class, CpuPerformanceSnapshotterModule::class, ExplorationProgressModule::class, @@ -214,11 +212,6 @@ class ViewEventLogsActivityTest { .build() as TestApplicationComponent } - override fun onCreate() { - super.onCreate() - FirebaseApp.initializeApp(applicationContext) - } - fun inject(viewEventLogsActivityTest: ViewEventLogsActivityTest) { component.inject(viewEventLogsActivityTest) } 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 f40406b79fd..aa464814d1e 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 @@ -15,8 +15,9 @@ 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.runners.AndroidJUnit4 -import com.google.firebase.FirebaseApp import com.google.firebase.crashlytics.FirebaseCrashlytics +import dagger.Binds +import dagger.BindsOptionalOf import dagger.Component import dagger.Module import dagger.Provides @@ -80,7 +81,10 @@ import org.oppia.android.domain.platformparameter.PlatformParameterModule import org.oppia.android.domain.platformparameter.PlatformParameterSingletonModule import org.oppia.android.domain.question.QuestionModule import org.oppia.android.domain.workmanager.WorkManagerConfigurationModule +import org.oppia.android.testing.FakeAnalyticsEventLogger +import org.oppia.android.testing.FakeExceptionLogger import org.oppia.android.testing.FakeFirestoreInstanceWrapperImpl +import org.oppia.android.testing.FakePerformanceMetricsEventLogger import org.oppia.android.testing.OppiaTestRule import org.oppia.android.testing.firebase.TestAuthenticationModule import org.oppia.android.testing.junit.InitializeDefaultLocaleRule @@ -677,6 +681,31 @@ class ViewEventLogsFragmentTest { ) } + @Module + interface TestModule { + companion object { + @Provides + @Singleton + fun provideDebugEventLogger( + debugLoggerFactory: DebugAnalyticsEventLogger.Factory, + fakeLoggerFactory: FakeAnalyticsEventLogger.FactoryImpl + ): DebugAnalyticsEventLogger = debugLoggerFactory.create(fakeLoggerFactory) + } + + @Binds + fun provideAnalyticsEventLogger( + debugAnalyticsEventLogger: DebugAnalyticsEventLogger + ): AnalyticsEventLogger + + @Binds + fun bindFakePerformanceMetricsEventLogger( + impl: FakePerformanceMetricsEventLogger + ): PerformanceMetricsEventLogger + + @Binds fun bindFakeExceptionLogger(impl: FakeExceptionLogger): ExceptionLogger + @BindsOptionalOf fun bindOptionalDebugAnalyticsEventLogger(): DebugAnalyticsEventLogger + } + @Module class TestLogStorageModule { @Provides @@ -740,7 +769,7 @@ class ViewEventLogsFragmentTest { GcsResourceModule::class, GlideImageLoaderModule::class, ImageParsingModule::class, HtmlParserEntityTypeModule::class, QuestionModule::class, TestLogReportingModule::class, AccessibilityTestModule::class, TestLogStorageModule::class, CachingTestModule::class, - ExpirationMetaDataRetrieverModule::class, + ExpirationMetaDataRetrieverModule::class, TestModule::class, ViewBindingShimModule::class, RatioInputModule::class, WorkManagerConfigurationModule::class, ApplicationStartupListenerModule::class, LogReportWorkerModule::class, HintsAndSolutionConfigModule::class, HintsAndSolutionProdModule::class, @@ -785,11 +814,6 @@ class ViewEventLogsFragmentTest { .build() as TestApplicationComponent } - override fun onCreate() { - super.onCreate() - FirebaseApp.initializeApp(applicationContext) - } - /** Called when setting up [TestApplication]. */ fun inject(viewEventLogsFragmentTest: ViewEventLogsFragmentTest) { component.inject(viewEventLogsFragmentTest) diff --git a/build.gradle b/build.gradle index 97172637258..1cc246545c7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,8 +1,8 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.10' - ext.fragment_version = '1.2.0-rc01' + ext.kotlin_version = '1.6.21' + ext.fragment_version = '1.2.0' repositories { google() gradlePluginPortal() diff --git a/build_flavors.bzl b/build_flavors.bzl index 0440b171a55..9d1f1d761b5 100644 --- a/build_flavors.bzl +++ b/build_flavors.bzl @@ -43,105 +43,105 @@ _PRODUCTION_PROGUARD_SPECS = [ # Note to developers: keys of this dict should follow the order of AVAILABLE_FLAVORS. # TODO(#4419): Remove the Kenya-specific alpha flavor. _FLAVOR_METADATA = { - "dev": { - "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, - "target_sdk_version": 33, - "multidex": "native", - "proguard_specs": [], # Developer builds are not optimized. - "production_release": False, + "alpha": { + "application_class": ".app.application.alpha.AlphaOppiaApplication", "deps": [ - "//app/src/main/java/org/oppia/android/app/application/dev:developer_application", + "//app/src/main/java/org/oppia/android/app/application/alpha:alpha_application", "//config/src/java/org/oppia/android/config:all_languages_config", ], - "version_code": OPPIA_DEV_VERSION_CODE, - "application_class": ".app.application.dev.DeveloperOppiaApplication", - }, - "dev_kitkat": { "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 19, + "min_sdk_version": 21, + "multidex": "native", + "production_release": True, + "proguard_specs": _PRODUCTION_PROGUARD_SPECS, "target_sdk_version": 33, - "multidex": "manual_main_dex", - "main_dex_list": _MAIN_DEX_LIST_TARGET_KITKAT, - "proguard_specs": [], # Developer builds are not optimized. - "production_release": False, + "version_code": OPPIA_ALPHA_VERSION_CODE, + }, + "alpha_kenya": { + "application_class": ".app.application.alphakenya.AlphaKenyaOppiaApplication", "deps": [ - "//app/src/main/java/org/oppia/android/app/application/dev:developer_application", + "//app/src/main/java/org/oppia/android/app/application/alphakenya:alpha_kenya_application", "//config/src/java/org/oppia/android/config:all_languages_config", ], - "version_code": OPPIA_DEV_KITKAT_VERSION_CODE, - "application_class": ".app.application.dev.DeveloperOppiaApplication", - }, - "alpha": { "manifest": "//app:src/main/AndroidManifest.xml", "min_sdk_version": 21, - "target_sdk_version": 33, "multidex": "native", - "proguard_specs": _PRODUCTION_PROGUARD_SPECS, "production_release": True, + "proguard_specs": _PRODUCTION_PROGUARD_SPECS, + "target_sdk_version": 33, + "version_code": OPPIA_ALPHA_KENYA_VERSION_CODE, + }, + "alpha_kitkat": { + "application_class": ".app.application.alpha.AlphaOppiaApplication", "deps": [ "//app/src/main/java/org/oppia/android/app/application/alpha:alpha_application", "//config/src/java/org/oppia/android/config:all_languages_config", ], - "version_code": OPPIA_ALPHA_VERSION_CODE, - "application_class": ".app.application.alpha.AlphaOppiaApplication", - }, - "alpha_kitkat": { + "main_dex_list": _MAIN_DEX_LIST_TARGET_KITKAT, "manifest": "//app:src/main/AndroidManifest.xml", "min_sdk_version": 19, - "target_sdk_version": 33, "multidex": "manual_main_dex", - "main_dex_list": _MAIN_DEX_LIST_TARGET_KITKAT, - "proguard_specs": [], "production_release": True, - "deps": [ - "//app/src/main/java/org/oppia/android/app/application/alpha:alpha_application", - "//config/src/java/org/oppia/android/config:all_languages_config", - ], + "proguard_specs": [], + "target_sdk_version": 33, "version_code": OPPIA_ALPHA_KITKAT_VERSION_CODE, - "application_class": ".app.application.alpha.AlphaOppiaApplication", }, - "alpha_kenya": { + "beta": { + "application_class": ".app.application.beta.BetaOppiaApplication", + "deps": [ + "//app/src/main/java/org/oppia/android/app/application/beta:beta_application", + "//config/src/java/org/oppia/android/config:production_languages_config", + ], "manifest": "//app:src/main/AndroidManifest.xml", "min_sdk_version": 21, - "target_sdk_version": 33, "multidex": "native", - "proguard_specs": _PRODUCTION_PROGUARD_SPECS, "production_release": True, + "proguard_specs": _PRODUCTION_PROGUARD_SPECS, + "target_sdk_version": 33, + "version_code": OPPIA_BETA_VERSION_CODE, + }, + "dev": { + "application_class": ".app.application.dev.DeveloperOppiaApplication", "deps": [ - "//app/src/main/java/org/oppia/android/app/application/alphakenya:alpha_kenya_application", + "//app/src/main/java/org/oppia/android/app/application/dev:developer_application", "//config/src/java/org/oppia/android/config:all_languages_config", ], - "version_code": OPPIA_ALPHA_KENYA_VERSION_CODE, - "application_class": ".app.application.alphakenya.AlphaKenyaOppiaApplication", - }, - "beta": { "manifest": "//app:src/main/AndroidManifest.xml", "min_sdk_version": 21, - "target_sdk_version": 33, "multidex": "native", - "proguard_specs": _PRODUCTION_PROGUARD_SPECS, - "production_release": True, + "production_release": False, + "proguard_specs": [], # Developer builds are not optimized. + "target_sdk_version": 33, + "version_code": OPPIA_DEV_VERSION_CODE, + }, + "dev_kitkat": { + "application_class": ".app.application.dev.DeveloperOppiaApplication", "deps": [ - "//app/src/main/java/org/oppia/android/app/application/beta:beta_application", - "//config/src/java/org/oppia/android/config:production_languages_config", + "//app/src/main/java/org/oppia/android/app/application/dev:developer_application", + "//config/src/java/org/oppia/android/config:all_languages_config", ], - "version_code": OPPIA_BETA_VERSION_CODE, - "application_class": ".app.application.beta.BetaOppiaApplication", - }, - "ga": { + "main_dex_list": _MAIN_DEX_LIST_TARGET_KITKAT, "manifest": "//app:src/main/AndroidManifest.xml", - "min_sdk_version": 21, + "min_sdk_version": 19, + "multidex": "manual_main_dex", + "production_release": False, + "proguard_specs": [], # Developer builds are not optimized. "target_sdk_version": 33, - "multidex": "native", - "proguard_specs": _PRODUCTION_PROGUARD_SPECS, - "production_release": True, + "version_code": OPPIA_DEV_KITKAT_VERSION_CODE, + }, + "ga": { + "application_class": ".app.application.ga.GaOppiaApplication", "deps": [ "//app/src/main/java/org/oppia/android/app/application/ga:general_availability_application", "//config/src/java/org/oppia/android/config:production_languages_config", ], + "manifest": "//app:src/main/AndroidManifest.xml", + "min_sdk_version": 21, + "multidex": "native", + "production_release": True, + "proguard_specs": _PRODUCTION_PROGUARD_SPECS, + "target_sdk_version": 33, "version_code": OPPIA_GA_VERSION_CODE, - "application_class": ".app.application.ga.GaOppiaApplication", }, } @@ -185,22 +185,22 @@ def _transform_android_manifest_impl(ctx): _transform_android_manifest = rule( attrs = { - "input_file": attr.label( + "application_relative_qualified_class": attr.string(mandatory = True), + "build_flavor": attr.string(mandatory = True), + "git_meta_dir": attr.label( allow_files = True, mandatory = True, ), - "output_file": attr.output( - mandatory = True, - ), - "git_meta_dir": attr.label( + "input_file": attr.label( allow_files = True, mandatory = True, ), - "build_flavor": attr.string(mandatory = True), "major_version": attr.int(mandatory = True), "minor_version": attr.int(mandatory = True), + "output_file": attr.output( + mandatory = True, + ), "version_code": attr.int(mandatory = True), - "application_relative_qualified_class": attr.string(mandatory = True), "_transform_android_manifest_tool": attr.label( executable = True, cfg = "host", @@ -250,7 +250,7 @@ def transform_android_manifest( application_relative_qualified_class = application_relative_qualified_class, ) -def define_oppia_aab_binary_flavor(flavor): +def define_oppia_aab_binary_flavor(name): """ Defines a new flavor of the Oppia Android app. @@ -262,9 +262,10 @@ def define_oppia_aab_binary_flavor(flavor): for details) Args: - flavor: str. The name of the flavor of the app. Must correspond to an entry in + name: str. The name of the flavor of the app. Must correspond to an entry in AVAILABLE_FLAVORS. """ + flavor = name transform_android_manifest( name = "oppia_%s_transformed_manifest" % flavor, application_relative_qualified_class = _FLAVOR_METADATA[flavor]["application_class"], diff --git a/build_vars.bzl b/build_vars.bzl index 6fd23a4f9a5..cce4d569ef7 100644 --- a/build_vars.bzl +++ b/build_vars.bzl @@ -1,2 +1,6 @@ +""" +Contains high-level common build constants used throughout Oppia Android builds. +""" + BUILD_SDK_VERSION = 33 BUILD_TOOLS_VERSION = "32.0.0" diff --git a/config/proguard/kotlin-proguard-rules.pro b/config/proguard/kotlin-proguard-rules.pro index 7a2361a17aa..03a4b13123e 100644 --- a/config/proguard/kotlin-proguard-rules.pro +++ b/config/proguard/kotlin-proguard-rules.pro @@ -32,3 +32,11 @@ # https://github.com/Kotlin/kotlinx.coroutines/pull/2997, specifically: # https://github.com/Kotlin/kotlinx.coroutines/blob/3574c2/kotlinx-coroutines-core/jvm/src/internal/ExceptionsConstructor.kt#L17. -dontwarn kotlinx.coroutines.internal.ClassValueCtorCache + +# This is an odd issue that seems to come up from buildSequence actually being included in the build +# (since it wasn't removed until 1.7.20 per https://github.com/JetBrains/kotlin/commit/b35c57 but +# was deprecated in https://github.com/JetBrains/kotlin/commit/aac96c. The noteworthy bit here is +# that buildSequence{} was marked as inline-only, so it makes sense that it doesn't exist. This +# should be safe to ignore, though it's a bit unexpected that it's even coming up. It probably can +# go away after upgrading to Kotlin 1.7.x or 1.8.x. +-dontwarn kotlin.sequences.SequencesKt__SequenceBuilderKt$buildSequence* diff --git a/data/BUILD.bazel b/data/BUILD.bazel index 9e61d1f5786..3cf71e9683a 100644 --- a/data/BUILD.bazel +++ b/data/BUILD.bazel @@ -38,10 +38,8 @@ TEST_DEPS = [ "//third_party:com_squareup_retrofit2_retrofit", "//third_party:com_squareup_retrofit2_retrofit-mock", "//third_party:junit_junit", - "//third_party:moshi", "//third_party:org_robolectric_annotations", "//third_party:robolectric_android-all", - "//utility", "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/threading:annotations", ] diff --git a/data/build.gradle b/data/build.gradle index 103cea56f3b..c819cd6dc7f 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -62,9 +62,9 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation( - 'androidx.appcompat:appcompat:1.0.2', + 'androidx.appcompat:appcompat:1.2.0', 'com.google.dagger:dagger:2.41', - 'com.google.guava:guava:28.1-android', + 'com.google.guava:guava:31.0.1-android', 'com.google.protobuf:protobuf-javalite:3.17.3', 'com.squareup.moshi:moshi-kotlin:1.13.0', 'com.squareup.okhttp3:okhttp:4.7.2', @@ -82,9 +82,9 @@ dependencies { 'com.google.truth.extensions:truth-liteproto-extension:1.1.3', 'com.squareup.okhttp3:mockwebserver:4.7.2', 'com.squareup.okhttp3:okhttp:4.7.2', - 'junit:junit:4.12', + 'junit:junit:4.13.2', 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4', - 'org.mockito:mockito-core:2.19.0', + 'org.mockito:mockito-core:3.9.0', 'org.robolectric:robolectric:4.5', project(":testing"), ) @@ -92,8 +92,8 @@ dependencies { // TODO(#97): Isolate retrofit-mock dependency from production api( 'com.squareup.retrofit2:converter-moshi:2.7.2', - 'com.squareup.retrofit2:retrofit:2.7.2', - 'com.squareup.retrofit2:retrofit-mock:2.7.2', + 'com.squareup.retrofit2:retrofit:2.9.0', + 'com.squareup.retrofit2:retrofit-mock:2.9.0', ) androidTestImplementation('androidx.test:runner:1.2.0', 'androidx.test.espresso:espresso-core:3.2.0') diff --git a/domain/BUILD.bazel b/domain/BUILD.bazel index 658fd1e6df9..5e1fad2eb95 100755 --- a/domain/BUILD.bazel +++ b/domain/BUILD.bazel @@ -17,6 +17,7 @@ filegroup( package_group( name = "domain_testing_visibility", packages = [ + "//domain", "//domain/src/test/...", ], ) @@ -140,12 +141,14 @@ kt_android_library( "//model/src/main/proto:platform_parameter_java_proto_lite", "//model/src/main/proto:question_java_proto_lite", "//model/src/main/proto:topic_java_proto_lite", + "//third_party:androidx_appcompat_appcompat", "//third_party:androidx_work_work-runtime-ktx", "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-guava", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/extensions:bundle_extensions", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", "//utility/src/main/java/org/oppia/android/util/extensions:string_extensions", + "//utility/src/main/java/org/oppia/android/util/gcsresource:annotations", "//utility/src/main/java/org/oppia/android/util/logging:event_logger", "//utility/src/main/java/org/oppia/android/util/logging:log_uploader", "//utility/src/main/java/org/oppia/android/util/math:extensions", @@ -175,8 +178,6 @@ TEST_DEPS = [ ":interaction_object_test_builder", "//:dagger", "//app:crashlytics", - "//app:crashlytics_deps", - "//app:firestore_deps", "//app/src/main/java/org/oppia/android/app/application/testing:testing_build_flavor_module", "//config/src/java/org/oppia/android/config:all_languages_config", "//data/src/main/java/org/oppia/android/data/backends/gae:network_config_prod_module", diff --git a/domain/build.gradle b/domain/build.gradle index 0d35db61ce2..67f77fd1bf5 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -84,17 +84,17 @@ android.sourceSets.test.kotlin.exclude(filesToExclude) dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation( - 'androidx.appcompat:appcompat:1.0.2', - 'androidx.exifinterface:exifinterface:1.0.0-rc01', - 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha03', - 'androidx.lifecycle:lifecycle-extensions:2.0.0', + 'androidx.appcompat:appcompat:1.2.0', + 'androidx.exifinterface:exifinterface:1.0.0', + 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0', + 'androidx.lifecycle:lifecycle-extensions:2.2.0', 'androidx.work:work-runtime-ktx:2.4.0', 'com.google.dagger:dagger:2.41', 'com.google.firebase:firebase-analytics-ktx:17.5.0', - 'com.google.firebase:firebase-crashlytics:17.0.0', - 'com.google.firebase:firebase-firestore-ktx:24.2.1', 'com.google.firebase:firebase-auth-ktx:19.3.1', - 'com.google.guava:guava:28.1-android', + 'com.google.firebase:firebase-crashlytics:17.1.1', + 'com.google.firebase:firebase-firestore-ktx:24.2.1', + 'com.google.guava:guava:31.0.1-android', 'com.google.protobuf:protobuf-javalite:3.17.3', "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", 'org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.6.4' @@ -112,9 +112,9 @@ dependencies { 'com.google.truth.extensions:truth-liteproto-extension:1.1.3', 'com.google.truth:truth:1.1.3', 'com.squareup.okhttp3:mockwebserver:4.7.2', - 'junit:junit:4.12', + 'junit:junit:4.13.2', "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version", - 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2', + 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4', 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4', 'org.mockito:mockito-core:3.9.0', 'org.robolectric:robolectric:4.5', 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 0c56bb8f283..b228379771c 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 @@ -8,17 +8,16 @@ kt_android_library( name = "state_controller", srcs = [ "AppStartupStateController.kt", - "DeprecationController.kt", ], visibility = ["//:oppia_api_visibility"], deps = [ + ":deprecation_controller", ":exploration_meta_data_retriever", "//data/src/main/java/org/oppia/android/data/persistence:cache_store", "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", "//model/src/main/proto:deprecation_java_proto_lite", "//model/src/main/proto:onboarding_java_proto_lite", "//third_party:javax_inject_javax_inject", - "//utility", "//utility/src/main/java/org/oppia/android/util/data:data_provider", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/extensions:bundle_extensions", @@ -71,10 +70,10 @@ kt_android_library( "//model/src/main/proto:deprecation_java_proto_lite", "//model/src/main/proto:onboarding_java_proto_lite", "//third_party:javax_inject_javax_inject", - "//utility", "//utility/src/main/java/org/oppia/android/util/data:data_provider", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/extensions:bundle_extensions", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", + "//utility/src/main/java/org/oppia/android/util/platformparameter", ], ) 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 3a91ed280e8..0509453a90c 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 @@ -28,13 +28,13 @@ kt_android_library( "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//domain/src/main/java/org/oppia/android/domain/translation:translation_controller", "//model/src/main/proto:event_logger_java_proto_lite", - "//utility", "//utility/src/main/java/org/oppia/android/util/data:data_provider", "//utility/src/main/java/org/oppia/android/util/logging:console_logger", "//utility/src/main/java/org/oppia/android/util/logging:event_logger", "//utility/src/main/java/org/oppia/android/util/logging:exception_logger", "//utility/src/main/java/org/oppia/android/util/logging:sync_status_manager", "//utility/src/main/java/org/oppia/android/util/networking:network_connection_util", + "//utility/src/main/java/org/oppia/android/util/platformparameter", ], ) @@ -84,9 +84,9 @@ kt_android_library( "//domain/src/main/java/org/oppia/android/domain/oppialogger:oppia_logger", "//domain/src/main/java/org/oppia/android/domain/oppialogger:startup_listener", "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", - "//utility", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_event_logger", + "//utility/src/main/java/org/oppia/android/util/platformparameter", ], ) @@ -218,10 +218,9 @@ kt_android_library( "//domain/src/main/java/org/oppia/android/domain/auth:authentication_controller", "//domain/src/main/java/org/oppia/android/domain/oppialogger:prod_module", "//model/src/main/proto:event_logger_java_proto_lite", - "//utility", "//utility/src/main/java/org/oppia/android/util/logging:console_logger", "//utility/src/main/java/org/oppia/android/util/logging:exception_logger", - "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging/firebase:firestore_logger", "//utility/src/main/java/org/oppia/android/util/networking:network_connection_util", "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", ], 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 608e59c379c..7f99af0a97a 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 @@ -17,8 +17,8 @@ kt_android_library( "//domain/src/main/java/org/oppia/android/domain/oppialogger/analytics:learner_analytics_logger", "//domain/src/main/java/org/oppia/android/domain/oppialogger/exceptions:controller", "//model/src/main/proto:profile_java_proto_lite", + "//third_party:androidx_exifinterface_exifinterface", "//third_party:javax_inject_javax_inject", - "//utility", "//utility/src/main/java/org/oppia/android/util/data:async_result", "//utility/src/main/java/org/oppia/android/util/data:data_provider", "//utility/src/main/java/org/oppia/android/util/data:data_providers", 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 fecc92c1cb3..a56f026bbdb 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 @@ -24,6 +24,7 @@ oppia_android_test( "//third_party:org_mockito_mockito-core", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/threading:prod_module", ], ) 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 ecdc2be1dbf..4cddcc3a58b 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 @@ -61,6 +61,7 @@ oppia_android_test( "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) @@ -94,6 +95,7 @@ oppia_android_test( "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) @@ -123,6 +125,7 @@ oppia_android_test( "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) @@ -197,6 +200,7 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/caching/testing:caching_test_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) 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 533770e2c80..c459cd4f151 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 @@ -31,8 +31,10 @@ oppia_android_test( "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", "//utility/src/main/java/org/oppia/android/util/networking:prod_module", + "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) diff --git a/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerTest.kt b/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerTest.kt index 04d07ab4cdb..97c0bcf1137 100644 --- a/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerTest.kt +++ b/domain/src/test/java/org/oppia/android/domain/oppialogger/logscheduler/MetricLogSchedulingWorkerTest.kt @@ -225,8 +225,14 @@ class MetricLogSchedulingWorkerTest { fun provideContext(application: Application): Context = application @Provides - fun bindFakeEventLogger(fakeAnalyticsEventLogger: FakeAnalyticsEventLogger): - AnalyticsEventLogger = fakeAnalyticsEventLogger + fun bindFakeEventLogger( + fakeLoggerFactory: FakeAnalyticsEventLogger.FactoryImpl + ): FakeAnalyticsEventLogger = fakeLoggerFactory.create() + + @Provides + fun bindAnalyticsEventLogger( + fakeAnalyticsEventLogger: FakeAnalyticsEventLogger + ): AnalyticsEventLogger = fakeAnalyticsEventLogger @Provides fun bindFakeExceptionLogger(fakeLogger: FakeExceptionLogger): ExceptionLogger = fakeLogger @@ -255,7 +261,6 @@ class MetricLogSchedulingWorkerTest { @Module interface TestFirebaseLogUploaderModule { - @Binds fun bindsFakeLogUploader(fakeLogUploader: FakeLogUploader): LogUploader } 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 a6e4f4d9620..ecaf80bc62f 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 @@ -33,6 +33,7 @@ oppia_android_test( "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:metric_log_scheduler", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", "//utility/src/main/java/org/oppia/android/util/networking:network_connection_debug_util", ], @@ -66,6 +67,7 @@ oppia_android_test( "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/caching:asset_prod_module", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", 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 6ecf7a83e28..0880eebb592 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 @@ -546,6 +546,12 @@ class LogUploadWorkerTest { @Provides fun provideContext(application: Application): Context = application + @Provides + @Singleton + fun bindFakeEventLogger( + factory: FakeAnalyticsEventLogger.FactoryImpl + ): FakeAnalyticsEventLogger = factory.create() + @Provides @Singleton @MockEventLogger @@ -560,6 +566,10 @@ class LogUploadWorkerTest { } } + @Provides + fun bindAnalyticsEventLogger(@MockEventLogger delegate: AnalyticsEventLogger): + AnalyticsEventLogger = delegate + @Provides @Singleton @MockFirestoreEventLogger @@ -575,10 +585,6 @@ class LogUploadWorkerTest { } } - @Provides - fun bindFakeEventLogger(@MockEventLogger delegate: AnalyticsEventLogger): - AnalyticsEventLogger = delegate - @Provides fun bindFakeExceptionLogger(fakeLogger: FakeExceptionLogger): ExceptionLogger = fakeLogger diff --git a/instrumentation/oppia_instrumentation_test.bzl b/instrumentation/oppia_instrumentation_test.bzl index 91f36e625ef..c913941e98a 100644 --- a/instrumentation/oppia_instrumentation_test.bzl +++ b/instrumentation/oppia_instrumentation_test.bzl @@ -34,6 +34,7 @@ def oppia_instrumentation_test( instruments = "//instrumentation:oppia_test", manifest = "//instrumentation:src/javatests/AndroidManifest.xml", deps = [test_lib_name], + tags = ["manual"], ) # TODO(#3617): Target isn't supported yet. Remove the manual tag once fixed. 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 7e7ab58686e..f735a1be960 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,6 @@ kt_android_library( "//data/src/main/java/org/oppia/android/data/backends/gae:network_config_annotations", "//domain", "//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", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", diff --git a/model/src/main/proto/BUILD.bazel b/model/src/main/proto/BUILD.bazel index 8a917b4108d..16f3bead11e 100644 --- a/model/src/main/proto/BUILD.bazel +++ b/model/src/main/proto/BUILD.bazel @@ -420,8 +420,6 @@ java_lite_proto_library( android_library( name = "test_models", testonly = True, - visibility = ["//:oppia_api_visibility"], - exports = [ - ":test_java_proto_lite", - ], + visibility = ["//:oppia_testing_visibility"], + exports = [":test_java_proto_lite"], ) diff --git a/oppia_android_application.bzl b/oppia_android_application.bzl index d9951cefa18..ec8dca1689f 100644 --- a/oppia_android_application.bzl +++ b/oppia_android_application.bzl @@ -266,11 +266,11 @@ _restrict_languages_in_raw_module_zip = rule( _bundle_module_zip_into_deployable_aab = rule( attrs = { - "input_file": attr.label( + "config_file": attr.label( allow_single_file = True, mandatory = True, ), - "config_file": attr.label( + "input_file": attr.label( allow_single_file = True, mandatory = True, ), @@ -280,7 +280,7 @@ _bundle_module_zip_into_deployable_aab = rule( "_bundletool_tool": attr.label( executable = True, cfg = "host", - default = "//third_party:android_bundletool_binary", + default = "//scripts/third_party:android_bundletool_binary", ), }, implementation = _bundle_module_zip_into_deployable_aab_impl, @@ -292,11 +292,11 @@ _package_metadata_into_deployable_aab = rule( allow_single_file = True, mandatory = True, ), - "proguard_map_file": attr.label( - allow_single_file = True, + "output_aab_file": attr.output( mandatory = True, ), - "output_aab_file": attr.output( + "proguard_map_file": attr.label( + allow_single_file = True, mandatory = True, ), }, @@ -305,18 +305,18 @@ _package_metadata_into_deployable_aab = rule( _generate_apks_and_install = rule( attrs = { - "input_file": attr.label( + "debug_keystore": attr.label( allow_single_file = True, mandatory = True, ), - "debug_keystore": attr.label( + "input_file": attr.label( allow_single_file = True, mandatory = True, ), "_bundletool_tool": attr.label( executable = True, cfg = "host", - default = "//third_party:android_bundletool_binary", + default = "//scripts/third_party:android_bundletool_binary", ), }, executable = True, diff --git a/scripts/BUILD.bazel b/scripts/BUILD.bazel index 689cf6e53d2..02c720129eb 100644 --- a/scripts/BUILD.bazel +++ b/scripts/BUILD.bazel @@ -42,6 +42,15 @@ package_group( packages = ["//scripts/src/java/..."], ) +# Visibility for libraries that should be accessible to script testing packages. +package_group( + name = "oppia_script_testing_library_visibility", + includes = [ + ":oppia_script_test_visibility", + ], + packages = ["//scripts/src/java/org/oppia/android/scripts/testing"], +) + kt_jvm_binary( name = "compute_aab_differences", testonly = True, @@ -167,6 +176,12 @@ kt_jvm_binary( runtime_deps = ["//scripts/src/java/org/oppia/android/scripts/maven:retrieve_license_texts_lib"], ) +kt_jvm_binary( + name = "validate_maven_dependencies", + main_class = "org.oppia.android.scripts.maven.ValidateMavenDependenciesKt", + runtime_deps = ["//scripts/src/java/org/oppia/android/scripts/maven:validate_maven_dependencies_lib"], +) + kt_jvm_binary( name = "license_texts_check", testonly = True, diff --git a/scripts/assets/kdoc_validity_exemptions.textproto b/scripts/assets/kdoc_validity_exemptions.textproto index ffe2c3d91e4..2b76666b769 100644 --- a/scripts/assets/kdoc_validity_exemptions.textproto +++ b/scripts/assets/kdoc_validity_exemptions.textproto @@ -7,7 +7,6 @@ exempted_file_path: "app/src/main/java/org/oppia/android/app/notice/AutomaticApp exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsActivityPresenter.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsFragment.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsFragmentPresenter.kt" -exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsModule.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/DeveloperOptionsStarter.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/devoptionsitemviewmodel/DeveloperOptionsItemViewModel.kt" exempted_file_path: "app/src/main/java/org/oppia/android/app/devoptions/markchapterscompleted/MarkChaptersCompletedActivityPresenter.kt" diff --git a/scripts/assets/maven_dependencies.textproto b/scripts/assets/maven_dependencies.textproto index 4f046941d1e..94dee574475 100644 --- a/scripts/assets/maven_dependencies.textproto +++ b/scripts/assets/maven_dependencies.textproto @@ -131,8 +131,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "androidx.core:core-ktx:1.0.1" - artifact_version: "1.0.1" + artifact_name: "androidx.core:core-ktx:1.0.2" + artifact_version: "1.0.2" license { license_name: "The Apache Software License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -836,8 +836,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "com.google.android.gms:play-services-basement:18.0.0" - artifact_version: "18.0.0" + artifact_name: "com.google.android.gms:play-services-basement:18.0.1" + artifact_version: "18.0.1" license { license_name: "Android Software Development Kit License" original_link: "https://developer.android.com/studio/terms.html" @@ -1392,8 +1392,8 @@ maven_dependency { } } maven_dependency { - artifact_name: "com.squareup.retrofit2:converter-moshi:2.5.0" - artifact_version: "2.5.0" + artifact_name: "com.squareup.retrofit2:converter-moshi:2.7.2" + artifact_version: "2.7.2" license { license_name: "The Apache Software License, Version 2.0" scrapable_link { @@ -1603,17 +1603,6 @@ maven_dependency { } } } -maven_dependency { - artifact_name: "org.jetbrains.kotlin:kotlin-reflect:1.6.0" - artifact_version: "1.6.0" - license { - license_name: "The Apache 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.kotlin:kotlin-stdlib:1.6.21" artifact_version: "1.6.21" @@ -1680,17 +1669,6 @@ maven_dependency { } } } -maven_dependency { - artifact_name: "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4" - artifact_version: "1.6.4" - 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-guava:1.6.4" artifact_version: "1.6.4" diff --git a/scripts/assets/todo_open_exemptions.textproto b/scripts/assets/todo_open_exemptions.textproto index 715fdf0bf32..ae52ec08090 100644 --- a/scripts/assets/todo_open_exemptions.textproto +++ b/scripts/assets/todo_open_exemptions.textproto @@ -336,7 +336,22 @@ todo_open_exemption { } todo_open_exemption { exempted_file_path: "scripts/static_checks.sh" - line_number: 110 + line_number: 92 +} +todo_open_exemption { + exempted_file_path: "third_party/versions/mods/kotlitex-combined.patch" + line_number: 310 + line_number: 397 + line_number: 499 + line_number: 522 + line_number: 536 + line_number: 549 + line_number: 568 + line_number: 642 + line_number: 897 + line_number: 902 + line_number: 972 + line_number: 1061 } todo_open_exemption { exempted_file_path: "wiki/Coding-style-guide.md" diff --git a/scripts/buildifier_lint_check.sh b/scripts/buildifier_lint_check.sh index 52e0857468e..329d87929cc 100644 --- a/scripts/buildifier_lint_check.sh +++ b/scripts/buildifier_lint_check.sh @@ -14,7 +14,7 @@ else buildifier_file_path="$github_actions_path/oppia-android-tools/buildifier" fi -$buildifier_file_path --lint=warn --mode=check --warnings=-native-android,+out-of-order-load,+unsorted-dict-items -r app data domain instrumentation model testing utility third_party tools scripts BUILD.bazel WORKSPACE oppia_android_test.bzl +$buildifier_file_path --lint=warn --mode=check --warnings=-native-android,+out-of-order-load,+unsorted-dict-items -r . status=$? @@ -25,7 +25,9 @@ else # Assume any lint output or non-zero exit code is a failure. echo "********************************" echo "Buildifier issue found." - echo "Please fix the above issues." + echo "Please fix the above issues. + You can also try to auto-fix the issues using the command: + $buildifier_file_path --lint=fix --mode=fix --warnings=-native-android,+out-of-order-load,+unsorted-dict-items -r ." echo "********************************" exit 1 fi diff --git a/scripts/ktlint_lint_check.sh b/scripts/ktlint_lint_check.sh index 2713b88d0e0..32867021a18 100755 --- a/scripts/ktlint_lint_check.sh +++ b/scripts/ktlint_lint_check.sh @@ -25,7 +25,7 @@ else echo "********************************" echo "Ktlint issue found." echo "Please fix the above issues. - You can also use the java -jar $jar_file_path -F --android domain/src/**/*.kt utility/src/**/*.kt data/src/**/*.kt app/src/**/*.kt testing/src/**/*.kt scripts/src/**/*.kt instrumentation/src/**/*.kt + You can also use the java -jar $jar_file_path -F --android domain/src/**/*.kt utility/src/**/*.kt data/src/**/*.kt app/src/**/*.kt testing/src/**/*.kt scripts/src/**/*.kt instrumentation/src/**/*.kt command to fix the most common issues." echo "Please note, there might be a possibility where the above command will not fix the issue. In that case, you will have to fix it yourself." diff --git a/scripts/src/java/org/oppia/android/scripts/apkstats/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/apkstats/BUILD.bazel index 7730a9c084a..aeb685bb588 100644 --- a/scripts/src/java/org/oppia/android/scripts/apkstats/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/apkstats/BUILD.bazel @@ -6,7 +6,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "compute_aab_differences_lib", - testonly = True, srcs = [ "ComputeAabDifferences.kt", ], @@ -21,7 +20,6 @@ kt_jvm_library( kt_jvm_library( name = "aapt2_client", - testonly = True, srcs = [ "Aapt2Client.kt", ], @@ -33,30 +31,28 @@ kt_jvm_library( kt_jvm_library( name = "apk_analyzer_client", - testonly = True, srcs = [ "ApkAnalyzerClient.kt", ], visibility = ["//scripts:oppia_script_test_visibility"], runtime_deps = [ - "//third_party:com_google_archivepatcher", + "//scripts/third_party:com_google_archivepatcher", ], deps = [ ":aapt2_client", - "//third_party:com_android_tools_apkparser_apkanalyzer", + "//scripts/third_party:com_android_tools_apkparser_apkanalyzer", ], ) kt_jvm_library( name = "bundle_tool_client", - testonly = True, srcs = [ "BundleToolClient.kt", ], visibility = ["//scripts:oppia_script_test_visibility"], runtime_deps = [ - "//third_party:android_bundletool", - "//third_party:com_google_guava_guava_jre", + "//scripts/third_party:android_bundletool", + "//scripts/third_party:com_google_guava_guava", ], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:command_executor", 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 96e253fe75b..e5443cfcd90 100644 --- a/scripts/src/java/org/oppia/android/scripts/build/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/build/BUILD.bazel @@ -10,7 +10,7 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ "//model/src/main/proto:languages_java_proto", - "//third_party:com_android_tools_build_aapt2-proto", + "//scripts/third_party:com_android_tools_build_aapt2-proto", ], ) 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 ff9990b866d..a1283074e6b 100644 --- a/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/ci/BUILD.bazel @@ -6,7 +6,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "compute_affected_tests_lib", - testonly = True, srcs = [ "ComputeAffectedTests.kt", ], @@ -21,7 +20,6 @@ kt_jvm_library( kt_jvm_library( name = "retrieve_affected_tests_lib", - testonly = True, srcs = [ "RetrieveAffectedTests.kt", ], 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 5bf6035b2bf..c401ca73061 100644 --- a/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt +++ b/scripts/src/java/org/oppia/android/scripts/ci/ComputeAffectedTests.kt @@ -172,7 +172,7 @@ class ComputeAffectedTests( val affectedTestTargets = changedFileTargets.chunked(size = 100) .fold(initial = setOf()) { allTargets, targetChunk -> - allTargets + bazelClient.retrieveRelatedTestTargets(targetChunk).toSet() + allTargets + bazelClient.retrieveDependingTestTargets(targetChunk).toSet() } println( "Affected Bazel test targets (${affectedTestTargets.size} total): $affectedTestTargets." 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 b4942de8721..650117a4cbf 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/common/BUILD.bazel @@ -8,7 +8,6 @@ load("//:build_vars.bzl", "BUILD_SDK_VERSION", "BUILD_TOOLS_VERSION") kt_jvm_library( name = "android_build_sdk_properties", - testonly = True, srcs = [ "AndroidBuildSdkProperties.kt", ], @@ -19,7 +18,6 @@ kt_jvm_library( kt_jvm_library( name = "bazel_client", - testonly = True, srcs = [ "BazelClient.kt", ], @@ -42,7 +40,6 @@ kt_jvm_library( kt_jvm_library( name = "github_client", - testonly = True, srcs = [ "GitHubClient.kt", ], @@ -51,10 +48,10 @@ kt_jvm_library( ":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", + "//scripts/third_party:com_squareup_okhttp3_okhttp", + "//scripts/third_party:com_squareup_retrofit2_converter-moshi", + "//scripts/third_party:com_squareup_retrofit2_retrofit", + "//scripts/third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", ], ) @@ -68,27 +65,25 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_library_visibility"], deps = [ ":script_background_coroutine_dispatcher", - "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + "//scripts/third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", ], ) kt_jvm_library( name = "proto_string_encoder", - testonly = True, srcs = ["ProtoStringEncoder.kt"], visibility = ["//scripts:oppia_script_library_visibility"], deps = [ - "//third_party:com_google_protobuf_protobuf-javalite", + "//scripts/third_party:com_google_protobuf_protobuf-java", ], ) kt_jvm_library( name = "repository_file", - testonly = True, srcs = ["RepositoryFile.kt"], visibility = ["//scripts:oppia_script_library_visibility"], deps = [ - "//third_party:org_jetbrains_kotlin_kotlin-stdlib-jdk8_jar", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-stdlib-jdk8", ], ) @@ -97,7 +92,7 @@ kt_jvm_library( srcs = ["ScriptBackgroundCoroutineDispatcher.kt"], visibility = ["//scripts:oppia_script_library_visibility"], deps = [ - "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + "//scripts/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 9aede2fd16f..f9a61189580 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/BazelClient.kt @@ -8,7 +8,11 @@ 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) { +class BazelClient( + private val rootDirectory: File, + private val commandExecutor: CommandExecutor, + private val universeScope: String = "//..." +) { /** Returns all Bazel test targets in the workspace. */ fun retrieveAllTestTargets(): List { return correctPotentiallyBrokenTargetNames( @@ -29,14 +33,28 @@ class BazelClient(private val rootDirectory: File, private val commandExecutor: ) } - /** Returns all test targets in the workspace that are affected by the list of file targets. */ - fun retrieveRelatedTestTargets(fileTargets: Iterable): List { + /** Returns all prod targets in the workspace that depend on the list of provided targets. */ + fun retrieveDependingProdTargets(targets: Iterable): List { + // Reference for the "kind exclusion": https://stackoverflow.com/a/58667282/3689782. return correctPotentiallyBrokenTargetNames( runPotentiallyShardedQueryCommand( - "kind(test, allrdeps(set(%s)))", - fileTargets, + "filter('^[^@]', allrdeps(set(%1\$s)) except kind(test, allrdeps(set(%1\$s))))", + targets, "--noshow_progress", - "--universe_scope=//...", + "--universe_scope=$universeScope", + "--order_output=no" + ) + ) + } + + /** Returns all test targets in the workspace that depend on the list of provided targets. */ + fun retrieveDependingTestTargets(targets: Iterable): List { + return correctPotentiallyBrokenTargetNames( + runPotentiallyShardedQueryCommand( + "filter('^[^@]', kind(test, allrdeps(set(%s))))", + targets, + "--noshow_progress", + "--universe_scope=$universeScope", "--order_output=no" ) ) @@ -45,7 +63,7 @@ class BazelClient(private val rootDirectory: File, private val commandExecutor: /** * Returns all test targets transitively tied to the specific Bazel BUILD/WORKSPACE files listed * in the provided [buildFiles] list. This may return different files than - * [retrieveRelatedTestTargets] since that method relies on the dependency graph to compute + * [retrieveDependingTestTargets] since that method relies on the dependency graph to compute * affected targets whereas this assumes that any changes to BUILD files could affect any test * directly or indirectly tied to that BUILD file, regardless of dependencies. */ @@ -58,7 +76,7 @@ class BazelClient(private val rootDirectory: File, private val commandExecutor: "filter('^[^@]', rbuildfiles(%s))", // Use a filter to limit the search space. buildFiles, "--noshow_progress", - "--universe_scope=//...", + "--universe_scope=$universeScope", "--order_output=no", delimiter = "," ) @@ -76,7 +94,7 @@ class BazelClient(private val rootDirectory: File, private val commandExecutor: "filter('^[^@]', kind(test, allrdeps(set(%s))))", relevantSiblings, "--noshow_progress", - "--universe_scope=//...", + "--universe_scope=$universeScope", "--order_output=no" ) ) @@ -90,7 +108,7 @@ class BazelClient(private val rootDirectory: File, private val commandExecutor: fun retrieveThirdPartyMavenDepsListForBinary(binaryTarget: String): List { return executeBazelCommand( "query", - "deps(deps($binaryTarget) intersect //third_party/...) intersect @maven//..." + "deps(deps($binaryTarget) intersect //third_party/...) intersect @maven_app//..." ) } @@ -101,7 +119,7 @@ class BazelClient(private val rootDirectory: File, private val commandExecutor: return executeBazelCommand( "query", "--noshow_progress", - "--universe_scope=//...", + "--universe_scope=$universeScope", "--order_output=no", "kind($filterRuleType, siblings($buildFileTarget))" ) @@ -164,7 +182,7 @@ class BazelClient(private val rootDirectory: File, private val commandExecutor: } private fun computeMaxArgumentLength(partitions: List>) = - partitions.map(this::computeArgumentLength).maxOrNull() ?: 0 + partitions.maxOfOrNull(this::computeArgumentLength) ?: 0 private fun computeArgumentLength(args: List) = args.joinToString(" ").length diff --git a/scripts/src/java/org/oppia/android/scripts/common/ProtoStringEncoder.kt b/scripts/src/java/org/oppia/android/scripts/common/ProtoStringEncoder.kt index e1a68d12c1d..0d4c9362f29 100644 --- a/scripts/src/java/org/oppia/android/scripts/common/ProtoStringEncoder.kt +++ b/scripts/src/java/org/oppia/android/scripts/common/ProtoStringEncoder.kt @@ -1,6 +1,6 @@ package org.oppia.android.scripts.common -import com.google.protobuf.MessageLite +import com.google.protobuf.Message import java.io.ByteArrayOutputStream import java.util.Base64 import java.util.zip.GZIPInputStream @@ -14,14 +14,14 @@ class ProtoStringEncoder private constructor() { private val base64Encoder by lazy { Base64.getEncoder() } private val base64Decoder by lazy { Base64.getDecoder() } - private fun encodeToCompressedBase64(message: M): String { + private fun encodeToCompressedBase64(message: M): String { val compressedMessage = ByteArrayOutputStream().also { byteOutputStream -> GZIPOutputStream(byteOutputStream).use { message.writeTo(it) } }.toByteArray() return base64Encoder.encodeToString(compressedMessage) } - private fun decodeFromCompressedBase64(base64: String, exampleMessage: M): M { + private fun decodeFromCompressedBase64(base64: String, exampleMessage: M): M { val compressedMessage = base64Decoder.decode(base64) return GZIPInputStream(compressedMessage.inputStream()).use { @Suppress("UNCHECKED_CAST") // Proto guarantees type safety here. @@ -36,7 +36,7 @@ class ProtoStringEncoder private constructor() { * Returns a compressed Base64 representation of this proto that can later be decoded using * [mergeFromCompressedBase64]. */ - fun M.toCompressedBase64(): String = + fun M.toCompressedBase64(): String = protoStringEncoder.encodeToCompressedBase64(this) /** @@ -46,7 +46,7 @@ class ProtoStringEncoder private constructor() { * Note that this method ignores any properties in the current proto; it will treat it like a * default instance when populating fields from the new proto. */ - fun M.mergeFromCompressedBase64(base64: String): M = + fun M.mergeFromCompressedBase64(base64: String): M = protoStringEncoder.decodeFromCompressedBase64(base64, exampleMessage = this) } } 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 989cbfb1a45..a4286117a4e 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 @@ -6,8 +6,7 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.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"], + deps = ["//scripts/third_party:moshi"], ) 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 f3a597add77..25a5542c7be 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 @@ -6,11 +6,10 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.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", + "//scripts/third_party:com_squareup_retrofit2_retrofit", ], ) 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 f1e33e9bfac..18c41612e1f 100644 --- a/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/docs/BUILD.bazel @@ -6,12 +6,11 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "kdoc_validity_check_lib", - testonly = True, srcs = ["KdocValidityCheck.kt"], 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", - "//third_party:org_jetbrains_kotlin_kotlin-compiler-embeddable", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-compiler-embeddable", ], ) diff --git a/scripts/src/java/org/oppia/android/scripts/docs/KdocValidityCheck.kt b/scripts/src/java/org/oppia/android/scripts/docs/KdocValidityCheck.kt index 5aed8d34847..7832937e481 100644 --- a/scripts/src/java/org/oppia/android/scripts/docs/KdocValidityCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/docs/KdocValidityCheck.kt @@ -70,7 +70,8 @@ fun main(vararg args: String) { "AfterClass", "Inject", "Provides", - "Binds" + "Binds", + "BindsOptionalOf" ) // A list of all the files to be exempted for this check. 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 3d221f7e0e3..10273baf62f 100644 --- a/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/label/BUILD.bazel @@ -7,7 +7,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "accessibility_label_check_lib", - testonly = True, srcs = ["AccessibilityLabelCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ 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 db5ce6414fe..b9210b01eb2 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/license/BUILD.bazel @@ -6,7 +6,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "maven_artifact_property_fetcher", - testonly = True, srcs = [ "MavenArtifactPropertyFetcher.kt", "MavenArtifactPropertyFetcherImpl.kt", @@ -14,25 +13,32 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_library_visibility"], ) +kt_jvm_library( + name = "maven_coordinate", + srcs = [ + "MavenCoordinate.kt", + ], + visibility = ["//scripts:oppia_script_library_visibility"], +) + kt_jvm_library( name = "maven_dependencies_retriever", - testonly = True, srcs = ["MavenDependenciesRetriever.kt"], visibility = ["//scripts:oppia_script_library_visibility"], deps = [ ":maven_artifact_property_fetcher", + ":maven_coordinate", "//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", - "//third_party:com_google_protobuf_protobuf-java", - "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", + "//scripts/third_party:com_google_protobuf_protobuf-java", + "//scripts/third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", ], ) kt_jvm_library( name = "maven_dependencies_list_check_lib", - testonly = True, srcs = ["MavenDependenciesListCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ @@ -43,7 +49,6 @@ kt_jvm_library( kt_jvm_library( name = "license_texts_check_lib", - testonly = True, srcs = ["LicenseTextsCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], ) diff --git a/scripts/src/java/org/oppia/android/scripts/license/MavenCoordinate.kt b/scripts/src/java/org/oppia/android/scripts/license/MavenCoordinate.kt new file mode 100644 index 00000000000..0e74d11b5af --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenCoordinate.kt @@ -0,0 +1,93 @@ +package org.oppia.android.scripts.license + +/** + * 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 variation of [reducedCoordinateString] which also omits this coordinate's [version]. */ + val reducedCoordinateStringWithoutVersion: String get() = "$groupId:$artifactId" + + /** + * 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('-', '_') + } +} 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 d6b5ff1d985..11ce00b1c81 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesListCheck.kt @@ -23,7 +23,7 @@ import org.oppia.android.scripts.proto.MavenDependency * * Example: * bazel run //scripts:maven_dependencies_list_check -- $(pwd) - * third_party/maven_install.json scripts/assets/maven_dependencies.pb + * third_party/versions/maven_install.json scripts/assets/maven_dependencies.pb */ fun main(args: Array) { ScriptBackgroundCoroutineDispatcher().use { 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 43f0193047c..8bd0ac2c53e 100644 --- a/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt +++ b/scripts/src/java/org/oppia/android/scripts/license/MavenDependenciesRetriever.kt @@ -22,7 +22,7 @@ import java.io.File import java.io.FileInputStream import javax.xml.parsers.DocumentBuilderFactory -private const val MAVEN_PREFIX = "@maven//:" +private const val MAVEN_PREFIX = "@maven_app//:" /** Helper to compile the third-party Maven dependencies list for Oppia Android. */ class MavenDependenciesRetriever( @@ -376,95 +376,6 @@ class MavenDependenciesRetriever( private fun replaceHttpWithHttps(url: String): String = url.replaceFirst("http://", "https://") - /** - * 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. * 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 1b030956df4..26fac8a8af2 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 @@ -6,7 +6,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "model", - testonly = True, srcs = [ "CopyrightLicense.kt", "Dependency.kt", 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 dfbf60e6710..80f60824f26 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/maven/BUILD.bazel @@ -6,7 +6,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "generate_maven_dependencies_list_lib", - testonly = True, srcs = ["GenerateMavenDependenciesList.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ @@ -17,7 +16,6 @@ kt_jvm_library( kt_jvm_library( name = "retrieve_license_texts_lib", - testonly = True, srcs = ["RetrieveLicenseTexts.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ @@ -27,3 +25,14 @@ kt_jvm_library( "//scripts/src/java/org/oppia/android/scripts/proto:maven_dependencies_java_proto", ], ) + +kt_jvm_library( + name = "validate_maven_dependencies_lib", + srcs = ["ValidateMavenDependencies.kt"], + visibility = ["//scripts:oppia_script_binary_visibility"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/common:bazel_client", + "//scripts/src/java/org/oppia/android/scripts/license:maven_coordinate", + "//scripts/src/java/org/oppia/android/scripts/maven/model", + ], +) 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 f58b82dac66..36313549404 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt +++ b/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt @@ -25,7 +25,7 @@ import org.oppia.android.scripts.proto.MavenDependencyList * - path_to_maven_dependencies_pb: relative path to the maven_dependencies.pb file. * Example: * bazel run //scripts:generate_maven_dependencies_list -- $(pwd) - * third_party/maven_install.json scripts/assets/maven_dependencies.textproto + * third_party/versions/maven_install.json scripts/assets/maven_dependencies.textproto * scripts/assets/maven_dependencies.pb */ fun main(args: Array) { diff --git a/scripts/src/java/org/oppia/android/scripts/maven/ValidateMavenDependencies.kt b/scripts/src/java/org/oppia/android/scripts/maven/ValidateMavenDependencies.kt new file mode 100644 index 00000000000..80a0459b23c --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/maven/ValidateMavenDependencies.kt @@ -0,0 +1,549 @@ +package org.oppia.android.scripts.maven + +import com.squareup.moshi.Moshi +import org.oppia.android.scripts.common.BazelClient +import org.oppia.android.scripts.common.CommandExecutorImpl +import org.oppia.android.scripts.common.ScriptBackgroundCoroutineDispatcher +import org.oppia.android.scripts.license.MavenCoordinate +import org.oppia.android.scripts.maven.ValidateMavenDependencies.MavenVersionsList.ReferenceScope +import org.oppia.android.scripts.maven.ValidateMavenDependencies.MavenVersionsList.ReferenceType +import org.oppia.android.scripts.maven.model.MavenInstallJson +import java.io.File + +/** + * Script for validating that Maven dependencies are unique, needed, and correctly represented in + * Bazel. + * + * Usage: + * bazel run //scripts:validate_maven_dependencies -- \ + * \ + * + * + * Arguments: + * - path_to_repo_root: directory path to the root of the Oppia Android repository. + * - path_to_direct_maven_versions: relative path to the tree's direct_maven_versions.bzl file. + * - path_to_transitive_maven_versions: relative path to the tree's transitive_maven_versions.bzl. + * - path_to_direct_maven_install_manifest: relative path to the tree's maven_install.json file. + * - third_party_base_target: the base target of all generated third-party dependencies + * (e.g. "//scripts/third_party" for scripts dependencies). + * - bazel_universe_scope: the Bazel target pattern from which all dependent targets should exist + * (e.g. "//..." for app dependencies). + * + * Example: + * bazel run //scripts:validate_maven_dependencies -- $(pwd) \ + * third_party/versions/direct_maven_versions.bzl \ + * third_party/versions/transitive_maven_versions.bzl third_party/versions/maven_install.json \ + * //third_party //... + * + * Note that all arguments must be relatively consistent for a particular dependency tree (since the + * repository has more than one, e.g. for app and scripts builds). Also, this script may not produce + * desired results if the provided Maven installation manifest file (maven_install.json) isn't + * up-to-date. + */ +fun main(vararg args: String) { + check(args.size == 6) { + "Usage: bazel run //scripts:validate_maven_dependencies -- " + + " " + + " " + + " " + + " " + } + val repoRootPath = args[0] + val directVersionsPath = args[1] + val transitiveVersionsPath = args[2] + val mavenInstallPath = args[3] + val baseTarget = args[4] + val universeScope = args[5] + val repoRootFile = File(repoRootPath).absoluteFile.normalize().also { + check(it.exists()) { "Repo root does not exist: $repoRootPath." } + } + val directVersionsFile = File(repoRootFile, directVersionsPath).absoluteFile.normalize().also { + check(it.exists()) { "Direct versions Bazel file does not exist: $directVersionsPath." } + } + val transitiveVersionsFile = File( + repoRootFile, transitiveVersionsPath + ).absoluteFile.normalize().also { + check(it.exists()) { "Transitive versions Bazel file does not exist: $transitiveVersionsPath." } + } + val mavenInstallFile = File(repoRootFile, mavenInstallPath).absoluteFile.normalize().also { + check(it.exists()) { "Maven installation JSON file does not exist: $mavenInstallPath." } + } + ScriptBackgroundCoroutineDispatcher().use { scriptBgDispatcher -> + val commandExecutor = CommandExecutorImpl(scriptBgDispatcher) + val bazelClient = BazelClient(repoRootFile, commandExecutor, universeScope) + val validator = ValidateMavenDependencies(repoRootFile, bazelClient, universeScope, baseTarget) + validator.validateDependencies(directVersionsFile, transitiveVersionsFile, mavenInstallFile) + } +} + +/** + * Validator for Maven dependencies. + * + * This shouldn't be used directly. Instead, invoke the functionality of this script using a Kotlin + * binary via [main]. + * + * @property repoRoot the root [File] of the repository + * @property bazelClient an interactive [BazelClient] initialized for the provided repository + * @property universeScope the Bazel target universe in which queries will be run + * @property baseTarget the base target where generated third-party dependency wrappers will be + */ +class ValidateMavenDependencies( + private val repoRoot: File, + private val bazelClient: BazelClient, + private val universeScope: String, + private val baseTarget: String +) { + /** + * Validates the provided dependency lists for consistency and necessity. + * + * @param directVersions the [File] corresponding to directly dependent production & test Maven + * artifacts + * @param transitiveVersions the [File] corresponding to transitive (indirectly dependent) + * production & test Maven artifacts + * @param mavenInstallFile the [File] corresponding to the generated Maven installation manifest + * that contains the comprehensive list of required dependencies + */ + fun validateDependencies( + directVersions: File, + transitiveVersions: File, + mavenInstallFile: File + ) { + println("Using repository: ${repoRoot.path}.") + println("Using direct Maven versions file: ${directVersions.toRelativeString(repoRoot)}.") + println("Using transitive versions file: ${transitiveVersions.toRelativeString(repoRoot)}.") + println("Using maven_install.json file: ${mavenInstallFile.toRelativeString(repoRoot)}.") + println("Using universe scope: $universeScope") + println("Using base third-party target: $baseTarget") + println() + + println("Parsing dependencies lists...") + val (prodDirectDeps, testDirectDeps) = + parseMavenVersionsLists(directVersions, ReferenceType.DIRECT) + val (prodTransitiveDeps, testTransitiveDeps) = + parseMavenVersionsLists(transitiveVersions, ReferenceType.TRANSITIVE) + val mavenInstallJson = parseMavenInstallJson(mavenInstallFile) + + // First, ensure there are no version conflicts being resolved (since it means the versions file + // is out-of-date with what's actually being used in the Maven installation manifest). + checkForConflictResolutions( + mavenInstallJson, directVersions, transitiveVersions, mavenInstallFile + ) + + // Second, verify that there are no duplications across any of the lists (they are all expected + // to be mutually exclusive). Note that this includes cases when tests try to expose a reference + // to a transitive production dependency. This is, inherently, not allowed because prod + // dependencies cannot depend on artifacts marked as test-only. Such artifacts should be exposed + // as explicit production dependencies, instead. + println("Checking for dependency list non-exclusivity...") + checkForCommonDeps(directVersions, transitiveVersions, prodDirectDeps, prodTransitiveDeps) + checkForCommonDeps(directVersions, transitiveVersions, prodDirectDeps, testDirectDeps) + checkForCommonDeps(directVersions, transitiveVersions, prodDirectDeps, testTransitiveDeps) + checkForCommonDeps(directVersions, transitiveVersions, prodTransitiveDeps, testDirectDeps) + checkForCommonDeps(directVersions, transitiveVersions, prodTransitiveDeps, testTransitiveDeps) + checkForCommonDeps(directVersions, transitiveVersions, testDirectDeps, testTransitiveDeps) + + // Third, check that direct dependencies have references within the universe scope. Note that + // transitive dependencies do not need to be checked because they don't generate referenceable + // third-party targets (so the build graph won't resolve). + println("Check for unreferenced production dependencies...") + checkForUnreferencedDeps(directVersions, prodDirectDeps, DIRECT_PRODUCTION_DEP_EXEMPTIONS) + println("Check for unreferenced test dependencies...") + checkForUnreferencedDeps(directVersions, testDirectDeps, exemptions = emptySet()) + + // Fourth, compute expected transitive dependencies & verify that all are explicitly listed. + println("Checking for extra and missing transitive dependencies...") + val expectedProdTransitiveDeps = + prodDirectDeps.computeExpectedTransitiveDependencies(mavenInstallJson) + val expectedTestTransitiveDeps = + testDirectDeps.computeExpectedTransitiveDependencies(mavenInstallJson) + checkForExactExplicitTransitiveDeps( + transitiveVersions, + prodTransitiveDeps, + extraTransitiveMavenVersionsLists = emptyList(), + expectedProdTransitiveDeps + ) + checkForExactExplicitTransitiveDeps( + transitiveVersions, + testTransitiveDeps, + // Test deps can depend on prod deps and shouldn't lead to re-listing the dep. + extraTransitiveMavenVersionsLists = listOf(prodDirectDeps, prodTransitiveDeps), + expectedTestTransitiveDeps + ) + + // Fifth, perform a sanity check to make sure that all dependencies reported by the Maven + // installation manifest are explicitly defined. + checkForComprehensiveVersionCoverage( + directVersions, + transitiveVersions, + allExplicitDepCoords = listOf( + prodDirectDeps, prodTransitiveDeps, testDirectDeps, testTransitiveDeps + ).flatMapTo(mutableSetOf()) { it.dependencyCoords }, + mavenInstallJson + ) + + println( + "Everything seems correct in ${directVersions.toRelativeString(repoRoot)}," + + " ${transitiveVersions.toRelativeString(repoRoot)}, and" + + " ${mavenInstallFile.toRelativeString(repoRoot)}!" + ) + } + + private fun MavenVersionsList.computeExpectedTransitiveDependencies( + mavenInstallJson: InterpretedMavenInstallJson + ): Set { + return computeTransitiveClosures(mavenInstallJson).values.flatMapTo(mutableSetOf()) { it } - + dependencyCoords + } + + private fun MavenVersionsList.computeTransitiveClosures( + mavenInstallJson: InterpretedMavenInstallJson + ): Map> { + return dependencyCoords.associateWith { coord -> + computeTransitiveClosure(mavenInstallJson.dependencies, coord) + } + } + + private fun computeTransitiveClosure( + allDeps: Map>, + coord: MavenCoordinate + ): Set { + return allDeps.find(coord)?.flatMapTo(mutableSetOf()) { + computeTransitiveClosure(allDeps, it) + it + } ?: emptySet() + } + + private fun checkForConflictResolutions( + mavenInstallJson: InterpretedMavenInstallJson, + directVersionsFile: File, + transitiveVersions: File, + mavenInstallFile: File + ) { + val resolutions = mavenInstallJson.conflictResolutions + check(resolutions.isEmpty()) { + "There are conflict resolutions in ${mavenInstallFile.toRelativeString(repoRoot)}. Please" + + " resolve these by updating the versions in" + + " ${directVersionsFile.toRelativeString(repoRoot)} or" + + " ${transitiveVersions.toRelativeString(repoRoot)}. The following coordinates require" + + " updating:\n" + + resolutions.entries.joinToString(separator = "\n") { (key, value) -> + "- ${key.reducedCoordinateStringWithoutVersion}: ${key.version} (old) =>" + + " ${value.version} (new)" + } + } + } + + private fun checkForCommonDeps( + directVersionsFile: File, + transitiveVersionsFile: File, + list1: MavenVersionsList, + list2: MavenVersionsList + ) { + val commonDeps = list1.dependencyCoords.intersect(list2.dependencyCoords) + check(commonDeps.isEmpty()) { + "In ${directVersionsFile.toRelativeString(repoRoot)} and" + + " ${transitiveVersionsFile.toRelativeString(repoRoot)}, some dependencies are common" + + " between ${list1.name} and ${list2.name} dependencies. All dependencies should be" + + " unique. Common dependencies:\n" + + commonDeps.asPrintableList().joinToString(separator = "\n") { "- $it" } + } + } + + private fun checkForUnreferencedDeps( + directVersionsFile: File, + mavenVersionsList: MavenVersionsList, + exemptions: Set + ) { + val unusedTargets = mavenVersionsList.filterUnusedTargets() - exemptions + check(unusedTargets.isEmpty()) { + "In ${directVersionsFile.toRelativeString(repoRoot)}, direct dependency list" + + " ${mavenVersionsList.name} includes unused dependencies:\n" + + unusedTargets.asPrintableList().joinToString(separator = "\n") { "- $it" } + } + } + + private fun checkForExactExplicitTransitiveDeps( + transitiveVersionsFile: File, + transitiveMavenVersionsList: MavenVersionsList, + extraTransitiveMavenVersionsLists: List, + transitiveDeps: Set + ) { + val transitiveDepCoords = transitiveMavenVersionsList.dependencyCoords + val extraListedDeps = transitiveDepCoords - transitiveDeps + val allowedTransitiveDeps = + transitiveDepCoords + + extraTransitiveMavenVersionsLists.flatMapTo(mutableSetOf()) { it.dependencyCoords } + val missingDeps = transitiveDeps - allowedTransitiveDeps + check(extraListedDeps.isEmpty()) { + "In ${transitiveVersionsFile.toRelativeString(repoRoot)}, transitive dependencies list" + + " ${transitiveMavenVersionsList.name} has extra transitive deps not used by any direct" + + " targets. Please remove them:\n" + + extraListedDeps.asPrintableList().joinToString(separator = "\n") { "- $it" } + } + check(missingDeps.isEmpty()) { + "In ${transitiveVersionsFile.toRelativeString(repoRoot)}, transitive dependencies list" + + " ${transitiveMavenVersionsList.name} is missing expected extra transitive deps. Please" + + " add them:\n" + + missingDeps.sorted().joinToString(separator = "\n") { + " \"${it.reducedCoordinateStringWithoutVersion}\": \"${it.version}\"," + } + } + } + + private fun checkForComprehensiveVersionCoverage( + directVersionsFile: File, + transitiveVersionsFile: File, + allExplicitDepCoords: Set, + mavenInstallJson: InterpretedMavenInstallJson + ) { + val allExpectedDepCoords = mavenInstallJson.artifactCoords + val missingExplicitDepCoords = allExplicitDepCoords - allExpectedDepCoords + val missingExpectedDepCoords = allExpectedDepCoords - allExplicitDepCoords + check(missingExplicitDepCoords.isEmpty()) { + "Something went wrong when validating Maven dependencies. Maybe try repinning the" + + " dependencies? The following dependencies are extra in" + + " ${directVersionsFile.toRelativeString(repoRoot)} or" + + " ${transitiveVersionsFile.toRelativeString(repoRoot)}:\n" + + missingExplicitDepCoords.asPrintableList().joinToString(separator = "\n") { "- $it" } + } + check(missingExpectedDepCoords.isEmpty()) { + "Something went wrong when validating Maven dependencies. Maybe try repinning the" + + " dependencies? The following dependencies are missing from" + + " ${directVersionsFile.toRelativeString(repoRoot)} or" + + " ${transitiveVersionsFile.toRelativeString(repoRoot)}:\n" + + missingExpectedDepCoords.asPrintableList().joinToString(separator = "\n") { "- $it" } + } + } + + private fun MavenVersionsList.filterUnusedTargets(): Set { + return when (referenceScope) { + ReferenceScope.PRODUCTION -> + filterUnusedTargets(bazelClient::retrieveDependingProdTargets) + ReferenceScope.TEST -> + filterUnusedTargets(bazelClient::retrieveDependingTestTargets) + } + } + + private fun MavenVersionsList.filterUnusedTargets( + retrieveTargets: (Iterable) -> List + ) = dependencyCoords.filter { retrieveDependingTargets(it, retrieveTargets).isEmpty() }.toSet() + + private fun retrieveDependingTargets( + coord: MavenCoordinate, + retrieveTargets: (Iterable) -> List + ): List { + val target = coord.toTarget() + return retrieveTargets(listOf(target)).filterNot { it == target } + } + + private fun parseMavenVersionsLists( + versionsList: File, + referenceType: ReferenceType + ): Pair { + data class DependencyBucket( + val name: String, + val scope: ReferenceScope, + var wasInList: Boolean = false + ) + val dependencyBuckets = ReferenceScope.values().map { + DependencyBucket(name = referenceType.computeDependencyBucketName(it), scope = it) + } + return versionsList.inputStream().bufferedReader().use { reader -> + var currentBucket: DependencyBucket? = null + return@use reader.lineSequence().mapIndexedNotNull { index, line -> + when { + currentBucket != null && line != "}" -> { + // Note the '!!' here is because Kotlin can't guarantee a smart-cast despite the + // surrounding code currently making it impossible for this to become non-null from the + // condition check to here. + BAZEL_VERSION_DECLARATION_REGEX.matchEntire(line)?.let { matchResult -> + val (artifactCoordinate, artifactVersion) = matchResult.destructured + val coordinate = MavenCoordinate.parseFrom("$artifactCoordinate:$artifactVersion") + return@let currentBucket!! to coordinate + } ?: error( + "${versionsList.toRelativeString(repoRoot)}:${index + 1}: Invalid artifact line." + ) + } + currentBucket != null && line == "}" -> null.also { currentBucket = null } + else -> { + dependencyBuckets.find { bucket -> + !bucket.wasInList && line == "${bucket.name} = {" + }?.let { bucket -> + currentBucket = bucket + bucket.wasInList = true + return@let null // Always skip the starting line. + } + } + } + }.groupBy { (bucket, _) -> bucket.scope }.mapValues { (_, coordinatePairs) -> + coordinatePairs.map { (_, coordinate) -> coordinate }.toSet() + }.also { + val expectedScopes = ReferenceScope.values().toSet() + val foundScopes = it.keys + val missingScopes = expectedScopes - foundScopes + val extraScopes = foundScopes - expectedScopes + check(missingScopes.isEmpty() && extraScopes.isEmpty()) { + "${versionsList.toRelativeString(repoRoot)}: Missing or extra dependencies. Found:" + + " $foundScopes. Expected: $expectedScopes." + } + }.mapValues { (referenceScope, dependencyCoords) -> + MavenVersionsList( + name = referenceType.computeDependencyBucketName(referenceScope), + dependencyCoords, + referenceType, + referenceScope + ) + }.let { it.getValue(ReferenceScope.PRODUCTION) to it.getValue(ReferenceScope.TEST) } + } + } + + private fun parseMavenInstallJson(mavenInstallFile: File): InterpretedMavenInstallJson { + val mavenInstallJsonText = mavenInstallFile.inputStream().bufferedReader().use { it.readText() } + val moshi = Moshi.Builder().build() + val adapter = moshi.adapter(MavenInstallJson::class.java) + return InterpretedMavenInstallJson.createFrom( + adapter.fromJson(mavenInstallJsonText) ?: error("Failed to parse $mavenInstallFile.") + ) + } + + private fun MavenCoordinate.toTarget() = + "$baseTarget:${reducedCoordinateStringWithoutVersion.replace(":", "_").replace(".", "_")}" + + /** + * Represents a list of Maven artifact versions within a specific build context. + * + * @property name the name of the versions list defined within a Bazel (.bzl) versions file + * @property dependencyCoords the unique [MavenCoordinate]s defined within the Bazel dict + * @property referenceType the [ReferenceType] that's partly defining this list's build context + * @property referenceScope the [ReferenceScope] that's partly defining this list's build context + */ + private data class MavenVersionsList( + val name: String, + val dependencyCoords: Set, + val referenceType: ReferenceType, + val referenceScope: ReferenceScope + ) { + /** Represents _how_ a dependency may be referenced elsewhere in the build scope. */ + enum class ReferenceType(private val depsBucketNameTemplate: String) { + /** Corresponds to directly referenceable dependencies. */ + DIRECT(depsBucketNameTemplate = "%s_DEPENDENCY_VERSIONS"), + + /** + * Corresponds to not-referenceable dependencies that are still required to build the end + * binary of the build context. + */ + TRANSITIVE(depsBucketNameTemplate = "%s_TRANSITIVE_DEPENDENCY_VERSIONS"); + + /** + * Returns the Bazel dict bucket name corresponding to this [ReferenceType] and the specified + * [ReferenceScope]. + */ + fun computeDependencyBucketName(referenceScope: ReferenceScope): String = + depsBucketNameTemplate.format(referenceScope.scopeName) + } + + /** Represents _where_ a dependency may be referenced elsewhere in the build scope. */ + enum class ReferenceScope(val scopeName: String) { + /** Corresponds to dependencies that may be referenced from both production & test targets. */ + PRODUCTION(scopeName = "PRODUCTION"), + + /** Corresponds to dependencies that may only be referenced from tests and test libraries. */ + TEST(scopeName = "TEST") + } + } + + /** + * Represents an interpreted version of [MavenInstallJson]. + * + * @property conflictResolutions map of requested [MavenCoordinate]s to resolved + * [MavenCoordinate]s which resolves potential incompatible version conflicts + * @property artifactCoords all unique [MavenCoordinate]s of depending artifacts + * @property dependencies map of artifact [MavenCoordinate]s to all dependent artifact + * [MavenCoordinate]s + */ + private data class InterpretedMavenInstallJson( + val conflictResolutions: Map, + val artifactCoords: Set, + val dependencies: Map> + ) { + companion object { + /** + * Returns a new [InterpretedMavenInstallJson] interpretation of the provided + * [MavenInstallJson]. + */ + fun createFrom(installJson: MavenInstallJson): InterpretedMavenInstallJson { + val interpretedCoords = + installJson.artifacts.mapTo(mutableSetOf()) { (partialCoord, artifact) -> + MavenCoordinate.parseFrom("$partialCoord:${artifact.version}") + } + val coordsWithoutVersion = interpretedCoords.asPartialReferenceMap() + return InterpretedMavenInstallJson( + conflictResolutions = installJson.conflictResolutions?.map { (keyCoord, valueCoord) -> + MavenCoordinate.parseFrom(keyCoord) to MavenCoordinate.parseFrom(valueCoord) + }?.toMap() ?: emptyMap(), + artifactCoords = interpretedCoords, + dependencies = installJson.dependencies.mapKeys { (partialCoord, _) -> + coordsWithoutVersion.getValue(partialCoord.reinterpretPartialCoord()) + }.mapValues { (_, deps) -> + deps.mapTo(mutableSetOf()) { + coordsWithoutVersion.getValue(it.reinterpretPartialCoord()) + } + } + ) + } + + private fun String.reinterpretPartialCoord(): String = + MavenCoordinate.parseFrom("$this:fake-version").reducedCoordinateStringWithoutVersion + } + } + + private companion object { + private val BAZEL_VERSION_DECLARATION_REGEX = + "^\\s+\"([\\w:.\\-]+)\":\\s+\"([\\w:.\\-]+)\",$".toRegex() + + /** + * Special dependencies that may be listed as direct production dependencies due to external + * toolchain usage, but may not be directly referenced. + */ + private val DIRECT_PRODUCTION_DEP_EXEMPTIONS = setOf( + MavenCoordinate.parseFrom("com.google.dagger:dagger:2.41"), + MavenCoordinate.parseFrom("com.google.dagger:dagger-compiler:2.41"), + MavenCoordinate.parseFrom("com.google.dagger:dagger-producers:2.41"), + MavenCoordinate.parseFrom("com.google.dagger:dagger-spi:2.41") + ) + + private fun Map.find(coord: MavenCoordinate): V? { + val matchingCoord = coord.reducedCoordinateStringWithoutVersion + return entries.find { (coord, _) -> + coord.reducedCoordinateStringWithoutVersion == matchingCoord + }?.value + } + + private fun Set.intersect( + other: Set + ): Set { + val thisReferenceMap = asPartialReferenceMap() + val otherReferenceMap = other.asPartialReferenceMap() + val newCoords = thisReferenceMap.keys.intersect(otherReferenceMap.keys) + return newCoords.mapTo(mutableSetOf(), thisReferenceMap::getValue) + } + + private operator fun Set.minus( + other: Set + ): Set { + val thisReferenceMap = asPartialReferenceMap() + val otherReferenceMap = other.asPartialReferenceMap() + val combinedMap = (this + other).asPartialReferenceMap() + val newCoords = thisReferenceMap.keys - otherReferenceMap.keys + return newCoords.mapTo(mutableSetOf(), combinedMap::getValue) + } + + private fun Set.asPartialReferenceMap(): Map = + associateBy(MavenCoordinate::reducedCoordinateStringWithoutVersion) + + private fun Set.sorted(): List = + sortedBy(MavenCoordinate::reducedCoordinateStringWithoutVersion) + + private fun Set.asPrintableList(): List = + sorted().map(MavenCoordinate::reducedCoordinateStringWithoutVersion) + } +} 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 4ad35ca52ee..6ef7903d70a 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 @@ -6,11 +6,10 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "model", - testonly = True, srcs = [ "MavenArtifact.kt", "MavenInstallJson.kt", ], visibility = ["//scripts:oppia_script_library_visibility"], - deps = ["//third_party:moshi"], + deps = ["//scripts/third_party:moshi"], ) 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 index 9b78a4a483a..dae2d4a55c4 100644 --- a/scripts/src/java/org/oppia/android/scripts/maven/model/MavenInstallJson.kt +++ b/scripts/src/java/org/oppia/android/scripts/maven/model/MavenInstallJson.kt @@ -6,11 +6,21 @@ import com.squareup.moshi.JsonClass /** * Represents a parsable a maven_install_json file. * + * @property conflictResolutions an optional map of version-qualified artifact coordinates to + * version-qualified artifact coordinates. The keys are requested coordinates and the values are + * resolved coordinates, where the latter are expected to be higher versions than requested (due + * to competing version dependencies elsewhere in the dependency graph). This is ``null`` when + * there are no conflict resolutions (i.e. that all requested versions can be requested + * directly). * @property artifacts a map of artifact coordinate to [MavenArtifact] + * @property dependencies a map of artifact coordinates to a list of artifact coordinates upon which + * that artifact depends * @property repositories a map of repository URL to a list of [MavenArtifact] coordinates */ @JsonClass(generateAdapter = true) data class MavenInstallJson( + @Json(name = "conflict_resolution") val conflictResolutions: Map?, @Json(name = "artifacts") val artifacts: Map, + @Json(name = "dependencies") val dependencies: Map>, @Json(name = "repositories") val repositories: Map> ) 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 a0e21a4ae17..b35d6b32ac0 100644 --- a/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/regex/BUILD.bazel @@ -7,7 +7,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "regex_pattern_validation_check_lib", - testonly = True, srcs = ["RegexPatternValidationCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ 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 d826ace97d4..0f44bf686e7 100644 --- a/scripts/src/java/org/oppia/android/scripts/telemetry/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/telemetry/BUILD.bazel @@ -6,18 +6,17 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "decode_user_study_event_string_lib", - testonly = True, srcs = ["DecodeUserStudyEventString.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], runtime_deps = [ - "//third_party:org_eclipse_parsson_parsson", - "//third_party:org_snakeyaml_snakeyaml-engine", + "//scripts/third_party:org_eclipse_parsson_parsson", + "//scripts/third_party:org_snakeyaml_snakeyaml-engine", ], deps = [ "//model/src/main/proto:event_logger_java_proto", - "//third_party:com_google_protobuf_protobuf-java", - "//third_party:com_google_protobuf_protobuf-java-util", - "//third_party:io_xlate_yaml-json", - "//third_party:jakarta_json_jakarta_json-api", + "//scripts/third_party:com_google_protobuf_protobuf-java", + "//scripts/third_party:com_google_protobuf_protobuf-java-util", + "//scripts/third_party:io_xlate_yaml-json", + "//scripts/third_party:jakarta_json_jakarta_json-api", ], ) 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 a4d8c7c0074..4b2dbe0ecf0 100644 --- a/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/testfile/BUILD.bazel @@ -7,7 +7,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "test_file_check_lib", - testonly = True, srcs = ["TestFileCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ 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 d9ca45340c0..e2cc7984afe 100644 --- a/scripts/src/java/org/oppia/android/scripts/testing/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/testing/BUILD.bazel @@ -13,7 +13,7 @@ kt_jvm_library( ], visibility = ["//scripts:oppia_script_test_visibility"], deps = [ - "//third_party:com_google_truth_truth", + "//scripts/third_party:com_google_truth_truth", ], ) @@ -26,6 +26,6 @@ kt_jvm_library( visibility = ["//scripts:oppia_script_test_visibility"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:command_executor", - "//third_party:com_google_truth_truth", + "//scripts/third_party:com_google_truth_truth", ], ) 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 7c57cf0d10c..ed75f313fac 100644 --- a/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt +++ b/scripts/src/java/org/oppia/android/scripts/testing/TestBazelWorkspace.kt @@ -229,6 +229,7 @@ class TestBazelWorkspace(private val temporaryRootFolder: TemporaryFolder) { load("@rules_jvm_external//:defs.bzl", "maven_install") maven_install( + name = "maven_app", artifacts = artifactsList, repositories = [ "https://maven.google.com", diff --git a/scripts/src/java/org/oppia/android/scripts/testing/proto/BUILD.bazel b/scripts/src/java/org/oppia/android/scripts/testing/proto/BUILD.bazel new file mode 100644 index 00000000000..8f6b97790f2 --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/testing/proto/BUILD.bazel @@ -0,0 +1,13 @@ +load("@rules_java//java:defs.bzl", "java_proto_library") +load("//model:oppia_proto_library.bzl", "oppia_proto_library") + +oppia_proto_library( + name = "test_proto", + srcs = ["test.proto"], +) + +java_proto_library( + name = "test_java_proto", + visibility = ["//scripts:oppia_script_test_visibility"], + deps = [":test_proto"], +) diff --git a/scripts/src/java/org/oppia/android/scripts/testing/proto/test.proto b/scripts/src/java/org/oppia/android/scripts/testing/proto/test.proto new file mode 100644 index 00000000000..e62589077b5 --- /dev/null +++ b/scripts/src/java/org/oppia/android/scripts/testing/proto/test.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package model; + +option java_package = "org.oppia.android.scripts.testing.proto"; +option java_multiple_files = true; + +// A test message that is meant only to be used in tests. +message TestMessage { + string str_value = 1; + + int32 int_value = 2; + + repeated string str_values = 3; +} 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 bff6a523d44..6b15841e4c2 100644 --- a/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/todo/BUILD.bazel @@ -7,7 +7,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "todo_collector", - testonly = True, srcs = ["TodoCollector.kt"], visibility = ["//scripts:oppia_script_test_visibility"], deps = [ @@ -18,7 +17,6 @@ kt_jvm_library( kt_jvm_library( name = "todo_open_check_lib", - testonly = True, srcs = ["TodoOpenCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ @@ -32,7 +30,6 @@ kt_jvm_library( kt_jvm_library( name = "todo_issue_resolved_check_lib", - testonly = True, srcs = ["TodoIssueResolvedCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ @@ -44,7 +41,6 @@ kt_jvm_library( kt_jvm_library( name = "todo_issue_comment_check_lib", - testonly = True, srcs = ["TodoIssueCommentCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], ) 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 c4eedc1ea26..48752f80d8d 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 @@ -6,7 +6,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "todo", - testonly = True, srcs = ["Todo.kt"], visibility = ["//scripts:oppia_script_library_visibility"], ) 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 0657b000c49..b25d1a9b866 100644 --- a/scripts/src/java/org/oppia/android/scripts/xml/BUILD.bazel +++ b/scripts/src/java/org/oppia/android/scripts/xml/BUILD.bazel @@ -7,7 +7,6 @@ load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_library") kt_jvm_library( name = "string_language_translation_check_lib", - testonly = True, srcs = ["StringLanguageTranslationCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ @@ -17,7 +16,6 @@ kt_jvm_library( kt_jvm_library( name = "string_resource_parser", - testonly = True, srcs = ["StringResourceParser.kt"], visibility = ["//scripts:oppia_script_test_visibility"], deps = [ @@ -27,7 +25,6 @@ kt_jvm_library( kt_jvm_library( name = "string_resource_validation_check_lib", - testonly = True, srcs = ["StringResourceValidationCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ @@ -37,14 +34,12 @@ kt_jvm_library( kt_jvm_library( name = "xml_syntax_error_handler", - testonly = True, srcs = ["XmlSyntaxErrorHandler.kt"], visibility = ["//scripts:oppia_script_test_visibility"], ) kt_jvm_library( name = "xml_syntax_check_lib", - testonly = True, srcs = ["XmlSyntaxCheck.kt"], visibility = ["//scripts:oppia_script_binary_visibility"], deps = [ diff --git a/scripts/src/javatests/org/oppia/android/scripts/apkstats/BUILD.bazel b/scripts/src/javatests/org/oppia/android/scripts/apkstats/BUILD.bazel index 78073d09666..cf925a57eda 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/apkstats/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/apkstats/BUILD.bazel @@ -11,8 +11,8 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/apkstats:aapt2_client", "//scripts/src/java/org/oppia/android/scripts/common:android_build_sdk_properties", + "//scripts/third_party:com_google_truth_truth", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", ], ) @@ -22,8 +22,8 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/apkstats:apk_analyzer_client", "//scripts/src/java/org/oppia/android/scripts/common:android_build_sdk_properties", + "//scripts/third_party:com_google_truth_truth", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", ], ) @@ -32,8 +32,8 @@ kt_jvm_test( srcs = ["BundleToolClientTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/apkstats:bundle_tool_client", + "//scripts/third_party:com_google_truth_truth", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", ], ) @@ -42,7 +42,7 @@ kt_jvm_test( srcs = ["ComputeAabDifferencesTest.kt"], data = ["@androidsdk//:aapt2_binary"], runtime_deps = [ - "//third_party:android_bundletool", + "//scripts/third_party:android_bundletool", ], deps = [ "//scripts/src/java/org/oppia/android/scripts/apkstats:aapt2_client", @@ -50,7 +50,7 @@ kt_jvm_test( "//scripts/src/java/org/oppia/android/scripts/apkstats:bundle_tool_client", "//scripts/src/java/org/oppia/android/scripts/apkstats:compute_aab_differences_lib", "//scripts/src/java/org/oppia/android/scripts/common:android_build_sdk_properties", + "//scripts/third_party:com_google_truth_truth", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", ], ) 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 5e5127bae83..e48be9c0294 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/build/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/build/BUILD.bazel @@ -9,9 +9,9 @@ kt_jvm_test( srcs = ["FilterPerLanguageResourcesTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/build:filter_per_language_resources_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:junit_junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:junit_junit", ], ) @@ -21,8 +21,8 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/build:transform_android_manifest_lib", "//scripts/src/java/org/oppia/android/scripts/testing:test_git_repository", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) 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 fa1a3c2798a..41e299e2646 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/ci/BUILD.bazel @@ -14,9 +14,9 @@ kt_jvm_test( "//scripts/src/java/org/oppia/android/scripts/common:proto_string_encoder", "//scripts/src/java/org/oppia/android/scripts/testing:test_bazel_workspace", "//scripts/src/java/org/oppia/android/scripts/testing:test_git_repository", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -26,8 +26,8 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/ci:retrieve_affected_tests_lib", "//scripts/src/java/org/oppia/android/scripts/common:proto_string_encoder", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) 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 b4e81b569db..89771f56985 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BUILD.bazel @@ -12,10 +12,10 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/common:bazel_client", "//scripts/src/java/org/oppia/android/scripts/testing:test_bazel_workspace", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_mockito_mockito-core", "//testing:assertion_helpers", "//testing/src/main/java/org/oppia/android/testing/mockito", - "//third_party:com_google_truth_truth", - "//third_party:org_mockito_mockito-core", ], ) @@ -24,7 +24,7 @@ kt_jvm_test( srcs = ["AndroidBuildSdkPropertiesTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:android_build_sdk_properties", - "//third_party:com_google_truth_truth", + "//scripts/third_party:com_google_truth_truth", ], ) @@ -33,8 +33,8 @@ kt_jvm_test( srcs = ["CommandExecutorImplTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:command_executor", + "//scripts/third_party:com_google_truth_truth", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", ], ) @@ -44,8 +44,8 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/common:git_client", "//scripts/src/java/org/oppia/android/scripts/testing:test_git_repository", + "//scripts/third_party:com_google_truth_truth", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", ], ) @@ -55,9 +55,9 @@ kt_jvm_test( deps = [ "//scripts/src/java/org/oppia/android/scripts/common:github_client", "//scripts/src/java/org/oppia/android/scripts/common/testing:fake_command_executor", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:com_squareup_okhttp3_mockwebserver", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:com_squareup_okhttp3_mockwebserver", ], ) @@ -65,11 +65,11 @@ kt_jvm_test( name = "ProtoStringEncoderTest", srcs = ["ProtoStringEncoderTest.kt"], deps = [ - "//model/src/main/proto:test_models", "//scripts/src/java/org/oppia/android/scripts/common:proto_string_encoder", + "//scripts/src/java/org/oppia/android/scripts/testing/proto:test_java_proto", + "//scripts/third_party:com_google_truth_extensions_truth-liteproto-extension", + "//scripts/third_party:com_google_truth_truth", "//testing:assertion_helpers", - "//third_party:com_google_truth_extensions_truth-liteproto-extension", - "//third_party:com_google_truth_truth", ], ) @@ -78,8 +78,8 @@ kt_jvm_test( srcs = ["RepositoryFileTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:repository_file", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -88,8 +88,8 @@ kt_jvm_test( srcs = ["ScriptBackgroundCoroutineDispatcherTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common:script_background_coroutine_dispatcher", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//scripts/third_party:org_mockito_mockito-core", "//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 3f451d354b8..f180ef21a81 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/BazelClientTest.kt @@ -158,42 +158,42 @@ class BazelClientTest { } @Test - fun testRetrieveRelatedTestTargets_forTargetWithNoTestDependency_returnsNoTargets() { + fun testRetrieveDependingTestTargets_forTargetWithNoTestDependency_returnsNoTargets() { val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary("SomeDependency") testBazelWorkspace.createTest("FirstTest") - val testTargets = bazelClient.retrieveRelatedTestTargets(listOf("//:SomeDependency.kt")) + val testTargets = bazelClient.retrieveDependingTestTargets(listOf("//:SomeDependency.kt")) // Since the target doesn't have any tests depending on it, there are no targets to provide. assertThat(testTargets).isEmpty() } @Test - fun testRetrieveRelatedTestTargets_forTestFileTarget_returnsTestTarget() { + fun testRetrieveDependingTestTargets_forTestFileTarget_returnsTestTarget() { val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest") - val testTargets = bazelClient.retrieveRelatedTestTargets(listOf("//:FirstTest.kt")) + val testTargets = bazelClient.retrieveDependingTestTargets(listOf("//:FirstTest.kt")) assertThat(testTargets).containsExactly("//:FirstTest") } @Test - fun testRetrieveRelatedTestTargets_forDependentFileTarget_returnsTestTarget() { + fun testRetrieveDependingTestTargets_forDependentFileTarget_returnsTestTarget() { val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createTest("FirstTest", withGeneratedDependency = true) - val testTargets = bazelClient.retrieveRelatedTestTargets(listOf("//:FirstTestDependency.kt")) + val testTargets = bazelClient.retrieveDependingTestTargets(listOf("//:FirstTestDependency.kt")) assertThat(testTargets).containsExactly("//:FirstTest") } @Test - fun testRetrieveRelatedTestTargets_forMixedFileTargets_returnsRelatedTestTargets() { + fun testRetrieveDependingTestTargets_forMixedFileTargets_returnsRelatedTestTargets() { val bazelClient = BazelClient(tempFolder.root, commandExecutor) testBazelWorkspace.initEmptyWorkspace() testBazelWorkspace.createLibrary("ExtraDep") @@ -203,7 +203,7 @@ class BazelClientTest { testBazelWorkspace.createTest("FourthTest", subpackage = "subpackage") val testTargets = - bazelClient.retrieveRelatedTestTargets( + bazelClient.retrieveDependingTestTargets( listOf("//:SecondTestDependency.kt", "//subpackage:FourthTest.kt", "//:ExtraDep.kt") ) @@ -217,12 +217,12 @@ class BazelClientTest { } @Test - fun testRetrieveRelatedTestTargets_resultsJumbled_returnsCorrectTestTargets() { + fun testRetrieveDependingTestTargets_resultsJumbled_returnsCorrectTestTargets() { val bazelClient = BazelClient(tempFolder.root, mockCommandExecutor) fakeCommandExecutorWithResult(singleLine = "//:FirstTest//:SecondTest") val testTargets = - bazelClient.retrieveRelatedTestTargets(listOf("//:FirstTest.kt", "//:SecondTest.kt")) + bazelClient.retrieveDependingTestTargets(listOf("//:FirstTest.kt", "//:SecondTest.kt")) assertThat(testTargets).containsExactly("//:FirstTest", "//:SecondTest") } @@ -347,7 +347,7 @@ class BazelClientTest { val thirdPartyDependenciesList = bazelClient.retrieveThirdPartyMavenDepsListForBinary("//:test_oppia") - assertThat(thirdPartyDependenciesList).contains("@maven//:androidx_annotation_annotation") + assertThat(thirdPartyDependenciesList).contains("@maven_app//:androidx_annotation_annotation") } @Test @@ -376,7 +376,8 @@ class BazelClientTest { val thirdPartyDependenciesList = bazelClient.retrieveThirdPartyMavenDepsListForBinary("//:test_oppia") - assertThat(thirdPartyDependenciesList).doesNotContain("@maven//:androidx_annotation_annotation") + assertThat(thirdPartyDependenciesList) + .doesNotContain("@maven_app//:androidx_annotation_annotation") } private fun fakeCommandExecutorWithResult(singleLine: String) { @@ -403,7 +404,7 @@ class BazelClientTest { name = "${omitVersionAndReplacePeriodsAndColons(artifactName)}", visibility = ["//visibility:public"], exports = [ - artifact("$artifactName") + artifact("$artifactName", repository_name = "maven_app") ], ) """.trimIndent() + "\n" 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 fa1e4d6525a..fa5558a4bc7 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/common/ProtoStringEncoderTest.kt @@ -5,9 +5,9 @@ import com.google.common.truth.extensions.proto.LiteProtoTruth.assertThat import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder -import org.oppia.android.app.model.TestMessage import org.oppia.android.scripts.common.ProtoStringEncoder.Companion.mergeFromCompressedBase64 import org.oppia.android.scripts.common.ProtoStringEncoder.Companion.toCompressedBase64 +import org.oppia.android.scripts.testing.proto.TestMessage import org.oppia.android.testing.assertThrows import java.io.EOFException import java.util.zip.ZipException 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 4b236ea4493..a3083f7f504 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 @@ -9,7 +9,7 @@ kt_jvm_test( srcs = ["FakeCommandExecutorTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/common/testing:fake_command_executor", + "//scripts/third_party:com_google_truth_truth", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", ], ) 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 4fc4b9a9d53..5aca0d4b029 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/docs/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/docs/BUILD.bazel @@ -9,8 +9,8 @@ kt_jvm_test( srcs = ["KdocValidityCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/docs:kdoc_validity_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) 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 e29f497fbf6..bd50b52c382 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/label/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/label/BUILD.bazel @@ -10,8 +10,8 @@ kt_jvm_test( srcs = ["AccessibilityLabelCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/label:accessibility_label_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) 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 a8019878db5..a3a2ba095fb 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/license/BUILD.bazel @@ -9,9 +9,20 @@ kt_jvm_test( srcs = ["LicenseTextsCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/license:license_texts_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//testing:assertion_helpers", + ], +) + +kt_jvm_test( + name = "MavenCoordinateTest", + srcs = ["MavenCoordinateTest.kt"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/license:maven_coordinate", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -23,10 +34,10 @@ kt_jvm_test( 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", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//scripts/third_party:org_mockito_kotlin_mockito-kotlin", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", - "//third_party:org_mockito_kotlin_mockito-kotlin", ], ) @@ -37,9 +48,9 @@ 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", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//scripts/third_party:org_mockito_kotlin_mockito-kotlin", "//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/MavenCoordinateTest.kt b/scripts/src/javatests/org/oppia/android/scripts/license/MavenCoordinateTest.kt new file mode 100644 index 00000000000..5b5e6a909c7 --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenCoordinateTest.kt @@ -0,0 +1,492 @@ +package org.oppia.android.scripts.license + +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.oppia.android.testing.assertThrows + +/** Tests for [MavenCoordinate]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +class MavenCoordinateTest { + @Test + fun testParseFrom_emptyString_throwsError() { + val error = assertThrows { + MavenCoordinate.parseFrom(coordinateString = "") + } + + assertThat(error).hasMessageThat().contains("Invalid Maven coordinate string") + } + + @Test + fun testParseFrom_oneComponentString_throwsError() { + val error = assertThrows { + MavenCoordinate.parseFrom("org.oppia.fake-group") + } + + assertThat(error).hasMessageThat().contains("Invalid Maven coordinate string") + } + + @Test + fun testParseFrom_twoComponentString_throwsError() { + val error = assertThrows { + MavenCoordinate.parseFrom("org.oppia.fake-group:and.fake-art") + } + + assertThat(error).hasMessageThat().contains("Invalid Maven coordinate string") + } + + @Test + fun testParseFrom_sixComponentString_throwsError() { + val error = assertThrows { + MavenCoordinate.parseFrom("one:two:three:four:five:six") + } + + assertThat(error).hasMessageThat().contains("Invalid Maven coordinate string") + } + + @Test + fun testParseFrom_threeComponentString_returnsCoordinateWithoutClassifierAndExtension() { + val coord = MavenCoordinate.parseFrom("org.oppia.fake-group:and.fake-art:1.2.3") + + assertThat(coord.groupId).isEqualTo("org.oppia.fake-group") + assertThat(coord.artifactId).isEqualTo("and.fake-art") + assertThat(coord.version).isEqualTo("1.2.3") + assertThat(coord.classifier).isNull() + assertThat(coord.extension).isNull() + } + + @Test + fun testParseFrom_fourComponentString_returnsCoordinateWithoutClassifier() { + val coord = MavenCoordinate.parseFrom("org.oppia.fake-group:and.fake-art:aar:1.2.3") + + assertThat(coord.groupId).isEqualTo("org.oppia.fake-group") + assertThat(coord.artifactId).isEqualTo("and.fake-art") + assertThat(coord.version).isEqualTo("1.2.3") + assertThat(coord.classifier).isNull() + assertThat(coord.extension).isEqualTo("aar") + } + + @Test + fun testParseFrom_fiveComponentString_returnsCoordinateWithAllProperties() { + val coord = MavenCoordinate.parseFrom("org.oppia.fake-group:and.fake-art:aar:sources:1.2.3") + + assertThat(coord.groupId).isEqualTo("org.oppia.fake-group") + assertThat(coord.artifactId).isEqualTo("and.fake-art") + assertThat(coord.version).isEqualTo("1.2.3") + assertThat(coord.classifier).isEqualTo("sources") + assertThat(coord.extension).isEqualTo("aar") + } + + @Test + fun testReducedCoordinateString_noClassifierOrExtension_returnsReducedString() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", artifactId = "and.fake-art", version = "1.2.3" + ) + + val reducedCoordString = coord.reducedCoordinateString + + assertThat(reducedCoordString).isEqualTo("org.oppia.fake-group:and.fake-art:1.2.3") + } + + @Test + fun testReducedCoordinateString_withClassifier_returnsReducedString() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + classifier = "sources" + ) + + val reducedCoordString = coord.reducedCoordinateString + + assertThat(reducedCoordString).isEqualTo("org.oppia.fake-group:and.fake-art:1.2.3") + } + + @Test + fun testReducedCoordinateString_withExtension_returnsReducedString() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar" + ) + + val reducedCoordString = coord.reducedCoordinateString + + assertThat(reducedCoordString).isEqualTo("org.oppia.fake-group:and.fake-art:1.2.3") + } + + @Test + fun testReducedCoordinateString_withClassifierAndExtension_returnsReducedString() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar", + classifier = "sources" + ) + + val reducedCoordString = coord.reducedCoordinateString + + assertThat(reducedCoordString).isEqualTo("org.oppia.fake-group:and.fake-art:1.2.3") + } + + @Test + fun testReducedCoordinateString_noClassifierOrExtension_thenParse_returnsEquivalentCoordinate() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", artifactId = "and.fake-art", version = "1.2.3" + ) + + val parsedReducedCoord = MavenCoordinate.parseFrom(coord.reducedCoordinateString) + + assertThat(parsedReducedCoord).isEqualTo(coord) + } + + @Test + fun testReducedCoordinateString_withClassifier_thenParse_returnsEquivalentCoordNoClassifier() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + classifier = "sources" + ) + + val parsedReducedCoord = MavenCoordinate.parseFrom(coord.reducedCoordinateString) + + val expected = coord.copy(classifier = null) + assertThat(parsedReducedCoord).isEqualTo(expected) + } + + @Test + fun testReducedCoordinateString_withExtension_thenParse_returnsEquivalentCoordinateNoExt() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar" + ) + + val parsedReducedCoord = MavenCoordinate.parseFrom(coord.reducedCoordinateString) + + val expected = coord.copy(extension = null) + assertThat(parsedReducedCoord).isEqualTo(expected) + } + + @Test + fun testReducedCoordinateString_withClassifierAndExt_thenParse_retsEquivCoordNoClassifierOrExt() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar", + classifier = "sources" + ) + + val parsedReducedCoord = MavenCoordinate.parseFrom(coord.reducedCoordinateString) + + val expected = coord.copy(extension = null, classifier = null) + assertThat(parsedReducedCoord).isEqualTo(expected) + } + + @Test + fun testReducedCoordinateStringWithoutVersion_noClassifierOrExtension_returnsReducedString() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", artifactId = "and.fake-art", version = "1.2.3" + ) + + val reducedCoordString = coord.reducedCoordinateStringWithoutVersion + + assertThat(reducedCoordString).isEqualTo("org.oppia.fake-group:and.fake-art") + } + + @Test + fun testReducedCoordinateStringWithoutVersion_withClassifier_returnsReducedString() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + classifier = "sources" + ) + + val reducedCoordString = coord.reducedCoordinateStringWithoutVersion + + assertThat(reducedCoordString).isEqualTo("org.oppia.fake-group:and.fake-art") + } + + @Test + fun testReducedCoordinateStringWithoutVersion_withExtension_returnsReducedString() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar" + ) + + val reducedCoordString = coord.reducedCoordinateStringWithoutVersion + + assertThat(reducedCoordString).isEqualTo("org.oppia.fake-group:and.fake-art") + } + + @Test + fun testReducedCoordinateStringWithoutVersion_withClassifierAndExtension_returnsReducedString() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar", + classifier = "sources" + ) + + val reducedCoordString = coord.reducedCoordinateStringWithoutVersion + + assertThat(reducedCoordString).isEqualTo("org.oppia.fake-group:and.fake-art") + } + + @Test + fun testBazelTarget_noClassifierOrExtension_returnsStringWithDotsAndDashesReplaced() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", artifactId = "and.fake-art", version = "1.2.3" + ) + + val bazelTarget = coord.bazelTarget + + assertThat(bazelTarget).isEqualTo("org_oppia_fake_group_and_fake_art") + } + + @Test + fun testBazelTarget_withClassifier_returnsStringWithDotsAndDashesReplaced() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + classifier = "sources" + ) + + val bazelTarget = coord.bazelTarget + + assertThat(bazelTarget).isEqualTo("org_oppia_fake_group_and_fake_art") + } + + @Test + fun testBazelTarget_withExtension_returnsStringWithDotsAndDashesReplaced() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar" + ) + + val bazelTarget = coord.bazelTarget + + assertThat(bazelTarget).isEqualTo("org_oppia_fake_group_and_fake_art") + } + + @Test + fun testBazelTarget_withClassifierAndExtension_returnsStringWithDotsAndDashesReplaced() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar", + classifier = "sources" + ) + + val bazelTarget = coord.bazelTarget + + assertThat(bazelTarget).isEqualTo("org_oppia_fake_group_and_fake_art") + } + + @Test + fun testComputeArtifactUrl_noClassifierOrExtension_returnsArtifactUrlWithJar() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", artifactId = "and.fake-art", version = "1.2.3" + ) + + val artifactUrl = coord.computeArtifactUrl(baseRepoUrl = "https://example.com") + + // The artifact's extension defaults to '.jar'. + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3.jar" + ) + } + + @Test + fun testComputeArtifactUrl_noClassifierOrExtension_urlWithSuffix_returnsArtifactUrlWithJar() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", artifactId = "and.fake-art", version = "1.2.3" + ) + + val artifactUrl = coord.computeArtifactUrl(baseRepoUrl = "https://example.com/") + + // The extra '/' from the base URL should be ignored. + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3.jar" + ) + } + + @Test + fun testComputeArtifactUrl_withClassifier_returnsArtifactUrlWithJar() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + classifier = "sources" + ) + + val artifactUrl = coord.computeArtifactUrl(baseRepoUrl = "https://example.com") + + // The artifact's extension defaults to '.jar'. + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3-sources.jar" + ) + } + + @Test + fun testComputeArtifactUrl_withExtension_returnsArtifactUrlWithExtension() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar" + ) + + val artifactUrl = coord.computeArtifactUrl(baseRepoUrl = "https://example.com") + + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3.aar" + ) + } + + @Test + fun testComputeArtifactUrl_withClassifierAndExtension_returnsArtifactUrlWithExtension() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar", + classifier = "sources" + ) + + val artifactUrl = coord.computeArtifactUrl(baseRepoUrl = "https://example.com") + + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3-sources.aar" + ) + } + + @Test + fun testComputePomUrl_noClassifierOrExtension_returnsPomUrl() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", artifactId = "and.fake-art", version = "1.2.3" + ) + + val artifactUrl = coord.computePomUrl(baseRepoUrl = "https://example.com") + + // Pom URLs always end in '.pom'. + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3.pom" + ) + } + + @Test + fun testComputePomUrl_noClassifierOrExtension_urlWithSuffix_returnsPomUrl() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", artifactId = "and.fake-art", version = "1.2.3" + ) + + val artifactUrl = coord.computePomUrl(baseRepoUrl = "https://example.com/") + + // The extra '/' from the base URL should be ignored. + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3.pom" + ) + } + + @Test + fun testComputePomUrl_withClassifier_returnsPomUrl() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + classifier = "sources" + ) + + val artifactUrl = coord.computePomUrl(baseRepoUrl = "https://example.com") + + // Pom URLs always end in '.pom'. + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3-sources.pom" + ) + } + + @Test + fun testComputePomUrl_withExtension_returnsPomUrl() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar" + ) + + val artifactUrl = coord.computePomUrl(baseRepoUrl = "https://example.com") + + // Pom URLs always end in '.pom'. + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3.pom" + ) + } + + @Test + fun testComputePomUrl_withClassifierAndExtension_returnsPomUrl() { + val coord = + MavenCoordinate( + groupId = "org.oppia.fake-group", + artifactId = "and.fake-art", + version = "1.2.3", + extension = "aar", + classifier = "sources" + ) + + val artifactUrl = coord.computePomUrl(baseRepoUrl = "https://example.com") + + // Pom URLs always end in '.pom'. + assertThat(artifactUrl) + .isEqualTo( + "https://example.com/org/oppia/fake-group/and.fake-art/1.2.3/and.fake-art-1.2.3-sources.pom" + ) + } +} 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 7040ef42b1c..d45ca21ce20 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesListCheckTest.kt @@ -932,7 +932,7 @@ class MavenDependenciesListCheckTest { android_library( name = "$artifactName", visibility = ["//visibility:public"], - exports = [artifact("$coord")], + exports = [artifact("$coord", repository_name = "maven_app")], ) """.trimIndent() + "\n" ) @@ -981,6 +981,7 @@ class MavenDependenciesListCheckTest { "version": "1.4.7" } }, + "dependencies": {}, "repositories": { "$GOOGLE_MAVEN_URL": [ "androidx.databinding:databinding-adapters", 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 4eabf3e26dd..a0293a16eff 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/license/MavenDependenciesRetrieverTest.kt @@ -874,12 +874,13 @@ class MavenDependenciesRetrieverTest { @Test fun testGetDepListFromMavenInstall_emptyBazelQueryDepsList_returnsEmptyDepList() { - val mavenInstallFile = tempFolder.newFile("third_party/maven_install.json") + tempFolder.newFolder("third_party", "versions") + val mavenInstallFile = tempFolder.newFile("third_party/versions/maven_install.json") writeMavenInstallJson(mavenInstallFile) val mavenListDependencies = runBlocking { retriever.generateDependenciesListFromMavenInstallAsync( - "${tempFolder.root}/third_party/maven_install.json", + "${tempFolder.root}/third_party/versions/maven_install.json", listOf() ).await() } @@ -889,12 +890,13 @@ class MavenDependenciesRetrieverTest { @Test fun testGetDepListFromMavenInstall_commonBazelQueryDepsList_returnsCorrectDepsList() { - val mavenInstallFile = tempFolder.newFile("third_party/maven_install.json") + tempFolder.newFolder("third_party", "versions") + val mavenInstallFile = tempFolder.newFile("third_party/versions/maven_install.json") writeMavenInstallJson(mavenInstallFile) val mavenListDependencies = runBlocking { retriever.generateDependenciesListFromMavenInstallAsync( - "${tempFolder.root}/third_party/maven_install.json", + "${tempFolder.root}/third_party/versions/maven_install.json", listOf(DATA_BINDING_DEP, FIREBASE_DEP) ).await() } @@ -961,12 +963,13 @@ class MavenDependenciesRetrieverTest { @Test fun testGenerateDepsListFromMavenInstall_emptyBazelQueryDeps_returnsEmptyList() { - val mavenInstallFile = tempFolder.newFile("third_party/maven_install.json") + tempFolder.newFolder("third_party", "versions") + val mavenInstallFile = tempFolder.newFile("third_party/versions/maven_install.json") writeMavenInstallJson(mavenInstallFile) val mavenListDependencies = runBlocking { retriever.generateDependenciesListFromMavenInstallAsync( - "${tempFolder.root}/third_party/maven_install.json", + "${tempFolder.root}/third_party/versions/maven_install.json", listOf() ).await() } @@ -976,12 +979,13 @@ class MavenDependenciesRetrieverTest { @Test fun testGenerateDepsListFromMavenInstall_nonEmptyBazelQueryDepNames_returnsCorrectList() { - val mavenInstallFile = tempFolder.newFile("third_party/maven_install.json") + tempFolder.newFolder("third_party", "versions") + val mavenInstallFile = tempFolder.newFile("third_party/versions/maven_install.json") writeMavenInstallJson(mavenInstallFile) val mavenListDependencies = runBlocking { retriever.generateDependenciesListFromMavenInstallAsync( - "${tempFolder.root}/third_party/maven_install.json", + "${tempFolder.root}/third_party/versions/maven_install.json", listOf(DATA_BINDING_DEP, FIREBASE_DEP) ).await() } @@ -1001,7 +1005,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_oneComponent_throwsException() { val exception = assertThrows() { - MavenDependenciesRetriever.MavenCoordinate.parseFrom("androidx.lifecycle") + MavenCoordinate.parseFrom("androidx.lifecycle") } assertThat(exception).hasMessageThat().contains("Invalid Maven coordinate string") @@ -1010,7 +1014,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_twoComponents_throwsException() { val exception = assertThrows() { - MavenDependenciesRetriever.MavenCoordinate.parseFrom("androidx.lifecycle:lifecycle-viewmodel") + MavenCoordinate.parseFrom("androidx.lifecycle:lifecycle-viewmodel") } assertThat(exception).hasMessageThat().contains("Invalid Maven coordinate string") @@ -1019,7 +1023,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_threeComponents_returnsCoordinateWithGroupArtifactVersion() { val coord = - MavenDependenciesRetriever.MavenCoordinate.parseFrom( + MavenCoordinate.parseFrom( "androidx.lifecycle:lifecycle-viewmodel:2.2.0" ) @@ -1033,7 +1037,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_fourComponents_returnsCoordinateWithExtension() { val coord = - MavenDependenciesRetriever.MavenCoordinate.parseFrom( + MavenCoordinate.parseFrom( "androidx.lifecycle:lifecycle-viewmodel:aar:2.2.0" ) @@ -1047,7 +1051,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_fiveComponents_returnsCoordinateWithClassifierAndExtension() { val coord = - MavenDependenciesRetriever.MavenCoordinate.parseFrom( + MavenCoordinate.parseFrom( "androidx.lifecycle:lifecycle-viewmodel:aar:sources:2.2.0" ) @@ -1061,7 +1065,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_parseFrom_sixComponents_throwsException() { val exception = assertThrows() { - MavenDependenciesRetriever.MavenCoordinate.parseFrom( + MavenCoordinate.parseFrom( "androidx.lifecycle:lifecycle-viewmodel:aar:sources:fake:2.2.0" ) } @@ -1072,7 +1076,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_reducedCoordinateString_simpleCoordinate_returnsCorrectValue() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0" @@ -1087,7 +1091,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_reducedCoordinateString_coordWithExtension_returnsCoordStrNoExtension() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1103,7 +1107,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_reducedCoordinateString_coordWithClassifier_returnsCoordStrNoClass() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1119,7 +1123,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_reducedCoordinateString_coordWithClassAndExt_returnsStrWithoutBoth() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1136,7 +1140,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_bazelTarget_simpleCoordinate_returnsTargetIgnoringVersion() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0" @@ -1151,7 +1155,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_bazelTarget_coordWithExtension_returnsTargetIgnoringExtension() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1167,7 +1171,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_bazelTarget_coordWithClassifier_returnsTargetIgnoringClassifier() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1183,7 +1187,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_bazelTarget_coordWithClassAndExt_returnsTargetIgnoringBoth() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1200,7 +1204,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_computeArtifactUrl_simpleCoordinate_returnsCorrectMavenUrl() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0" @@ -1220,7 +1224,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_computeArtifactUrl_coordWithExtension_returnsUrlWithExtension() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1239,7 +1243,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_computeArtifactUrl_coordWithClassifier_returnsUrlWithClassifier() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1258,7 +1262,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_computeArtifactUrl_coordWithClassAndExt_returnsUrlWithBoth() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1278,7 +1282,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_computePomUrl_simpleCoordinate_returnsCorrectMavenUrl() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0" @@ -1297,7 +1301,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_computePomUrl_coordWithExtension_returnsUrlWithExtension() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1317,7 +1321,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_computePomUrl_coordWithClassifier_returnsUrlWithClassifier() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1337,7 +1341,7 @@ class MavenDependenciesRetrieverTest { @Test fun testMavenCoordinate_computePomUrl_coordWithClassAndExt_returnsUrlWithBoth() { val coord = - MavenDependenciesRetriever.MavenCoordinate( + MavenCoordinate( groupId = "androidx.lifecycle", artifactId = "lifecycle-viewmodel", version = "2.2.0", @@ -1458,7 +1462,7 @@ class MavenDependenciesRetrieverTest { android_library( name = "$artifactName", visibility = ["//visibility:public"], - exports = [artifact("$coord")], + exports = [artifact("$coord", repository_name = "maven_app")], ) """.trimIndent() + "\n" ) @@ -1507,6 +1511,7 @@ class MavenDependenciesRetrieverTest { "version": "1.4.7" } }, + "dependencies": {}, "repositories": { "$GOOGLE_MAVEN_URL": [ "androidx.databinding:databinding-adapters", @@ -1614,7 +1619,7 @@ class MavenDependenciesRetrieverTest { } private fun String.coordStrToMavenCoord() = - MavenDependenciesRetriever.MavenCoordinate.parseFrom(this) + MavenCoordinate.parseFrom(this) private companion object { private const val DEP_WITH_SCRAPABLE_LICENSE = "androidx.databinding:databinding-adapters:3.4.2" 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 b14648e3157..0250f9bcb50 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/BUILD.bazel @@ -14,10 +14,10 @@ kt_jvm_test( "//scripts/src/java/org/oppia/android/scripts/common:command_executor", "//scripts/src/java/org/oppia/android/scripts/maven:generate_maven_dependencies_list_lib", "//scripts/src/java/org/oppia/android/scripts/testing:test_bazel_workspace", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//scripts/third_party:org_mockito_kotlin_mockito-kotlin", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", - "//third_party:org_mockito_kotlin_mockito-kotlin", ], ) @@ -26,9 +26,20 @@ kt_jvm_test( srcs = ["RetrieveLicenseTextsTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/maven:retrieve_license_texts_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//scripts/third_party:org_mockito_kotlin_mockito-kotlin", + "//testing:assertion_helpers", + ], +) + +kt_jvm_test( + name = "ValidateMavenDependenciesTest", + srcs = ["ValidateMavenDependenciesTest.kt"], + deps = [ + "//scripts/src/java/org/oppia/android/scripts/maven:validate_maven_dependencies_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//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/maven/GenerateMavenDependenciesListTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt index ca789a2ada5..7bf80eb634e 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/GenerateMavenDependenciesListTest.kt @@ -1310,7 +1310,7 @@ class GenerateMavenDependenciesListTest { android_library( name = "${omitVersionAndReplaceColonsHyphensPeriods(artifactName)}", visibility = ["//visibility:public"], - exports = [artifact("$artifactName")], + exports = [artifact("$artifactName", repository_name = "maven_app")], ) """.trimIndent() + "\n" ) @@ -1367,6 +1367,7 @@ class GenerateMavenDependenciesListTest { "version": "1.4.7" } }, + "dependencies": {}, "repositories": { "$GOOGLE_MAVEN_URL": [ "androidx.databinding:databinding-adapters", diff --git a/scripts/src/javatests/org/oppia/android/scripts/maven/ValidateMavenDependenciesTest.kt b/scripts/src/javatests/org/oppia/android/scripts/maven/ValidateMavenDependenciesTest.kt new file mode 100644 index 00000000000..c9f7cb2f8f9 --- /dev/null +++ b/scripts/src/javatests/org/oppia/android/scripts/maven/ValidateMavenDependenciesTest.kt @@ -0,0 +1,23 @@ +package org.oppia.android.scripts.maven + +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.oppia.android.testing.assertThrows + +/** Tests for [ValidateMavenDependencies]. */ +// FunctionName: test names are conventionally named with underscores. +@Suppress("FunctionName") +class ValidateMavenDependenciesTest { + // TODO(#4973): Finish the tests for this suite. + + @Test + fun testMain_noArguments_failsWithError() { + val error = assertThrows { runScript(/* No arguments. */) } + + assertThat(error).hasMessageThat().contains("Usage: bazel run") + } + + private fun runScript(vararg args: String) { + main(*args) + } +} 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 2554607d2dc..cd4eede9e74 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/regex/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/regex/BUILD.bazel @@ -11,8 +11,8 @@ kt_jvm_test( deps = [ "//scripts:regex_check_assets", "//scripts/src/java/org/oppia/android/scripts/regex:regex_pattern_validation_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) 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 0f60064c09e..4448e0b92a7 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testfile/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/testfile/BUILD.bazel @@ -11,8 +11,8 @@ kt_jvm_test( deps = [ "//scripts:test_file_check_assets", "//scripts/src/java/org/oppia/android/scripts/testfile:test_file_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) 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 421e8a03b96..3913f477e55 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/BUILD.bazel @@ -9,9 +9,9 @@ kt_jvm_test( srcs = ["TestBazelWorkspaceTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/testing:test_bazel_workspace", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -20,8 +20,8 @@ kt_jvm_test( srcs = ["TestGitRepositoryTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/testing:test_git_repository", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) 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 2ea2f42b1bf..fa1401c3c8b 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt +++ b/scripts/src/javatests/org/oppia/android/scripts/testing/TestBazelWorkspaceTest.kt @@ -208,6 +208,7 @@ class TestBazelWorkspaceTest { assertThat(workspaceContent).contains( """ maven_install( + name = "maven_app", artifacts = artifactsList, repositories = [ "https://maven.google.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 02f414b73b0..ca49d3d85b8 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/todo/BUILD.bazel @@ -10,8 +10,8 @@ kt_jvm_test( srcs = ["TodoCollectorTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/todo:todo_collector", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -21,10 +21,10 @@ kt_jvm_test( 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", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:com_squareup_okhttp3_mockwebserver", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:com_squareup_okhttp3_mockwebserver", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -33,9 +33,9 @@ kt_jvm_test( srcs = ["TodoIssueResolvedCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/todo:todo_issue_resolved_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -44,8 +44,8 @@ kt_jvm_test( srcs = ["TodoIssueCommentCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/todo:todo_issue_comment_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) 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 1b2a3d64a69..f87222efbef 100644 --- a/scripts/src/javatests/org/oppia/android/scripts/xml/BUILD.bazel +++ b/scripts/src/javatests/org/oppia/android/scripts/xml/BUILD.bazel @@ -10,9 +10,9 @@ kt_jvm_test( srcs = ["StringLanguageTranslationCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/xml:string_language_translation_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -21,9 +21,9 @@ kt_jvm_test( srcs = ["StringResourceParserTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/xml:string_resource_parser", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -32,9 +32,9 @@ kt_jvm_test( srcs = ["StringResourceValidationCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/xml:string_resource_validation_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -43,9 +43,9 @@ kt_jvm_test( srcs = ["XmlSyntaxCheckTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/xml:xml_syntax_check_lib", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", "//testing:assertion_helpers", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) @@ -54,7 +54,7 @@ kt_jvm_test( srcs = ["XmlSyntaxErrorHandlerTest.kt"], deps = [ "//scripts/src/java/org/oppia/android/scripts/xml:xml_syntax_error_handler", - "//third_party:com_google_truth_truth", - "//third_party:org_jetbrains_kotlin_kotlin-test-junit", + "//scripts/third_party:com_google_truth_truth", + "//scripts/third_party:org_jetbrains_kotlin_kotlin-test-junit", ], ) diff --git a/scripts/static_checks.sh b/scripts/static_checks.sh index f7ad2a39d8e..c649d73181b 100644 --- a/scripts/static_checks.sh +++ b/scripts/static_checks.sh @@ -82,34 +82,57 @@ echo "********************************" bazel run //scripts:string_resource_validation_check -- $(pwd) echo "" +# License Texts Check +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 "" + -# THIRD PARTY DEPENDENCY CHECKS -# These are checks for third party dependencies +# THIRD PARTY APP DEPENDENCY CHECKS # Maven Repin Check echo "********************************" echo "Running Maven repin checks" echo "********************************" -REPIN=1 bazel run @unpinned_maven//:pin +REPIN=1 bazel run @unpinned_maven_app//:pin echo "" # Maven Dependencies Update Check echo "********************************" echo "Running maven dependencies update checks" echo "********************************" -bazel run //scripts:maven_dependencies_list_check -- $(pwd) third_party/maven_install.json scripts/assets/maven_dependencies.pb +bazel run //scripts:maven_dependencies_list_check -- $(pwd) third_party/versions/maven_install.json scripts/assets/maven_dependencies.pb echo "" -# License Texts Check +# Validation checks. echo "********************************" -echo "Running license texts checks" +echo "Running app third-party dependency validation checks" echo "********************************" -bazel run //scripts:license_texts_check -- $(pwd)/app/src/main/res/values/third_party_dependencies.xml +bazel run //scripts:validate_maven_dependencies -- $(pwd) third_party/versions/direct_maven_versions.bzl third_party/versions/transitive_maven_versions.bzl third_party/versions/maven_install.json //third_party //... echo "" -# TODO checks. + +# THIRD PARTY SCRIPTS DEPENDENCY CHECKS + +# Maven Repin Check echo "********************************" -echo "Running TODO correctness checks" +echo "Running Maven repin checks" echo "********************************" -bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb +REPIN=1 bazel run @unpinned_maven_scripts//:pin +echo "" + +# Validation checks. +echo "********************************" +echo "Running scripts third-party dependency validation checks" +echo "********************************" +bazel run //scripts:validate_maven_dependencies -- $(pwd) scripts/third_party/versions/direct_maven_versions.bzl scripts/third_party/versions/transitive_maven_versions.bzl scripts/third_party/versions/maven_install.json //scripts/third_party //scripts/... echo "" diff --git a/scripts/third_party/BUILD.bazel b/scripts/third_party/BUILD.bazel new file mode 100644 index 00000000000..a6f014279af --- /dev/null +++ b/scripts/third_party/BUILD.bazel @@ -0,0 +1,56 @@ +""" +This package contains all third-party dependencies that script builds depend on. + +Note to developers: all new dependencies should go in one of versions/direct_http_versions.bzl or +versions/direct_maven_versions.bzl, not here. + +Furthermore, annotation processor plugins must be configured within this file by loading the tool's +corresponding setup macro. +""" + +load("//scripts/third_party/versions:direct_http_versions.bzl", "DIRECT_REMOTE_DEPENDENCIES") +load("//scripts/third_party/versions:maven_config.bzl", "MAVEN_ARTIFACT_CONFIGURATION") +load( + "//third_party/macros:direct_dep_loader.bzl", + "create_direct_import_dependency_wrappers", + "create_maven_dependency_wrappers", +) +load("//third_party/tools/moshi:plugin_setup.bzl", set_up_moshi_plugin = "set_up") + +package_group( + name = "script_all_artifact_visibility", + includes = [ + ":script_test_artifact_visibility", + "//:oppia_binary_visibility", + "//scripts:oppia_script_library_visibility", + ], +) + +package_group( + name = "script_test_artifact_visibility", + includes = [ + "//scripts:oppia_script_test_visibility", + "//scripts:oppia_script_testing_library_visibility", + ], +) + +create_maven_dependency_wrappers( + maven_artifact_config = MAVEN_ARTIFACT_CONFIGURATION, + maven_repository_name = "maven_scripts", + prod_artifact_visibility = [":script_all_artifact_visibility"], + test_artifact_visibility = [":script_test_artifact_visibility"], +) + +create_direct_import_dependency_wrappers( + dependency_imports_details = DIRECT_REMOTE_DEPENDENCIES, + maven_artifact_visibility = ["@maven_scripts//:__pkg__"], + prod_artifact_visibility = [":script_all_artifact_visibility"], + test_artifact_visibility = [":script_test_artifact_visibility"], +) + +set_up_moshi_plugin( + name = "moshi", + moshi_compiler_dep = "//scripts/third_party:com_squareup_moshi_moshi-kotlin-codegen", + moshi_exported_library = "//scripts/third_party:com_squareup_moshi_moshi-kotlin", + visibility = [":script_all_artifact_visibility"], +) diff --git a/scripts/third_party/versions/BUILD.bazel b/scripts/third_party/versions/BUILD.bazel new file mode 100644 index 00000000000..5b2fd15c55a --- /dev/null +++ b/scripts/third_party/versions/BUILD.bazel @@ -0,0 +1,7 @@ +""" +Contains the versions and configurations for all direct archive & Maven dependencies needed to build +Oppia Android scripts. + +Generally, the only files that need to be manually changed are direct_http_versions.bzl and +direct_maven_versions.bzl. +""" diff --git a/scripts/third_party/versions/direct_http_versions.bzl b/scripts/third_party/versions/direct_http_versions.bzl new file mode 100644 index 00000000000..02b46e0f4c6 --- /dev/null +++ b/scripts/third_party/versions/direct_http_versions.bzl @@ -0,0 +1,65 @@ +""" +Contains all of the HTTP archive/jar & Git repository dependencies that are directly required for +production & test builds of Oppia Android scripts. These are exposed via DIRECT_REMOTE_DEPENDENCIES. +""" + +load( + "//third_party/macros:direct_dep_defs.bzl", + "EXPORT_TOOLCHAIN", + "create_export_binary_details", + "create_export_library_details", + "create_git_repository_reference", + "create_http_jar_reference", +) + +DIRECT_REMOTE_DEPENDENCIES = [ + create_http_jar_reference( + name = "android_bundletool", + sha = "1e8430002c76f36ce2ddbac8aadfaf2a252a5ffbd534dab64bb255cda63db7ba", + version = "1.8.0", + url = "https://github.com/google/bundletool/releases/download/{0}/bundletool-all-{0}.jar", + test_only = False, + exports_details = [ + create_export_library_details( + exposed_artifact_name = "android_bundletool", + exportable_target = "jar", + export_toolchain = EXPORT_TOOLCHAIN.ANDROID, + ), + create_export_binary_details( + exposed_artifact_name = "android_bundletool_binary", + main_class = "com.android.tools.build.bundletool.BundleToolMain", + exportable_runtime_target = "jar", + ), + ], + ), + create_git_repository_reference( + name = "archive_patcher", + commit = "50ca40a3de7983392a383ed3cc7b48e25f1b69b3", + remote = "https://github.com/google/archive-patcher", + test_only = False, + build_file = "//scripts/third_party/versions/mods:BUILD.archive-patcher", + export_details = create_export_library_details( + exposed_artifact_name = "com_google_archivepatcher", + exportable_target = ":tools", + export_toolchain = EXPORT_TOOLCHAIN.ANDROID, + ), + ), + create_git_repository_reference( + name = "oppia_proto_api", + commit = "9cf993ea0b798a67b3faa21c690c30b9027fb371", + remote = "https://github.com/oppia/oppia-proto-api", + test_only = False, + exports_details = [ + create_export_library_details( + exposed_artifact_name = "oppia_proto_api_protos", + exportable_target = ":android_protos", + export_toolchain = EXPORT_TOOLCHAIN.ALIAS, + ), + create_export_library_details( + exposed_artifact_name = "oppia_proto_api_java_protos", + exportable_target = ":android_java_protos", + export_toolchain = EXPORT_TOOLCHAIN.ALIAS, + ), + ], + ), +] diff --git a/scripts/third_party/versions/direct_maven_versions.bzl b/scripts/third_party/versions/direct_maven_versions.bzl new file mode 100644 index 00000000000..d8db550d05c --- /dev/null +++ b/scripts/third_party/versions/direct_maven_versions.bzl @@ -0,0 +1,48 @@ +""" +Contains all of the Maven dependencies that required to build Oppia Android scripts and their test +targets. These are exposed via PRODUCTION_DEPENDENCY_VERSIONS and TEST_DEPENDENCY_VERSIONS. + +Note that all versions listed in this file will automatically be exposed via //scripts/third_party +library wrappers. For example, the "org.jetbrains.kotlinx:kotlinx-coroutines-core" dependency will +be available via //scripts/third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core. Test +dependencies are only visible to tests and test targets. None of these libraries are available to +app builds. + +See //third_party/versions/direct_maven_versions.bzl for additional details on these file and how to +update it. +""" + +# Note to developers: Please keep this dict sorted by key to make it easier to find dependencies. +# This list should contain only production (non-test) dependencies. +PRODUCTION_DEPENDENCY_VERSIONS = { + "com.android.tools.apkparser:apkanalyzer": "30.0.4", + "com.android.tools.build:aapt2-proto": "7.3.1-8691043", + "com.google.guava:guava": "31.0.1-jre", + "com.google.protobuf:protobuf-java": "3.17.3", + "com.google.protobuf:protobuf-java-util": "3.17.3", + "com.squareup.moshi:moshi-kotlin": "1.13.0", + "com.squareup.moshi:moshi-kotlin-codegen": "1.13.0", + "com.squareup.okhttp3:okhttp": "4.7.2", + "com.squareup.retrofit2:converter-moshi": "2.5.0", + "com.squareup.retrofit2:retrofit": "2.9.0", + "io.xlate:yaml-json": "0.1.0", + "jakarta.json:jakarta.json-api": "2.1.2", + "org.eclipse.parsson:parsson": "1.1.2", + "org.jetbrains.kotlin:kotlin-compiler-embeddable": "1.5.0", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": "1.6.21", + "org.jetbrains.kotlinx:kotlinx-coroutines-core": "1.6.4", + "org.snakeyaml:snakeyaml-engine": "2.6", +} + +# Note to developers: Please keep this dict sorted by key to make it easier to find dependencies. +# This list should only contain test-only dependencies. These are dependencies that are guaranteed +# cannot be included in production builds of scripts. +TEST_DEPENDENCY_VERSIONS = { + "com.google.truth.extensions:truth-liteproto-extension": "1.1.3", + "com.google.truth:truth": "1.1.3", + "com.squareup.okhttp3:mockwebserver": "4.7.2", + "junit:junit": "4.13.2", + "org.jetbrains.kotlin:kotlin-test-junit": "1.3.72", + "org.mockito.kotlin:mockito-kotlin": "3.2.0", + "org.mockito:mockito-core": "3.9.0", +} diff --git a/scripts/third_party/versions/maven_config.bzl b/scripts/third_party/versions/maven_config.bzl new file mode 100644 index 00000000000..c746f3bdb8f --- /dev/null +++ b/scripts/third_party/versions/maven_config.bzl @@ -0,0 +1,31 @@ +""" +Provides the high-level configuration required for downloading & accessing dependencies from Maven, +via MAVEN_ARTIFACT_CONFIGURATION. + +This file generally never needs to be changed directly. Instead, Maven dependencies can be updated +and/or added/removed via direct_maven_versions.bzl. +""" + +load( + "//third_party/macros:direct_dep_defs.bzl", + "create_dep_config", + "create_maven_artifact_configuration", +) +load(":direct_maven_versions.bzl", "PRODUCTION_DEPENDENCY_VERSIONS", "TEST_DEPENDENCY_VERSIONS") +load( + ":transitive_maven_versions.bzl", + "PRODUCTION_TRANSITIVE_DEPENDENCY_VERSIONS", + "TEST_TRANSITIVE_DEPENDENCY_VERSIONS", +) + +MAVEN_ARTIFACT_CONFIGURATION = create_maven_artifact_configuration( + production_dep_config = create_dep_config( + direct_deps = PRODUCTION_DEPENDENCY_VERSIONS, + transitive_deps = PRODUCTION_TRANSITIVE_DEPENDENCY_VERSIONS, + ), + test_dep_config = create_dep_config( + direct_deps = TEST_DEPENDENCY_VERSIONS, + transitive_deps = TEST_TRANSITIVE_DEPENDENCY_VERSIONS, + ), + maven_install_json_target = "//scripts/third_party/versions:maven_install.json", +) diff --git a/third_party/maven_install.json b/scripts/third_party/versions/maven_install.json similarity index 57% rename from third_party/maven_install.json rename to scripts/third_party/versions/maven_install.json index c9a27f18450..44855945db0 100644 --- a/third_party/maven_install.json +++ b/scripts/third_party/versions/maven_install.json @@ -1,519 +1,8 @@ { "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", - "__INPUT_ARTIFACTS_HASH": 1041130706, - "__RESOLVED_ARTIFACTS_HASH": 1257218600, - "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.firebase:firebase-common:19.3.0": "com.google.firebase:firebase-common:20.1.1", - "com.google.protobuf:protobuf-javalite:3.17.3": "com.google.protobuf:protobuf-javalite:3.19.2", - "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.6.0", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21", - "org.mockito:mockito-core:2.19.0": "org.mockito:mockito-core:3.9.0" - }, + "__INPUT_ARTIFACTS_HASH": 1952693171, + "__RESOLVED_ARTIFACTS_HASH": 1880373108, "artifacts": { - "androidx.activity:activity:aar": { - "shasums": { - "jar": "4f2b35916768032f7d0c20e250e28b29037ed4ce9ebf3da4fcd51bcb0c6067ef" - }, - "version": "1.1.0" - }, - "androidx.annotation:annotation": { - "shasums": { - "jar": "d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692" - }, - "version": "1.1.0" - }, - "androidx.annotation:annotation-experimental:aar": { - "shasums": { - "jar": "b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11" - }, - "version": "1.0.0" - }, - "androidx.appcompat:appcompat-resources:aar": { - "shasums": { - "jar": "c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5" - }, - "version": "1.2.0" - }, - "androidx.appcompat:appcompat:aar": { - "shasums": { - "jar": "3d2131a55a61a777322e2126e0018011efa6339e53b44153eb651b16020cca70" - }, - "version": "1.2.0" - }, - "androidx.arch.core:core-common": { - "shasums": { - "jar": "fe1237bf029d063e7f29fe39aeaf73ef74c8b0a3658486fc29d3c54326653889" - }, - "version": "2.1.0" - }, - "androidx.arch.core:core-runtime:aar": { - "shasums": { - "jar": "dd77615bd3dd275afb11b62df25bae46b10b4a117cd37943af45bdcbf8755852" - }, - "version": "2.1.0" - }, - "androidx.arch.core:core-testing:aar": { - "shasums": { - "jar": "c57ffade2a9a844bd62b4f4c3916fad5e09e9f24cceba27e932c25bb7a6d1d8f" - }, - "version": "2.1.0" - }, - "androidx.cardview:cardview:aar": { - "shasums": { - "jar": "1193c04c22a3d6b5946dae9f4e8c59d6adde6a71b6bd5d87fb99d82dda1afec7" - }, - "version": "1.0.0" - }, - "androidx.collection:collection": { - "shasums": { - "jar": "632a0e5407461de774409352940e292a291037724207a787820c77daf7d33b72" - }, - "version": "1.1.0" - }, - "androidx.constraintlayout:constraintlayout-solver": { - "shasums": { - "jar": "b23732edbb3511d937fea1ffef047b0e6c001b50c1921f0d959fc384d706ec6a" - }, - "version": "2.0.1" - }, - "androidx.constraintlayout:constraintlayout:aar": { - "shasums": { - "jar": "ec15b5d4a2eff07888bc1499ce2e2c6efe24c0ed60cc57b08c9dc4b6fd3c2189" - }, - "version": "2.0.1" - }, - "androidx.coordinatorlayout:coordinatorlayout:aar": { - "shasums": { - "jar": "44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb" - }, - "version": "1.1.0" - }, - "androidx.core:core-ktx:aar": { - "shasums": { - "jar": "a151b7e21acc3d272e1d397a2084e76ccce88e8542adcc4e0cf1e0655063255f" - }, - "version": "1.0.1" - }, - "androidx.core:core:aar": { - "shasums": { - "jar": "e92ea65a37d589943d405a6a54d1be9d12a225948f26c4e41e511dd55e81efb6" - }, - "version": "1.3.1" - }, - "androidx.cursoradapter:cursoradapter:aar": { - "shasums": { - "jar": "a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564" - }, - "version": "1.0.0" - }, - "androidx.customview:customview:aar": { - "shasums": { - "jar": "01f76ab043770a97b054046f9815717b82ce0355c02967d16c61981359dc189a" - }, - "version": "1.1.0" - }, - "androidx.databinding:databinding-adapters:aar": { - "shasums": { - "jar": "840a66744866185b6a74fd99e6596bf1eb0720837c3ae470c25212bccc563939" - }, - "version": "3.4.2" - }, - "androidx.databinding:databinding-common": { - "shasums": { - "jar": "52886c0ef6cfa492d07b40c3952201d6d2f0cfc680144fbefc69d2d5cb786c25" - }, - "version": "3.4.2" - }, - "androidx.databinding:databinding-compiler": { - "shasums": { - "jar": "07a9fb44f43048b18f149add7835e1239e92057e6748affde2d2bccf330c4242" - }, - "version": "3.4.2" - }, - "androidx.databinding:databinding-compiler-common": { - "shasums": { - "jar": "770b6a82da0684f93d037ed5d241248cb25862ed14ecd7d9ec8c756153266051" - }, - "version": "3.4.2" - }, - "androidx.databinding:databinding-runtime:aar": { - "shasums": { - "jar": "80d966bf58b971334d65b213b2ab16fe827bbb95389a9c6a52b141853f529b30" - }, - "version": "3.4.2" - }, - "androidx.documentfile:documentfile:aar": { - "shasums": { - "jar": "865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487" - }, - "version": "1.0.0" - }, - "androidx.drawerlayout:drawerlayout:aar": { - "shasums": { - "jar": "9d79030ad4f93b1c6296f7a8391710f9e9e3228a3b10964c4bb0a042fd6257b8" - }, - "version": "1.1.0" - }, - "androidx.dynamicanimation:dynamicanimation:aar": { - "shasums": { - "jar": "ce005162c229bf308d2d5b12fb6cad0874069cbbeaccee63a8193bd08d40de04" - }, - "version": "1.0.0" - }, - "androidx.exifinterface:exifinterface:aar": { - "shasums": { - "jar": "ee48be10aab8f54efff4c14b77d11e10b9eeee4379d5ef6bf297a2923c55cc11" - }, - "version": "1.0.0" - }, - "androidx.fragment:fragment:aar": { - "shasums": { - "jar": "fdd0eac80c6b26c79093a63fc699303f928cc1fa73ca7196d5590a77eb6d6873" - }, - "version": "1.2.0" - }, - "androidx.interpolator:interpolator:aar": { - "shasums": { - "jar": "33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a" - }, - "version": "1.0.0" - }, - "androidx.legacy:legacy-support-core-utils:aar": { - "shasums": { - "jar": "a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7" - }, - "version": "1.0.0" - }, - "androidx.lifecycle:lifecycle-common": { - "shasums": { - "jar": "63898dabf7cfe5ec5d7ed8b8c2564c1427be876e1496ead95c2703cf59d3734b" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-extensions:aar": { - "shasums": { - "jar": "648c8de1d10b025d524a2e46ac994fc3f6bf186826c09ec1a62d250bf1b877ae" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-livedata-core-ktx:aar": { - "shasums": { - "jar": "5951f882e95b7e05ceb9adfca0fa2ebd511d63ea5a00da4eae6c6d0c1903da18" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-livedata-core:aar": { - "shasums": { - "jar": "556c1f3af90aa9d7d0d330565adbf6da71b2429148bac91e07c485f4f9abf614" - }, - "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" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-process:aar": { - "shasums": { - "jar": "3a977e7778fc8418742d388409daaba7ea8fea8823d21ffb96e4c4236f715070" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-runtime:aar": { - "shasums": { - "jar": "2f866c07a1f33a8c9bb69a9545d4f20b4f0628cd0a155432386d7cb081e1e0bc" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-service:aar": { - "shasums": { - "jar": "ca2801ffc069555afed8eddd2292130f436956452bc8bbad30fb56f8e4e382a0" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-viewmodel-ktx:aar": { - "shasums": { - "jar": "f791001f2211947e56ad3d96d12c9ae93fc5589b88f08603f69a2265c9a7d702" - }, - "version": "2.2.0" - }, - "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar": { - "shasums": { - "jar": "f4cceafbf86acfc7f3ba6a61d6dc6842a6738c1274610767d3ab8f8a114cba97" - }, - "version": "1.0.0" - }, - "androidx.lifecycle:lifecycle-viewmodel:aar": { - "shasums": { - "jar": "967efab24d6c49dd414a8c0ac4a1cd09b018f0b8bb43b739ad360c4158ebde27" - }, - "version": "2.2.0" - }, - "androidx.loader:loader:aar": { - "shasums": { - "jar": "11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025" - }, - "version": "1.0.0" - }, - "androidx.localbroadcastmanager:localbroadcastmanager:aar": { - "shasums": { - "jar": "e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8" - }, - "version": "1.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-ktx:aar": { - "shasums": { - "jar": "ed00b6f73d8acc7e06729f5f19cdeb410ca1d0e45afbcf6ff435a1091c3a3d57" - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-common:aar": { - "shasums": { - "jar": "542ec6f993b6d3bfafe2e53e0f250b8685331e2a0258f9313af9ee3376f93959" - }, - "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" - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-runtime-ktx:aar": { - "shasums": { - "jar": "41f1145f9aca5a7d97567dfe08924ec1cebcc72cb2c5d6d1a1cd31a780669358" - }, - "version": "2.0.0" - }, - "androidx.navigation:navigation-runtime:aar": { - "shasums": { - "jar": "903cd93d3424300ff048a92086d773cfc5e23f928063d4493a45b4b042f2a550" - }, - "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" - }, - "version": "2.0.0" - }, - "androidx.print:print:aar": { - "shasums": { - "jar": "1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd" - }, - "version": "1.0.0" - }, - "androidx.recyclerview:recyclerview:aar": { - "shasums": { - "jar": "f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f" - }, - "version": "1.1.0" - }, - "androidx.room:room-common": { - "shasums": { - "jar": "2b130dd4a1d3d91b6701ed33096d389f01c4fc1197a7acd6b91724ddc5acfc06" - }, - "version": "2.2.5" - }, - "androidx.room:room-runtime:aar": { - "shasums": { - "jar": "24a5549b796e43e337513d2908adac67f45350d9a90bca7e2e6120692140bb14" - }, - "version": "2.2.5" - }, - "androidx.savedstate:savedstate:aar": { - "shasums": { - "jar": "2510a5619c37579c9ce1a04574faaf323cd0ffe2fc4e20fa8f8f01e5bb402e83" - }, - "version": "1.0.0" - }, - "androidx.sqlite:sqlite-framework:aar": { - "shasums": { - "jar": "8673737fdb2efbad91aeaeed1927ebb29212d36a867d93b9639c8069019f8a1e" - }, - "version": "2.1.0" - }, - "androidx.sqlite:sqlite:aar": { - "shasums": { - "jar": "8341ff092d6060d62a07227f29237155fff36fb16f96c95fbd9a884e375db912" - }, - "version": "2.1.0" - }, - "androidx.test.espresso:espresso-accessibility:aar": { - "shasums": { - "jar": "e2ee8b50081c0b578521d112808321f737f3bf1acce035fe7be0e26ef00b491f" - }, - "version": "3.1.0" - }, - "androidx.test.espresso:espresso-contrib:aar": { - "shasums": { - "jar": "277c292f02816b5e49051485b11e612c0ba7d36fc76b7dac955fe37766ec2832" - }, - "version": "3.1.0" - }, - "androidx.test.espresso:espresso-core:aar": { - "shasums": { - "jar": "beb4712c2520c1da30ac1f25506871f16ea5b83ee686ece5a258769df1a01e15" - }, - "version": "3.2.0" - }, - "androidx.test.espresso:espresso-idling-resource:aar": { - "shasums": { - "jar": "c1a0454fe95788122ba652c3ecff7ec538c7e27de206aed970f2809fb8090d09" - }, - "version": "3.2.0" - }, - "androidx.test.espresso:espresso-intents:aar": { - "shasums": { - "jar": "6c252ea1221a7973301b62d1695d4d73cb1b7c0853ee2ffdb8274886148f0af6" - }, - "version": "3.1.0" - }, - "androidx.test.ext:junit:aar": { - "shasums": { - "jar": "449df418d2916a0f86fe7dafb1edb09480fafb6e995d5c751c7d0d1970d4ae72" - }, - "version": "1.1.1" - }, - "androidx.test.ext:truth:aar": { - "shasums": { - "jar": "d067a9bdd009b08d4230f8283cb4579a1183ef45bbfa169fd6d0f112d6c324f6" - }, - "version": "1.4.0" - }, - "androidx.test.uiautomator:uiautomator:aar": { - "shasums": { - "jar": "2838e9d961dbffefbbd229a2bd4f6f82ac4fb2462975862a9e75e9ed325a3197" - }, - "version": "2.2.0" - }, - "androidx.test:core:aar": { - "shasums": { - "jar": "671284e62e393f16ceae1a99a3a9a07bf1aacda29f8fe7b6b884355ef34c09cf" - }, - "version": "1.4.0" - }, - "androidx.test:monitor:aar": { - "shasums": { - "jar": "46a912a1e175f27a97521af3f50e5af87c22c49275dd2c57c043740012806325" - }, - "version": "1.4.0" - }, - "androidx.test:rules:aar": { - "shasums": { - "jar": "0c5c87df67b358c1a17765357138ea1d4bb58c61159ae635b4cb4dcaa3bb5986" - }, - "version": "1.1.0" - }, - "androidx.test:runner:aar": { - "shasums": { - "jar": "5387e011167a3c8da08d99b5d59248c0e2da839317b48ebf202e31dc1f791ec1" - }, - "version": "1.2.0" - }, - "androidx.transition:transition:aar": { - "shasums": { - "jar": "a1e059b3bc0b43a58dec0efecdcaa89c82d2bca552ea5bacf6656c46e853157e" - }, - "version": "1.2.0" - }, - "androidx.vectordrawable:vectordrawable-animated:aar": { - "shasums": { - "jar": "76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8" - }, - "version": "1.1.0" - }, - "androidx.vectordrawable:vectordrawable:aar": { - "shasums": { - "jar": "46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26" - }, - "version": "1.1.0" - }, - "androidx.versionedparcelable:versionedparcelable:aar": { - "shasums": { - "jar": "9a1d77140ac222b7866b5054ee7d159bc1800987ed2d46dd6afdd145abb710c1" - }, - "version": "1.1.0" - }, - "androidx.viewpager2:viewpager2:aar": { - "shasums": { - "jar": "e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af" - }, - "version": "1.0.0" - }, - "androidx.viewpager:viewpager:aar": { - "shasums": { - "jar": "147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682" - }, - "version": "1.0.0" - }, - "androidx.work:work-runtime-ktx:aar": { - "shasums": { - "jar": "290d2e9c1a22388b3f0c3dbc204a6176f8c49174126de884820befa83899f129" - }, - "version": "2.4.0" - }, - "androidx.work:work-runtime:aar": { - "shasums": { - "jar": "7801441cb973fb007ef311d3db35c3b3c9d011cef890357e7ca33890833354e5" - }, - "version": "2.4.0" - }, - "androidx.work:work-testing:aar": { - "shasums": { - "jar": "dc1d9f743c59ee08c605aa924fc20819b6a0b734338e0a95af1943c3cd806e23" - }, - "version": "2.4.0" - }, - "com.almworks.sqlite4java:sqlite4java": { - "shasums": { - "jar": "243a64470fda0e86a6fddeb0af4c7aa9426ce84e68cbfe18d75ee5da4b7e0b92" - }, - "version": "1.0.392" - }, - "com.android.databinding:baseLibrary": { - "shasums": { - "jar": "5e4f3b90995be63f3c8eeecce120c588a98c6aad3b54f60ad4c80b5418c4b012" - }, - "version": "3.4.2" - }, "com.android.tools.analytics-library:protos": { "shasums": { "jar": "c1f0270c758f61db311d1365af2eaab46318c0ecde1d15aed6c20d5b32ed3ade" @@ -538,12 +27,6 @@ }, "version": "30.0.4" }, - "com.android.tools.build.jetifier:jetifier-core": { - "shasums": { - "jar": "c9f8b016144cfb31c5aee92d47f34de23289167cac5e8ef68365b2dd05766f11" - }, - "version": "1.0.0-beta04" - }, "com.android.tools.build:aapt2-proto": { "shasums": { "jar": "d5e2f3e1e1eb06224b6875f5e513c72a65182342745718160caf191d46a96664" @@ -658,186 +141,6 @@ }, "version": "1.64" }, - "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" - }, - "version": "4.11.0" - }, - "com.github.bumptech.glide:compiler": { - "shasums": { - "jar": "a98cdf265c36261b1d523448b05c322ec290afa865946425eded6361980e8770" - }, - "version": "4.11.0" - }, - "com.github.bumptech.glide:disklrucache": { - "shasums": { - "jar": "d06775a5171b777aa3db031eb0dd4a1dbe3f00dda35b5574dfd953f6b0d5ef18" - }, - "version": "4.11.0" - }, - "com.github.bumptech.glide:gifdecoder:aar": { - "shasums": { - "jar": "197a1cd5b76855aa02b230c13974e293229b901dc2b96fab4315201e78baa804" - }, - "version": "4.11.0" - }, - "com.github.bumptech.glide:glide:aar": { - "shasums": { - "jar": "5c294e6a5f0f812cef876b8412954c1822da184af38e082a5b766e3c4f4fcd95" - }, - "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" - }, - "version": "2.0" - }, - "com.google.android.datatransport:transport-api:aar": { - "shasums": { - "jar": "576514f8b75d8ae32897f1b9b031f88b00465bf6e0996e227d09af688195f71e" - }, - "version": "2.2.0" - }, - "com.google.android.datatransport:transport-backend-cct:aar": { - "shasums": { - "jar": "6a2d99756c1fa634d3f14b4479257ac83d5d0fbf7fe5aa1db0a014df95ae217f" - }, - "version": "2.3.0" - }, - "com.google.android.datatransport:transport-runtime:aar": { - "shasums": { - "jar": "5e219672fe5a03f5b80c4d2211f39c2b0ceeb3988bfe1e8f1e033579dee20414" - }, - "version": "2.2.3" - }, - "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" - }, - "version": "17.0.0" - }, - "com.google.android.gms:play-services-base:aar": { - "shasums": { - "jar": "2896d76f432be52167295bb9ce45ade25c310aeffc04d28cf8db6a15868e83de" - }, - "version": "18.0.1" - }, - "com.google.android.gms:play-services-basement:aar": { - "shasums": { - "jar": "55c1777467901a2d399f3252384c4976284aa35fddfd5995466dbeacb49f9dd6" - }, - "version": "18.0.0" - }, - "com.google.android.gms:play-services-measurement-api:aar": { - "shasums": { - "jar": "fde4cb8493409aa5130de84775eba9f967aaaf916512362987e1bd61b60babfc" - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-base:aar": { - "shasums": { - "jar": "39fd34e7da8e822a93b64c66134e2479075c298588018d4f379c53b9eea1cf1e" - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-impl:aar": { - "shasums": { - "jar": "d143f6d909619a0aa597ccc127713cd5e4b2eea38477521de739331bb791f3ec" - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-sdk-api:aar": { - "shasums": { - "jar": "afff4861d76bc1f6c7527ae9c4c58c50d6d9e4668a3dc58b03cd77e508e305b3" - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement-sdk:aar": { - "shasums": { - "jar": "24c3c4085609a85debabc43718ac3049583b5452e4d34b2e8c9e620542631b30" - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-measurement:aar": { - "shasums": { - "jar": "553f0b6fc6e44eed81bb5b7b4cb80719c05a244a394eb38ae91271871dcddf07" - }, - "version": "17.5.0" - }, - "com.google.android.gms:play-services-stats:aar": { - "shasums": { - "jar": "e8ae5b40512b71e2258bfacd8cd3da398733aa4cde3b32d056093f832b83a6fe" - }, - "version": "17.0.0" - }, - "com.google.android.gms:play-services-tasks:aar": { - "shasums": { - "jar": "f106db48c6ccfa8e1315a7adc44aecd02ff7355eb3fa7dcdcba8c283a8eb1681" - }, - "version": "18.0.1" - }, - "com.google.android.gms:strict-version-matcher-plugin": { - "shasums": { - "jar": "0c1027a51198190386eae3f90adee9a30687e76da7589f06c79269fea4c7a4c0" - }, - "version": "1.2.1" - }, - "com.google.android.material:material:aar": { - "shasums": { - "jar": "cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a" - }, - "version": "1.3.0" - }, - "com.google.android.play:integrity:aar": { - "shasums": { - "jar": "c44e46f3fa25c89840e5edcd76e203d61bba2bb7c2eae485856fbcc7d6fa411b" - }, - "version": "1.0.1" - }, - "com.google.android:annotations": { - "shasums": { - "jar": "ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15" - }, - "version": "4.1.1.4" - }, "com.google.auto.service:auto-service-annotations": { "shasums": { "jar": "44752893119fdaf01b4c5ee74e46e5dab86f2dcda18114c562f877355c6ed26e" @@ -858,201 +161,15 @@ }, "com.google.code.gson:gson": { "shasums": { - "jar": "d3999291855de495c94c743761b8ab5176cfeabe281a5ab0d8e8d45326fd703e" - }, - "version": "2.8.9" - }, - "com.google.dagger:dagger": { - "shasums": { - "jar": "bb0600d2dd9669cbd5a2e40e7d3fbc4692f57fb7d59509d26b380398e20f5739" - }, - "version": "2.41" - }, - "com.google.dagger:dagger-compiler": { - "shasums": { - "jar": "b53edab184655a0de6bacfb9551849de7b6bf0c688a4771321b4cf6f548ac80e" - }, - "version": "2.41" - }, - "com.google.dagger:dagger-producers": { - "shasums": { - "jar": "8fe89dc042654fdf38a5be19bfe7f1d61a512225495a9379d52e5c28bc3f4521" + "jar": "c8fb4839054d280b3033f800d1f5a97de2f028eb8ba2eb458ad287e536f3f25f" }, - "version": "2.41" - }, - "com.google.dagger:dagger-spi": { - "shasums": { - "jar": "960d8a3ea526e53f4a47e025bce84c714cdec9b84d29fc29d348bbb58406d8ea" - }, - "version": "2.41" - }, - "com.google.devtools.ksp:symbol-processing-api": { - "shasums": { - "jar": "bf4a6875af46917174b087d03840456685e115954d926ce88fd04b9d2f254df3" - }, - "version": "1.5.30-1.0.0" + "version": "2.8.6" }, "com.google.errorprone:error_prone_annotations": { "shasums": { - "jar": "721cb91842b46fa056847d104d5225c8b8e1e8b62263b993051e1e5a0137b7ec" - }, - "version": "2.11.0" - }, - "com.google.errorprone:javac-shaded": { - "shasums": { - "jar": "65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30" - }, - "version": "9-dev-r4023-3" - }, - "com.google.firebase:firebase-analytics:aar": { - "shasums": { - "jar": "5c36ae943a719de1c598287370cb3ee1d27fd2dc9d0ada650de2b7f9a1dcac54" - }, - "version": "17.5.0" - }, - "com.google.firebase:firebase-annotations": { - "shasums": { - "jar": "0393478cf124721c7502ea76a28129a420c462fc4d5c0a4274db9e309785bd7e" - }, - "version": "16.1.0" - }, - "com.google.firebase:firebase-appcheck-debug:aar": { - "shasums": { - "jar": "544cff5ae13c1d2edcb2478c1d4ebb703d2d1a616f4e0bf261721aefc108ab4c" - }, - "version": "16.0.0" - }, - "com.google.firebase:firebase-appcheck-interop:aar": { - "shasums": { - "jar": "44b9133286fe4c550391cf55057b2748323c4052b68412df0f8c83efd6044824" - }, - "version": "16.0.0" - }, - "com.google.firebase:firebase-appcheck-playintegrity:aar": { - "shasums": { - "jar": "de9ca1700814a52272ad157654f1224c6b05da9c3da15121c4da23a5eca1ebda" - }, - "version": "16.0.0" - }, - "com.google.firebase:firebase-appcheck:aar": { - "shasums": { - "jar": "f6f093086af3af54797cc8f4070aad5b1e8fbb3e16ccbcfd0f02e7dd3e3c9448" - }, - "version": "16.0.0" - }, - "com.google.firebase:firebase-auth-interop:aar": { - "shasums": { - "jar": "64dd9a5c20b64d0e367f4731d11e8fd6ea816a89a4e44e4193c72eafb54264d3" - }, - "version": "19.0.2" - }, - "com.google.firebase:firebase-auth-ktx:aar": { - "shasums": { - "jar": "bd23f0077d8e85c8c57e06c06cdcccdc06a3de96facdd72fabd11159f01c4d4d" - }, - "version": "19.3.1" - }, - "com.google.firebase:firebase-auth:aar": { - "shasums": { - "jar": "0523401e4028729d1a882d2f787cd180bdf91bd12cb1d362453a770e6a2f72c1" - }, - "version": "19.3.1" - }, - "com.google.firebase:firebase-common-ktx:aar": { - "shasums": { - "jar": "32ef394eea17445d3460a11f7128ef412f9aa093cd00106e9cfbec363b17a2c1" - }, - "version": "20.1.1" - }, - "com.google.firebase:firebase-common:aar": { - "shasums": { - "jar": "1ab1a5054cb82395487fe0645dcfec6acc94efb9f4972fe717a8bff6905b8ecf" - }, - "version": "20.1.1" - }, - "com.google.firebase:firebase-components:aar": { - "shasums": { - "jar": "dd678b2e24dd9b3f570196c618b6ffba9ea59b232ae6dce1356b0629ecb6fbf7" - }, - "version": "17.0.0" - }, - "com.google.firebase:firebase-crashlytics:aar": { - "shasums": { - "jar": "635953640e1bbb277affadbc3e59b43f1c4dd07de79c8973b6341a756ad8b74b" - }, - "version": "17.1.1" - }, - "com.google.firebase:firebase-database-collection:aar": { - "shasums": { - "jar": "fb92604df35bf819e706432ff6e3ca9d4794cc85348d94c887622ba93b5450e0" + "jar": "cd5257c08a246cf8628817ae71cb822be192ef91f6881ca4a3fcff4f1de1cff3" }, - "version": "18.0.1" - }, - "com.google.firebase:firebase-encoders-json:aar": { - "shasums": { - "jar": "24ce7c1cfda1d526b76b16437a2e7d0920d7176a377e0e30b2a7381341f22ea1" - }, - "version": "16.1.0" - }, - "com.google.firebase:firebase-firestore-ktx:aar": { - "shasums": { - "jar": "5c3ebeadfc1feed2fb20c3a974c9f108e2068833af1b9e532cda6a85cb37011f" - }, - "version": "24.2.1" - }, - "com.google.firebase:firebase-firestore:aar": { - "shasums": { - "jar": "e0f2b11b93e779f13e7fcc6a91724aeb071114959c55d19e7e0028c0a01003aa" - }, - "version": "24.2.1" - }, - "com.google.firebase:firebase-iid-interop:aar": { - "shasums": { - "jar": "b6f4ad581eb489370be3bf38a4bdabfc6ea3d4e716234c625a0f42516c53523c" - }, - "version": "17.0.0" - }, - "com.google.firebase:firebase-iid:aar": { - "shasums": { - "jar": "f1c174e75a24f298fbc0ed93dde29c997f29ca511d7e8a18dec068203553cf6b" - }, - "version": "20.1.5" - }, - "com.google.firebase:firebase-installations-interop:aar": { - "shasums": { - "jar": "d498fe20e7d2c65fc8f7124f1c1791d2828bebdf6bf06ab4cdee13e7fe9ccaa2" - }, - "version": "16.0.0" - }, - "com.google.firebase:firebase-installations:aar": { - "shasums": { - "jar": "0d0f88b3c3789d5fe1aa9a69bd5ab6c0e92036fcf34520775a0091e37268dd3f" - }, - "version": "16.3.2" - }, - "com.google.firebase:firebase-measurement-connector:aar": { - "shasums": { - "jar": "17e8b9b60ac0a79fcbed754d03d4b966cc5bb8837e79c2308bf2970f1d05700c" - }, - "version": "18.0.0" - }, - "com.google.firebase:protolite-well-known-types:aar": { - "shasums": { - "jar": "9ac16b795b44c4ba87937ba0a850260d393f9dc25ff469d52a7bad528daac986" - }, - "version": "18.0.0" - }, - "com.google.gms:google-services": { - "shasums": { - "jar": "d9668002ef7032deddf7dbf853b47e10e6722bbce1b318fe7d6a297e28a8dcae" - }, - "version": "4.3.3" - }, - "com.google.googlejavaformat:google-java-format": { - "shasums": { - "jar": "aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e" - }, - "version": "1.5" + "version": "2.7.1" }, "com.google.guava:failureaccess": { "shasums": { @@ -1096,12 +213,6 @@ }, "version": "3.17.3" }, - "com.google.protobuf:protobuf-javalite": { - "shasums": { - "jar": "bfc598474392a015c050d34be38bb84eb3986809374eac437420d51680150e94" - }, - "version": "3.19.2" - }, "com.google.truth.extensions:truth-liteproto-extension": { "shasums": { "jar": "71cce6284554e546d1b5ba48e310ee4b4050676f09fb0eced136d779284ff78d" @@ -1114,18 +225,6 @@ }, "version": "1.1.3" }, - "com.googlecode.juniversalchardet:juniversalchardet": { - "shasums": { - "jar": "757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76" - }, - "version": "1.0.3" - }, - "com.ibm.icu:icu4j": { - "shasums": { - "jar": "e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab" - }, - "version": "53.1" - }, "com.squareup.moshi:moshi": { "shasums": { "jar": "bd004dd9ba175e603ad44420bf605250291b9b7bc6b9d9e916f5741ac8663307" @@ -1156,12 +255,6 @@ }, "version": "4.7.2" }, - "com.squareup.okhttp:okhttp": { - "shasums": { - "jar": "88ac9fd1bb51f82bcc664cc1eb9c225c90dc4389d660231b4cc737bebfe7d0aa" - }, - "version": "2.7.5" - }, "com.squareup.okio:okio": { "shasums": { "jar": "a27f091d34aa452e37227e2cfa85809f29012a8ef2501a9b5a125a978e4fcbc1" @@ -1180,24 +273,6 @@ }, "version": "2.9.0" }, - "com.squareup.retrofit2:retrofit-mock": { - "shasums": { - "jar": "00692755410b4367c7c12e6e4aadd3b1a28b5169e8961d94bc27ab36ece9bf29" - }, - "version": "2.5.0" - }, - "com.squareup:javapoet": { - "shasums": { - "jar": "4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291" - }, - "version": "1.13.0" - }, - "com.squareup:javawriter": { - "shasums": { - "jar": "f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e" - }, - "version": "2.1.1" - }, "com.squareup:kotlinpoet": { "shasums": { "jar": "336095fd910caeaebcc2f6998df6625a9a90a5fd9f2cfa215ac224b77f37fbc6" @@ -1216,83 +291,29 @@ }, "version": "3.0.8" }, - "com.sun.xml.fastinfoset:FastInfoset": { - "shasums": { - "jar": "056f3a1e144409f21ed16afc26805f58e9a21f3fce1543c42d400719d250c511" - }, - "version": "1.2.16" - }, - "commons-codec:commons-codec": { - "shasums": { - "jar": "4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569" - }, - "version": "1.10" - }, - "commons-io:commons-io": { - "shasums": { - "jar": "cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581" - }, - "version": "2.4" - }, - "commons-logging:commons-logging": { - "shasums": { - "jar": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636" - }, - "version": "1.2" - }, - "io.fabric.sdk.android:fabric:aar": { - "shasums": { - "jar": "36df4b321ec95e31226ff5abaae73e66f3a99dedddbc2d03054c4e141c8aaa5c" - }, - "version": "1.4.7" - }, - "io.grpc:grpc-android:aar": { - "shasums": { - "jar": "5a2d9a295c6e77cb4e615ed4519edcae2432b7828cac2cc1a8ee798cffb43c9a" - }, - "version": "1.44.1" - }, - "io.grpc:grpc-api": { - "shasums": { - "jar": "5d2bd58e4003e6b8440b3596c0809ef5c651594d62943edb459d5fa82273bd2f" - }, - "version": "1.44.1" - }, - "io.grpc:grpc-context": { - "shasums": { - "jar": "97059fef9e325ecfcc30429921916ebaccd436cf5601af4d706ef1f613f5ea85" - }, - "version": "1.44.1" - }, - "io.grpc:grpc-core": { - "shasums": { - "jar": "907dd75d9684dcd1e5664856e45aa05e072870af91796e635405f963f82431da" - }, - "version": "1.44.1" - }, - "io.grpc:grpc-okhttp": { + "com.sun.xml.fastinfoset:FastInfoset": { "shasums": { - "jar": "ecd538b47b44b4638fa12b792ae2ac18c9b28c5d5a96595b1d3b75d1af424ac2" + "jar": "056f3a1e144409f21ed16afc26805f58e9a21f3fce1543c42d400719d250c511" }, - "version": "1.44.1" + "version": "1.2.16" }, - "io.grpc:grpc-protobuf-lite": { + "commons-codec:commons-codec": { "shasums": { - "jar": "1e53b2f3d856ee83fe58f7b89a36180e00c79141fbc9752682d1fdb36bcb93be" + "jar": "4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569" }, - "version": "1.44.1" + "version": "1.10" }, - "io.grpc:grpc-stub": { + "commons-io:commons-io": { "shasums": { - "jar": "c34e16c085568df0ca8b22d7fe1326999d5be192deb2ae057238ec0f7707a107" + "jar": "cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581" }, - "version": "1.44.1" + "version": "2.4" }, - "io.perfmark:perfmark-api": { + "commons-logging:commons-logging": { "shasums": { - "jar": "c705b5c10c18ff3032b9e81742bc2f6b0e5607f6a6dfc0c8ad0cff75d4913042" + "jar": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636" }, - "version": "0.23.0" + "version": "1.2" }, "io.xlate:yaml-json": { "shasums": { @@ -1318,12 +339,6 @@ }, "version": "2.3.2" }, - "javax.annotation:javax.annotation-api": { - "shasums": { - "jar": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b" - }, - "version": "1.3.2" - }, "javax.inject:javax.inject": { "shasums": { "jar": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" @@ -1360,30 +375,12 @@ }, "version": "5.6.0" }, - "net.ltgt.gradle.incap:incap": { - "shasums": { - "jar": "b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd" - }, - "version": "0.2" - }, "net.sf.kxml:kxml2": { "shasums": { "jar": "f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2" }, "version": "2.3.0" }, - "nl.dionsegijn:konfetti:aar": { - "shasums": { - "jar": "a9beb9371e9c06c39eeff1ed052142a6ed6f0b28e3408230d8771867f9d817ba" - }, - "version": "1.2.5" - }, - "org.antlr:antlr4": { - "shasums": { - "jar": "a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4" - }, - "version": "4.5.3" - }, "org.apache.commons:commons-compress": { "shasums": { "jar": "0aeb625c948c697ea7b205156e112363b59ed5e2551212cd4e460bdb72c7c06e" @@ -1416,27 +413,15 @@ }, "org.bouncycastle:bcprov-jdk15on": { "shasums": { - "jar": "e78f96eb59066c94c94fb2d6b5eb80f52feac6f5f9776898634f8addec6e2137" + "jar": "963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349" }, - "version": "1.65" - }, - "org.checkerframework:checker-compat-qual": { - "shasums": { - "jar": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a" - }, - "version": "2.5.5" + "version": "1.56" }, "org.checkerframework:checker-qual": { "shasums": { - "jar": "63d474e16948b0a5aabd12c18bdc3d6f47ac2efc4c7ee08da76dba4658138f95" + "jar": "3ea0dcd73b4d6cb2fb34bd7ed4dad6db327a01ebad7db05eb7894076b3d64491" }, - "version": "3.21.3" - }, - "org.codehaus.mojo:animal-sniffer-annotations": { - "shasums": { - "jar": "e67ec27ceeaf13ab5d54cf5fdbcc544c41b4db8d02d9f006678cca2c7c13ee9d" - }, - "version": "1.19" + "version": "3.13.0" }, "org.eclipse.parsson:parsson": { "shasums": { @@ -1462,18 +447,6 @@ }, "version": "1.3" }, - "org.hamcrest:hamcrest-integration": { - "shasums": { - "jar": "70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2" - }, - "version": "1.3" - }, - "org.hamcrest:hamcrest-library": { - "shasums": { - "jar": "711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c" - }, - "version": "1.3" - }, "org.jetbrains.intellij.deps:trove4j": { "shasums": { "jar": "affb7c85a3c87bdcf69ff1dbb84de11f63dc931293934bc08cd7ab18de083601" @@ -1552,12 +525,6 @@ }, "version": "1.3.72" }, - "org.jetbrains.kotlinx:kotlinx-coroutines-android": { - "shasums": { - "jar": "3fdc0eed5bc4b83ee9622774520a2db25470370eacd1581cac1e37704f095b00" - }, - "version": "1.6.4" - }, "org.jetbrains.kotlinx:kotlinx-coroutines-core": { "shasums": { "jar": "778851e73851b502e8366434bc9ec58371431890fb12b89e7edbf1732962c030" @@ -1570,30 +537,6 @@ }, "version": "1.6.4" }, - "org.jetbrains.kotlinx:kotlinx-coroutines-guava": { - "shasums": { - "jar": "94deeee072e0f762a8a3ccc66b1762c5d96d55eca13cab4001f5b7588bb74390" - }, - "version": "1.6.4" - }, - "org.jetbrains.kotlinx:kotlinx-coroutines-test": { - "shasums": { - "jar": "993eef7de86d59e99096fbc51b7df33f0cc8a3a655e195590765b7e51e4c0aaa" - }, - "version": "1.6.4" - }, - "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm": { - "shasums": { - "jar": "69d65e5fea41cbc0bb905d3ef6623a2348b931fd01b9f2c4a1751a372f2e476d" - }, - "version": "1.6.4" - }, - "org.jetbrains.kotlinx:kotlinx-metadata-jvm": { - "shasums": { - "jar": "fdaf7ba158465f6b6e9ce5762e0300fd681a976fbfeb5ed50fa5a2b26868cec8" - }, - "version": "0.3.0" - }, "org.jetbrains:annotations": { "shasums": { "jar": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478" @@ -1632,93 +575,15 @@ }, "org.ow2.asm:asm-analysis": { "shasums": { - "jar": "2d46de6df856a4daac9aa534459ab7287eb80584e9109850405e5b302dc9c2a6" - }, - "version": "9.0" - }, - "org.ow2.asm:asm-commons": { - "shasums": { - "jar": "1b9090acb7e67bd4ed2f2cfb002063316d79cecace237bd07cc4f7f1b302092f" + "jar": "e981f8f650c4d900bb033650b18e122fa6b161eadd5f88978d08751f72ee8474" }, - "version": "9.0" + "version": "7.0" }, "org.ow2.asm:asm-tree": { "shasums": { - "jar": "e2c25f332eb95861883a8568e45aac5e77d140d0fe961ae8eb9a474ec876e00d" - }, - "version": "9.0" - }, - "org.ow2.asm:asm-util": { - "shasums": { - "jar": "2af6e7d01e0862e75193f3c01a06a689b0a245947e29f38eb683633391519bb6" + "jar": "cfd7a0874f9de36a999c127feeadfbfe6e04d4a71ee954d7af3d853f0be48a6c" }, - "version": "9.0" - }, - "org.robolectric:annotations": { - "shasums": { - "jar": "76b5bf55bb0d98e3b72fee1e015dea04c3a5a907aff02b9b405cebd50a19e1ab" - }, - "version": "4.5" - }, - "org.robolectric:junit": { - "shasums": { - "jar": "c9eec2e87d53fc7a4af3c0c1c4b722963f2dc7d0a01b90568a6c83ca6d751c4a" - }, - "version": "4.5" - }, - "org.robolectric:pluginapi": { - "shasums": { - "jar": "9292f4a65d546b27b000112f1daeea8228c039ba9eb790d122ee99a4b04d8c43" - }, - "version": "4.5" - }, - "org.robolectric:plugins-maven-dependency-resolver": { - "shasums": { - "jar": "e6c381016e2da09c3f3a7859075042d3457d0dc0a6ba088b8d969b9d3a525cfa" - }, - "version": "4.5" - }, - "org.robolectric:resources": { - "shasums": { - "jar": "21b60d114670827bf80b7815faa16da02eeda2fcd01cba088dfb630fa9721eb3" - }, - "version": "4.5" - }, - "org.robolectric:robolectric": { - "shasums": { - "jar": "ba9f8130c11d5b34dfe61990d2e9adfbcf5a945476309c3dcb48fce547331c27" - }, - "version": "4.5" - }, - "org.robolectric:sandbox": { - "shasums": { - "jar": "cf18639f2991893122f88df87bf83eb325b3ca1031c9a730acead5acdc7e275c" - }, - "version": "4.5" - }, - "org.robolectric:shadowapi": { - "shasums": { - "jar": "a158c49d0274a1412fb909d6b2e52a06b230a2b80ad8657c072c7474f0e69c1f" - }, - "version": "4.5" - }, - "org.robolectric:shadows-framework": { - "shasums": { - "jar": "3be4c7d01ee2fb5cff4cb90a65af26831199baac3e92311dd2d5f42cadb50723" - }, - "version": "4.5" - }, - "org.robolectric:utils": { - "shasums": { - "jar": "b0982a413c4bd874a8099b97a22cdcd4826cf62178f17dbca67d814627124de1" - }, - "version": "4.5" - }, - "org.robolectric:utils-reflector": { - "shasums": { - "jar": "91f9e5f9eacd6a2f308473b39d473f3edd205365fe3c4188f8c4c11191c6d914" - }, - "version": "4.5" + "version": "7.0" }, "org.smali:baksmali": { "shasums": { @@ -1758,390 +623,6 @@ } }, "dependencies": { - "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.analytics-library:protos": [ "com.google.protobuf:protobuf-java" ], @@ -2170,10 +651,6 @@ "com.google.code.findbugs:jsr305", "com.google.guava:guava" ], - "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" ], @@ -2256,388 +733,50 @@ "com.google.guava:guava", "org.jetbrains.kotlin:kotlin-stdlib-jdk8" ], - "com.android.tools:dvlib": [ - "com.android.tools:common" - ], - "com.android.tools:repository": [ - "com.android.tools.analytics-library:shared", - "com.android.tools:common", - "com.google.jimfs:jimfs", - "com.sun.activation:javax.activation", - "org.apache.commons:commons-compress", - "org.glassfish.jaxb:jaxb-runtime", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8" - ], - "com.android.tools:sdk-common": [ - "com.android.tools.analytics-library:shared", - "com.android.tools.build:aapt2-proto", - "com.android.tools.build:builder-model", - "com.android.tools.build:builder-test-api", - "com.android.tools.ddms:ddmlib", - "com.android.tools.layoutlib:layoutlib-api", - "com.android.tools:common", - "com.android.tools:sdklib", - "com.google.code.gson:gson", - "com.google.guava:guava", - "com.google.protobuf:protobuf-java", - "javax.inject:javax.inject", - "net.sf.kxml:kxml2", - "org.bouncycastle:bcpkix-jdk15on", - "org.bouncycastle:bcprov-jdk15on", - "org.glassfish.jaxb:jaxb-runtime", - "org.jetbrains.intellij.deps:trove4j", - "org.jetbrains.kotlin:kotlin-reflect", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8", - "xerces:xercesImpl" - ], - "com.android.tools:sdklib": [ - "com.android.tools.layoutlib:layoutlib-api", - "com.android.tools:common", - "com.android.tools:dvlib", - "com.android.tools:repository", - "com.google.code.gson:gson", - "org.apache.commons:commons-compress", - "org.apache.httpcomponents:httpcore", - "org.apache.httpcomponents:httpmime", - "org.glassfish.jaxb:jaxb-runtime" - ], - "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.android.play:integrity:aar": [ - "com.google.android.gms:play-services-basement:aar", - "com.google.android.gms:play-services-tasks: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.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": [ - "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.devtools.ksp:symbol-processing-api", - "com.google.guava:failureaccess", - "com.google.guava:guava", - "com.squareup:javapoet", - "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", - "com.google.android.gms:play-services-measurement-sdk:aar", - "com.google.android.gms:play-services-measurement:aar" - ], - "com.google.firebase:firebase-appcheck-debug:aar": [ - "com.google.android.gms:play-services-base:aar", - "com.google.android.gms:play-services-tasks:aar", - "com.google.firebase:firebase-appcheck:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar" - ], - "com.google.firebase:firebase-appcheck-interop:aar": [ - "com.google.android.gms:play-services-base: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-appcheck-playintegrity:aar": [ - "com.google.android.gms:play-services-base:aar", - "com.google.android.gms:play-services-tasks:aar", - "com.google.android.play:integrity:aar", - "com.google.firebase:firebase-appcheck:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar" - ], - "com.google.firebase:firebase-appcheck:aar": [ - "com.google.android.gms:play-services-base:aar", - "com.google.android.gms:play-services-tasks:aar", - "com.google.firebase:firebase-appcheck-interop:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar" - ], - "com.google.firebase:firebase-auth-interop:aar": [ - "com.google.android.gms:play-services-basement:aar", - "com.google.android.gms:play-services-tasks:aar", - "com.google.firebase:firebase-annotations", - "com.google.firebase:firebase-common:aar" - ], - "com.google.firebase:firebase-auth-ktx:aar": [ - "com.google.firebase:firebase-auth:aar", - "com.google.firebase:firebase-common-ktx:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7" - ], - "com.google.firebase:firebase-auth:aar": [ - "androidx.collection:collection", - "androidx.fragment:fragment:aar", - "androidx.localbroadcastmanager:localbroadcastmanager:aar", - "com.google.android.gms:play-services-base:aar", - "com.google.android.gms:play-services-basement:aar", - "com.google.android.gms:play-services-tasks:aar", - "com.google.firebase:firebase-auth-interop:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar" - ], - "com.google.firebase:firebase-common-ktx:aar": [ - "androidx.annotation:annotation", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7" - ], - "com.google.firebase:firebase-common:aar": [ - "com.google.android.gms:play-services-basement:aar", - "com.google.android.gms:play-services-tasks:aar", - "com.google.firebase:firebase-components:aar" - ], - "com.google.firebase:firebase-components:aar": [ - "androidx.annotation:annotation", - "com.google.firebase:firebase-annotations" - ], - "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-database-collection:aar": [ - "com.google.android.gms:play-services-base:aar" - ], - "com.google.firebase:firebase-encoders-json:aar": [ - "androidx.annotation:annotation" + "com.android.tools:dvlib": [ + "com.android.tools:common" ], - "com.google.firebase:firebase-firestore-ktx:aar": [ - "androidx.annotation:annotation", - "com.google.firebase:firebase-common-ktx:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-firestore:aar", - "org.jetbrains.kotlin:kotlin-stdlib-jdk7" + "com.android.tools:repository": [ + "com.android.tools.analytics-library:shared", + "com.android.tools:common", + "com.google.jimfs:jimfs", + "com.sun.activation:javax.activation", + "org.apache.commons:commons-compress", + "org.glassfish.jaxb:jaxb-runtime", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" ], - "com.google.firebase:firebase-firestore:aar": [ - "androidx.annotation:annotation", - "com.google.android.gms:play-services-base:aar", - "com.google.android.gms:play-services-basement:aar", - "com.google.android.gms:play-services-tasks:aar", - "com.google.firebase:firebase-annotations", - "com.google.firebase:firebase-appcheck-interop:aar", - "com.google.firebase:firebase-auth-interop:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-database-collection:aar", - "com.google.firebase:protolite-well-known-types:aar", - "com.squareup.okhttp:okhttp", - "io.grpc:grpc-android:aar", - "io.grpc:grpc-okhttp", - "io.grpc:grpc-protobuf-lite", - "io.grpc:grpc-stub" - ], - "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.firebase:protolite-well-known-types:aar": [ - "com.google.protobuf:protobuf-javalite" - ], - "com.google.gms:google-services": [ - "com.google.android.gms:strict-version-matcher-plugin", + "com.android.tools:sdk-common": [ + "com.android.tools.analytics-library:shared", + "com.android.tools.build:aapt2-proto", + "com.android.tools.build:builder-model", + "com.android.tools.build:builder-test-api", + "com.android.tools.ddms:ddmlib", + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools:common", + "com.android.tools:sdklib", "com.google.code.gson:gson", - "com.google.guava:guava" + "com.google.guava:guava", + "com.google.protobuf:protobuf-java", + "javax.inject:javax.inject", + "net.sf.kxml:kxml2", + "org.bouncycastle:bcpkix-jdk15on", + "org.bouncycastle:bcprov-jdk15on", + "org.glassfish.jaxb:jaxb-runtime", + "org.jetbrains.intellij.deps:trove4j", + "org.jetbrains.kotlin:kotlin-reflect", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "xerces:xercesImpl" ], - "com.google.googlejavaformat:google-java-format": [ - "com.google.errorprone:javac-shaded", - "com.google.guava:guava" + "com.android.tools:sdklib": [ + "com.android.tools.layoutlib:layoutlib-api", + "com.android.tools:common", + "com.android.tools:dvlib", + "com.android.tools:repository", + "com.google.code.gson:gson", + "org.apache.commons:commons-compress", + "org.apache.httpcomponents:httpcore", + "org.apache.httpcomponents:httpmime", + "org.glassfish.jaxb:jaxb-runtime" ], "com.google.guava:guava": [ "com.google.code.findbugs:jsr305", @@ -2697,9 +836,6 @@ "com.squareup.okio:okio", "org.jetbrains.kotlin:kotlin-stdlib" ], - "com.squareup.okhttp:okhttp": [ - "com.squareup.okio:okio" - ], "com.squareup.okio:okio": [ "org.jetbrains.kotlin:kotlin-stdlib", "org.jetbrains.kotlin:kotlin-stdlib-common" @@ -2711,9 +847,6 @@ "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" @@ -2721,43 +854,6 @@ "com.sun.istack:istack-commons-runtime": [ "jakarta.activation:jakarta.activation-api" ], - "io.grpc:grpc-android:aar": [ - "com.google.guava:guava", - "io.grpc:grpc-core" - ], - "io.grpc:grpc-api": [ - "com.google.code.findbugs:jsr305", - "com.google.errorprone:error_prone_annotations", - "com.google.guava:guava", - "io.grpc:grpc-context" - ], - "io.grpc:grpc-core": [ - "com.google.android:annotations", - "com.google.code.gson:gson", - "com.google.errorprone:error_prone_annotations", - "com.google.guava:guava", - "io.grpc:grpc-api", - "io.perfmark:perfmark-api", - "org.codehaus.mojo:animal-sniffer-annotations" - ], - "io.grpc:grpc-okhttp": [ - "com.google.guava:guava", - "com.squareup.okhttp:okhttp", - "com.squareup.okio:okio", - "io.grpc:grpc-core", - "io.perfmark:perfmark-api" - ], - "io.grpc:grpc-protobuf-lite": [ - "com.google.code.findbugs:jsr305", - "com.google.guava:guava", - "com.google.protobuf:protobuf-javalite", - "io.grpc:grpc-api" - ], - "io.grpc:grpc-stub": [ - "com.google.errorprone:error_prone_annotations", - "com.google.guava:guava", - "io.grpc:grpc-api" - ], "jakarta.xml.bind:jakarta.xml.bind-api": [ "jakarta.activation:jakarta.activation-api" ], @@ -2767,9 +863,6 @@ "net.java.dev.jna:jna-platform": [ "net.java.dev.jna:jna" ], - "nl.dionsegijn:konfetti:aar": [ - "org.jetbrains.kotlin:kotlin-stdlib" - ], "org.apache.httpcomponents:httpclient": [ "commons-codec:commons-codec", "commons-logging:commons-logging", @@ -2792,12 +885,6 @@ "org.glassfish.jaxb:txw2", "org.jvnet.staxex:stax-ex" ], - "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", @@ -2834,10 +921,6 @@ "org.jetbrains.kotlin:kotlin-test", "org.jetbrains.kotlin:kotlin-test-annotations-common" ], - "org.jetbrains.kotlinx:kotlinx-coroutines-android": [ - "org.jetbrains.kotlin:kotlin-stdlib-jdk8", - "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm" - ], "org.jetbrains.kotlinx:kotlinx-coroutines-core": [ "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm" ], @@ -2845,22 +928,6 @@ "org.jetbrains.kotlin:kotlin-stdlib-common", "org.jetbrains.kotlin:kotlin-stdlib-jdk8" ], - "org.jetbrains.kotlinx:kotlinx-coroutines-guava": [ - "com.google.guava:guava", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8", - "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm" - ], - "org.jetbrains.kotlinx:kotlinx-coroutines-test": [ - "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm" - ], - "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm": [ - "org.jetbrains.kotlin:kotlin-stdlib-common", - "org.jetbrains.kotlin:kotlin-stdlib-jdk8", - "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm" - ], - "org.jetbrains.kotlinx:kotlinx-metadata-jvm": [ - "org.jetbrains.kotlin:kotlin-stdlib" - ], "org.jvnet.staxex:stax-ex": [ "jakarta.activation:jakarta.activation-api", "jakarta.xml.bind:jakarta.xml.bind-api" @@ -2876,95 +943,9 @@ "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" - ], "org.smali:baksmali": [ "com.beust:jcommander", "com.google.guava:guava", @@ -2986,61 +967,6 @@ ] }, "packages": { - "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.tools.analytics-library:protos": [ "com.android.tools.build.gradle.internal.profile", "com.google.wireless.android.play.playlog.proto", @@ -3059,15 +985,6 @@ "com.android.tools.apkparser:binary-resources": [ "com.google.devrel.gmscore.tools.apk.arsc" ], - "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" @@ -4203,33 +2120,6 @@ "com.beust.jcommander.internal", "com.beust.jcommander.validators" ], - "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.android:annotations": [ - "android.annotation" - ], "com.google.auto.service:auto-service-annotations": [ "com.google.auto.service" ], @@ -4251,109 +2141,13 @@ "com.google.gson.internal.bind", "com.google.gson.internal.bind.util", "com.google.gson.internal.reflect", - "com.google.gson.internal.sql", "com.google.gson.reflect", "com.google.gson.stream" ], - "com.google.dagger:dagger": [ - "dagger", - "dagger.assisted", - "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.componentgenerator", - "dagger.internal.codegen.javapoet", - "dagger.internal.codegen.kotlin", - "dagger.internal.codegen.langmodel", - "dagger.internal.codegen.validation", - "dagger.internal.codegen.writing" - ], - "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.internal.codegen.xprocessing", - "dagger.model", - "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", "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.firebase:firebase-annotations": [ - "com.google.firebase.annotations" - ], - "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" ], @@ -4390,35 +2184,12 @@ "com.google.protobuf:protobuf-java-util": [ "com.google.protobuf.util" ], - "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" @@ -4474,14 +2245,6 @@ "okhttp3.internal.tls", "okhttp3.internal.ws" ], - "com.squareup.okhttp:okhttp": [ - "com.squareup.okhttp", - "com.squareup.okhttp.internal", - "com.squareup.okhttp.internal.framed", - "com.squareup.okhttp.internal.http", - "com.squareup.okhttp.internal.io", - "com.squareup.okhttp.internal.tls" - ], "com.squareup.okio:okio": [ "okio", "okio.internal" @@ -4494,15 +2257,6 @@ "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", @@ -4557,32 +2311,6 @@ "org.apache.commons.logging", "org.apache.commons.logging.impl" ], - "io.grpc:grpc-api": [ - "io.grpc" - ], - "io.grpc:grpc-context": [ - "io.grpc" - ], - "io.grpc:grpc-core": [ - "io.grpc.inprocess", - "io.grpc.internal", - "io.grpc.util" - ], - "io.grpc:grpc-okhttp": [ - "io.grpc.okhttp", - "io.grpc.okhttp.internal", - "io.grpc.okhttp.internal.framed" - ], - "io.grpc:grpc-protobuf-lite": [ - "io.grpc.protobuf.lite" - ], - "io.grpc:grpc-stub": [ - "io.grpc.stub", - "io.grpc.stub.annotations" - ], - "io.perfmark:perfmark-api": [ - "io.perfmark" - ], "io.xlate:yaml-json": [ "io.xlate.yamljson" ], @@ -4602,11 +2330,6 @@ "javax.xml.bind.helpers", "javax.xml.bind.util" ], - "javax.annotation:javax.annotation-api": [ - "javax.annotation", - "javax.annotation.security", - "javax.annotation.sql" - ], "javax.inject:javax.inject": [ "javax.inject" ], @@ -4706,9 +2429,6 @@ "com.sun.jna.platform.win32.COM.util.annotation", "com.sun.jna.platform.wince" ], - "net.ltgt.gradle.incap:incap": [ - "net.ltgt.gradle.incap" - ], "net.sf.kxml:kxml2": [ "org.kxml2.io", "org.kxml2.kdom", @@ -4718,44 +2438,6 @@ "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.apache.commons:commons-compress": [ "org.apache.commons.compress", "org.apache.commons.compress.archivers", @@ -4883,24 +2565,18 @@ "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", @@ -4910,7 +2586,6 @@ "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", @@ -4945,19 +2620,18 @@ "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.tls", "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", @@ -4965,8 +2639,6 @@ "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", @@ -4994,11 +2666,8 @@ "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", @@ -5006,26 +2675,19 @@ "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", @@ -5037,9 +2699,6 @@ "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", @@ -5053,7 +2712,6 @@ "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", @@ -5072,9 +2730,6 @@ "org.checkerframework.dataflow.qual", "org.checkerframework.framework.qual" ], - "org.codehaus.mojo:animal-sniffer-annotations": [ - "org.codehaus.mojo.animal_sniffer" - ], "org.eclipse.parsson:parsson": [ "org.eclipse.parsson", "org.eclipse.parsson.api" @@ -5116,19 +2771,6 @@ "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" @@ -6008,9 +3650,6 @@ "kotlin.test.junit", "kotlin.test.junit.annotations" ], - "org.jetbrains.kotlinx:kotlinx-coroutines-android": [ - "kotlinx.coroutines.android" - ], "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm": [ "kotlinx.coroutines", "kotlinx.coroutines.channels", @@ -6024,28 +3663,6 @@ "kotlinx.coroutines.selects", "kotlinx.coroutines.sync" ], - "org.jetbrains.kotlinx:kotlinx-coroutines-guava": [ - "kotlinx.coroutines.guava" - ], - "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm": [ - "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" @@ -6144,84 +3761,9 @@ "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" - ], "org.smali:baksmali": [ "org.jf.baksmali", "org.jf.baksmali.Adaptors", @@ -6371,387 +3913,11 @@ ] }, "repositories": { - "https://maven.google.com/": [ - "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.tools.analytics-library:protos", - "com.android.tools.analytics-library:shared", - "com.android.tools.apkparser:apkanalyzer", - "com.android.tools.apkparser:binary-resources", - "com.android.tools.build.jetifier:jetifier-core", - "com.android.tools.build:aapt2-proto", - "com.android.tools.build:builder-model", - "com.android.tools.build:builder-test-api", - "com.android.tools.build:manifest-merger", - "com.android.tools.ddms:ddmlib", - "com.android.tools.external.com-intellij:intellij-core", - "com.android.tools.external.com-intellij:kotlin-compiler", - "com.android.tools.external.org-jetbrains:uast", - "com.android.tools.layoutlib:layoutlib-api", - "com.android.tools.lint:lint-api", - "com.android.tools.lint:lint-checks", - "com.android.tools.lint:lint-model", - "com.android.tools:annotations", - "com.android.tools:common", - "com.android.tools:dvlib", - "com.android.tools:repository", - "com.android.tools:sdk-common", - "com.android.tools:sdklib", - "com.beust:jcommander", - "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", - "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.android.play:integrity:aar", - "com.google.android:annotations", - "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", - "com.google.firebase:firebase-annotations", - "com.google.firebase:firebase-appcheck-debug:aar", - "com.google.firebase:firebase-appcheck-interop:aar", - "com.google.firebase:firebase-appcheck-playintegrity:aar", - "com.google.firebase:firebase-appcheck:aar", - "com.google.firebase:firebase-auth-interop:aar", - "com.google.firebase:firebase-auth-ktx:aar", - "com.google.firebase:firebase-auth:aar", - "com.google.firebase:firebase-common-ktx:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-crashlytics:aar", - "com.google.firebase:firebase-database-collection:aar", - "com.google.firebase:firebase-encoders-json:aar", - "com.google.firebase:firebase-firestore-ktx:aar", - "com.google.firebase:firebase-firestore: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.firebase:protolite-well-known-types: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.jimfs:jimfs", - "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", - "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.okhttp: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", - "com.sun.activation:javax.activation", - "com.sun.istack:istack-commons-runtime", - "com.sun.xml.fastinfoset:FastInfoset", - "commons-codec:commons-codec", - "commons-io:commons-io", - "commons-logging:commons-logging", - "io.fabric.sdk.android:fabric:aar", - "io.grpc:grpc-android:aar", - "io.grpc:grpc-api", - "io.grpc:grpc-context", - "io.grpc:grpc-core", - "io.grpc:grpc-okhttp", - "io.grpc:grpc-protobuf-lite", - "io.grpc:grpc-stub", - "io.perfmark:perfmark-api", - "io.xlate:yaml-json", - "jakarta.activation:jakarta.activation-api", - "jakarta.json:jakarta.json-api", - "jakarta.xml.bind:jakarta.xml.bind-api", - "javax.annotation:javax.annotation-api", - "javax.inject:javax.inject", - "junit:junit", - "net.bytebuddy:byte-buddy", - "net.bytebuddy:byte-buddy-agent", - "net.java.dev.jna:jna", - "net.java.dev.jna:jna-platform", - "net.ltgt.gradle.incap:incap", - "net.sf.kxml:kxml2", - "nl.dionsegijn:konfetti:aar", - "org.antlr:antlr4", - "org.apache.commons:commons-compress", - "org.apache.httpcomponents:httpclient", - "org.apache.httpcomponents:httpcore", - "org.apache.httpcomponents:httpmime", - "org.bouncycastle:bcpkix-jdk15on", - "org.bouncycastle:bcprov-jdk15on", - "org.checkerframework:checker-compat-qual", - "org.checkerframework:checker-qual", - "org.codehaus.mojo:animal-sniffer-annotations", - "org.eclipse.parsson:parsson", - "org.glassfish.jaxb:jaxb-runtime", - "org.glassfish.jaxb:txw2", - "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-core-jvm", - "org.jetbrains.kotlinx:kotlinx-coroutines-guava", - "org.jetbrains.kotlinx:kotlinx-coroutines-test", - "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm", - "org.jetbrains:annotations", - "org.jvnet.staxex:stax-ex", - "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", - "org.smali:baksmali", - "org.smali:dexlib2", - "org.smali:util", - "org.snakeyaml:snakeyaml-engine", - "xerces:xercesImpl", - "xml-apis:xml-apis" - ], - "https://repo1.maven.org/maven2/": [ - "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", + "https://maven.fabric.io/public/": [ "com.android.tools.analytics-library:protos", "com.android.tools.analytics-library:shared", "com.android.tools.apkparser:apkanalyzer", "com.android.tools.apkparser:binary-resources", - "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools.build:builder-model", "com.android.tools.build:builder-test-api", @@ -6771,72 +3937,11 @@ "com.android.tools:sdk-common", "com.android.tools:sdklib", "com.beust:jcommander", - "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", - "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.android.play:integrity:aar", - "com.google.android:annotations", "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", - "com.google.firebase:firebase-annotations", - "com.google.firebase:firebase-appcheck-debug:aar", - "com.google.firebase:firebase-appcheck-interop:aar", - "com.google.firebase:firebase-appcheck-playintegrity:aar", - "com.google.firebase:firebase-appcheck:aar", - "com.google.firebase:firebase-auth-interop:aar", - "com.google.firebase:firebase-auth-ktx:aar", - "com.google.firebase:firebase-auth:aar", - "com.google.firebase:firebase-common-ktx:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-crashlytics:aar", - "com.google.firebase:firebase-database-collection:aar", - "com.google.firebase:firebase-encoders-json:aar", - "com.google.firebase:firebase-firestore-ktx:aar", - "com.google.firebase:firebase-firestore: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.firebase:protolite-well-known-types:aar", - "com.google.gms:google-services", - "com.google.googlejavaformat:google-java-format", "com.google.guava:failureaccess", "com.google.guava:guava", "com.google.guava:listenablefuture", @@ -6844,23 +3949,16 @@ "com.google.jimfs:jimfs", "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", - "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.okhttp: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", "com.sun.activation:javax.activation", "com.sun.istack:istack-commons-runtime", @@ -6868,45 +3966,28 @@ "commons-codec:commons-codec", "commons-io:commons-io", "commons-logging:commons-logging", - "io.fabric.sdk.android:fabric:aar", - "io.grpc:grpc-android:aar", - "io.grpc:grpc-api", - "io.grpc:grpc-context", - "io.grpc:grpc-core", - "io.grpc:grpc-okhttp", - "io.grpc:grpc-protobuf-lite", - "io.grpc:grpc-stub", - "io.perfmark:perfmark-api", "io.xlate:yaml-json", "jakarta.activation:jakarta.activation-api", "jakarta.json:jakarta.json-api", "jakarta.xml.bind:jakarta.xml.bind-api", - "javax.annotation:javax.annotation-api", "javax.inject:javax.inject", "junit:junit", "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", "net.java.dev.jna:jna", "net.java.dev.jna:jna-platform", - "net.ltgt.gradle.incap:incap", "net.sf.kxml:kxml2", - "nl.dionsegijn:konfetti:aar", - "org.antlr:antlr4", "org.apache.commons:commons-compress", "org.apache.httpcomponents:httpclient", "org.apache.httpcomponents:httpcore", "org.apache.httpcomponents:httpmime", "org.bouncycastle:bcpkix-jdk15on", "org.bouncycastle:bcprov-jdk15on", - "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", - "org.codehaus.mojo:animal-sniffer-annotations", "org.eclipse.parsson:parsson", "org.glassfish.jaxb:jaxb-runtime", "org.glassfish.jaxb:txw2", "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", @@ -6920,13 +4001,8 @@ "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-core-jvm", - "org.jetbrains.kotlinx:kotlinx-coroutines-guava", - "org.jetbrains.kotlinx:kotlinx-coroutines-test", - "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm", "org.jetbrains:annotations", "org.jvnet.staxex:stax-ex", "org.mockito.kotlin:mockito-kotlin", @@ -6934,20 +4010,7 @@ "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", "org.smali:baksmali", "org.smali:dexlib2", "org.smali:util", @@ -6955,95 +4018,11 @@ "xerces:xercesImpl", "xml-apis:xml-apis" ], - "https://oss.sonatype.org/content/repositories/snapshots/": [ - "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", + "https://maven.google.com/": [ "com.android.tools.analytics-library:protos", "com.android.tools.analytics-library:shared", "com.android.tools.apkparser:apkanalyzer", "com.android.tools.apkparser:binary-resources", - "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools.build:builder-model", "com.android.tools.build:builder-test-api", @@ -7063,72 +4042,11 @@ "com.android.tools:sdk-common", "com.android.tools:sdklib", "com.beust:jcommander", - "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", - "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.android.play:integrity:aar", - "com.google.android:annotations", "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", - "com.google.firebase:firebase-annotations", - "com.google.firebase:firebase-appcheck-debug:aar", - "com.google.firebase:firebase-appcheck-interop:aar", - "com.google.firebase:firebase-appcheck-playintegrity:aar", - "com.google.firebase:firebase-appcheck:aar", - "com.google.firebase:firebase-auth-interop:aar", - "com.google.firebase:firebase-auth-ktx:aar", - "com.google.firebase:firebase-auth:aar", - "com.google.firebase:firebase-common-ktx:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-crashlytics:aar", - "com.google.firebase:firebase-database-collection:aar", - "com.google.firebase:firebase-encoders-json:aar", - "com.google.firebase:firebase-firestore-ktx:aar", - "com.google.firebase:firebase-firestore: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.firebase:protolite-well-known-types:aar", - "com.google.gms:google-services", - "com.google.googlejavaformat:google-java-format", "com.google.guava:failureaccess", "com.google.guava:guava", "com.google.guava:listenablefuture", @@ -7136,23 +4054,16 @@ "com.google.jimfs:jimfs", "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", - "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.okhttp: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", "com.sun.activation:javax.activation", "com.sun.istack:istack-commons-runtime", @@ -7160,45 +4071,28 @@ "commons-codec:commons-codec", "commons-io:commons-io", "commons-logging:commons-logging", - "io.fabric.sdk.android:fabric:aar", - "io.grpc:grpc-android:aar", - "io.grpc:grpc-api", - "io.grpc:grpc-context", - "io.grpc:grpc-core", - "io.grpc:grpc-okhttp", - "io.grpc:grpc-protobuf-lite", - "io.grpc:grpc-stub", - "io.perfmark:perfmark-api", "io.xlate:yaml-json", "jakarta.activation:jakarta.activation-api", "jakarta.json:jakarta.json-api", "jakarta.xml.bind:jakarta.xml.bind-api", - "javax.annotation:javax.annotation-api", "javax.inject:javax.inject", "junit:junit", "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", "net.java.dev.jna:jna", "net.java.dev.jna:jna-platform", - "net.ltgt.gradle.incap:incap", "net.sf.kxml:kxml2", - "nl.dionsegijn:konfetti:aar", - "org.antlr:antlr4", "org.apache.commons:commons-compress", "org.apache.httpcomponents:httpclient", "org.apache.httpcomponents:httpcore", "org.apache.httpcomponents:httpmime", "org.bouncycastle:bcpkix-jdk15on", "org.bouncycastle:bcprov-jdk15on", - "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", - "org.codehaus.mojo:animal-sniffer-annotations", "org.eclipse.parsson:parsson", "org.glassfish.jaxb:jaxb-runtime", "org.glassfish.jaxb:txw2", "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", @@ -7212,13 +4106,8 @@ "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-core-jvm", - "org.jetbrains.kotlinx:kotlinx-coroutines-guava", - "org.jetbrains.kotlinx:kotlinx-coroutines-test", - "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm", "org.jetbrains:annotations", "org.jvnet.staxex:stax-ex", "org.mockito.kotlin:mockito-kotlin", @@ -7226,20 +4115,7 @@ "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", "org.smali:baksmali", "org.smali:dexlib2", "org.smali:util", @@ -7247,95 +4123,11 @@ "xerces:xercesImpl", "xml-apis:xml-apis" ], - "https://maven.fabric.io/public/": [ - "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", + "https://repo1.maven.org/maven2/": [ "com.android.tools.analytics-library:protos", "com.android.tools.analytics-library:shared", "com.android.tools.apkparser:apkanalyzer", "com.android.tools.apkparser:binary-resources", - "com.android.tools.build.jetifier:jetifier-core", "com.android.tools.build:aapt2-proto", "com.android.tools.build:builder-model", "com.android.tools.build:builder-test-api", @@ -7355,72 +4147,11 @@ "com.android.tools:sdk-common", "com.android.tools:sdklib", "com.beust:jcommander", - "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", - "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.android.play:integrity:aar", - "com.google.android:annotations", "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", - "com.google.firebase:firebase-annotations", - "com.google.firebase:firebase-appcheck-debug:aar", - "com.google.firebase:firebase-appcheck-interop:aar", - "com.google.firebase:firebase-appcheck-playintegrity:aar", - "com.google.firebase:firebase-appcheck:aar", - "com.google.firebase:firebase-auth-interop:aar", - "com.google.firebase:firebase-auth-ktx:aar", - "com.google.firebase:firebase-auth:aar", - "com.google.firebase:firebase-common-ktx:aar", - "com.google.firebase:firebase-common:aar", - "com.google.firebase:firebase-components:aar", - "com.google.firebase:firebase-crashlytics:aar", - "com.google.firebase:firebase-database-collection:aar", - "com.google.firebase:firebase-encoders-json:aar", - "com.google.firebase:firebase-firestore-ktx:aar", - "com.google.firebase:firebase-firestore: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.firebase:protolite-well-known-types:aar", - "com.google.gms:google-services", - "com.google.googlejavaformat:google-java-format", "com.google.guava:failureaccess", "com.google.guava:guava", "com.google.guava:listenablefuture", @@ -7428,23 +4159,16 @@ "com.google.jimfs:jimfs", "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", - "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.okhttp: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", "com.sun.activation:javax.activation", "com.sun.istack:istack-commons-runtime", @@ -7452,45 +4176,28 @@ "commons-codec:commons-codec", "commons-io:commons-io", "commons-logging:commons-logging", - "io.fabric.sdk.android:fabric:aar", - "io.grpc:grpc-android:aar", - "io.grpc:grpc-api", - "io.grpc:grpc-context", - "io.grpc:grpc-core", - "io.grpc:grpc-okhttp", - "io.grpc:grpc-protobuf-lite", - "io.grpc:grpc-stub", - "io.perfmark:perfmark-api", "io.xlate:yaml-json", "jakarta.activation:jakarta.activation-api", "jakarta.json:jakarta.json-api", "jakarta.xml.bind:jakarta.xml.bind-api", - "javax.annotation:javax.annotation-api", "javax.inject:javax.inject", "junit:junit", "net.bytebuddy:byte-buddy", "net.bytebuddy:byte-buddy-agent", "net.java.dev.jna:jna", "net.java.dev.jna:jna-platform", - "net.ltgt.gradle.incap:incap", "net.sf.kxml:kxml2", - "nl.dionsegijn:konfetti:aar", - "org.antlr:antlr4", "org.apache.commons:commons-compress", "org.apache.httpcomponents:httpclient", "org.apache.httpcomponents:httpcore", "org.apache.httpcomponents:httpmime", "org.bouncycastle:bcpkix-jdk15on", "org.bouncycastle:bcprov-jdk15on", - "org.checkerframework:checker-compat-qual", "org.checkerframework:checker-qual", - "org.codehaus.mojo:animal-sniffer-annotations", "org.eclipse.parsson:parsson", "org.glassfish.jaxb:jaxb-runtime", "org.glassfish.jaxb:txw2", "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", @@ -7504,13 +4211,8 @@ "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-core-jvm", - "org.jetbrains.kotlinx:kotlinx-coroutines-guava", - "org.jetbrains.kotlinx:kotlinx-coroutines-test", - "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm", - "org.jetbrains.kotlinx:kotlinx-metadata-jvm", "org.jetbrains:annotations", "org.jvnet.staxex:stax-ex", "org.mockito.kotlin:mockito-kotlin", @@ -7518,20 +4220,7 @@ "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", "org.smali:baksmali", "org.smali:dexlib2", "org.smali:util", diff --git a/scripts/third_party/versions/mods/BUILD.archive-patcher b/scripts/third_party/versions/mods/BUILD.archive-patcher new file mode 100644 index 00000000000..7d766f5b4fd --- /dev/null +++ b/scripts/third_party/versions/mods/BUILD.archive-patcher @@ -0,0 +1,12 @@ +# The BUILD file for archive-patcher. +java_library( + name = "tools", + srcs = glob([ + "applier/src/main/java/**/*.java", + "explainer/src/main/java/**/*.java", + "generator/src/main/java/**/*.java", + "shared/src/main/java/**/*.java", + "tools/src/main/java/**/*.java", + ]), + visibility = ["//visibility:public"], +) diff --git a/scripts/third_party/versions/mods/BUILD.bazel b/scripts/third_party/versions/mods/BUILD.bazel new file mode 100644 index 00000000000..907479058b1 --- /dev/null +++ b/scripts/third_party/versions/mods/BUILD.bazel @@ -0,0 +1,4 @@ +""" +This package contains BUILD files and/or patches needed to modify imported dependencies to make them +compatible or fully functional within Oppia Android script builds. +""" diff --git a/scripts/third_party/versions/transitive_maven_versions.bzl b/scripts/third_party/versions/transitive_maven_versions.bzl new file mode 100644 index 00000000000..057b15af308 --- /dev/null +++ b/scripts/third_party/versions/transitive_maven_versions.bzl @@ -0,0 +1,92 @@ +""" +Provides the production & test transitive (i.e. indirect) dependencies needed for all of the direct +dependencies requested via direct_maven_versions.bzl. + +This file should only need to be changed when //scripts:validate_maven_dependencies indicates that +it needs to be updated. +""" + +PRODUCTION_TRANSITIVE_DEPENDENCY_VERSIONS = { + "com.android.tools.analytics-library:protos": "30.0.4", + "com.android.tools.analytics-library:shared": "30.0.4", + "com.android.tools.apkparser:binary-resources": "30.0.4", + "com.android.tools.build:builder-model": "7.0.4", + "com.android.tools.build:builder-test-api": "7.0.4", + "com.android.tools.build:manifest-merger": "30.0.4", + "com.android.tools.ddms:ddmlib": "30.0.4", + "com.android.tools.external.com-intellij:intellij-core": "30.0.4", + "com.android.tools.external.com-intellij:kotlin-compiler": "30.0.4", + "com.android.tools.external.org-jetbrains:uast": "30.0.4", + "com.android.tools.layoutlib:layoutlib-api": "30.0.4", + "com.android.tools.lint:lint-api": "30.0.4", + "com.android.tools.lint:lint-checks": "30.0.4", + "com.android.tools.lint:lint-model": "30.0.4", + "com.android.tools:annotations": "30.0.4", + "com.android.tools:common": "30.0.4", + "com.android.tools:dvlib": "30.0.4", + "com.android.tools:repository": "30.0.4", + "com.android.tools:sdk-common": "30.0.4", + "com.android.tools:sdklib": "30.0.4", + "com.beust:jcommander": "1.64", + "com.google.auto.service:auto-service-annotations": "1.0", + "com.google.code.findbugs:jsr305": "3.0.2", + "com.google.code.gson:gson": "2.8.6", + "com.google.errorprone:error_prone_annotations": "2.7.1", + "com.google.guava:failureaccess": "1.0.1", + "com.google.guava:listenablefuture": "9999.0-empty-to-avoid-conflict-with-guava", + "com.google.j2objc:j2objc-annotations": "1.3", + "com.google.jimfs:jimfs": "1.1", + "com.squareup.moshi:moshi": "1.13.0", + "com.squareup.okio:okio": "2.10.0", + "com.squareup:kotlinpoet": "1.10.2", + "com.sun.activation:javax.activation": "1.2.0", + "com.sun.istack:istack-commons-runtime": "3.0.8", + "com.sun.xml.fastinfoset:FastInfoset": "1.2.16", + "commons-codec:commons-codec": "1.10", + "commons-io:commons-io": "2.4", + "commons-logging:commons-logging": "1.2", + "jakarta.activation:jakarta.activation-api": "1.2.1", + "jakarta.xml.bind:jakarta.xml.bind-api": "2.3.2", + "javax.inject:javax.inject": "1", + "net.java.dev.jna:jna": "5.6.0", + "net.java.dev.jna:jna-platform": "5.6.0", + "net.sf.kxml:kxml2": "2.3.0", + "org.apache.commons:commons-compress": "1.20", + "org.apache.httpcomponents:httpclient": "4.5.6", + "org.apache.httpcomponents:httpcore": "4.4.10", + "org.apache.httpcomponents:httpmime": "4.5.6", + "org.bouncycastle:bcpkix-jdk15on": "1.56", + "org.bouncycastle:bcprov-jdk15on": "1.56", + "org.checkerframework:checker-qual": "3.13.0", + "org.glassfish.jaxb:jaxb-runtime": "2.3.2", + "org.glassfish.jaxb:txw2": "2.3.2", + "org.jetbrains.intellij.deps:trove4j": "1.0.20181211", + "org.jetbrains.kotlin:kotlin-daemon-embeddable": "1.5.0", + "org.jetbrains.kotlin:kotlin-reflect": "1.6.0", + "org.jetbrains.kotlin:kotlin-script-runtime": "1.5.0", + "org.jetbrains.kotlin:kotlin-stdlib": "1.6.21", + "org.jetbrains.kotlin:kotlin-stdlib-common": "1.6.21", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": "1.6.21", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm": "1.6.4", + "org.jetbrains:annotations": "13.0", + "org.jvnet.staxex:stax-ex": "1.8.1", + "org.ow2.asm:asm": "9.2", + "org.ow2.asm:asm-analysis": "7.0", + "org.ow2.asm:asm-tree": "7.0", + "org.smali:baksmali": "2.2.4", + "org.smali:dexlib2": "2.2.4", + "org.smali:util": "2.2.4", + "xerces:xercesImpl": "2.12.0", + "xml-apis:xml-apis": "1.4.01", +} + +TEST_TRANSITIVE_DEPENDENCY_VERSIONS = { + "com.google.auto.value:auto-value-annotations": "1.8.1", + "net.bytebuddy:byte-buddy": "1.10.20", + "net.bytebuddy:byte-buddy-agent": "1.10.20", + "org.hamcrest:hamcrest-core": "1.3", + "org.jetbrains.kotlin:kotlin-test": "1.3.72", + "org.jetbrains.kotlin:kotlin-test-annotations-common": "1.3.72", + "org.jetbrains.kotlin:kotlin-test-common": "1.3.72", + "org.objenesis:objenesis": "3.2", +} diff --git a/testing/BUILD.bazel b/testing/BUILD.bazel index 0df7d21484a..d472b88a068 100644 --- a/testing/BUILD.bazel +++ b/testing/BUILD.bazel @@ -55,13 +55,13 @@ kt_android_library( "//third_party:com_squareup_retrofit2_retrofit", "//third_party:com_squareup_retrofit2_retrofit-mock", "//third_party:junit_junit", - "//third_party:moshi", "//third_party:nl_dionsegijn_konfetti", "//third_party:org_jetbrains_kotlin_kotlin-reflect", "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-test", "//third_party:org_mockito_mockito-core", "//third_party:org_robolectric_robolectric", - "//utility", + "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_event_logger", + "//utility/src/main/java/org/oppia/android/util/logging/firebase:firestore_wrapper", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_event_logger", "//utility/src/main/java/org/oppia/android/util/parser/image:glide_image_loader_module", @@ -118,7 +118,6 @@ TEST_DEPS = [ "//third_party:com_squareup_retrofit2_retrofit", "//third_party:com_squareup_retrofit2_retrofit-mock", "//third_party:junit_junit", - "//third_party:moshi", "//third_party:org_jetbrains_kotlin_kotlin-reflect", "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-test", "//third_party:org_mockito_mockito-core", @@ -151,7 +150,7 @@ kt_android_library( name = "assertion_helpers", testonly = True, srcs = ["src/main/java/org/oppia/android/testing/AssertionHelpers.kt"], - visibility = ["//visibility:public"], + visibility = ["//:oppia_testing_visibility"], deps = ["//third_party:junit_junit"], ) diff --git a/testing/build.gradle b/testing/build.gradle index 26f050e48ef..decf2c12a72 100644 --- a/testing/build.gradle +++ b/testing/build.gradle @@ -65,10 +65,10 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation( 'androidx.annotation:annotation:1.1.0', - 'androidx.appcompat:appcompat:1.1.0', - 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha03', + 'androidx.appcompat:appcompat:1.2.0', + 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0', 'androidx.core:core-ktx:1.0.2', - "androidx.test:core:1.0.0", + "androidx.test:core:1.4.0", 'androidx.test.espresso:espresso-accessibility:3.1.0', 'androidx.test.espresso:espresso-core:3.2.0', 'androidx.test:runner:1.2.0', @@ -84,7 +84,7 @@ dependencies { 'org.jetbrains.kotlin:kotlin-reflect:$kotlin_version', 'org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version', 'org.jetbrains.kotlinx:kotlinx-coroutines-guava:1.6.4', - 'org.mockito:mockito-core:2.19.0', + 'org.mockito:mockito-core:3.9.0', project(":domain"), project(":model"), project(":utility"), @@ -95,13 +95,13 @@ dependencies { 'org.glassfish.jaxb:jaxb-runtime:2.3.2', ) testImplementation( - 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha03', + 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0', 'androidx.test.ext:junit:1.1.1', 'com.google.android.material:material:1.3.0', 'com.google.truth:truth:1.1.3', - 'junit:junit:4.12', + 'junit:junit:4.13.2', "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version", - 'org.mockito:mockito-core:2.19.0', + 'org.mockito:mockito-core:3.9.0', project(":domain"), ) kapt( diff --git a/testing/src/main/java/org/oppia/android/testing/FakeAnalyticsEventLogger.kt b/testing/src/main/java/org/oppia/android/testing/FakeAnalyticsEventLogger.kt index ef425464ca3..e8a34b39040 100644 --- a/testing/src/main/java/org/oppia/android/testing/FakeAnalyticsEventLogger.kt +++ b/testing/src/main/java/org/oppia/android/testing/FakeAnalyticsEventLogger.kt @@ -8,7 +8,7 @@ import javax.inject.Singleton /** A test specific fake for the event logger. */ @Singleton -class FakeAnalyticsEventLogger @Inject constructor() : AnalyticsEventLogger { +class FakeAnalyticsEventLogger private constructor() : AnalyticsEventLogger { private val eventList = CopyOnWriteArrayList() override fun logEvent(eventLog: EventLog) { @@ -44,4 +44,9 @@ class FakeAnalyticsEventLogger @Inject constructor() : AnalyticsEventLogger { /** Returns the number of events logged to date (and not cleared by [clearAllEvents]). */ fun getEventListCount(): Int = eventList.size + + /** [AnalyticsEventLogger.Factory] implementation for [FakeAnalyticsEventLogger]. */ + class FactoryImpl @Inject constructor() : AnalyticsEventLogger.Factory { + override fun create() = FakeAnalyticsEventLogger() + } } diff --git a/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt b/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt index f10c83dfa83..58aa8154e2a 100644 --- a/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt +++ b/testing/src/main/java/org/oppia/android/testing/TestLogReportingModule.kt @@ -1,40 +1,50 @@ package org.oppia.android.testing import dagger.Binds +import dagger.BindsOptionalOf import dagger.Module +import dagger.Provides import org.oppia.android.util.logging.AnalyticsEventLogger import org.oppia.android.util.logging.ExceptionLogger +import org.oppia.android.util.logging.firebase.DebugAnalyticsEventLogger import org.oppia.android.util.logging.firebase.FirestoreEventLogger import org.oppia.android.util.logging.firebase.FirestoreInstanceWrapper import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsAssessor import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger +import javax.inject.Singleton /** Provides fake log reporting dependencies. */ @Module interface TestLogReportingModule { + companion object { + @Provides + @Singleton + fun provideFakeEventLogger( + fakeLoggerFactory: FakeAnalyticsEventLogger.FactoryImpl + ): FakeAnalyticsEventLogger = fakeLoggerFactory.create() + } - @Binds - fun bindFakeExceptionLogger(fakeExceptionLogger: FakeExceptionLogger): ExceptionLogger - - @Binds - fun bindFakeEventLogger(fakeAnalyticsEventLogger: FakeAnalyticsEventLogger): AnalyticsEventLogger + @Binds fun bindFakeEventLogger(impl: FakeAnalyticsEventLogger): AnalyticsEventLogger + @Binds fun bindFakeExceptionLogger(impl: FakeExceptionLogger): ExceptionLogger @Binds fun bindFakePerformanceMetricsEventLogger( - fakePerformanceMetricsEventLogger: FakePerformanceMetricsEventLogger + impl: FakePerformanceMetricsEventLogger ): PerformanceMetricsEventLogger @Binds fun bindFakePerformanceMetricsAssessor( - fakePerformanceMetricAssessor: FakePerformanceMetricAssessor + impl: FakePerformanceMetricAssessor ): PerformanceMetricsAssessor @Binds fun bindFakeFirestoreEventLogger( - fakeFirestoreEventLogger: FakeFirestoreEventLogger + impl: FakeFirestoreEventLogger ): FirestoreEventLogger @Binds fun bindFirebaseFirestoreInstanceWrapper(wrapperImpl: FakeFirestoreInstanceWrapperImpl): FirestoreInstanceWrapper + + @BindsOptionalOf fun bindOptionalDebugAnalyticsEventLogger(): DebugAnalyticsEventLogger } 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 26769e83181..de7ff88454f 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 @@ -20,7 +20,7 @@ kt_android_library( "//data/src/main/java/org/oppia/android/data/backends/gae/model", "//testing/src/main/java/org/oppia/android/testing/platformparameter:test_constants", "//third_party:com_squareup_retrofit2_retrofit-mock", - "//utility", + "//utility/src/main/java/org/oppia/android/util/platformparameter", ], ) 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 1ff35e43281..c3d0d85e4e0 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 @@ -31,7 +31,8 @@ kt_android_library( deps = [ ":test_constants", "//:dagger", - "//utility", + "//third_party:androidx_annotation_annotation", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", + "//utility/src/main/java/org/oppia/android/util/platformparameter", ], ) 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 f56cf1bf1b9..03d6dd08b0c 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 @@ -30,6 +30,7 @@ oppia_android_test( "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/data:data_providers", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", ], ) 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 6eeeb67df1b..39f79207767 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 @@ -41,5 +41,6 @@ oppia_android_test( "//third_party:junit_junit", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/logging/firebase:debug_module", ], ) 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 27b564b46fa..4fe932af304 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 @@ -26,6 +26,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", "//utility/src/test/java/org/oppia/android/util/logging:sync_status_manager_test_base", ], @@ -53,6 +54,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:sync_status_manager", "//utility/src/main/java/org/oppia/android/util/networking:debug_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 4c67acdc229..28539aae0cc 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 @@ -47,7 +47,6 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:robolectric_android-all", - "//utility", ], ) @@ -63,7 +62,6 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:robolectric_android-all", - "//utility", ], ) @@ -78,6 +76,5 @@ oppia_android_test( "//testing", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:robolectric_android-all", - "//utility", ], ) diff --git a/third_party/BUILD.bazel b/third_party/BUILD.bazel index 5c8dc488a58..ab8bf6636dd 100644 --- a/third_party/BUILD.bazel +++ b/third_party/BUILD.bazel @@ -1,139 +1,61 @@ # TODO(#1532): Rename file to 'BUILD' post-Gradle. """ -This package contains all third-party dependencies that the project depends on. Each maven artifact -should correspond to a single wrapper android_library, and versions should go in versions.bzl. +This package contains all third-party dependencies that app builds depend on. -Note to developers: most new dependencies should go in versions.bzl, not here. In some circumstances -(such as when non-Maven dependencies need to be used) it's appropriate to add additional -dependencies here. +Note to developers: all new dependencies should go in one of versions/direct_http_versions.bzl or +versions/direct_maven_versions.bzl, not here. -Further, note that not all dependencies can be encapsulated here. For example, Dagger introduces its -own Bazel macros to automatically set up code generation (which includes pulling in external Dagger -dependencies). +Furthermore, annotation processor plugins must be configured within this file by loading the tool's +corresponding setup macro. """ -load("@rules_java//java:defs.bzl", "java_binary", "java_library") -load("@rules_jvm_external//:defs.bzl", "artifact") -load(":versions.bzl", "MAVEN_PRODUCTION_DEPENDENCY_VERSIONS", "MAVEN_TEST_DEPENDENCY_VERSIONS") - -# Create an android library wrapper for all production dependencies. Note that artifact is used so -# that the correct Maven repository (default) is selected. This allows future customization -# potential in managing multiple Maven repositories. -[alias( - name = name.replace(":", "_").replace(".", "_"), - actual = artifact("%s:%s" % (name, version)), - visibility = ["//visibility:public"], -) for name, version in MAVEN_PRODUCTION_DEPENDENCY_VERSIONS.items()] - -# Create an android library wrapper for all test dependencies. -[alias( - name = name.replace(":", "_").replace(".", "_"), - testonly = True, - actual = artifact("%s:%s" % (name, version)), - visibility = ["//visibility:public"], -) for name, version in MAVEN_TEST_DEPENDENCY_VERSIONS.items()] - -# A wrapper dependency for the custom Git import of Android SVG (so that dependencies on this -# library still routes through //third_party). -alias( - name = "com_caverock_androidsvg", - actual = "@androidsvg//androidsvg", - visibility = ["//visibility:public"], -) - -alias( - name = "com_github_takusemba_spotlight", - actual = "@android-spotlight//spotlight", - visibility = ["//visibility:public"], +load( + "//third_party/macros:direct_dep_loader.bzl", + "create_direct_import_dependency_wrappers", + "create_maven_dependency_wrappers", ) +load("//third_party/tools/glide:plugin_setup.bzl", set_up_glide_plugin = "set_up") +load("//third_party/tools/moshi:plugin_setup.bzl", set_up_moshi_plugin = "set_up") +load("//third_party/versions:direct_http_versions.bzl", "DIRECT_REMOTE_DEPENDENCIES") +load("//third_party/versions:maven_config.bzl", "MAVEN_ARTIFACT_CONFIGURATION") -alias( - name = "robolectric_android-all", - testonly = True, - actual = "@robolectric//bazel:android-all", - visibility = ["//visibility:public"], -) - -alias( - name = "com_google_archivepatcher", - actual = "@archive_patcher//tools", - visibility = ["//visibility:public"], -) - -java_library( - name = "moshi", - exported_plugins = ["//tools:moshi_annotation_processor_plugin"], - visibility = ["//visibility:public"], - exports = [ - "//third_party:com_squareup_moshi_moshi-kotlin", +package_group( + name = "app_prod_artifact_visibility", + includes = [ + "//:oppia_api_visibility", ], ) -alias( - name = "io_github_karino2_kotlitex", - actual = "@kotlitex//kotlitex", - visibility = ["//visibility:public"], -) - -alias( - name = "oppia_proto_api_protos", - actual = "@oppia_proto_api//:android_protos", - visibility = ["//scripts:oppia_script_library_visibility"], -) - -alias( - name = "oppia_proto_api_java_protos", - testonly = True, - actual = "@oppia_proto_api//:android_java_protos", - visibility = ["//scripts:oppia_script_library_visibility"], -) - -# 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", +package_group( + name = "app_test_artifact_visibility", + includes = [ + "//:oppia_testing_visibility", ], ) -java_library( - name = "com_google_guava_guava_jre", - visibility = ["//scripts:__subpackages__"], - 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_jre//jar", - ], +create_maven_dependency_wrappers( + maven_artifact_config = MAVEN_ARTIFACT_CONFIGURATION, + maven_repository_name = "maven_app", + prod_artifact_visibility = [":app_prod_artifact_visibility"], + test_artifact_visibility = [":app_test_artifact_visibility"], ) -# 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. -java_library( - name = "glide_compiler", - exported_plugins = ["//tools:glide_compiler_plugin"], - visibility = ["//visibility:public"], +create_direct_import_dependency_wrappers( + dependency_imports_details = DIRECT_REMOTE_DEPENDENCIES, + maven_artifact_visibility = ["@maven_app//:__pkg__"], + prod_artifact_visibility = [":app_prod_artifact_visibility"], + test_artifact_visibility = [":app_test_artifact_visibility"], ) -alias( - name = "android_bundletool", - actual = "@android_bundletool//jar", - visibility = ["//visibility:public"], +set_up_glide_plugin( + name = "glide_compiler", + glide_compiler_dep = "//third_party:com_github_bumptech_glide_compiler", + visibility = [":app_prod_artifact_visibility"], ) -java_binary( - name = "android_bundletool_binary", - main_class = "com.android.tools.build.bundletool.BundleToolMain", - visibility = ["//visibility:public"], - runtime_deps = [":android_bundletool"], +set_up_moshi_plugin( + name = "moshi", + moshi_compiler_dep = "//third_party:com_squareup_moshi_moshi-kotlin-codegen", + moshi_exported_library = "//third_party:com_squareup_moshi_moshi-kotlin", + visibility = [":app_prod_artifact_visibility"], ) diff --git a/third_party/macros/BUILD.bazel b/third_party/macros/BUILD.bazel new file mode 100644 index 00000000000..505fea384d6 --- /dev/null +++ b/third_party/macros/BUILD.bazel @@ -0,0 +1,4 @@ +""" +This package provides Starlark macros for assembling and loading both direct HTTP/Git and Maven +dependencies. +""" diff --git a/third_party/macros/direct_dep_defs.bzl b/third_party/macros/direct_dep_defs.bzl new file mode 100644 index 00000000000..a10c2fc9272 --- /dev/null +++ b/third_party/macros/direct_dep_defs.bzl @@ -0,0 +1,436 @@ +""" +Macros for defining external dependency references through multiple mechanisms. The structures +created by these definitions are used by //third_party/macros:direct_dep_downloader.bzl and +//third_party/macros:direct_dep_loader.bzl. +""" + +# Represents how an imported dependency should be made available to other libraries. +EXPORT_TYPE = struct( + # Indicates a dependency should be exported as a library. + LIBRARY = struct(export_type_enum_value = 0), + + # Indicates a dependency should be exported as a Bazel-runnable binary. + BINARY = struct(export_type_enum_value = 1), +) + +# Represents the required toolchain for exporting an imported dependency. +EXPORT_TOOLCHAIN = struct( + # Indicates a dependency requires the Android toolchain. + ANDROID = struct(export_toolchain_enum_value = 0), + + # Indicates a dependency requires the JVM toolchain. + JAVA = struct(export_toolchain_enum_value = 1), + + # Indicates a dependency requires the Kotlin toolchain. + KOTLIN = struct(export_toolchain_enum_value = 2), + + # Indicates that the toolchain is ignored and the target is instead just directly aliased. + ALIAS = struct(export_toolchain_enum_value = 3), +) + +# Represents the type of import approach required for a dependency. +IMPORT_TYPE = struct( + # Indicates that the dependency is an HTTP archive, per Bazel's http_archive. + HTTP_ARCHIVE = struct(import_type_enum_value = 0), + + # Indicates that the dependency is an HTTP Jar file, per Bazel's http_jar. + HTTP_JAR = struct(import_type_enum_value = 1), + + # Indicates that the dependency is a git repository, per Bazel's git_repository. + GIT_REPOSITORY = struct(import_type_enum_value = 2), +) + +# Represents a type of patch to apply to an imported dependency. +PATCH_ORIGIN = struct( + # Indicates a patch that is included within the local repository. + LOCAL = struct(patch_origin_enum_value = 0), + + # Indicates a patch that is remotely available to download. + REMOTE = struct(patch_origin_enum_value = 1), +) + +def create_http_archive_reference( + name, + sha, + version, + test_only, + import_bind_name = None, + url = None, + urls = None, + maven_url_suffix = None, + strip_prefix_template = None, + patches_details = [], + patch_path_start_removal_count = 0, + export_details = None, + exports_details = None): + """Creates and returns a structure that will be imported using Bazel's http_archive. + + Args: + name: str. The name of the archive that will be used to reference it as an external + workspace. That is, the archive's contents will be made available using "@//...". + sha: str. The SHA-256 hash used to validate the archive when it's downloaded. + version: str. The version of the archive to be downloaded. + test_only: boolean. Whether this archive should be made available only to test targets. + import_bind_name: str. The name to bind the archive to, instead of 'name', when referencing + its contents, or None if 'name' should be used, instead. The default value is None. + url: str. The URL template from which to download the archive. This should use "{0}" for + places where the archive's version should be interpolated. Exactly one of this, urls, or + maven_url_prefix must be provided (but not more than one). + urls: list of str. The list of URL templates from which to download the archive, following + the same constraints as 'url'. Bazel will use extra URLs as mirrors in case the archive + is temporarily unavailable from any of the others. + maven_url_suffix: str. A URL template with the same constraints as 'url' except the + beginning of the URL is omitted since it will be replaced with a link to one of the + Maven repositories that the build system depends on. All Maven repositories will be used + by default for redundancy. + strip_prefix_template: str. An optional prefix to strip from the directory path imported + from the archive with optional templating (in the same way as 'url': "{0}" will be + replaced with the archive's version). See http_archive's 'strip_prefix' for more. + patches_details: list of dicts. An optional list of patch configurations to apply to the + imported dependency. Each dict is expected to have been created by one of the + create_*_patch_config functions. This defaults to an empty list. + patch_path_start_removal_count: int. An optional integer specifying the number of leading + path fragments to remove from remote patches before applying them. This defaults to 0, + but oftentimes '1' is required as it removes the normal "a/" and "b/" prefixes. + export_details: dict. An optional dict created using one of create_export_library_details or + create_export_binary_details. When provided, the system will ensure this archive is made + accessible under a "third_party:" reference (where the alias is defined as part + of the export details). + exports_details: list of dicts. An optional list of export details that are each constrained + by the same specifics as 'export_details' above. + """ + return _create_http_import_reference( + name, + import_type = IMPORT_TYPE.HTTP_ARCHIVE, + sha = sha, + version = version, + test_only = test_only, + import_bind_name = import_bind_name, + url = url, + urls = urls, + maven_url_suffix = maven_url_suffix, + strip_prefix_template = strip_prefix_template, + patches_details = patches_details, + patch_path_start_removal_count = patch_path_start_removal_count, + export_details = export_details, + exports_details = exports_details, + ) + +def create_http_jar_reference( + name, + sha, + version, + test_only, + import_bind_name = None, + url = None, + urls = None, + maven_url_suffix = None, + strip_prefix_template = None, + export_details = None, + exports_details = None): + """Creates and returns a structure that will be imported using Bazel's http_jar. + + Args: + name: str. The name of the archive that will be used to reference it as an external + workspace. See create_http_archive_reference for more specifics. + sha: str. The SHA-256 hash used to validate the archive when it's downloaded. + version: str. The version of the archive to be downloaded. + test_only: boolean. Whether this archive should be made available only to test targets. + import_bind_name: str. The name to bind the archive to. See create_http_archive_reference + for more specifics. + url: str. The URL template from which to download the archive. See + create_http_archive_reference for more specifics. + urls: list of str. The list of URL templates from which to download the archive. See + create_http_archive_reference for more specifics. + maven_url_suffix: str. A Maven-populated URL from which to download the archive. See + create_http_archive_reference for more specifics. + strip_prefix_template: str. An optional prefix to strip from the archive's directory path. + See create_http_archive_reference for more specifics. + export_details: dict. An optional dict specifying how to export this library. See + create_http_archive_reference for more specifics. + exports_details: list of dicts. An optional list of export details. See + create_http_archive_reference for more specifics. + """ + return _create_http_import_reference( + name, + import_type = IMPORT_TYPE.HTTP_JAR, + sha = sha, + version = version, + test_only = test_only, + import_bind_name = import_bind_name, + url = url, + urls = urls, + maven_url_suffix = maven_url_suffix, + strip_prefix_template = strip_prefix_template, + patches_details = [], + patch_path_start_removal_count = None, + export_details = export_details, + exports_details = exports_details, + ) + +def create_git_repository_reference( + name, + commit, + remote, + test_only, + import_bind_name = None, + repo_mapping = {}, + build_file = None, + patches_details = [], + export_details = None, + exports_details = None): + """Creates and returns a structure that will be imported using Bazel's git_repository. + + The remote repository must be a Bazel-compatible repository, or build_file needs to be provided. + + Args: + name: str. The name of the archive that will be used to reference it as an external + workspace. See create_http_archive_reference for more specifics. + commit: str. The SHA-1 commit hash that should be checked out. + remote: str. The remote URL of the Git repository. + test_only: boolean. Whether this archive should be made available only to test targets. + import_bind_name: str. The name to bind the archive to. See create_http_archive_reference + for more specifics. + repo_mapping: dict. A string-to-string dictionary representing how certain workspaces should + be aliased in the imported workspace. For example, a repo_mapping of + '{"@maven": "@maven_app"}' will instruct Bazel to treat all references to "@maven" as + "@maven_app", instead, when building the imported workspace, giving more control to the + main workspace to configure its imported dependencies. + build_file: str. The target label for the build file to use when building the remote + repository. This is None by default where None indicates to not create a custom build + file. + patches_details: list of dicts. An optional list of patch configurations See + create_http_archive_reference for more specifics. + export_details: dict. An optional dict specifying how to export this library. See + create_http_archive_reference for more specifics. + exports_details: list of dicts. An optional list of export details. See + create_http_archive_reference for more specifics. + """ + return _create_import_dependency_reference( + name = name, + import_type = IMPORT_TYPE.GIT_REPOSITORY, + test_only = test_only, + dependency_details = { + "build_file": build_file, + "commit": commit, + "remote": remote, + "repo_mapping": repo_mapping, + }, + import_bind_name = import_bind_name, + patches_details = patches_details, + export_details = export_details, + exports_details = exports_details, + ) + +def create_export_library_details( + exposed_artifact_name, + exportable_target, + export_toolchain, + should_be_visible_to_maven_targets = False, + additional_exports = []): + """Returns a structure that specifies how a dependency should be made available as a library. + + Note that this does not actually create a wrapper library, only the instructions for creating + one. create_direct_import_dependency_wrappers is ultimately responsible for creating the + wrappers and will control visibilities and full target names. + + Args: + exposed_artifact_name: str. The name of the exported library under the immediate Bazel + package (usually a 'third_party' directory). + exportable_target: str. The relative target within the imported archive that can be exposed. + This is often "jar" for imported Jar files, or a specific build target for repositories. + export_toolchain: EXPORT_TOOLCHAIN. The specific toolchain that should be used when creating + the exported wrapper library. + should_be_visible_to_maven_targets: boolean. Whether the exported library should be made + specially available to local internal Maven dependencies. This defaults to False and is + generally only needed for Maven dependency overrides. + additional_exports: list of str. Additional targets to automatically export with the wrapper + library. This defaults to an empty list and is only needed in advanced cases. + """ + return { + "additional_exports": additional_exports, + "export_toolchain": export_toolchain, + "export_type": EXPORT_TYPE.LIBRARY, + "exportable_target": exportable_target, + "exposed_artifact_name": exposed_artifact_name, + "should_be_visible_to_maven_targets": should_be_visible_to_maven_targets, + } + +def create_export_binary_details( + exposed_artifact_name, + main_class, + exportable_runtime_target, + additional_exports = []): + """Returns a structure that specifies how a dependency should be made available as a binary. + + Note that this has the same limitations and restrictions as create_export_library_details. + + Note also that binaries always use the Java toolchain. + + Args: + exposed_artifact_name: str. The name of the exported library under the immediate Bazel + package (usually a 'third_party' directory). + main_class: str. The fully-qualified Java class containing the binary's main() function. + exportable_runtime_target: str. The relative target within the imported archive that can be + exposed for execution. This is often "jar" for imported Jar files, or a specific build + target for repositories. + additional_exports: list of str. Additional targets to automatically export with the wrapper + binary. This defaults to an empty list and is only needed in advanced cases. + """ + return { + "additional_exports": additional_exports, + "export_toolchain": EXPORT_TOOLCHAIN.JAVA, + "export_type": EXPORT_TYPE.BINARY, + "exportable_runtime_target": exportable_runtime_target, + "exposed_artifact_name": exposed_artifact_name, + "main_class": main_class, + } + +def create_maven_artifact_configuration( + production_dep_config, + test_dep_config, + maven_install_json_target, + target_overrides = {}): + """Returns a structure that specifies the complete definition of a new imported Maven workspace. + + Args: + production_dep_config: dict. The configuration, as created by create_dep_config() below, of + production dependencies to download. Note that these dependencies will be available to + both test & non-test targets. + test_dep_config: dict. The configuration, as created by create_dep_config() below, of test + dependencies to download. Note that these dependencies will only be available to test + targets. + maven_install_json_target: str. The absolute file target to which a Maven installation + manifest will be referenced (or created). + target_overrides: dict. An optional dictionary of string-to-string that forcibly overrides + Maven dependencies to local targets, instead. This is only used for advanced cases and + can have significant stability implications if not used carefully. The default value is + an empty dict (indicating no overrides). + """ + return { + "deps": { + "prod": production_dep_config, + "test": test_dep_config, + }, + "maven_install_json": maven_install_json_target, + "target_overrides": target_overrides, + } + +def create_dep_config(direct_deps, transitive_deps, exclusions = None): + """Returns a structure that specifies versions of dependencies to download. + + Args: + direct_deps: dict. A dictionary of Maven coordinate strings to version strings that should + be made directly available (e.g. via wrappers created by direct_dep_loader.bzl). + transitive_deps: dict. A dictionary of Maven coordinate strings to version strings that are + indirectly required for the direct_deps to be available. These are usually supplied by a + list automatically generated via an up-to-date installation manifest file and + //scripts:validate_maven_dependencies. + exclusions: list of str. An optional list of non-version Maven coordinate strings that + should never be included when downloading the dependencies provided by this + configuration. This is an advanced option that turns a compile-time guarantee into + potential runtime errors--it should only be used when excluded dependencies can be + guaranteed to never be needed at runtime. This defaults to None (indicating no + exclusions). + """ + return { + "direct": direct_deps, + "exclusions": exclusions, + "transitive": transitive_deps, + } + +def create_local_patch_config(patch_file): + """Returns a structure that specifies a local patch to apply to an imported dependency. + + Args: + patch_file: str. The Bazel file target label corresponding to a local patch file to apply. + """ + return { + "file": patch_file, + "origin": PATCH_ORIGIN.LOCAL, + } + +def create_remote_patch_config(patch_url, patch_sri): + """Returns a structure that specifies a remote patch to apply to an imported dependency. + + Args: + patch_url: str. The URL to the patch to download. + patch_sri: str. The Subresource Integrity (SRI) of the patch. See + https://www.srihash.org/ and + https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity for more + context and instructions on how to generate a hash. Alternatively, you can use this + command via a terminal: + ```sh + echo "sha256-$(wget -q -O- | openssl dgst -sha256 -binary | openssl base64 -A)" + ``` + and copy the result to use as the patch's SRI. + """ + return { + "origin": PATCH_ORIGIN.REMOTE, + "sri": patch_sri, + "url": patch_url, + } + +def _create_http_import_reference( + name, + import_type, + sha, + version, + test_only, + import_bind_name, + url, + urls, + maven_url_suffix, + strip_prefix_template, + patches_details, + patch_path_start_removal_count, + export_details, + exports_details): + # The '+' here is working around syntax issues when trying to use XOR. + if int(url != None) + int(urls != None) + int(maven_url_suffix != None) != 1: + fail("Expected exactly one of url, urls, or maven_template_url to be defined.") + if url != None: + urls = [url] + elif maven_url_suffix != None: + urls = ["{1}/%s" % maven_url_suffix] + return _create_import_dependency_reference( + name = name, + import_type = import_type, + test_only = test_only, + dependency_details = { + "sha": sha, + "strip_prefix_template": strip_prefix_template, + "url_templates": urls, + "version": version, + }, + import_bind_name = import_bind_name, + patches_details = patches_details, + patch_path_start_removal_count = patch_path_start_removal_count, + export_details = export_details, + exports_details = exports_details, + ) + +def _create_import_dependency_reference( + name, + import_type, + test_only, + dependency_details, + import_bind_name, + patches_details, + export_details = None, + exports_details = None, + patch_path_start_removal_count = None): + if export_details != None and exports_details != None: + fail("Expected exactly one of export_details or exports_details to be defined.") + if export_details != None: + exports_details = [export_details] + return { + "dependency_details": dependency_details, + "exports_details": exports_details or [], + "import_bind_name": import_bind_name, + "import_type": import_type, + "name": name, + "patch_path_start_removal_count": patch_path_start_removal_count, + "patches_details": patches_details, + "test_only": test_only, + } diff --git a/third_party/macros/direct_dep_downloader.bzl b/third_party/macros/direct_dep_downloader.bzl new file mode 100644 index 00000000000..2fe221d5767 --- /dev/null +++ b/third_party/macros/direct_dep_downloader.bzl @@ -0,0 +1,128 @@ +""" +Provides Starlark macros for importing direct dependencies needed to build Oppia Android. +""" + +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(":direct_dep_defs.bzl", "IMPORT_TYPE", "PATCH_ORIGIN") + +def download_direct_workspace_dependencies(dependencies, maven_repositories): + """Loads the direct Bazel workspace dependencies needed to be able to build the project. + + Note that this must be called after loading in this deps file, for example: + + load("//third_party/macros:direct_dep_downloader.bzl", "download_direct_workspace_dependencies") + download_direct_workspace_dependencies() + + Note also that toolchains may need to be set up after loading this dependencies (see + //third_party/tools:toolchains.bzl). + + Args: + dependencies: list of dict. The list of dependencies where is dependency is created using + one of the create_*_reference() macros from direct_dep_defs.bzl. This may not contain + all build-time dependencies as many of those are provided by Maven via + direct_dep_loader.bzl. + maven_repositories: list of str. The list of Maven repository URLs that should be used when + downloading direct dependencies which are pulled from Maven. + """ + + # Set up all dependencies (the order doesn't matter here since it's just downloading + # corresponding HTTP archives/jars or cloning git repositories without building them). + for import_details in dependencies: + _set_up_remote_dependency(import_details, maven_repositories) + +def _set_up_http_archive_dependency(import_details, maven_repositories): + _set_up_http_import( + import_details, + maven_repositories, + import_dep_without_patches = http_archive, + import_dep_with_patches = http_archive, + ) + +def _set_up_http_jar_dependency(import_details, maven_repositories): + _set_up_http_import(import_details, maven_repositories, import_dep_without_patches = http_jar) + +def _set_up_http_import( + import_details, + maven_repositories, + import_dep_without_patches, + import_dep_with_patches = None): + dependency_details = import_details["dependency_details"] + version = dependency_details["version"] + strip_prefix_template = dependency_details.get("strip_prefix_template") + url_templates = dependency_details["url_templates"] + expanded_urls = [ + url_template.format(version, maven_repository) + for url_template in url_templates + for maven_repository in maven_repositories + ] + unique_urls = [] + for expanded_url in expanded_urls: + if expanded_url not in unique_urls: + unique_urls.append(expanded_url) + local_patches = _extract_local_patches(import_details["patches_details"]) + remote_patches = _extract_remote_patches(import_details["patches_details"]) + if len(local_patches) != 0 or len(remote_patches) != 0: + if import_dep_with_patches == None: + fail("This method of importing an HTTP dependency does not support patching.") + import_dep_with_patches_conditional_kwargs = {} + if strip_prefix_template != None: + import_dep_with_patches_conditional_kwargs["strip_prefix"] = strip_prefix_template.format(version) + import_dep_with_patches( + name = import_details.get("import_bind_name") or import_details["name"], + urls = unique_urls, + sha256 = dependency_details["sha"], + patches = local_patches, + remote_patches = remote_patches, + remote_patch_strip = import_details.get("patch_path_start_removal_count"), + **import_dep_with_patches_conditional_kwargs + ) + else: + import_dep_with_patches_conditional_kwargs = {} + if strip_prefix_template != None: + import_dep_with_patches_conditional_kwargs["strip_prefix"] = strip_prefix_template.format(version) + import_dep_without_patches( + name = import_details.get("import_bind_name") or import_details["name"], + urls = unique_urls, + sha256 = dependency_details["sha"], + **import_dep_with_patches_conditional_kwargs + ) + +def _set_up_git_repository_dependency(import_details): + dependency_details = import_details["dependency_details"] + local_patches = _extract_local_patches(import_details["patches_details"]) + remote_patches = _extract_remote_patches(import_details["patches_details"]) + if len(remote_patches) != 0: + fail("Git repository imports do not currently support remote patches.") + git_repository( + name = import_details.get("import_bind_name") or import_details["name"], + commit = dependency_details["commit"], + remote = dependency_details["remote"], + repo_mapping = dependency_details.get("repo_mapping") or {}, + build_file = dependency_details["build_file"], + patches = local_patches, + ) + +def _set_up_remote_dependency(import_details, maven_repositories): + if import_details["import_type"] == IMPORT_TYPE.HTTP_ARCHIVE: + _set_up_http_archive_dependency(import_details, maven_repositories) + elif import_details["import_type"] == IMPORT_TYPE.HTTP_JAR: + _set_up_http_jar_dependency(import_details, maven_repositories) + elif import_details["import_type"] == IMPORT_TYPE.GIT_REPOSITORY: + _set_up_git_repository_dependency(import_details) + else: + fail("Unsupported import type: %s." % import_details["import_type"]) + +def _extract_local_patches(patches_details): + return [ + patch_details["file"] + for patch_details in patches_details + if patch_details["origin"] == PATCH_ORIGIN.LOCAL + ] + +def _extract_remote_patches(patches_details): + return { + patch_details["url"]: patch_details["sri"] + for patch_details in patches_details + if patch_details["origin"] == PATCH_ORIGIN.REMOTE + } diff --git a/third_party/macros/direct_dep_loader.bzl b/third_party/macros/direct_dep_loader.bzl new file mode 100644 index 00000000000..334fd4c669b --- /dev/null +++ b/third_party/macros/direct_dep_loader.bzl @@ -0,0 +1,240 @@ +""" +Provides Starlark macros for importing and wrapping both Maven-hosted and directly referenced remote +dependencies. +""" + +load("@io_bazel_rules_kotlin//kotlin:jvm.bzl", "kt_jvm_import", "kt_jvm_library") +load("@rules_java//java:defs.bzl", "java_binary", "java_library") +load("@rules_jvm_external//:defs.bzl", "artifact", "maven_install") +load("@rules_jvm_external//:specs.bzl", "maven", "parse") +load(":direct_dep_defs.bzl", "EXPORT_TOOLCHAIN", "EXPORT_TYPE") + +def download_maven_dependencies(name, maven_artifact_config, maven_repositories): + """Loads the Maven-hosted dependencies needed to be able to build the Oppia Android project. + + Note that this must be called after loading in this deps file, for example: + + load("//third_party/macros:direct_dep_loader.bzl", "download_maven_dependencies") + download_maven_dependencies() + + Note that this can only be called after toolchains are set up using + //third_party/tools:toolchains.bzl as it requires supporting rules_jvm_external. + + Args: + name: str. The name of the Maven repository that's being set up, per rules_jvm_external's + maven_install macro. + maven_artifact_config: dict. The create_maven_artifact_configuration()-created configuration + specifying dependencies that should be downloaded into a new locally-available Maven + repository. + maven_repositories: list of str. The list of Maven repository URLs that should be used when + downloading direct dependencies which are pulled from Maven. + """ + + # Add support for JVM rules: https://github.com/bazelbuild/rules_jvm_external. Note to + # developers: new dependencies should be added to a direct_maven_versions.bzl file, not here. + maven_install( + name = name, + artifacts = _extract_maven_dependencies(maven_artifact_config), + duplicate_version_warning = "error", + fail_if_repin_required = True, + maven_install_json = maven_artifact_config["maven_install_json"], + override_targets = maven_artifact_config.get("target_overrides") or {}, + repositories = maven_repositories, + strict_visibility = True, + ) + +# buildifier: disable=unnamed-macro +def create_direct_import_dependency_wrappers( + dependency_imports_details, + prod_artifact_visibility, + test_artifact_visibility, + maven_artifact_visibility): + """Creates wrapper libraries & binaries for directly imported dependencies. + + Note that the new targets will be made available in the immediate package, so this should be + called in the BUILD file corresponding to the package that should house these wrappers. + + Args: + dependency_imports_details: list of dict. The list of direct dependency configurations that + should each be wrapped (for configurations that include export details). Each of these + dictionaries is expected to have been created from one of the create_*_reference() + macros in direct_dep_defs.bzl. + prod_artifact_visibility: list of str. The list of Bazel visibility rules that should + automatically be applied to all non-test/production dependencies (i.e. the visibilities + of the new wrappers). + test_artifact_visibility: list of str. The list of Bazel visibility rules that should + automatically be applied to all test-only dependencies (i.e. the visibilities of the new + wrappers). + maven_artifact_visibility: list of str. The list of Bazel visibility rules that should + automatically be applied to all dependency wrappers that have been configured to be + available to Maven dependencies (to ensure that Maven dependencies themselves can access + the new wrapper library, such as in the case of overrides). + """ + for import_details in dependency_imports_details: + for export_details in import_details["exports_details"]: + _wrap_dependency( + import_details, + export_details, + prod_artifact_visibility, + test_artifact_visibility, + maven_artifact_visibility, + ) + +# buildifier: disable=unnamed-macro +def create_maven_dependency_wrappers( + maven_repository_name, + maven_artifact_config, + prod_artifact_visibility, + test_artifact_visibility): + """Creates wrapper libraries for Maven-imported dependencies. + + Args: + maven_repository_name: str. The name of the Maven repository from which dependencies will be + wrapped (as passed to download_maven_dependencies()). + maven_artifact_config: dict. The create_maven_artifact_configuration()-created configuration + specifying dependencies that should be wrapped into new libraries. + prod_artifact_visibility: list of str. The list of Bazel visibility rules that should + automatically be applied to all non-test/production dependencies (i.e. the visibilities + of the new wrappers). + test_artifact_visibility: list of str. The list of Bazel visibility rules that should + automatically be applied to all test-only dependencies (i.e. the visibilities of the new + wrappers). + """ + _wrap_maven_dependencies( + maven_repository_name, + maven_artifact_config["deps"]["prod"]["direct"], + prod_artifact_visibility, + test_only = False, + ) + _wrap_maven_dependencies( + maven_repository_name, + maven_artifact_config["deps"]["test"]["direct"], + test_artifact_visibility, + test_only = True, + ) + +def _wrap_maven_dependencies( + maven_repository_name, + dependency_versions, + artifact_visibility, + test_only): + # Create aliases for select dependencies. Note that artifact is used so that the correct Maven + # repository is selected. Also, dependencies are restricted to specific visibility scopes (e.g. + # prod vs. test), or to specific build contexts (e.g. scripts which is in an entirely different + # target path) to help prevent accidental cross-dependencies. + for name, version in dependency_versions.items(): + native.alias( + name = name.replace(":", "_").replace(".", "_"), + testonly = test_only, + visibility = artifact_visibility, + actual = artifact( + "%s:%s" % (name, version), + repository_name = maven_repository_name, + ), + ) + +def _wrap_dependency( + import_details, + export_details, + prod_artifact_visibility, + test_artifact_visibility, + maven_artifact_visibility): + name = import_details.get("import_bind_name") or import_details["name"] + is_test_only = import_details["test_only"] + base_visibility = test_artifact_visibility if is_test_only else prod_artifact_visibility + + if export_details["export_type"] == EXPORT_TYPE.LIBRARY: + should_be_visible_to_maven_targets = export_details["should_be_visible_to_maven_targets"] + maven_visibility = maven_artifact_visibility if should_be_visible_to_maven_targets else [] + + if export_details["export_toolchain"] == EXPORT_TOOLCHAIN.ANDROID: + create_lib = native.android_library + explicit_exports = ["@%s//%s" % (name, export_details["exportable_target"])] + elif export_details["export_toolchain"] == EXPORT_TOOLCHAIN.JAVA: + create_lib = java_library + explicit_exports = ["@%s//%s" % (name, export_details["exportable_target"])] + elif export_details["export_toolchain"] == EXPORT_TOOLCHAIN.KOTLIN: + # A kt_jvm_import is needed to ensure that Kotlin metadata is included. However, the + # output from kt_jvm_import needs to be wrapped in a kt_jvm_library in order to work + # with the Bazel IntelliJ plugin correctly (since kt_jvm_library provides the expected + # IDE output for syncing). + create_lib = kt_jvm_library + kt_jvm_import( + name = "_%s_do_not_depend" % export_details["exposed_artifact_name"], + jars = ["@%s//%s:file" % (name, export_details["exportable_target"])], + tags = ["no-ide"], + testonly = is_test_only, + ) + explicit_exports = ["_%s_do_not_depend" % export_details["exposed_artifact_name"]] + elif export_details["export_toolchain"] == EXPORT_TOOLCHAIN.ALIAS: + if len(export_details["additional_exports"]) != 0: + fail("Cannot have additional exports when aliasing a target. Use a toolchain type, instead.") + native.alias( + name = export_details["exposed_artifact_name"], + visibility = base_visibility + maven_visibility, + actual = "@%s//%s" % (name, export_details["exportable_target"]), + testonly = is_test_only, + ) + return + else: + fail("Unsupported export type: %s." % export_details["export_toolchain"]) + + create_lib( + name = export_details["exposed_artifact_name"], + visibility = base_visibility + maven_visibility, + exports = explicit_exports + export_details["additional_exports"], + testonly = is_test_only, + ) + elif export_details["export_type"] == EXPORT_TYPE.BINARY: + if export_details["export_toolchain"] != EXPORT_TOOLCHAIN.JAVA: + fail( + "Only Java binaries are currently supported. Encountered: %s." % ( + export_details["export_toolchain"] + ), + ) + java_binary( + name = export_details["exposed_artifact_name"], + deps = export_details["additional_exports"], + visibility = base_visibility, + runtime_deps = [ + "@%s//%s" % (name, export_details["exportable_runtime_target"]), + ], + main_class = export_details["main_class"], + ) + else: + fail("Unsupported export type: %s." % export_details["export_type"]) + +def _extract_maven_dependencies(artifact_config): + """Returns a list of Maven dependency artifacts to install to fulfill all third-party deps. + """ + return ( + _create_all_maven_deps(artifact_config["deps"]["prod"], test_only = False) + + _create_all_maven_deps(artifact_config["deps"]["test"], test_only = True) + ) + +def _create_all_maven_deps(deps_metadata, test_only): + """Returns a list of Maven dependency artifacts to install to fulfill specific third-party deps. + """ + return ( + _create_maven_deps(deps_metadata["direct"], deps_metadata["exclusions"], test_only) + + _create_maven_deps(deps_metadata["transitive"], deps_metadata["exclusions"], test_only) + ) + +def _create_maven_deps(dependency_versions, exclusions, test_only): + return [ + _create_maven_artifact(name, version, exclusions, test_only) + for name, version in dependency_versions.items() + ] + +def _create_maven_artifact(name, version, exclusions, test_only): + # Create production & test specific dependencies per: + # https://github.com/bazelbuild/rules_jvm_external#test-only-dependencies. + coordinate = parse.parse_maven_coordinate("%s:%s" % (name, version)) + return maven.artifact( + coordinate["group"], + coordinate["artifact"], + coordinate["version"], + packaging = coordinate.get("packaging"), + exclusions = exclusions, + testonly = test_only, + ) diff --git a/third_party/tools/BUILD.bazel b/third_party/tools/BUILD.bazel new file mode 100644 index 00000000000..727c734325e --- /dev/null +++ b/third_party/tools/BUILD.bazel @@ -0,0 +1,4 @@ +""" +This package contains macros and subpackages for initializing all of the individual libraries and +toolchains required to build the Oppia Android project & its constituent projects (such as scripts). +""" diff --git a/tools/android/BUILD.bazel b/third_party/tools/android/BUILD.bazel similarity index 69% rename from tools/android/BUILD.bazel rename to third_party/tools/android/BUILD.bazel index 010bb615193..82799f8eef3 100644 --- a/tools/android/BUILD.bazel +++ b/third_party/tools/android/BUILD.bazel @@ -1,5 +1,5 @@ """ -Imports required data-binding annotation processor. +Configurations for plugins required to build Android targets. """ load("@rules_java//java:defs.bzl", "java_plugin") @@ -8,7 +8,10 @@ java_plugin( name = "compiler_annotation_processor", generates_api = True, processor_class = "android.databinding.annotationprocessor.ProcessDataBinding", - visibility = ["//visibility:public"], + visibility = [ + "//:oppia_binary_visibility", + "//external:__pkg__", + ], deps = [ "@bazel_tools//src/tools/android/java/com/google/devtools/build/android:all_android_tools", ], diff --git a/third_party/tools/android/toolchain_setup.bzl b/third_party/tools/android/toolchain_setup.bzl new file mode 100644 index 00000000000..8d263221334 --- /dev/null +++ b/third_party/tools/android/toolchain_setup.bzl @@ -0,0 +1,26 @@ +""" +Provides a macro for setting up support building Android app & library targets. +""" + +load("//:build_vars.bzl", "BUILD_SDK_VERSION", "BUILD_TOOLS_VERSION") + +def set_up(name): + """Adds support for building Android targets to the workspace. + + Args: + name: str. The workspace name under which to configure the Android SDK. + """ + + # Android SDK configuration. For more details, see: + # https://docs.bazel.build/versions/master/be/android.html#android_sdk_repository. + # TODO(#1542): Sync Android SDK version with the manifest. + native.android_sdk_repository( + name = name, + api_level = BUILD_SDK_VERSION, + build_tools_version = BUILD_TOOLS_VERSION, + ) + + native.bind( + name = "databinding_annotation_processor", + actual = "//third_party/tools/android:compiler_annotation_processor", + ) diff --git a/third_party/tools/glide/BUILD.bazel b/third_party/tools/glide/BUILD.bazel new file mode 100644 index 00000000000..c3dea885695 --- /dev/null +++ b/third_party/tools/glide/BUILD.bazel @@ -0,0 +1,3 @@ +""" +Configurations for incorporating Glide (https://github.com/bumptech/glide) into Java build targets. +""" diff --git a/third_party/tools/glide/plugin_setup.bzl b/third_party/tools/glide/plugin_setup.bzl new file mode 100644 index 00000000000..7721e90d831 --- /dev/null +++ b/third_party/tools/glide/plugin_setup.bzl @@ -0,0 +1,25 @@ +""" +Provides a macro for setting up support for using Glide in Java target builds. +""" + +load("@rules_java//java:defs.bzl", "java_library", "java_plugin") + +def set_up(name, visibility, glide_compiler_dep): + """Defines a new java_library that exposes Glide as both a dependency and annotation processor. + """ + java_plugin( + name = "%s_plugin" % name, + generates_api = True, + processor_class = "com.bumptech.glide.annotation.compiler.GlideAnnotationProcessor", + deps = [glide_compiler_dep], + ) + + # 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. + java_library( + name = name, + exported_plugins = [":%s_plugin" % name], + visibility = visibility, + exports = [glide_compiler_dep], + ) diff --git a/third_party/tools/java/BUILD.bazel b/third_party/tools/java/BUILD.bazel new file mode 100644 index 00000000000..7ec0b005cbe --- /dev/null +++ b/third_party/tools/java/BUILD.bazel @@ -0,0 +1,3 @@ +""" +Configurations for building Java binary & library targets. +""" diff --git a/third_party/tools/java/toolchain_setup.bzl b/third_party/tools/java/toolchain_setup.bzl new file mode 100644 index 00000000000..b64ec6a3b95 --- /dev/null +++ b/third_party/tools/java/toolchain_setup.bzl @@ -0,0 +1,12 @@ +""" +Provides a macro for setting up support building Java binary & library targets. +""" + +load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") + +def set_up(): + """Adds support for building Java binary & library targets to the workspace. + """ + + rules_java_dependencies() + rules_java_toolchains() diff --git a/tools/kotlin/BUILD.bazel b/third_party/tools/kotlin/BUILD.bazel similarity index 100% rename from tools/kotlin/BUILD.bazel rename to third_party/tools/kotlin/BUILD.bazel diff --git a/third_party/tools/kotlin/toolchain_setup.bzl b/third_party/tools/kotlin/toolchain_setup.bzl new file mode 100644 index 00000000000..532acfcc7cf --- /dev/null +++ b/third_party/tools/kotlin/toolchain_setup.bzl @@ -0,0 +1,14 @@ +""" +Provides a macro for setting up support building Kotlin Android & JVM targets. +""" + +load("@io_bazel_rules_kotlin//kotlin:repositories.bzl", "kotlin_repositories") + +# buildifier: disable=unnamed-macro +def set_up(): + """Adds support for building Kotlin targets to the workspace. + """ + + # Add support for Kotlin: https://github.com/bazelbuild/rules_kotlin. + kotlin_repositories() + native.register_toolchains("//third_party/tools/kotlin:kotlin_16_jdk9_toolchain") diff --git a/third_party/tools/moshi/BUILD.bazel b/third_party/tools/moshi/BUILD.bazel new file mode 100644 index 00000000000..1a5d9e5d840 --- /dev/null +++ b/third_party/tools/moshi/BUILD.bazel @@ -0,0 +1,3 @@ +""" +Configurations for incorporating Moshi (https://github.com/square/moshi) into Java build targets. +""" diff --git a/third_party/tools/moshi/plugin_setup.bzl b/third_party/tools/moshi/plugin_setup.bzl new file mode 100644 index 00000000000..050edaf3e7d --- /dev/null +++ b/third_party/tools/moshi/plugin_setup.bzl @@ -0,0 +1,21 @@ +""" +Provides a macro for setting up support for using Moshi in Java target builds. +""" + +load("@rules_java//java:defs.bzl", "java_library", "java_plugin") + +def set_up(name, visibility, moshi_compiler_dep, moshi_exported_library): + """Defines a new java_library that exposes Moshi as both a dependency and annotation processor. + """ + java_plugin( + name = "%s_plugin" % name, + generates_api = True, + processor_class = "com.squareup.moshi.kotlin.codegen.apt.JsonClassCodegenProcessor", + deps = [moshi_compiler_dep, moshi_exported_library], + ) + java_library( + name = name, + exported_plugins = [":%s_plugin" % name], + visibility = visibility, + exports = [moshi_exported_library], + ) diff --git a/third_party/tools/oppia_proto_api/BUILD.bazel b/third_party/tools/oppia_proto_api/BUILD.bazel new file mode 100644 index 00000000000..f09b46802fd --- /dev/null +++ b/third_party/tools/oppia_proto_api/BUILD.bazel @@ -0,0 +1,3 @@ +""" +Configurations required to incorporate Oppia's centralized API protos. +""" diff --git a/third_party/tools/oppia_proto_api/toolchain_setup.bzl b/third_party/tools/oppia_proto_api/toolchain_setup.bzl new file mode 100644 index 00000000000..a11efafbbc4 --- /dev/null +++ b/third_party/tools/oppia_proto_api/toolchain_setup.bzl @@ -0,0 +1,13 @@ +""" +Provides a macro for setting up support for incorporating Oppia's centralized API protos. +""" + +load("@oppia_proto_api//repo:deps.bzl", "initializeDepsForWorkspace") + +def set_up(): + """Adds support for incorporating Oppia's centralized API protos. + """ + + # Note that the proto API's toolchains don't need to be initialized since the ones required for + # building are already being initialized with the same names in Oppia Android. + initializeDepsForWorkspace() diff --git a/third_party/tools/proto/BUILD.bazel b/third_party/tools/proto/BUILD.bazel new file mode 100644 index 00000000000..83e781ace97 --- /dev/null +++ b/third_party/tools/proto/BUILD.bazel @@ -0,0 +1,3 @@ +""" +Configurations for building proto library targets. +""" diff --git a/third_party/tools/proto/toolchain_setup.bzl b/third_party/tools/proto/toolchain_setup.bzl new file mode 100644 index 00000000000..3730fb7d941 --- /dev/null +++ b/third_party/tools/proto/toolchain_setup.bzl @@ -0,0 +1,26 @@ +""" +Provides a macro for setting up support building proto library targets. +""" + +load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") + +# buildifier: disable=unnamed-macro +def set_up(): + """Adds support for building proto library targets to the workspace. + """ + + # The proto_compiler and proto_java_toolchain bindings load the protos rules needed for building + # protos while helping us avoid the unnecessary compilation of protoc. References: + # - https://github.com/google/startup-os/blob/5f30a62/WORKSPACE#L179-L187 + # - https://github.com/bazelbuild/bazel/issues/7095 + native.bind( + name = "proto_compiler", + actual = "//third_party/tools:protoc", + ) + native.bind( + name = "proto_java_toolchain", + actual = "//third_party/tools:java_toolchain", + ) + + rules_proto_dependencies() + rules_proto_toolchains() diff --git a/third_party/tools/robolectric/BUILD.bazel b/third_party/tools/robolectric/BUILD.bazel new file mode 100644 index 00000000000..a3330ceb29d --- /dev/null +++ b/third_party/tools/robolectric/BUILD.bazel @@ -0,0 +1,3 @@ +""" +Configurations for using Robolectric in Java-based targets. +""" diff --git a/third_party/tools/robolectric/toolchain_setup.bzl b/third_party/tools/robolectric/toolchain_setup.bzl new file mode 100644 index 00000000000..962a4e0fcb4 --- /dev/null +++ b/third_party/tools/robolectric/toolchain_setup.bzl @@ -0,0 +1,12 @@ +""" +Provides a macro for setting up support to use Robolectric in Java-based targets. +""" + +load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories") + +def set_up(): + """Adds support for using Robolectric in Java-based targets to the workspace. + """ + + # Add support for Robolectric: https://github.com/robolectric/robolectric-bazel. + robolectric_repositories() diff --git a/third_party/tools/skylib/BUILD.bazel b/third_party/tools/skylib/BUILD.bazel new file mode 100644 index 00000000000..af4e64726d5 --- /dev/null +++ b/third_party/tools/skylib/BUILD.bazel @@ -0,0 +1,3 @@ +""" +Configurations for using Skylib macros. +""" diff --git a/third_party/tools/skylib/toolchain_setup.bzl b/third_party/tools/skylib/toolchain_setup.bzl new file mode 100644 index 00000000000..74011798a09 --- /dev/null +++ b/third_party/tools/skylib/toolchain_setup.bzl @@ -0,0 +1,12 @@ +""" +Provides a macro for setting up support to use Skylib macros. +""" + +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +def set_up(): + """Adds support for using Skylib macros to the workspace. + """ + + # Add support for Skylib: https://github.com/bazelbuild/bazel-skylib#getting-started. + bazel_skylib_workspace() diff --git a/third_party/tools/toolchains.bzl b/third_party/tools/toolchains.bzl new file mode 100644 index 00000000000..55fd0c38046 --- /dev/null +++ b/third_party/tools/toolchains.bzl @@ -0,0 +1,36 @@ +""" +Defines Starlark macros that are used to set up dependency toolchains needed to build the Oppia +Android project. +""" + +load("//third_party/tools/android:toolchain_setup.bzl", set_up_android = "set_up") +load("//third_party/tools/java:toolchain_setup.bzl", set_up_java = "set_up") +load("//third_party/tools/kotlin:toolchain_setup.bzl", set_up_kotlin = "set_up") +load("//third_party/tools/oppia_proto_api:toolchain_setup.bzl", set_up_oppia_proto_api = "set_up") +load("//third_party/tools/proto:toolchain_setup.bzl", set_up_proto = "set_up") +load("//third_party/tools/robolectric:toolchain_setup.bzl", set_up_robolectric = "set_up") +load("//third_party/tools/skylib:toolchain_setup.bzl", set_up_skylib = "set_up") +load("//third_party/tools/tools_android:toolchain_setup.bzl", set_up_tools_android = "set_up") + +# buildifier: disable=unnamed-macro +def initialize_toolchains_for_workspace(): + """ + Initializes the toolchains needed to be able to build the Oppia Android app & tests. + + Note that this must be called after loading in this toolchains file, for example: + load("//third_party/tools:toolchains.bzl", "initialize_toolchains_for_workspace") + initialize_toolchains_for_workspace() + + Note also that this can't be called until the dependencies themselves are loaded (see + //third_party/macros/direct_dep_downloader.bzl). + """ + + # Note that the order matters here since toolchains & libraries may have cross-dependencies. + set_up_skylib() + set_up_android("androidsdk") + set_up_oppia_proto_api() + set_up_kotlin() + set_up_java() + set_up_proto() + set_up_robolectric() + set_up_tools_android() diff --git a/third_party/tools/tools_android/BUILD.bazel b/third_party/tools/tools_android/BUILD.bazel new file mode 100644 index 00000000000..0b4099e11b2 --- /dev/null +++ b/third_party/tools/tools_android/BUILD.bazel @@ -0,0 +1,3 @@ +""" +Configurations for using Google Play Services plugins & libraries. +""" diff --git a/third_party/tools/tools_android/toolchain_setup.bzl b/third_party/tools/tools_android/toolchain_setup.bzl new file mode 100644 index 00000000000..cfeec08770c --- /dev/null +++ b/third_party/tools/tools_android/toolchain_setup.bzl @@ -0,0 +1,12 @@ +""" +Provides a macro for setting up support to use Google Play Services plugins & libraries. +""" + +load("@tools_android//tools/googleservices:defs.bzl", "google_services_workspace_dependencies") + +def set_up(): + """Adds support for using Google Play Services plugins & libraries to the workspace. + """ + + # Add support for Firebase Crashlytics. + google_services_workspace_dependencies() diff --git a/third_party/versions.bzl b/third_party/versions.bzl deleted file mode 100644 index f9e0864672d..00000000000 --- a/third_party/versions.bzl +++ /dev/null @@ -1,184 +0,0 @@ -""" -Contains all versions of third-party dependencies for the Oppia Android app. Note: dependencies -added to the version dictionary below will automatically become available as a new third-party -dependency elsewhere in the app. - -Note that dependencies can only be represented once in the list--that's by design to protect against -one-version violations. See https://docs.bazel.build/versions/master/best-practices.html#versioning -for more information on multi-version violations. - -Note that each of the dependencies will have all ':'s & '.'s replaced with underscores. For example, -the dependency "android.arch.core:core-testing": "1.1.1" will be referencable with the following: -//third_party:android_arch_core_core-testing (no version is included so that versions can be easily -updated here). - -Note that for making any change in 'MAVEN_PRODUCTION_DEPENDENCY_VERSIONS' or -'MAVEN_TEST_DEPENDENCY_VERSIONS' dicts please refer to: -https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies -""" - -# Note to developers: Please keep this dict sorted by key to make it easier to find dependencies. -# This list should contain only production (non-test) dependencies. -MAVEN_PRODUCTION_DEPENDENCY_VERSIONS = { - "androidx.annotation:annotation": "1.1.0", - "androidx.appcompat:appcompat": "1.2.0", - "androidx.constraintlayout:constraintlayout": "1.1.3", - "androidx.core:core": "1.0.1", - "androidx.core:core-ktx": "1.0.1", - "androidx.databinding:databinding-adapters": "3.4.2", - "androidx.databinding:databinding-common": "3.4.2", - "androidx.databinding:databinding-compiler": "3.4.2", - "androidx.databinding:databinding-runtime": "3.4.2", - "androidx.drawerlayout:drawerlayout": "1.1.0", - "androidx.lifecycle:lifecycle-extensions": "2.2.0", - "androidx.lifecycle:lifecycle-livedata-core": "2.2.0", - "androidx.lifecycle:lifecycle-livedata-ktx": "2.2.0", - "androidx.lifecycle:lifecycle-viewmodel-ktx": "2.2.0", - "androidx.multidex:multidex": "2.0.1", - "androidx.multidex:multidex-instrumentation": "2.0.0", - "androidx.navigation:navigation-fragment": "2.0.0", - "androidx.navigation:navigation-fragment-ktx": "2.0.0", - "androidx.navigation:navigation-ui": "2.0.0", - "androidx.navigation:navigation-ui-ktx": "2.0.0", - "androidx.recyclerview:recyclerview": "1.0.0", - "androidx.room:room-runtime": "2.2.5", - "androidx.test.uiautomator:uiautomator": "2.2.0", - "androidx.viewpager2:viewpager2": "1.0.0", - "androidx.viewpager:viewpager": "1.0.0", - "androidx.work:work-runtime": "2.4.0", - "androidx.work:work-runtime-ktx": "2.4.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", - "com.google.android.material:material": "1.3.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", - "com.google.firebase:firebase-appcheck-playintegrity": "16.0.0", - "com.google.firebase:firebase-auth-ktx": "19.3.1", - "com.google.firebase:firebase-common": "19.3.0", - "com.google.firebase:firebase-crashlytics": "17.1.1", - "com.google.firebase:firebase-firestore-ktx": "24.2.1", - "com.google.gms:google-services": "4.3.3", - "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.13.0", - "com.squareup.moshi:moshi-kotlin-codegen": "1.13.0", - "com.squareup.okhttp3:okhttp": "4.7.2", - "com.squareup.retrofit2:converter-moshi": "2.5.0", - "com.squareup.retrofit2:retrofit": "2.9.0", - "io.fabric.sdk.android:fabric": "1.4.7", - "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.6.10", - "org.jetbrains.kotlinx:kotlinx-coroutines-android": "1.6.4", - "org.jetbrains.kotlinx:kotlinx-coroutines-core": "1.6.4", - "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm": "1.6.4", - "org.jetbrains.kotlinx:kotlinx-coroutines-guava": "1.6.4", - "org.jetbrains:annotations:jar": "13.0", -} - -# Note to developers: Please keep this dict sorted by key to make it easier to find dependencies. -# This list should only contain test-only dependencies. These are dependencies that are guaranteed -# cannot be included in production builds of the app. -MAVEN_TEST_DEPENDENCY_VERSIONS = { - "androidx.arch.core:core-testing": "2.1.0", - "androidx.test.espresso:espresso-accessibility": "3.1.0", - "androidx.test.espresso:espresso-contrib": "3.1.0", - "androidx.test.espresso:espresso-core": "3.2.0", - "androidx.test.espresso:espresso-intents": "3.1.0", - "androidx.test.ext:junit": "1.1.1", - "androidx.test.ext:truth": "1.4.0", - "androidx.test:core": "1.0.0", - "androidx.test:runner": "1.2.0", - "androidx.work:work-testing": "2.4.0", - "com.android.tools.apkparser:apkanalyzer": "30.0.4", - "com.github.bumptech.glide:mocks": "4.11.0", - "com.google.protobuf:protobuf-java": "3.17.3", - "com.google.protobuf:protobuf-java-util": "3.17.3", - "com.google.truth.extensions:truth-liteproto-extension": "1.1.3", - "com.google.truth:truth": "0.43", - "com.squareup.okhttp3:mockwebserver": "4.7.2", - "com.squareup.retrofit2:retrofit-mock": "2.5.0", - "io.xlate:yaml-json": "0.1.0", - "jakarta.json:jakarta.json-api": "2.1.2", - "junit:junit": "4.12", - "org.eclipse.parsson:parsson": "1.1.2", - "org.jetbrains.kotlin:kotlin-compiler-embeddable": "1.5.0", - "org.jetbrains.kotlin:kotlin-reflect": "1.3.41", - "org.jetbrains.kotlin:kotlin-test-junit": "1.3.72", - "org.jetbrains.kotlinx:kotlinx-coroutines-test": "1.6.4", - "org.mockito.kotlin:mockito-kotlin": "3.2.0", - "org.mockito:mockito-core": "2.19.0", - "org.robolectric:annotations": "4.5", - "org.robolectric:robolectric": "4.5", - "org.snakeyaml:snakeyaml-engine": "2.6", -} - -# Note to developers: Please keep this dict sorted by key to make it easier to find dependencies. -HTTP_DEPENDENCY_VERSIONS = { - "android_bundletool": { - "sha": "1e8430002c76f36ce2ddbac8aadfaf2a252a5ffbd534dab64bb255cda63db7ba", - "version": "1.8.0", - }, - "dagger": { - "sha": "5c2b22e88e52110178afebda100755f31f5dd505c317be0bfb4f7ad88a88db86", - "version": "2.41", - }, - "guava_android": { - "sha": "9425a423a4cb9d9db0356300722d9bd8e634cf539f29d97bb84f457cccd16eb8", - "version": "31.0.1", - }, - "guava_jre": { - "sha": "d5be94d65e87bd219fb3193ad1517baa55a3b88fc91d21cf735826ab5af087b9", - "version": "31.0.1", - }, - "oppia_proto_api": { - "version": "9cf993ea0b798a67b3faa21c690c30b9027fb371", - }, - "protobuf_tools": { - "sha": "efcb0b9004200fce79de23be796072a055105273905a5a441dbb5a979d724d20", - "version": "3.11.0", - }, - "robolectric": { - "sha": "af0177d32ecd2cd68ee6e9f5d38288e1c4de0dd2a756bb7133c243f2d5fe06f7", - "version": "4.5", - }, - "rules_java": { - "sha": "c73336802d0b4882e40770666ad055212df4ea62cfa6edf9cb0f9d29828a0934", - "version": "5.3.5", - }, - "rules_jvm": { - "sha": "c4cd0fd413b43785494b986fdfeec5bb47eddca196af5a2a98061faab83ed7b2", - "version": "5.1", - }, - "rules_kotlin": { - "sha": "fd92a98bd8a8f0e1cdcb490b93f5acef1f1727ed992571232d33de42395ca9b3", - "version": "v1.7.1", - }, - "rules_proto": { - "sha": "e0cab008a9cdc2400a1d6572167bf9c5afc72e19ee2b862d18581051efab42c9", - "version": "c0b62f2f46c85c16cb3b5e9e921f0d00e3101934", - }, -} - -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. - """ - return (["%s:%s" % (name, version) for name, version in MAVEN_PRODUCTION_DEPENDENCY_VERSIONS.items()] + - ["%s:%s" % (name, version) for name, version in MAVEN_TEST_DEPENDENCY_VERSIONS.items()]) diff --git a/third_party/versions/BUILD.bazel b/third_party/versions/BUILD.bazel new file mode 100644 index 00000000000..928f7e9f2ed --- /dev/null +++ b/third_party/versions/BUILD.bazel @@ -0,0 +1,7 @@ +""" +Contains the versions and configurations for all direct archive & Maven dependencies needed to build +the Oppia Android app. + +Generally, the only files that need to be manually changed are direct_http_versions.bzl and +direct_maven_versions.bzl. +""" diff --git a/third_party/versions/direct_http_versions.bzl b/third_party/versions/direct_http_versions.bzl new file mode 100644 index 00000000000..53f0bfecc2b --- /dev/null +++ b/third_party/versions/direct_http_versions.bzl @@ -0,0 +1,220 @@ +""" +Contains all of the HTTP archive/jar & Git repository dependencies that are directly required for +production & test builds of the app. These are exposed via DIRECT_REMOTE_DEPENDENCIES. +""" + +load( + "//third_party/macros:direct_dep_defs.bzl", + "EXPORT_TOOLCHAIN", + "create_export_library_details", + "create_git_repository_reference", + "create_http_archive_reference", + "create_http_jar_reference", + "create_local_patch_config", + "create_remote_patch_config", +) +load(":direct_maven_versions.bzl", "PRODUCTION_DEPENDENCY_VERSIONS") + +# External dependencies that are directly imported rather than made accessible through Maven. See +# the individual create*reference() functions for more details on available properties and +# configurations. Note that the order of the references in this list mostly matter (that is, they +# can be configured to reference earlier references, and references are evaluated in-order. +DIRECT_REMOTE_DEPENDENCIES = [ + create_http_archive_reference( + name = "android_test_support", + sha = "dcd1ff76aef1a26329d77863972780c8fe1fc8ff625747342239f0489c2837ec", + version = "1edfdab3134a7f01b37afabd3eebfd2c5bb05151", + test_only = True, + url = "https://github.com/android/android-test/archive/{0}.tar.gz", + strip_prefix_template = "android-test-{0}", + ), + create_http_archive_reference( + name = "bazel_skylib", + sha = "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7", + version = "1.4.1", + test_only = False, + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/{0}/bazel-skylib-{0}.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/{0}/bazel-skylib-{0}.tar.gz", + ], + ), + create_http_archive_reference( + name = "dagger", + sha = "5c2b22e88e52110178afebda100755f31f5dd505c317be0bfb4f7ad88a88db86", + version = PRODUCTION_DEPENDENCY_VERSIONS["com.google.dagger:dagger"], + test_only = False, + url = "https://github.com/google/dagger/archive/dagger-{0}.zip", + strip_prefix_template = "dagger-dagger-{0}", + ), + create_http_archive_reference( + name = "protobuf_tools", + sha = "efcb0b9004200fce79de23be796072a055105273905a5a441dbb5a979d724d20", + version = "3.11.0", + test_only = False, + url = "https://github.com/protocolbuffers/protobuf/releases/download/v{0}/protobuf-all-{0}.zip", + strip_prefix_template = "protobuf-{0}", + ), + create_http_archive_reference( + name = "robolectric", + sha = "af0177d32ecd2cd68ee6e9f5d38288e1c4de0dd2a756bb7133c243f2d5fe06f7", + version = "4.5", + test_only = True, + url = "https://github.com/robolectric/robolectric-bazel/archive/{0}.tar.gz", + strip_prefix_template = "robolectric-bazel-{0}", + export_details = create_export_library_details( + exposed_artifact_name = "robolectric_android-all", + exportable_target = "bazel:android-all", + export_toolchain = EXPORT_TOOLCHAIN.ANDROID, + ), + ), + create_http_archive_reference( + name = "rules_java", + sha = "c73336802d0b4882e40770666ad055212df4ea62cfa6edf9cb0f9d29828a0934", + version = "5.3.5", + test_only = False, + url = "https://github.com/bazelbuild/rules_java/releases/download/{0}/rules_java-{0}.tar.gz", + ), + create_http_archive_reference( + name = "rules_jvm", + sha = "c4cd0fd413b43785494b986fdfeec5bb47eddca196af5a2a98061faab83ed7b2", + version = "5.1", + test_only = False, + url = "https://github.com/bazelbuild/rules_jvm_external/archive/{0}.zip", + import_bind_name = "rules_jvm_external", + strip_prefix_template = "rules_jvm_external-{0}", + ), + create_http_archive_reference( + name = "rules_kotlin", + sha = "fd92a98bd8a8f0e1cdcb490b93f5acef1f1727ed992571232d33de42395ca9b3", + version = "v1.7.1", + test_only = False, + url = "https://github.com/bazelbuild/rules_kotlin/releases/download/{0}/rules_kotlin_release.tgz", + import_bind_name = "io_bazel_rules_kotlin", + patches_details = [ + # See https://github.com/orgs/community/discussions/12531#discussioncomment-5271653 for + # an explanation on the 'full_index' bit. + create_remote_patch_config( + patch_url = "https://github.com/bazelbuild/rules_kotlin/commit/0b75e942e444ccced07cfec50cbc8d925821ed57.patch?full_index=1", + patch_sri = "sha256-UgznkSxEhnHcDh8PjaWI92EEPHRe/8HEtlmXrr7O4i8=", + ), + ], + patch_path_start_removal_count = 1, + ), + create_http_archive_reference( + name = "rules_proto", + sha = "e0cab008a9cdc2400a1d6572167bf9c5afc72e19ee2b862d18581051efab42c9", + version = "c0b62f2f46c85c16cb3b5e9e921f0d00e3101934", + test_only = False, + url = "https://github.com/bazelbuild/rules_proto/archive/{0}.tar.gz", + strip_prefix_template = "rules_proto-{0}", + ), + create_http_jar_reference( + name = "guava_android", + sha = "9425a423a4cb9d9db0356300722d9bd8e634cf539f29d97bb84f457cccd16eb8", + version = "31.0.1", + maven_url_suffix = "com/google/guava/guava/{0}-android/guava-{0}-android.jar", + test_only = False, + # Create 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. + export_details = create_export_library_details( + exposed_artifact_name = "com_google_guava_guava", + exportable_target = "jar", + export_toolchain = EXPORT_TOOLCHAIN.ANDROID, + should_be_visible_to_maven_targets = True, + additional_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", + ], + ), + ), + create_http_jar_reference( + name = "kotlinx-coroutines-core-jvm", + sha = "c24c8bb27bb320c4a93871501a7e5e0c61607638907b197aef675513d4c820be", + version = "1.6.4", + maven_url_suffix = "org/jetbrains/kotlinx/kotlinx-coroutines-core-jvm/{0}/kotlinx-coroutines-core-jvm-{0}.jar", + test_only = False, + export_details = create_export_library_details( + exposed_artifact_name = "kotlinx-coroutines-core-jvm", + exportable_target = "jar", + export_toolchain = EXPORT_TOOLCHAIN.KOTLIN, + should_be_visible_to_maven_targets = True, + additional_exports = [ + "//third_party:org_jetbrains_kotlin_kotlin-stdlib-jdk8", + ], + ), + ), + create_git_repository_reference( + name = "android-spotlight", + commit = "d19e4ddc8dc0b2ced3b55d2a34dd68af96692d2d", + remote = "https://github.com/TakuSemba/Spotlight", + test_only = False, + repo_mapping = {"@maven": "@maven_app"}, + build_file = "//third_party/versions/mods:BUILD.android-spotlight", + export_details = create_export_library_details( + exposed_artifact_name = "com_github_takusemba_spotlight", + exportable_target = ":spotlight", + export_toolchain = EXPORT_TOOLCHAIN.ANDROID, + ), + patches_details = [ + create_local_patch_config( + patch_file = "//third_party/versions/mods:android-spotlight-combined.patch", + ), + ], + ), + create_git_repository_reference( + name = "androidsvg", + commit = "5bc9c7553e94c3476e8ea32baea3c77567228fcd", + remote = "https://github.com/oppia/androidsvg", + test_only = False, + export_details = create_export_library_details( + exposed_artifact_name = "com_caverock_androidsvg", + exportable_target = "androidsvg", + export_toolchain = EXPORT_TOOLCHAIN.ANDROID, + ), + ), + create_git_repository_reference( + name = "circularimageview", + commit = "6cfbdf532e475af7152d49d748079a7bceaef9e9", + remote = "https://github.com/sparrow007/CircularImageview", + test_only = False, + build_file = "//third_party/versions/mods:BUILD.circularimageview", + export_details = create_export_library_details( + exposed_artifact_name = "circularimageview_circular_image_view", + exportable_target = ":circular_image_view", + export_toolchain = EXPORT_TOOLCHAIN.ANDROID, + ), + patches_details = [ + create_local_patch_config( + patch_file = "//third_party/versions/mods:circularimageview-remove-app-name.patch", + ), + ], + ), + create_git_repository_reference( + name = "kotlitex", + commit = "97c146758dfe8481283ef9d3a4220264156e1296", + remote = "https://github.com/karino2/kotlitex", + test_only = False, + repo_mapping = {"@maven": "@maven_app"}, + build_file = "//third_party/versions/mods:BUILD.kotlitex", + export_details = create_export_library_details( + exposed_artifact_name = "io_github_karino2_kotlitex", + exportable_target = ":kotlitex", + export_toolchain = EXPORT_TOOLCHAIN.ANDROID, + ), + patches_details = [ + create_local_patch_config( + patch_file = "//third_party/versions/mods:kotlitex-combined.patch", + ), + ], + ), + create_git_repository_reference( + name = "tools_android", + commit = "00e6f4b7bdd75911e33c618a9bc57bab7a6e8930", + remote = "https://github.com/bazelbuild/tools_android", + test_only = False, + ), +] diff --git a/third_party/versions/direct_maven_versions.bzl b/third_party/versions/direct_maven_versions.bzl new file mode 100644 index 00000000000..da358f7d3df --- /dev/null +++ b/third_party/versions/direct_maven_versions.bzl @@ -0,0 +1,116 @@ +""" +Contains all of the Maven dependencies that required to build the app and its test targets. These +are exposed via PRODUCTION_DEPENDENCY_VERSIONS and TEST_DEPENDENCY_VERSIONS. + +Note that all versions listed in this file will automatically be exposed via //third_party library +wrappers. For example, the "androidx.lifecycle:lifecycle-extensions" dependency will be available +via //third_party:androidx_lifecycle_lifecycle-extensions. Test dependencies are only visible to +tests and test targets. None of these libraries are available to script builds. + +Note also that dependencies can only be represented once in the list--that's by design to protect +against one-version violations. See +https://docs.bazel.build/versions/master/best-practices.html#versioning for more information on +multi-version violations. + +The transitive dependencies required for each of the dependencies listed in this file are provided +in transitive_maven_versions.bzl. Both this & that file should be audited using +//scripts:validate_maven_dependencies to ensure that the lists are up-to-date and minimized. + +Also, when changing the lists below please refer to +https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies. +""" + +# Note to developers: Please keep this dict sorted by key to make it easier to find dependencies. +# This list should contain only production (non-test) dependencies. Note also that Dagger artifacts +# are manually included here for better integration with version list maintenance despite this being +# contrary to Dagger's suggested Bazel setup instructions. +PRODUCTION_DEPENDENCY_VERSIONS = { + "androidx.annotation:annotation": "1.1.0", + "androidx.appcompat:appcompat": "1.2.0", + "androidx.constraintlayout:constraintlayout": "2.0.1", + "androidx.core:core": "1.3.1", + "androidx.core:core-ktx": "1.0.2", + "androidx.databinding:databinding-adapters": "3.4.2", + "androidx.databinding:databinding-common": "3.4.2", + "androidx.databinding:databinding-compiler": "3.4.2", + "androidx.databinding:databinding-runtime": "3.4.2", + "androidx.drawerlayout:drawerlayout": "1.1.0", + "androidx.exifinterface:exifinterface": "1.0.0", + "androidx.lifecycle:lifecycle-extensions": "2.2.0", + "androidx.lifecycle:lifecycle-livedata-core": "2.2.0", + "androidx.lifecycle:lifecycle-livedata-ktx": "2.2.0", + "androidx.multidex:multidex": "2.0.1", + "androidx.navigation:navigation-fragment": "2.0.0", + "androidx.navigation:navigation-ui": "2.0.0", + "androidx.recyclerview:recyclerview": "1.1.0", + "androidx.viewpager2:viewpager2": "1.0.0", + "androidx.viewpager:viewpager": "1.0.0", + "androidx.work:work-runtime": "2.4.0", + "androidx.work:work-runtime-ktx": "2.4.0", + "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", + "com.google.android.material:material": "1.3.0", + "com.google.auto.value:auto-value-annotations": "1.8.1", + "com.google.dagger:dagger": "2.41", + "com.google.dagger:dagger-compiler": "2.41", + "com.google.dagger:dagger-producers": "2.41", + "com.google.dagger:dagger-spi": "2.41", + "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", + "com.google.firebase:firebase-appcheck-playintegrity": "16.0.0", + "com.google.firebase:firebase-auth-ktx": "19.3.1", + "com.google.firebase:firebase-common": "20.1.1", + "com.google.firebase:firebase-crashlytics": "17.1.1", + "com.google.firebase:firebase-firestore-ktx": "24.2.1", + "com.google.guava:failureaccess": "1.0.1", + "com.google.j2objc:j2objc-annotations": "1.3", + "com.google.protobuf:protobuf-javalite": "3.19.2", + "com.squareup.moshi:moshi-kotlin": "1.13.0", + "com.squareup.moshi:moshi-kotlin-codegen": "1.13.0", + "com.squareup.okhttp3:okhttp": "4.7.2", + "com.squareup.retrofit2:converter-moshi": "2.7.2", + "com.squareup.retrofit2:retrofit": "2.9.0", + "io.fabric.sdk.android:fabric": "1.4.7", + "javax.annotation:javax.annotation-api": "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": "1.6.21", + "org.jetbrains.kotlinx:kotlinx-coroutines-android": "1.6.4", + "org.jetbrains.kotlinx:kotlinx-coroutines-core": "1.6.4", + "org.jetbrains.kotlinx:kotlinx-coroutines-guava": "1.6.4", +} + +# Note to developers: Please keep this dict sorted by key to make it easier to find dependencies. +# This list should only contain test-only dependencies. These are dependencies that are guaranteed +# cannot be included in production builds of the app. +TEST_DEPENDENCY_VERSIONS = { + "androidx.arch.core:core-testing": "2.1.0", + "androidx.test.espresso:espresso-accessibility": "3.1.0", + "androidx.test.espresso:espresso-contrib": "3.1.0", + "androidx.test.espresso:espresso-core": "3.2.0", + "androidx.test.espresso:espresso-intents": "3.1.0", + "androidx.test.ext:junit": "1.1.1", + "androidx.test.ext:truth": "1.4.0", + "androidx.test.uiautomator:uiautomator": "2.2.0", + "androidx.test:core": "1.4.0", + "androidx.test:runner": "1.2.0", + "androidx.work:work-testing": "2.4.0", + "com.github.bumptech.glide:mocks": "4.11.0", + "com.google.truth.extensions:truth-liteproto-extension": "1.1.3", + "com.google.truth:truth": "1.1.3", + "com.squareup.okhttp3:mockwebserver": "4.7.2", + "com.squareup.retrofit2:retrofit-mock": "2.9.0", + "junit:junit": "4.13.2", + "org.jetbrains.kotlin:kotlin-reflect": "1.6.21", + "org.jetbrains.kotlin:kotlin-test-junit": "1.6.21", + "org.jetbrains.kotlinx:kotlinx-coroutines-test": "1.6.4", + "org.mockito:mockito-core": "3.9.0", + "org.robolectric:annotations": "4.5", + "org.robolectric:robolectric": "4.5", +} diff --git a/third_party/versions/maven_config.bzl b/third_party/versions/maven_config.bzl new file mode 100644 index 00000000000..c80c51c2799 --- /dev/null +++ b/third_party/versions/maven_config.bzl @@ -0,0 +1,41 @@ +""" +Provides the high-level configuration required for downloading & accessing dependencies from Maven, +via MAVEN_ARTIFACT_CONFIGURATION. + +This file generally never needs to be changed directly. Instead, Maven dependencies can be updated +and/or added/removed via direct_maven_versions.bzl. +""" + +load( + "//third_party/macros:direct_dep_defs.bzl", + "create_dep_config", + "create_maven_artifact_configuration", +) +load(":direct_maven_versions.bzl", "PRODUCTION_DEPENDENCY_VERSIONS", "TEST_DEPENDENCY_VERSIONS") +load( + ":transitive_maven_versions.bzl", + "PRODUCTION_TRANSITIVE_DEPENDENCY_VERSIONS", + "TEST_TRANSITIVE_DEPENDENCY_VERSIONS", +) + +MAVEN_ARTIFACT_CONFIGURATION = create_maven_artifact_configuration( + production_dep_config = create_dep_config( + direct_deps = PRODUCTION_DEPENDENCY_VERSIONS, + transitive_deps = PRODUCTION_TRANSITIVE_DEPENDENCY_VERSIONS, + exclusions = [ + # Don't allow production dependencies to use kotlin-reflect. Note that this may + # result in runtime failures for libraries that depend on it, so care must be + # taken or those libraries can't be used as dependencies. + "org.jetbrains.kotlin:kotlin-reflect", + ], + ), + test_dep_config = create_dep_config( + direct_deps = TEST_DEPENDENCY_VERSIONS, + transitive_deps = TEST_TRANSITIVE_DEPENDENCY_VERSIONS, + ), + maven_install_json_target = "//third_party/versions:maven_install.json", + target_overrides = { + "com.google.guava:guava": "@//third_party:com_google_guava_guava", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm": "@//third_party:kotlinx-coroutines-core-jvm", + }, +) diff --git a/third_party/versions/maven_install.json b/third_party/versions/maven_install.json new file mode 100644 index 00000000000..350877d5b3d --- /dev/null +++ b/third_party/versions/maven_install.json @@ -0,0 +1,4067 @@ +{ + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", + "__INPUT_ARTIFACTS_HASH": -1740112150, + "__RESOLVED_ARTIFACTS_HASH": -1963235025, + "artifacts": { + "androidx.activity:activity:aar": { + "shasums": { + "jar": "4f2b35916768032f7d0c20e250e28b29037ed4ce9ebf3da4fcd51bcb0c6067ef" + }, + "version": "1.1.0" + }, + "androidx.annotation:annotation": { + "shasums": { + "jar": "d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692" + }, + "version": "1.1.0" + }, + "androidx.annotation:annotation-experimental:aar": { + "shasums": { + "jar": "b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11" + }, + "version": "1.0.0" + }, + "androidx.appcompat:appcompat-resources:aar": { + "shasums": { + "jar": "c470297c03ff3de1c3d15dacf0be0cae63abc10b52f021dd07ae28daa3100fe5" + }, + "version": "1.2.0" + }, + "androidx.appcompat:appcompat:aar": { + "shasums": { + "jar": "3d2131a55a61a777322e2126e0018011efa6339e53b44153eb651b16020cca70" + }, + "version": "1.2.0" + }, + "androidx.arch.core:core-common": { + "shasums": { + "jar": "fe1237bf029d063e7f29fe39aeaf73ef74c8b0a3658486fc29d3c54326653889" + }, + "version": "2.1.0" + }, + "androidx.arch.core:core-runtime:aar": { + "shasums": { + "jar": "dd77615bd3dd275afb11b62df25bae46b10b4a117cd37943af45bdcbf8755852" + }, + "version": "2.1.0" + }, + "androidx.arch.core:core-testing:aar": { + "shasums": { + "jar": "c57ffade2a9a844bd62b4f4c3916fad5e09e9f24cceba27e932c25bb7a6d1d8f" + }, + "version": "2.1.0" + }, + "androidx.cardview:cardview:aar": { + "shasums": { + "jar": "1193c04c22a3d6b5946dae9f4e8c59d6adde6a71b6bd5d87fb99d82dda1afec7" + }, + "version": "1.0.0" + }, + "androidx.collection:collection": { + "shasums": { + "jar": "632a0e5407461de774409352940e292a291037724207a787820c77daf7d33b72" + }, + "version": "1.1.0" + }, + "androidx.constraintlayout:constraintlayout-solver": { + "shasums": { + "jar": "b23732edbb3511d937fea1ffef047b0e6c001b50c1921f0d959fc384d706ec6a" + }, + "version": "2.0.1" + }, + "androidx.constraintlayout:constraintlayout:aar": { + "shasums": { + "jar": "ec15b5d4a2eff07888bc1499ce2e2c6efe24c0ed60cc57b08c9dc4b6fd3c2189" + }, + "version": "2.0.1" + }, + "androidx.coordinatorlayout:coordinatorlayout:aar": { + "shasums": { + "jar": "44a9e30abf56af1025c52a0af506fee9c4131aa55efda52f9fd9451211c5e8cb" + }, + "version": "1.1.0" + }, + "androidx.core:core-ktx:aar": { + "shasums": { + "jar": "70e0827b92b0efc7d81bf71eea40d0952cf2c01fac8a7cbc497ada359074e182" + }, + "version": "1.0.2" + }, + "androidx.core:core:aar": { + "shasums": { + "jar": "e92ea65a37d589943d405a6a54d1be9d12a225948f26c4e41e511dd55e81efb6" + }, + "version": "1.3.1" + }, + "androidx.cursoradapter:cursoradapter:aar": { + "shasums": { + "jar": "a81c8fe78815fa47df5b749deb52727ad11f9397da58b16017f4eb2c11e28564" + }, + "version": "1.0.0" + }, + "androidx.customview:customview:aar": { + "shasums": { + "jar": "01f76ab043770a97b054046f9815717b82ce0355c02967d16c61981359dc189a" + }, + "version": "1.1.0" + }, + "androidx.databinding:databinding-adapters:aar": { + "shasums": { + "jar": "840a66744866185b6a74fd99e6596bf1eb0720837c3ae470c25212bccc563939" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-common": { + "shasums": { + "jar": "52886c0ef6cfa492d07b40c3952201d6d2f0cfc680144fbefc69d2d5cb786c25" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-compiler": { + "shasums": { + "jar": "07a9fb44f43048b18f149add7835e1239e92057e6748affde2d2bccf330c4242" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-compiler-common": { + "shasums": { + "jar": "770b6a82da0684f93d037ed5d241248cb25862ed14ecd7d9ec8c756153266051" + }, + "version": "3.4.2" + }, + "androidx.databinding:databinding-runtime:aar": { + "shasums": { + "jar": "80d966bf58b971334d65b213b2ab16fe827bbb95389a9c6a52b141853f529b30" + }, + "version": "3.4.2" + }, + "androidx.documentfile:documentfile:aar": { + "shasums": { + "jar": "865a061ef2fad16522f8433536b8d47208c46ff7c7745197dfa1eeb481869487" + }, + "version": "1.0.0" + }, + "androidx.drawerlayout:drawerlayout:aar": { + "shasums": { + "jar": "9d79030ad4f93b1c6296f7a8391710f9e9e3228a3b10964c4bb0a042fd6257b8" + }, + "version": "1.1.0" + }, + "androidx.dynamicanimation:dynamicanimation:aar": { + "shasums": { + "jar": "ce005162c229bf308d2d5b12fb6cad0874069cbbeaccee63a8193bd08d40de04" + }, + "version": "1.0.0" + }, + "androidx.exifinterface:exifinterface:aar": { + "shasums": { + "jar": "ee48be10aab8f54efff4c14b77d11e10b9eeee4379d5ef6bf297a2923c55cc11" + }, + "version": "1.0.0" + }, + "androidx.fragment:fragment:aar": { + "shasums": { + "jar": "fdd0eac80c6b26c79093a63fc699303f928cc1fa73ca7196d5590a77eb6d6873" + }, + "version": "1.2.0" + }, + "androidx.interpolator:interpolator:aar": { + "shasums": { + "jar": "33193135a64fe21fa2c35eec6688f1a76e512606c0fc83dc1b689e37add7732a" + }, + "version": "1.0.0" + }, + "androidx.legacy:legacy-support-core-utils:aar": { + "shasums": { + "jar": "a7edcf01d5b52b3034073027bc4775b78a4764bb6202bb91d61c829add8dd1c7" + }, + "version": "1.0.0" + }, + "androidx.lifecycle:lifecycle-common": { + "shasums": { + "jar": "63898dabf7cfe5ec5d7ed8b8c2564c1427be876e1496ead95c2703cf59d3734b" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-extensions:aar": { + "shasums": { + "jar": "648c8de1d10b025d524a2e46ac994fc3f6bf186826c09ec1a62d250bf1b877ae" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata-core-ktx:aar": { + "shasums": { + "jar": "5951f882e95b7e05ceb9adfca0fa2ebd511d63ea5a00da4eae6c6d0c1903da18" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-livedata-core:aar": { + "shasums": { + "jar": "556c1f3af90aa9d7d0d330565adbf6da71b2429148bac91e07c485f4f9abf614" + }, + "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" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-process:aar": { + "shasums": { + "jar": "3a977e7778fc8418742d388409daaba7ea8fea8823d21ffb96e4c4236f715070" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-runtime:aar": { + "shasums": { + "jar": "2f866c07a1f33a8c9bb69a9545d4f20b4f0628cd0a155432386d7cb081e1e0bc" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-service:aar": { + "shasums": { + "jar": "ca2801ffc069555afed8eddd2292130f436956452bc8bbad30fb56f8e4e382a0" + }, + "version": "2.2.0" + }, + "androidx.lifecycle:lifecycle-viewmodel-savedstate:aar": { + "shasums": { + "jar": "f4cceafbf86acfc7f3ba6a61d6dc6842a6738c1274610767d3ab8f8a114cba97" + }, + "version": "1.0.0" + }, + "androidx.lifecycle:lifecycle-viewmodel:aar": { + "shasums": { + "jar": "967efab24d6c49dd414a8c0ac4a1cd09b018f0b8bb43b739ad360c4158ebde27" + }, + "version": "2.2.0" + }, + "androidx.loader:loader:aar": { + "shasums": { + "jar": "11f735cb3b55c458d470bed9e25254375b518b4b1bad6926783a7026db0f5025" + }, + "version": "1.0.0" + }, + "androidx.localbroadcastmanager:localbroadcastmanager:aar": { + "shasums": { + "jar": "e71c328ceef5c4a7d76f2d86df1b65d65fe2acf868b1a4efd84a3f34336186d8" + }, + "version": "1.0.0" + }, + "androidx.multidex:multidex:aar": { + "shasums": { + "jar": "42dd32ff9f97f85771b82a20003a8d70f68ab7b4ba328964312ce0732693db09" + }, + "version": "2.0.1" + }, + "androidx.navigation:navigation-common:aar": { + "shasums": { + "jar": "542ec6f993b6d3bfafe2e53e0f250b8685331e2a0258f9313af9ee3376f93959" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-fragment:aar": { + "shasums": { + "jar": "38ddf1afc99a0585904f2121eee7131fef13595e64c9bb6b22f68dd66b8d1f9c" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-runtime:aar": { + "shasums": { + "jar": "903cd93d3424300ff048a92086d773cfc5e23f928063d4493a45b4b042f2a550" + }, + "version": "2.0.0" + }, + "androidx.navigation:navigation-ui:aar": { + "shasums": { + "jar": "d6edc08d69268967d11336bd8c2dce1f154f0ae8117be9874895f6974123ed20" + }, + "version": "2.0.0" + }, + "androidx.print:print:aar": { + "shasums": { + "jar": "1d5c7f3135a1bba661fc373fd72e11eb0a4adbb3396787826dd8e4190d5d9edd" + }, + "version": "1.0.0" + }, + "androidx.recyclerview:recyclerview:aar": { + "shasums": { + "jar": "f0d2b5a67d0a91ee1b1c73ef2b636a81f3563925ddd15a1d4e1c41ec28de7a4f" + }, + "version": "1.1.0" + }, + "androidx.room:room-common": { + "shasums": { + "jar": "2b130dd4a1d3d91b6701ed33096d389f01c4fc1197a7acd6b91724ddc5acfc06" + }, + "version": "2.2.5" + }, + "androidx.room:room-runtime:aar": { + "shasums": { + "jar": "24a5549b796e43e337513d2908adac67f45350d9a90bca7e2e6120692140bb14" + }, + "version": "2.2.5" + }, + "androidx.savedstate:savedstate:aar": { + "shasums": { + "jar": "2510a5619c37579c9ce1a04574faaf323cd0ffe2fc4e20fa8f8f01e5bb402e83" + }, + "version": "1.0.0" + }, + "androidx.sqlite:sqlite-framework:aar": { + "shasums": { + "jar": "8673737fdb2efbad91aeaeed1927ebb29212d36a867d93b9639c8069019f8a1e" + }, + "version": "2.1.0" + }, + "androidx.sqlite:sqlite:aar": { + "shasums": { + "jar": "8341ff092d6060d62a07227f29237155fff36fb16f96c95fbd9a884e375db912" + }, + "version": "2.1.0" + }, + "androidx.test.espresso:espresso-accessibility:aar": { + "shasums": { + "jar": "e2ee8b50081c0b578521d112808321f737f3bf1acce035fe7be0e26ef00b491f" + }, + "version": "3.1.0" + }, + "androidx.test.espresso:espresso-contrib:aar": { + "shasums": { + "jar": "277c292f02816b5e49051485b11e612c0ba7d36fc76b7dac955fe37766ec2832" + }, + "version": "3.1.0" + }, + "androidx.test.espresso:espresso-core:aar": { + "shasums": { + "jar": "beb4712c2520c1da30ac1f25506871f16ea5b83ee686ece5a258769df1a01e15" + }, + "version": "3.2.0" + }, + "androidx.test.espresso:espresso-idling-resource:aar": { + "shasums": { + "jar": "c1a0454fe95788122ba652c3ecff7ec538c7e27de206aed970f2809fb8090d09" + }, + "version": "3.2.0" + }, + "androidx.test.espresso:espresso-intents:aar": { + "shasums": { + "jar": "6c252ea1221a7973301b62d1695d4d73cb1b7c0853ee2ffdb8274886148f0af6" + }, + "version": "3.1.0" + }, + "androidx.test.ext:junit:aar": { + "shasums": { + "jar": "449df418d2916a0f86fe7dafb1edb09480fafb6e995d5c751c7d0d1970d4ae72" + }, + "version": "1.1.1" + }, + "androidx.test.ext:truth:aar": { + "shasums": { + "jar": "d067a9bdd009b08d4230f8283cb4579a1183ef45bbfa169fd6d0f112d6c324f6" + }, + "version": "1.4.0" + }, + "androidx.test.uiautomator:uiautomator:aar": { + "shasums": { + "jar": "2838e9d961dbffefbbd229a2bd4f6f82ac4fb2462975862a9e75e9ed325a3197" + }, + "version": "2.2.0" + }, + "androidx.test:core:aar": { + "shasums": { + "jar": "671284e62e393f16ceae1a99a3a9a07bf1aacda29f8fe7b6b884355ef34c09cf" + }, + "version": "1.4.0" + }, + "androidx.test:monitor:aar": { + "shasums": { + "jar": "46a912a1e175f27a97521af3f50e5af87c22c49275dd2c57c043740012806325" + }, + "version": "1.4.0" + }, + "androidx.test:rules:aar": { + "shasums": { + "jar": "0c5c87df67b358c1a17765357138ea1d4bb58c61159ae635b4cb4dcaa3bb5986" + }, + "version": "1.1.0" + }, + "androidx.test:runner:aar": { + "shasums": { + "jar": "5387e011167a3c8da08d99b5d59248c0e2da839317b48ebf202e31dc1f791ec1" + }, + "version": "1.2.0" + }, + "androidx.transition:transition:aar": { + "shasums": { + "jar": "a1e059b3bc0b43a58dec0efecdcaa89c82d2bca552ea5bacf6656c46e853157e" + }, + "version": "1.2.0" + }, + "androidx.vectordrawable:vectordrawable-animated:aar": { + "shasums": { + "jar": "76da2c502371d9c38054df5e2b248d00da87809ed058f3363eae87ce5e2403f8" + }, + "version": "1.1.0" + }, + "androidx.vectordrawable:vectordrawable:aar": { + "shasums": { + "jar": "46fd633ac01b49b7fcabc263bf098c5a8b9e9a69774d234edcca04fb02df8e26" + }, + "version": "1.1.0" + }, + "androidx.versionedparcelable:versionedparcelable:aar": { + "shasums": { + "jar": "9a1d77140ac222b7866b5054ee7d159bc1800987ed2d46dd6afdd145abb710c1" + }, + "version": "1.1.0" + }, + "androidx.viewpager2:viewpager2:aar": { + "shasums": { + "jar": "e95c0031d4cc247cd48196c6287e58d2cee54d9c79b85afea7c90920330275af" + }, + "version": "1.0.0" + }, + "androidx.viewpager:viewpager:aar": { + "shasums": { + "jar": "147af4e14a1984010d8f155e5e19d781f03c1d70dfed02a8e0d18428b8fc8682" + }, + "version": "1.0.0" + }, + "androidx.work:work-runtime-ktx:aar": { + "shasums": { + "jar": "290d2e9c1a22388b3f0c3dbc204a6176f8c49174126de884820befa83899f129" + }, + "version": "2.4.0" + }, + "androidx.work:work-runtime:aar": { + "shasums": { + "jar": "7801441cb973fb007ef311d3db35c3b3c9d011cef890357e7ca33890833354e5" + }, + "version": "2.4.0" + }, + "androidx.work:work-testing:aar": { + "shasums": { + "jar": "dc1d9f743c59ee08c605aa924fc20819b6a0b734338e0a95af1943c3cd806e23" + }, + "version": "2.4.0" + }, + "com.almworks.sqlite4java:sqlite4java": { + "shasums": { + "jar": "243a64470fda0e86a6fddeb0af4c7aa9426ce84e68cbfe18d75ee5da4b7e0b92" + }, + "version": "1.0.392" + }, + "com.android.databinding:baseLibrary": { + "shasums": { + "jar": "5e4f3b90995be63f3c8eeecce120c588a98c6aad3b54f60ad4c80b5418c4b012" + }, + "version": "3.4.2" + }, + "com.android.tools.build.jetifier:jetifier-core": { + "shasums": { + "jar": "c9f8b016144cfb31c5aee92d47f34de23289167cac5e8ef68365b2dd05766f11" + }, + "version": "1.0.0-beta04" + }, + "com.android.tools:annotations": { + "shasums": { + "jar": "1877849936f48cd65857bf448743f9a0bf93ed47fe57527d9ad8af875024888d" + }, + "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" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:compiler": { + "shasums": { + "jar": "a98cdf265c36261b1d523448b05c322ec290afa865946425eded6361980e8770" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:disklrucache": { + "shasums": { + "jar": "d06775a5171b777aa3db031eb0dd4a1dbe3f00dda35b5574dfd953f6b0d5ef18" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:gifdecoder:aar": { + "shasums": { + "jar": "197a1cd5b76855aa02b230c13974e293229b901dc2b96fab4315201e78baa804" + }, + "version": "4.11.0" + }, + "com.github.bumptech.glide:glide:aar": { + "shasums": { + "jar": "5c294e6a5f0f812cef876b8412954c1822da184af38e082a5b766e3c4f4fcd95" + }, + "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" + }, + "version": "2.0" + }, + "com.google.android.datatransport:transport-api:aar": { + "shasums": { + "jar": "576514f8b75d8ae32897f1b9b031f88b00465bf6e0996e227d09af688195f71e" + }, + "version": "2.2.0" + }, + "com.google.android.datatransport:transport-backend-cct:aar": { + "shasums": { + "jar": "6a2d99756c1fa634d3f14b4479257ac83d5d0fbf7fe5aa1db0a014df95ae217f" + }, + "version": "2.3.0" + }, + "com.google.android.datatransport:transport-runtime:aar": { + "shasums": { + "jar": "5e219672fe5a03f5b80c4d2211f39c2b0ceeb3988bfe1e8f1e033579dee20414" + }, + "version": "2.2.3" + }, + "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" + }, + "version": "17.0.0" + }, + "com.google.android.gms:play-services-base:aar": { + "shasums": { + "jar": "2896d76f432be52167295bb9ce45ade25c310aeffc04d28cf8db6a15868e83de" + }, + "version": "18.0.1" + }, + "com.google.android.gms:play-services-basement:aar": { + "shasums": { + "jar": "80859cd9780194be5fb653f6b4484c3c0b32bcf0752d633fc61a889f5fde2fbb" + }, + "version": "18.0.1" + }, + "com.google.android.gms:play-services-measurement-api:aar": { + "shasums": { + "jar": "fde4cb8493409aa5130de84775eba9f967aaaf916512362987e1bd61b60babfc" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-base:aar": { + "shasums": { + "jar": "39fd34e7da8e822a93b64c66134e2479075c298588018d4f379c53b9eea1cf1e" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-impl:aar": { + "shasums": { + "jar": "d143f6d909619a0aa597ccc127713cd5e4b2eea38477521de739331bb791f3ec" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-sdk-api:aar": { + "shasums": { + "jar": "afff4861d76bc1f6c7527ae9c4c58c50d6d9e4668a3dc58b03cd77e508e305b3" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement-sdk:aar": { + "shasums": { + "jar": "24c3c4085609a85debabc43718ac3049583b5452e4d34b2e8c9e620542631b30" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-measurement:aar": { + "shasums": { + "jar": "553f0b6fc6e44eed81bb5b7b4cb80719c05a244a394eb38ae91271871dcddf07" + }, + "version": "17.5.0" + }, + "com.google.android.gms:play-services-stats:aar": { + "shasums": { + "jar": "e8ae5b40512b71e2258bfacd8cd3da398733aa4cde3b32d056093f832b83a6fe" + }, + "version": "17.0.0" + }, + "com.google.android.gms:play-services-tasks:aar": { + "shasums": { + "jar": "f106db48c6ccfa8e1315a7adc44aecd02ff7355eb3fa7dcdcba8c283a8eb1681" + }, + "version": "18.0.1" + }, + "com.google.android.material:material:aar": { + "shasums": { + "jar": "cbf1e7d69fc236cdadcbd1ec5f6c0a1a41aca6ad1ef7f8481058956270ab1f0a" + }, + "version": "1.3.0" + }, + "com.google.android.play:integrity:aar": { + "shasums": { + "jar": "c44e46f3fa25c89840e5edcd76e203d61bba2bb7c2eae485856fbcc7d6fa411b" + }, + "version": "1.0.1" + }, + "com.google.android:annotations": { + "shasums": { + "jar": "ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15" + }, + "version": "4.1.1.4" + }, + "com.google.auto.service:auto-service-annotations": { + "shasums": { + "jar": "44752893119fdaf01b4c5ee74e46e5dab86f2dcda18114c562f877355c6ed26e" + }, + "version": "1.0" + }, + "com.google.auto.value:auto-value-annotations": { + "shasums": { + "jar": "37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852" + }, + "version": "1.8.1" + }, + "com.google.code.findbugs:jsr305": { + "shasums": { + "jar": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7" + }, + "version": "3.0.2" + }, + "com.google.code.gson:gson": { + "shasums": { + "jar": "d3999291855de495c94c743761b8ab5176cfeabe281a5ab0d8e8d45326fd703e" + }, + "version": "2.8.9" + }, + "com.google.dagger:dagger": { + "shasums": { + "jar": "bb0600d2dd9669cbd5a2e40e7d3fbc4692f57fb7d59509d26b380398e20f5739" + }, + "version": "2.41" + }, + "com.google.dagger:dagger-compiler": { + "shasums": { + "jar": "b53edab184655a0de6bacfb9551849de7b6bf0c688a4771321b4cf6f548ac80e" + }, + "version": "2.41" + }, + "com.google.dagger:dagger-producers": { + "shasums": { + "jar": "8fe89dc042654fdf38a5be19bfe7f1d61a512225495a9379d52e5c28bc3f4521" + }, + "version": "2.41" + }, + "com.google.dagger:dagger-spi": { + "shasums": { + "jar": "960d8a3ea526e53f4a47e025bce84c714cdec9b84d29fc29d348bbb58406d8ea" + }, + "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": "721cb91842b46fa056847d104d5225c8b8e1e8b62263b993051e1e5a0137b7ec" + }, + "version": "2.11.0" + }, + "com.google.errorprone:javac-shaded": { + "shasums": { + "jar": "65bfccf60986c47fbc17c9ebab0be626afc41741e0a6ec7109e0768817a36f30" + }, + "version": "9-dev-r4023-3" + }, + "com.google.firebase:firebase-analytics:aar": { + "shasums": { + "jar": "5c36ae943a719de1c598287370cb3ee1d27fd2dc9d0ada650de2b7f9a1dcac54" + }, + "version": "17.5.0" + }, + "com.google.firebase:firebase-annotations": { + "shasums": { + "jar": "0393478cf124721c7502ea76a28129a420c462fc4d5c0a4274db9e309785bd7e" + }, + "version": "16.1.0" + }, + "com.google.firebase:firebase-appcheck-debug:aar": { + "shasums": { + "jar": "544cff5ae13c1d2edcb2478c1d4ebb703d2d1a616f4e0bf261721aefc108ab4c" + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-appcheck-interop:aar": { + "shasums": { + "jar": "44b9133286fe4c550391cf55057b2748323c4052b68412df0f8c83efd6044824" + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-appcheck-playintegrity:aar": { + "shasums": { + "jar": "de9ca1700814a52272ad157654f1224c6b05da9c3da15121c4da23a5eca1ebda" + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-appcheck:aar": { + "shasums": { + "jar": "f6f093086af3af54797cc8f4070aad5b1e8fbb3e16ccbcfd0f02e7dd3e3c9448" + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-auth-interop:aar": { + "shasums": { + "jar": "64dd9a5c20b64d0e367f4731d11e8fd6ea816a89a4e44e4193c72eafb54264d3" + }, + "version": "19.0.2" + }, + "com.google.firebase:firebase-auth-ktx:aar": { + "shasums": { + "jar": "bd23f0077d8e85c8c57e06c06cdcccdc06a3de96facdd72fabd11159f01c4d4d" + }, + "version": "19.3.1" + }, + "com.google.firebase:firebase-auth:aar": { + "shasums": { + "jar": "0523401e4028729d1a882d2f787cd180bdf91bd12cb1d362453a770e6a2f72c1" + }, + "version": "19.3.1" + }, + "com.google.firebase:firebase-common-ktx:aar": { + "shasums": { + "jar": "32ef394eea17445d3460a11f7128ef412f9aa093cd00106e9cfbec363b17a2c1" + }, + "version": "20.1.1" + }, + "com.google.firebase:firebase-common:aar": { + "shasums": { + "jar": "1ab1a5054cb82395487fe0645dcfec6acc94efb9f4972fe717a8bff6905b8ecf" + }, + "version": "20.1.1" + }, + "com.google.firebase:firebase-components:aar": { + "shasums": { + "jar": "dd678b2e24dd9b3f570196c618b6ffba9ea59b232ae6dce1356b0629ecb6fbf7" + }, + "version": "17.0.0" + }, + "com.google.firebase:firebase-crashlytics:aar": { + "shasums": { + "jar": "635953640e1bbb277affadbc3e59b43f1c4dd07de79c8973b6341a756ad8b74b" + }, + "version": "17.1.1" + }, + "com.google.firebase:firebase-database-collection:aar": { + "shasums": { + "jar": "fb92604df35bf819e706432ff6e3ca9d4794cc85348d94c887622ba93b5450e0" + }, + "version": "18.0.1" + }, + "com.google.firebase:firebase-encoders-json:aar": { + "shasums": { + "jar": "24ce7c1cfda1d526b76b16437a2e7d0920d7176a377e0e30b2a7381341f22ea1" + }, + "version": "16.1.0" + }, + "com.google.firebase:firebase-firestore-ktx:aar": { + "shasums": { + "jar": "5c3ebeadfc1feed2fb20c3a974c9f108e2068833af1b9e532cda6a85cb37011f" + }, + "version": "24.2.1" + }, + "com.google.firebase:firebase-firestore:aar": { + "shasums": { + "jar": "e0f2b11b93e779f13e7fcc6a91724aeb071114959c55d19e7e0028c0a01003aa" + }, + "version": "24.2.1" + }, + "com.google.firebase:firebase-iid-interop:aar": { + "shasums": { + "jar": "b6f4ad581eb489370be3bf38a4bdabfc6ea3d4e716234c625a0f42516c53523c" + }, + "version": "17.0.0" + }, + "com.google.firebase:firebase-iid:aar": { + "shasums": { + "jar": "f1c174e75a24f298fbc0ed93dde29c997f29ca511d7e8a18dec068203553cf6b" + }, + "version": "20.1.5" + }, + "com.google.firebase:firebase-installations-interop:aar": { + "shasums": { + "jar": "d498fe20e7d2c65fc8f7124f1c1791d2828bebdf6bf06ab4cdee13e7fe9ccaa2" + }, + "version": "16.0.0" + }, + "com.google.firebase:firebase-installations:aar": { + "shasums": { + "jar": "0d0f88b3c3789d5fe1aa9a69bd5ab6c0e92036fcf34520775a0091e37268dd3f" + }, + "version": "16.3.2" + }, + "com.google.firebase:firebase-measurement-connector:aar": { + "shasums": { + "jar": "17e8b9b60ac0a79fcbed754d03d4b966cc5bb8837e79c2308bf2970f1d05700c" + }, + "version": "18.0.0" + }, + "com.google.firebase:protolite-well-known-types:aar": { + "shasums": { + "jar": "9ac16b795b44c4ba87937ba0a850260d393f9dc25ff469d52a7bad528daac986" + }, + "version": "18.0.0" + }, + "com.google.googlejavaformat:google-java-format": { + "shasums": { + "jar": "aa19ad7850fb85178aa22f2fddb163b84d6ce4d0035872f30d4408195ca1144e" + }, + "version": "1.5" + }, + "com.google.guava:failureaccess": { + "shasums": { + "jar": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26" + }, + "version": "1.0.1" + }, + "com.google.guava:guava": { + "shasums": { + "jar": "d5be94d65e87bd219fb3193ad1517baa55a3b88fc91d21cf735826ab5af087b9" + }, + "version": "31.0.1-jre" + }, + "com.google.guava:listenablefuture": { + "shasums": { + "jar": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99" + }, + "version": "9999.0-empty-to-avoid-conflict-with-guava" + }, + "com.google.j2objc:j2objc-annotations": { + "shasums": { + "jar": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b" + }, + "version": "1.3" + }, + "com.google.protobuf:protobuf-javalite": { + "shasums": { + "jar": "bfc598474392a015c050d34be38bb84eb3986809374eac437420d51680150e94" + }, + "version": "3.19.2" + }, + "com.google.truth.extensions:truth-liteproto-extension": { + "shasums": { + "jar": "71cce6284554e546d1b5ba48e310ee4b4050676f09fb0eced136d779284ff78d" + }, + "version": "1.1.3" + }, + "com.google.truth:truth": { + "shasums": { + "jar": "fc0b67782289a2aabfddfdf99eff1dcd5edc890d49143fcd489214b107b8f4f3" + }, + "version": "1.1.3" + }, + "com.googlecode.juniversalchardet:juniversalchardet": { + "shasums": { + "jar": "757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76" + }, + "version": "1.0.3" + }, + "com.ibm.icu:icu4j": { + "shasums": { + "jar": "e37a4467bac5cdeb02c5c4b8e5063d2f4e67b69e3c7df6d6b610f13185572bab" + }, + "version": "53.1" + }, + "com.squareup.moshi:moshi": { + "shasums": { + "jar": "bd004dd9ba175e603ad44420bf605250291b9b7bc6b9d9e916f5741ac8663307" + }, + "version": "1.13.0" + }, + "com.squareup.moshi:moshi-kotlin": { + "shasums": { + "jar": "a4967678345569919986c0d71ad59ae615745f708ae19fce30ba1e2bcb7f60cd" + }, + "version": "1.13.0" + }, + "com.squareup.moshi:moshi-kotlin-codegen": { + "shasums": { + "jar": "2cab2ee6ff25c12e2712bacbf170239335b3d4694398a5aeddb39484856fd1ae" + }, + "version": "1.13.0" + }, + "com.squareup.okhttp3:mockwebserver": { + "shasums": { + "jar": "d7d08b5096336d5b5a27d0e91bb2ebfa7dd54e48c3bb1e3cba15cc9bf16526b7" + }, + "version": "4.7.2" + }, + "com.squareup.okhttp3:okhttp": { + "shasums": { + "jar": "6b64ca1d2069751242984537d5de2cbe627ae000430f5117c47d8cb3d272facd" + }, + "version": "4.7.2" + }, + "com.squareup.okhttp:okhttp": { + "shasums": { + "jar": "88ac9fd1bb51f82bcc664cc1eb9c225c90dc4389d660231b4cc737bebfe7d0aa" + }, + "version": "2.7.5" + }, + "com.squareup.okio:okio": { + "shasums": { + "jar": "a27f091d34aa452e37227e2cfa85809f29012a8ef2501a9b5a125a978e4fcbc1" + }, + "version": "2.10.0" + }, + "com.squareup.retrofit2:converter-moshi": { + "shasums": { + "jar": "a77fb00f3a8c975bd0962404c51c73e737904b06f1e83aa2d74d9fa71ba3f6bd" + }, + "version": "2.7.2" + }, + "com.squareup.retrofit2:retrofit": { + "shasums": { + "jar": "e6ea1929c46852f5bec66ab3357da383476cef4e8d1deefdbf195b79cc4d6581" + }, + "version": "2.9.0" + }, + "com.squareup.retrofit2:retrofit-mock": { + "shasums": { + "jar": "98773557b7c23d25c2eb542022d33ac061a35dcbbb2fed25f476515ca709a32f" + }, + "version": "2.9.0" + }, + "com.squareup:javapoet": { + "shasums": { + "jar": "4c7517e848a71b36d069d12bb3bf46a70fd4cda3105d822b0ed2e19c00b69291" + }, + "version": "1.13.0" + }, + "com.squareup:javawriter": { + "shasums": { + "jar": "f699823d0081f69cbb676c1845ea222e0ada79bc88a53e5d22d8bd02d328f57e" + }, + "version": "2.1.1" + }, + "com.squareup:kotlinpoet": { + "shasums": { + "jar": "336095fd910caeaebcc2f6998df6625a9a90a5fd9f2cfa215ac224b77f37fbc6" + }, + "version": "1.10.2" + }, + "commons-codec:commons-codec": { + "shasums": { + "jar": "4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569" + }, + "version": "1.10" + }, + "commons-io:commons-io": { + "shasums": { + "jar": "cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581" + }, + "version": "2.4" + }, + "io.fabric.sdk.android:fabric:aar": { + "shasums": { + "jar": "36df4b321ec95e31226ff5abaae73e66f3a99dedddbc2d03054c4e141c8aaa5c" + }, + "version": "1.4.7" + }, + "io.grpc:grpc-android:aar": { + "shasums": { + "jar": "5a2d9a295c6e77cb4e615ed4519edcae2432b7828cac2cc1a8ee798cffb43c9a" + }, + "version": "1.44.1" + }, + "io.grpc:grpc-api": { + "shasums": { + "jar": "5d2bd58e4003e6b8440b3596c0809ef5c651594d62943edb459d5fa82273bd2f" + }, + "version": "1.44.1" + }, + "io.grpc:grpc-context": { + "shasums": { + "jar": "97059fef9e325ecfcc30429921916ebaccd436cf5601af4d706ef1f613f5ea85" + }, + "version": "1.44.1" + }, + "io.grpc:grpc-core": { + "shasums": { + "jar": "907dd75d9684dcd1e5664856e45aa05e072870af91796e635405f963f82431da" + }, + "version": "1.44.1" + }, + "io.grpc:grpc-okhttp": { + "shasums": { + "jar": "ecd538b47b44b4638fa12b792ae2ac18c9b28c5d5a96595b1d3b75d1af424ac2" + }, + "version": "1.44.1" + }, + "io.grpc:grpc-protobuf-lite": { + "shasums": { + "jar": "1e53b2f3d856ee83fe58f7b89a36180e00c79141fbc9752682d1fdb36bcb93be" + }, + "version": "1.44.1" + }, + "io.grpc:grpc-stub": { + "shasums": { + "jar": "c34e16c085568df0ca8b22d7fe1326999d5be192deb2ae057238ec0f7707a107" + }, + "version": "1.44.1" + }, + "io.perfmark:perfmark-api": { + "shasums": { + "jar": "c705b5c10c18ff3032b9e81742bc2f6b0e5607f6a6dfc0c8ad0cff75d4913042" + }, + "version": "0.23.0" + }, + "javax.annotation:javax.annotation-api": { + "shasums": { + "jar": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b" + }, + "version": "1.3.2" + }, + "javax.inject:javax.inject": { + "shasums": { + "jar": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff" + }, + "version": "1" + }, + "junit:junit": { + "shasums": { + "jar": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3" + }, + "version": "4.13.2" + }, + "net.bytebuddy:byte-buddy": { + "shasums": { + "jar": "5fcad05da791e9a22811c255a4a74b7ea094b7243d9dbf3e6fc578c8c94290ac" + }, + "version": "1.10.20" + }, + "net.bytebuddy:byte-buddy-agent": { + "shasums": { + "jar": "b592a6c43e752bf41659717956c57fbb790394d2ee5f8941876659f9c5c0e7e8" + }, + "version": "1.10.20" + }, + "net.ltgt.gradle.incap:incap": { + "shasums": { + "jar": "b625b9806b0f1e4bc7a2e3457119488de3cd57ea20feedd513db070a573a4ffd" + }, + "version": "0.2" + }, + "net.sf.kxml:kxml2": { + "shasums": { + "jar": "f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2" + }, + "version": "2.3.0" + }, + "nl.dionsegijn:konfetti:aar": { + "shasums": { + "jar": "a9beb9371e9c06c39eeff1ed052142a6ed6f0b28e3408230d8771867f9d817ba" + }, + "version": "1.2.5" + }, + "org.antlr:antlr4": { + "shasums": { + "jar": "a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4" + }, + "version": "4.5.3" + }, + "org.bouncycastle:bcprov-jdk15on": { + "shasums": { + "jar": "e78f96eb59066c94c94fb2d6b5eb80f52feac6f5f9776898634f8addec6e2137" + }, + "version": "1.65" + }, + "org.checkerframework:checker-compat-qual": { + "shasums": { + "jar": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a" + }, + "version": "2.5.5" + }, + "org.checkerframework:checker-qual": { + "shasums": { + "jar": "63d474e16948b0a5aabd12c18bdc3d6f47ac2efc4c7ee08da76dba4658138f95" + }, + "version": "3.21.3" + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "shasums": { + "jar": "e67ec27ceeaf13ab5d54cf5fdbcc544c41b4db8d02d9f006678cca2c7c13ee9d" + }, + "version": "1.19" + }, + "org.hamcrest:hamcrest-core": { + "shasums": { + "jar": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9" + }, + "version": "1.3" + }, + "org.hamcrest:hamcrest-integration": { + "shasums": { + "jar": "70f418efbb506c5155da5f9a5a33262ea08a9e4d7fea186aa9015c41a7224ac2" + }, + "version": "1.3" + }, + "org.hamcrest:hamcrest-library": { + "shasums": { + "jar": "711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c" + }, + "version": "1.3" + }, + "org.jetbrains.kotlin:kotlin-reflect": { + "shasums": { + "jar": "1e1f57209f7238c3fd1735a1b9339a56565507dca249f8371bf59d91f601aeaa" + }, + "version": "1.6.21" + }, + "org.jetbrains.kotlin:kotlin-stdlib": { + "shasums": { + "jar": "739c526672bb337573b28f63afa8306eb088b0c3a0967f56d6c89f4a3012a492" + }, + "version": "1.6.21" + }, + "org.jetbrains.kotlin:kotlin-stdlib-common": { + "shasums": { + "jar": "183bec59cd9f3a14957b190e8c879cf1194bd1f106b0a7b6e1cbb8790d242363" + }, + "version": "1.6.21" + }, + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": { + "shasums": { + "jar": "f1b0634dbb94172038463020bb2dd45ca26849f8ce29d625acb0f1569d11dbee" + }, + "version": "1.6.21" + }, + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": { + "shasums": { + "jar": "dab45489b47736d59fce44b80676f1947a9b6bcab10fd60e878a83bd82a6954c" + }, + "version": "1.6.21" + }, + "org.jetbrains.kotlin:kotlin-test": { + "shasums": { + "jar": "5507a7f3da534e221d75c7dd039b6e8e8107496a64ee8e334007ff904676d5e4" + }, + "version": "1.6.21" + }, + "org.jetbrains.kotlin:kotlin-test-junit": { + "shasums": { + "jar": "00a5a0a1e02504573da314e3aa29bed702ff70272c07e53c8a10e562325542c3" + }, + "version": "1.6.21" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-android": { + "shasums": { + "jar": "3fdc0eed5bc4b83ee9622774520a2db25470370eacd1581cac1e37704f095b00" + }, + "version": "1.6.4" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-core": { + "shasums": { + "jar": "778851e73851b502e8366434bc9ec58371431890fb12b89e7edbf1732962c030" + }, + "version": "1.6.4" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm": { + "shasums": { + "jar": "c24c8bb27bb320c4a93871501a7e5e0c61607638907b197aef675513d4c820be" + }, + "version": "1.6.4" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-guava": { + "shasums": { + "jar": "94deeee072e0f762a8a3ccc66b1762c5d96d55eca13cab4001f5b7588bb74390" + }, + "version": "1.6.4" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-test": { + "shasums": { + "jar": "993eef7de86d59e99096fbc51b7df33f0cc8a3a655e195590765b7e51e4c0aaa" + }, + "version": "1.6.4" + }, + "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm": { + "shasums": { + "jar": "69d65e5fea41cbc0bb905d3ef6623a2348b931fd01b9f2c4a1751a372f2e476d" + }, + "version": "1.6.4" + }, + "org.jetbrains.kotlinx:kotlinx-metadata-jvm": { + "shasums": { + "jar": "fdaf7ba158465f6b6e9ce5762e0300fd681a976fbfeb5ed50fa5a2b26868cec8" + }, + "version": "0.3.0" + }, + "org.jetbrains:annotations": { + "shasums": { + "jar": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478" + }, + "version": "13.0" + }, + "org.mockito:mockito-core": { + "shasums": { + "jar": "a1f64211407b8dc4cf80b16e07cc11aa9e5228d53dc4a5357326d66825f6a4ac" + }, + "version": "3.9.0" + }, + "org.objenesis:objenesis": { + "shasums": { + "jar": "03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3" + }, + "version": "3.2" + }, + "org.ow2.asm:asm": { + "shasums": { + "jar": "b9d4fe4d71938df38839f0eca42aaaa64cf8b313d678da036f0cb3ca199b47f5" + }, + "version": "9.2" + }, + "org.ow2.asm:asm-analysis": { + "shasums": { + "jar": "2d46de6df856a4daac9aa534459ab7287eb80584e9109850405e5b302dc9c2a6" + }, + "version": "9.0" + }, + "org.ow2.asm:asm-commons": { + "shasums": { + "jar": "1b9090acb7e67bd4ed2f2cfb002063316d79cecace237bd07cc4f7f1b302092f" + }, + "version": "9.0" + }, + "org.ow2.asm:asm-tree": { + "shasums": { + "jar": "e2c25f332eb95861883a8568e45aac5e77d140d0fe961ae8eb9a474ec876e00d" + }, + "version": "9.0" + }, + "org.ow2.asm:asm-util": { + "shasums": { + "jar": "2af6e7d01e0862e75193f3c01a06a689b0a245947e29f38eb683633391519bb6" + }, + "version": "9.0" + }, + "org.robolectric:annotations": { + "shasums": { + "jar": "76b5bf55bb0d98e3b72fee1e015dea04c3a5a907aff02b9b405cebd50a19e1ab" + }, + "version": "4.5" + }, + "org.robolectric:junit": { + "shasums": { + "jar": "c9eec2e87d53fc7a4af3c0c1c4b722963f2dc7d0a01b90568a6c83ca6d751c4a" + }, + "version": "4.5" + }, + "org.robolectric:pluginapi": { + "shasums": { + "jar": "9292f4a65d546b27b000112f1daeea8228c039ba9eb790d122ee99a4b04d8c43" + }, + "version": "4.5" + }, + "org.robolectric:plugins-maven-dependency-resolver": { + "shasums": { + "jar": "e6c381016e2da09c3f3a7859075042d3457d0dc0a6ba088b8d969b9d3a525cfa" + }, + "version": "4.5" + }, + "org.robolectric:resources": { + "shasums": { + "jar": "21b60d114670827bf80b7815faa16da02eeda2fcd01cba088dfb630fa9721eb3" + }, + "version": "4.5" + }, + "org.robolectric:robolectric": { + "shasums": { + "jar": "ba9f8130c11d5b34dfe61990d2e9adfbcf5a945476309c3dcb48fce547331c27" + }, + "version": "4.5" + }, + "org.robolectric:sandbox": { + "shasums": { + "jar": "cf18639f2991893122f88df87bf83eb325b3ca1031c9a730acead5acdc7e275c" + }, + "version": "4.5" + }, + "org.robolectric:shadowapi": { + "shasums": { + "jar": "a158c49d0274a1412fb909d6b2e52a06b230a2b80ad8657c072c7474f0e69c1f" + }, + "version": "4.5" + }, + "org.robolectric:shadows-framework": { + "shasums": { + "jar": "3be4c7d01ee2fb5cff4cb90a65af26831199baac3e92311dd2d5f42cadb50723" + }, + "version": "4.5" + }, + "org.robolectric:utils": { + "shasums": { + "jar": "b0982a413c4bd874a8099b97a22cdcd4826cf62178f17dbca67d814627124de1" + }, + "version": "4.5" + }, + "org.robolectric:utils-reflector": { + "shasums": { + "jar": "91f9e5f9eacd6a2f308473b39d473f3edd205365fe3c4188f8c4c11191c6d914" + }, + "version": "4.5" + } + }, + "dependencies": { + "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-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.navigation:navigation-common:aar": [ + "androidx.collection:collection", + "androidx.core:core:aar" + ], + "androidx.navigation:navigation-fragment:aar": [ + "androidx.fragment:fragment:aar", + "androidx.navigation:navigation-runtime:aar" + ], + "androidx.navigation:navigation-runtime:aar": [ + "androidx.legacy:legacy-support-core-utils:aar", + "androidx.navigation:navigation-common:aar" + ], + "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.crashlytics.sdk.android:answers:aar": [ + "io.fabric.sdk.android:fabric:aar" + ], + "com.crashlytics.sdk.android:beta: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.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.android.play:integrity:aar": [ + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-tasks: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.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": [ + "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.devtools.ksp:symbol-processing-api", + "com.google.guava:failureaccess", + "com.google.guava:guava", + "com.squareup:javapoet", + "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", + "com.google.android.gms:play-services-measurement-sdk:aar", + "com.google.android.gms:play-services-measurement:aar" + ], + "com.google.firebase:firebase-appcheck-debug:aar": [ + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-appcheck:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar" + ], + "com.google.firebase:firebase-appcheck-interop:aar": [ + "com.google.android.gms:play-services-base: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-appcheck-playintegrity:aar": [ + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.android.play:integrity:aar", + "com.google.firebase:firebase-appcheck:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar" + ], + "com.google.firebase:firebase-appcheck:aar": [ + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-appcheck-interop:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar" + ], + "com.google.firebase:firebase-auth-interop:aar": [ + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-annotations", + "com.google.firebase:firebase-common:aar" + ], + "com.google.firebase:firebase-auth-ktx:aar": [ + "com.google.firebase:firebase-auth:aar", + "com.google.firebase:firebase-common-ktx:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7" + ], + "com.google.firebase:firebase-auth:aar": [ + "androidx.collection:collection", + "androidx.fragment:fragment:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-auth-interop:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar" + ], + "com.google.firebase:firebase-common-ktx:aar": [ + "androidx.annotation:annotation", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7" + ], + "com.google.firebase:firebase-common:aar": [ + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-components:aar" + ], + "com.google.firebase:firebase-components:aar": [ + "androidx.annotation:annotation", + "com.google.firebase:firebase-annotations" + ], + "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-database-collection:aar": [ + "com.google.android.gms:play-services-base:aar" + ], + "com.google.firebase:firebase-encoders-json:aar": [ + "androidx.annotation:annotation" + ], + "com.google.firebase:firebase-firestore-ktx:aar": [ + "androidx.annotation:annotation", + "com.google.firebase:firebase-common-ktx:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-firestore:aar", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7" + ], + "com.google.firebase:firebase-firestore:aar": [ + "androidx.annotation:annotation", + "com.google.android.gms:play-services-base:aar", + "com.google.android.gms:play-services-basement:aar", + "com.google.android.gms:play-services-tasks:aar", + "com.google.firebase:firebase-annotations", + "com.google.firebase:firebase-appcheck-interop:aar", + "com.google.firebase:firebase-auth-interop:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-database-collection:aar", + "com.google.firebase:protolite-well-known-types:aar", + "com.squareup.okhttp:okhttp", + "io.grpc:grpc-android:aar", + "io.grpc:grpc-okhttp", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ], + "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.firebase:protolite-well-known-types:aar": [ + "com.google.protobuf:protobuf-javalite" + ], + "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-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", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.squareup.moshi:moshi-kotlin": [ + "com.squareup.moshi:moshi", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "com.squareup.moshi:moshi-kotlin-codegen": [ + "com.google.auto.service:auto-service-annotations", + "com.google.guava:guava", + "com.squareup.moshi:moshi", + "com.squareup:kotlinpoet", + "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.okhttp:okhttp": [ + "com.squareup.okio:okio" + ], + "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-stdlib-jdk8" + ], + "io.grpc:grpc-android:aar": [ + "com.google.guava:guava", + "io.grpc:grpc-core" + ], + "io.grpc:grpc-api": [ + "com.google.code.findbugs:jsr305", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "io.grpc:grpc-context" + ], + "io.grpc:grpc-core": [ + "com.google.android:annotations", + "com.google.code.gson:gson", + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.perfmark:perfmark-api", + "org.codehaus.mojo:animal-sniffer-annotations" + ], + "io.grpc:grpc-okhttp": [ + "com.google.guava:guava", + "com.squareup.okhttp:okhttp", + "com.squareup.okio:okio", + "io.grpc:grpc-core", + "io.perfmark:perfmark-api" + ], + "io.grpc:grpc-protobuf-lite": [ + "com.google.code.findbugs:jsr305", + "com.google.guava:guava", + "com.google.protobuf:protobuf-javalite", + "io.grpc:grpc-api" + ], + "io.grpc:grpc-stub": [ + "com.google.errorprone:error_prone_annotations", + "com.google.guava:guava", + "io.grpc:grpc-api" + ], + "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-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-junit": [ + "junit:junit", + "org.jetbrains.kotlin:kotlin-test" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-android": [ + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-core": [ + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm": [ + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-guava": [ + "com.google.guava:guava", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-test": [ + "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm": [ + "org.jetbrains.kotlin:kotlin-stdlib-common", + "org.jetbrains.kotlin:kotlin-stdlib-jdk8", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm" + ], + "org.jetbrains.kotlinx:kotlinx-metadata-jvm": [ + "org.jetbrains.kotlin:kotlin-stdlib" + ], + "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" + ] + }, + "packages": { + "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.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: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:annotations": [ + "android.annotation" + ], + "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.internal.sql", + "com.google.gson.reflect", + "com.google.gson.stream" + ], + "com.google.dagger:dagger": [ + "dagger", + "dagger.assisted", + "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.componentgenerator", + "dagger.internal.codegen.javapoet", + "dagger.internal.codegen.kotlin", + "dagger.internal.codegen.langmodel", + "dagger.internal.codegen.validation", + "dagger.internal.codegen.writing" + ], + "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.internal.codegen.xprocessing", + "dagger.model", + "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", + "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.firebase:firebase-annotations": [ + "com.google.firebase.annotations" + ], + "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-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.api", + "com.squareup.moshi.kotlin.codegen.apt", + "com.squareup.moshi.kotlin.codegen.ksp", + "com.squareup.moshi.kotlinpoet.metadata", + "com.squareup.moshi.kotlinpoet.metadata.classinspectors", + "com.squareup.moshi.kotlinpoet.metadata.specs", + "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", + "shadow.com.google.auto.common", + "shadow.com.squareup.kotlinpoet.ksp" + ], + "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.okhttp:okhttp": [ + "com.squareup.okhttp", + "com.squareup.okhttp.internal", + "com.squareup.okhttp.internal.framed", + "com.squareup.okhttp.internal.http", + "com.squareup.okhttp.internal.io", + "com.squareup.okhttp.internal.tls" + ], + "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", + "com.squareup.kotlinpoet.tags" + ], + "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" + ], + "io.grpc:grpc-api": [ + "io.grpc" + ], + "io.grpc:grpc-context": [ + "io.grpc" + ], + "io.grpc:grpc-core": [ + "io.grpc.inprocess", + "io.grpc.internal", + "io.grpc.util" + ], + "io.grpc:grpc-okhttp": [ + "io.grpc.okhttp", + "io.grpc.okhttp.internal", + "io.grpc.okhttp.internal.framed" + ], + "io.grpc:grpc-protobuf-lite": [ + "io.grpc.protobuf.lite" + ], + "io.grpc:grpc-stub": [ + "io.grpc.stub", + "io.grpc.stub.annotations" + ], + "io.perfmark:perfmark-api": [ + "io.perfmark" + ], + "javax.annotation:javax.annotation-api": [ + "javax.annotation", + "javax.annotation.security", + "javax.annotation.sql" + ], + "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.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.mustcall.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.codehaus.mojo:animal-sniffer-annotations": [ + "org.codehaus.mojo.animal_sniffer" + ], + "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.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-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.io.path", + "kotlin.jdk7" + ], + "org.jetbrains.kotlin:kotlin-stdlib-jdk8": [ + "kotlin.collections.jdk8", + "kotlin.internal.jdk8", + "kotlin.jvm.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-jvm": [ + "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" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-guava": [ + "kotlinx.coroutines.guava" + ], + "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm": [ + "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: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.fabric.io/public/": [ + "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-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.loader:loader:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "androidx.multidex:multidex:aar", + "androidx.navigation:navigation-common:aar", + "androidx.navigation:navigation-fragment:aar", + "androidx.navigation:navigation-runtime: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.tools.build.jetifier:jetifier-core", + "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", + "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.material:material:aar", + "com.google.android.play:integrity:aar", + "com.google.android:annotations", + "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", + "com.google.firebase:firebase-annotations", + "com.google.firebase:firebase-appcheck-debug:aar", + "com.google.firebase:firebase-appcheck-interop:aar", + "com.google.firebase:firebase-appcheck-playintegrity:aar", + "com.google.firebase:firebase-appcheck:aar", + "com.google.firebase:firebase-auth-interop:aar", + "com.google.firebase:firebase-auth-ktx:aar", + "com.google.firebase:firebase-auth:aar", + "com.google.firebase:firebase-common-ktx:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-crashlytics:aar", + "com.google.firebase:firebase-database-collection:aar", + "com.google.firebase:firebase-encoders-json:aar", + "com.google.firebase:firebase-firestore-ktx:aar", + "com.google.firebase:firebase-firestore: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.firebase:protolite-well-known-types:aar", + "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-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.okhttp: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", + "io.fabric.sdk.android:fabric:aar", + "io.grpc:grpc-android:aar", + "io.grpc:grpc-api", + "io.grpc:grpc-context", + "io.grpc:grpc-core", + "io.grpc:grpc-okhttp", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub", + "io.perfmark:perfmark-api", + "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.codehaus.mojo:animal-sniffer-annotations", + "org.hamcrest:hamcrest-core", + "org.hamcrest:hamcrest-integration", + "org.hamcrest:hamcrest-library", + "org.jetbrains.kotlin:kotlin-reflect", + "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-junit", + "org.jetbrains.kotlinx:kotlinx-coroutines-android", + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", + "org.jetbrains.kotlinx:kotlinx-coroutines-guava", + "org.jetbrains.kotlinx:kotlinx-coroutines-test", + "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm", + "org.jetbrains:annotations", + "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://maven.google.com/": [ + "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-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.loader:loader:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "androidx.multidex:multidex:aar", + "androidx.navigation:navigation-common:aar", + "androidx.navigation:navigation-fragment:aar", + "androidx.navigation:navigation-runtime: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.tools.build.jetifier:jetifier-core", + "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", + "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.material:material:aar", + "com.google.android.play:integrity:aar", + "com.google.android:annotations", + "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", + "com.google.firebase:firebase-annotations", + "com.google.firebase:firebase-appcheck-debug:aar", + "com.google.firebase:firebase-appcheck-interop:aar", + "com.google.firebase:firebase-appcheck-playintegrity:aar", + "com.google.firebase:firebase-appcheck:aar", + "com.google.firebase:firebase-auth-interop:aar", + "com.google.firebase:firebase-auth-ktx:aar", + "com.google.firebase:firebase-auth:aar", + "com.google.firebase:firebase-common-ktx:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-crashlytics:aar", + "com.google.firebase:firebase-database-collection:aar", + "com.google.firebase:firebase-encoders-json:aar", + "com.google.firebase:firebase-firestore-ktx:aar", + "com.google.firebase:firebase-firestore: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.firebase:protolite-well-known-types:aar", + "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-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.okhttp: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", + "io.fabric.sdk.android:fabric:aar", + "io.grpc:grpc-android:aar", + "io.grpc:grpc-api", + "io.grpc:grpc-context", + "io.grpc:grpc-core", + "io.grpc:grpc-okhttp", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub", + "io.perfmark:perfmark-api", + "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.codehaus.mojo:animal-sniffer-annotations", + "org.hamcrest:hamcrest-core", + "org.hamcrest:hamcrest-integration", + "org.hamcrest:hamcrest-library", + "org.jetbrains.kotlin:kotlin-reflect", + "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-junit", + "org.jetbrains.kotlinx:kotlinx-coroutines-android", + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", + "org.jetbrains.kotlinx:kotlinx-coroutines-guava", + "org.jetbrains.kotlinx:kotlinx-coroutines-test", + "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm", + "org.jetbrains:annotations", + "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://repo1.maven.org/maven2/": [ + "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-savedstate:aar", + "androidx.lifecycle:lifecycle-viewmodel:aar", + "androidx.loader:loader:aar", + "androidx.localbroadcastmanager:localbroadcastmanager:aar", + "androidx.multidex:multidex:aar", + "androidx.navigation:navigation-common:aar", + "androidx.navigation:navigation-fragment:aar", + "androidx.navigation:navigation-runtime: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.tools.build.jetifier:jetifier-core", + "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", + "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.material:material:aar", + "com.google.android.play:integrity:aar", + "com.google.android:annotations", + "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", + "com.google.firebase:firebase-annotations", + "com.google.firebase:firebase-appcheck-debug:aar", + "com.google.firebase:firebase-appcheck-interop:aar", + "com.google.firebase:firebase-appcheck-playintegrity:aar", + "com.google.firebase:firebase-appcheck:aar", + "com.google.firebase:firebase-auth-interop:aar", + "com.google.firebase:firebase-auth-ktx:aar", + "com.google.firebase:firebase-auth:aar", + "com.google.firebase:firebase-common-ktx:aar", + "com.google.firebase:firebase-common:aar", + "com.google.firebase:firebase-components:aar", + "com.google.firebase:firebase-crashlytics:aar", + "com.google.firebase:firebase-database-collection:aar", + "com.google.firebase:firebase-encoders-json:aar", + "com.google.firebase:firebase-firestore-ktx:aar", + "com.google.firebase:firebase-firestore: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.firebase:protolite-well-known-types:aar", + "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-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.okhttp: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", + "io.fabric.sdk.android:fabric:aar", + "io.grpc:grpc-android:aar", + "io.grpc:grpc-api", + "io.grpc:grpc-context", + "io.grpc:grpc-core", + "io.grpc:grpc-okhttp", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub", + "io.perfmark:perfmark-api", + "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.codehaus.mojo:animal-sniffer-annotations", + "org.hamcrest:hamcrest-core", + "org.hamcrest:hamcrest-integration", + "org.hamcrest:hamcrest-library", + "org.jetbrains.kotlin:kotlin-reflect", + "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-junit", + "org.jetbrains.kotlinx:kotlinx-coroutines-android", + "org.jetbrains.kotlinx:kotlinx-coroutines-core", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", + "org.jetbrains.kotlinx:kotlinx-coroutines-guava", + "org.jetbrains.kotlinx:kotlinx-coroutines-test", + "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm", + "org.jetbrains:annotations", + "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" + ] + }, + "version": "2" +} diff --git a/third_party/versions/mods/BUILD.android-spotlight b/third_party/versions/mods/BUILD.android-spotlight new file mode 100644 index 00000000000..5ae9a5cb464 --- /dev/null +++ b/third_party/versions/mods/BUILD.android-spotlight @@ -0,0 +1,29 @@ +# Main BUILD file for Spotlight. +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") +load("@rules_jvm_external//:defs.bzl", "artifact") + +genrule( + name = "generate_kotlitex_manifest", + srcs = [], + outs = ["AndroidManifest.xml"], + cmd = """ + echo "" > \"$@\" + echo " " >> \"$@\" + echo " " >> \"$@\" + echo "" >> \"$@\" + """, +) + +kt_android_library( + name = "spotlight", + custom_package = "com.takusemba.spotlight", + srcs = glob(["spotlight/src/main/java/**/*.kt"]), + resource_files = glob(["spotlight/src/main/res/**"]), + manifest = ":AndroidManifest.xml", + exports_manifest = True, + visibility = ["//visibility:public"], + deps = [ + artifact("androidx.appcompat:appcompat"), + artifact("androidx.constraintlayout:constraintlayout"), + ], +) diff --git a/third_party/versions/mods/BUILD.bazel b/third_party/versions/mods/BUILD.bazel new file mode 100644 index 00000000000..0ca37fb8dc3 --- /dev/null +++ b/third_party/versions/mods/BUILD.bazel @@ -0,0 +1,4 @@ +""" +This package contains BUILD files and/or patches needed to modify imported dependencies to make them +compatible or fully functional within Oppia Android app & test builds. +""" diff --git a/third_party/versions/mods/BUILD.circularimageview b/third_party/versions/mods/BUILD.circularimageview new file mode 100644 index 00000000000..078651d38d2 --- /dev/null +++ b/third_party/versions/mods/BUILD.circularimageview @@ -0,0 +1,27 @@ +# Main BUILD file for CircularImageView. +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") +load("@rules_jvm_external//:defs.bzl", "artifact") + +genrule( + name = "generate_kotlitex_manifest", + srcs = [], + outs = ["AndroidManifest.xml"], + cmd = """ + echo "" > \"$@\" + echo " " >> \"$@\" + echo " " >> \"$@\" + echo "" >> \"$@\" + """, +) + +load("@rules_jvm_external//:defs.bzl", "artifact") + +android_library( + name = "circular_image_view", + custom_package = "com.jackandphantom.circularimageview", + srcs = glob(["circularimageview/src/main/java/**/*.java"]), + resource_files = glob(["circularimageview/src/main/res/**"]), + manifest = ":AndroidManifest.xml", + exports_manifest = True, + visibility = ["//visibility:public"], +) diff --git a/third_party/versions/mods/BUILD.kotlitex b/third_party/versions/mods/BUILD.kotlitex new file mode 100644 index 00000000000..68809f73c0c --- /dev/null +++ b/third_party/versions/mods/BUILD.kotlitex @@ -0,0 +1,32 @@ +# Main BUILD file for KotliTeX. +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") +load("@rules_jvm_external//:defs.bzl", "artifact") + +genrule( + name = "generate_kotlitex_manifest", + srcs = [], + outs = ["AndroidManifest.xml"], + cmd = """ + echo "" > \"$@\" + echo " " >> \"$@\" + echo " " >> \"$@\" + echo "" >> \"$@\" + """, +) + +kt_android_library( + name = "kotlitex", + custom_package = "io.github.karino2.kotlitex", + srcs = glob(["kotlitex/src/main/java/**/*.kt"]), + assets = glob( + ["kotlitex/src/main/assets/**"], + ), + assets_dir = "kotlitex/src/main/assets/", + manifest = ":AndroidManifest.xml", + exports_manifest = True, + visibility = ["//visibility:public"], + deps = [ + artifact("org.jetbrains.kotlinx:kotlinx-coroutines-core"), + artifact("org.jetbrains.kotlinx:kotlinx-coroutines-android"), + ], +) diff --git a/third_party/versions/mods/android-spotlight-combined.patch b/third_party/versions/mods/android-spotlight-combined.patch new file mode 100644 index 00000000000..bf854b42b9d --- /dev/null +++ b/third_party/versions/mods/android-spotlight-combined.patch @@ -0,0 +1,147 @@ +index 02cf0ba..7e820b2 100644 +--- spotlight/src/main/java/com/takusemba/spotlight/SpotlightView.kt ++++ spotlight/src/main/java/com/takusemba/spotlight/SpotlightView.kt +@@ -45,6 +45,7 @@ internal class SpotlightView @JvmOverloads constructor( + private var shapeAnimator: ValueAnimator? = null + private var effectAnimator: ValueAnimator? = null + private var target: Target? = null ++ private var anchorOnLayoutChangeListener: View.OnLayoutChangeListener? = null + + init { + setWillNotDraw(false) +@@ -60,7 +61,7 @@ internal class SpotlightView @JvmOverloads constructor( + if (currentTarget != null && currentEffectAnimator != null && currentShapeAnimator != null && !currentShapeAnimator.isRunning) { + currentTarget.effect.draw( + canvas = canvas, +- point = currentTarget.anchor, ++ point = currentTarget.anchorPosition, + value = currentEffectAnimator.animatedValue as Float, + paint = effectPaint + ) +@@ -68,7 +69,7 @@ internal class SpotlightView @JvmOverloads constructor( + if (currentTarget != null && currentShapeAnimator != null) { + currentTarget.shape.draw( + canvas = canvas, +- point = currentTarget.anchor, ++ point = currentTarget.anchorPosition, + value = currentShapeAnimator.animatedValue as Float, + paint = shapePaint + ) +@@ -113,12 +114,12 @@ internal class SpotlightView @JvmOverloads constructor( + fun startTarget(target: Target) { + removeAllViews() + addView(target.overlay, MATCH_PARENT, MATCH_PARENT) +- this.target = target.apply { +- // adjust anchor in case where custom container is set. +- val location = IntArray(2) +- getLocationInWindow(location) +- val offset = PointF(location[0].toFloat(), location[1].toFloat()) +- anchor.offset(-offset.x, -offset.y) ++ anchorOnLayoutChangeListener = View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> ++ // Force a re-draw since the anchor may have moved and/or been resized. ++ this@SpotlightView.invalidate() ++ } ++ this.target = target.also { ++ target.anchor.addOnLayoutChangeListener(anchorOnLayoutChangeListener) + } + this.shapeAnimator?.removeAllListeners() + this.shapeAnimator?.removeAllUpdateListeners() +@@ -170,6 +171,7 @@ internal class SpotlightView @JvmOverloads constructor( + */ + fun finishTarget(listener: Animator.AnimatorListener) { + val currentTarget = target ?: return ++ currentTarget.anchor.removeOnLayoutChangeListener(anchorOnLayoutChangeListener) + val currentAnimatedValue = shapeAnimator?.animatedValue ?: return + shapeAnimator?.removeAllListeners() + shapeAnimator?.removeAllUpdateListeners() +index 4a16fc2..5873e32 100644 +--- spotlight/src/main/java/com/takusemba/spotlight/Target.kt ++++ spotlight/src/main/java/com/takusemba/spotlight/Target.kt +@@ -11,50 +11,29 @@ import com.takusemba.spotlight.shape.Shape + * Target represents the spot that Spotlight will cast. + */ + class Target( +- val anchor: PointF, ++ val anchor: View, + val shape: Shape, + val effect: Effect, + val overlay: View?, + val listener: OnTargetListener? + ) { + ++ val anchorPosition: PointF ++ get() { ++ val location = IntArray(2).also { anchor.getLocationInWindow(it) } ++ return PointF(location[0] + anchor.width / 2f, location[1] + anchor.height / 2f) ++ } ++ + /** + * [Builder] to build a [Target]. + * All parameters should be set in this [Builder]. + */ + class Builder { +- +- private var anchor: PointF = DEFAULT_ANCHOR + private var shape: Shape = DEFAULT_SHAPE + private var effect: Effect = DEFAULT_EFFECT + private var overlay: View? = null + private var listener: OnTargetListener? = null + +- /** +- * Sets a pointer to start a [Target]. +- */ +- fun setAnchor(view: View): Builder = apply { +- val location = IntArray(2) +- view.getLocationInWindow(location) +- val x = location[0] + view.width / 2f +- val y = location[1] + view.height / 2f +- setAnchor(x, y) +- } +- +- /** +- * Sets an anchor point to start [Target]. +- */ +- fun setAnchor(x: Float, y: Float): Builder = apply { +- setAnchor(PointF(x, y)) +- } +- +- /** +- * Sets an anchor point to start [Target]. +- */ +- fun setAnchor(anchor: PointF): Builder = apply { +- this.anchor = anchor +- } +- + /** + * Sets [shape] of the spot of [Target]. + */ +@@ -83,7 +62,7 @@ class Target( + this.listener = listener + } + +- fun build() = Target( ++ fun build(anchor: View) = Target( + anchor = anchor, + shape = shape, + effect = effect, +@@ -92,12 +71,9 @@ class Target( + ) + + companion object { +- +- private val DEFAULT_ANCHOR = PointF(0f, 0f) +- + private val DEFAULT_SHAPE = Circle(100f) + + private val DEFAULT_EFFECT = EmptyEffect() + } + } +-} ++} +index 0d1b953..0000000 +--- spotlight/src/main/res/values/strings.xml ++++ /dev/null +@@ -1,3 +0,0 @@ +- +- Spotlight +- diff --git a/third_party/versions/mods/circularimageview-remove-app-name.patch b/third_party/versions/mods/circularimageview-remove-app-name.patch new file mode 100644 index 00000000000..c677ada1477 --- /dev/null +++ b/third_party/versions/mods/circularimageview-remove-app-name.patch @@ -0,0 +1,7 @@ +index 43ff249..0000000 +--- circularimageview/src/main/res/values/strings.xml ++++ /dev/null +@@ -1,3 +0,0 @@ +- +- circularimageview +- diff --git a/third_party/versions/mods/kotlitex-combined.patch b/third_party/versions/mods/kotlitex-combined.patch new file mode 100644 index 00000000000..403e41662e8 --- /dev/null +++ b/third_party/versions/mods/kotlitex-combined.patch @@ -0,0 +1,1094 @@ +index 5ee4a7e..088eb48 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/FontMetrics.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/FontMetrics.kt +@@ -1,5 +1,7 @@ + package io.github.karino2.kotlitex + ++import java.util.concurrent.ConcurrentHashMap ++ + data class FontMetrics(val cssEmPerMu: Double, + val slant: Double, + val space: Double, +@@ -64,7 +66,7 @@ data class FontMetrics(val cssEmPerMu: Double, + // + // The output of each of these commands is quite lengthy. The only part we + // care about is the FONTDIMEN section. Each value is measured in EMs. +- val sigmasAndXis = mapOf( ++ val sigmasAndXis by lazy { mapOf( + "slant" to arrayOf(0.250, 0.250, 0.250), // sigma1 + "space" to arrayOf(0.000, 0.000, 0.000), // sigma2 + "stretch" to arrayOf(0.000, 0.000, 0.000), // sigma3 +@@ -114,10 +116,11 @@ data class FontMetrics(val cssEmPerMu: Double, + // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. + "doubleRuleSep" to arrayOf(0.2, 0.2, 0.2) + ) ++ } + + // Original code is too JS specific way. We just write down without thinking... + +- val sigmasAndXisKeyList = listOf( ++ val sigmasAndXisKeyList by lazy { listOf( + "slant", // sigma1 + "space", // sigma2 + "stretch", // sigma3 +@@ -167,6 +170,7 @@ data class FontMetrics(val cssEmPerMu: Double, + // `\showthe\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm. + "doubleRuleSep" + ) ++ } + fun createFontMetrics(cssEmPerMu : Double, argVals: List) : FontMetrics { + val slant = argVals[0] + val space = argVals[1] +@@ -234,7 +238,7 @@ data class FontMetrics(val cssEmPerMu: Double, + doubleRuleSep + ) + } +- var fontMetricsBySizeIndex = mutableMapOf() ++ val fontMetricsBySizeIndex by lazy { ConcurrentHashMap() } + + /** + * Get the font metrics for a given size. +index 17a8792..eb7ad96 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/LatexFunctions.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/LatexFunctions.kt +@@ -1,5 +1,7 @@ + package io.github.karino2.kotlitex + ++import java.util.concurrent.ConcurrentHashMap ++ + // LaTeX argument type. + // - "size": A size-like thing, such as "1em" or "5ex" + // - "color": An html color, like "#abc" or "blue" +@@ -97,8 +99,8 @@ data class FunctionDef(val spec: FunctionSpec, + */ + + object LatexFunctions { +- val functions = mutableMapOf() +- val renderGroupBuilders = mutableMapOf() ++ val functions by lazy {ConcurrentHashMap()} ++ val renderGroupBuilders by lazy {ConcurrentHashMap()} + + fun defineFunction(spec: FunctionSpec, names: List, handler: HandlerType, groupHandler: RenderNodeHandlerType) { + val fundef = FunctionDef(spec, handler) +index 1e251bd..eb3c496 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/MacroExpander.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/MacroExpander.kt +@@ -33,13 +33,13 @@ class MacroExpander(val input: String, val settings: Settings, var mode: Mode = + fun endGroup() { macros.endGroup() } + + companion object { +- val implicitCommands = setOf( ++ val implicitCommands by lazy { setOf( + "\\relax", // MacroExpander.js + "^", // Parser.js + "_", // Parser.js + "\\limits", // Parser.js + "\\nolimits" // Parser.js +- ) ++ ) } + } + + /** +index 021314c..4b9aae7 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/Macros.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/Macros.kt +@@ -1,5 +1,7 @@ + package io.github.karino2.kotlitex + ++import java.util.concurrent.ConcurrentHashMap ++ + /* + This file basically contain the code of macros.js in original katex. + */ +@@ -11,7 +13,7 @@ data class MacroString(val value: String) : MacroDefinition() + data class MacroFunction(val func: (MacroExpander)-> MacroDefinition) : MacroDefinition() + + object Macros { +- val builtinMacros = mutableMapOf() ++ val builtinMacros by lazy { ConcurrentHashMap() } + fun defineMacro(name: String, body: MacroDefinition) { + builtinMacros[name] = body + } +index 2bfbf40..a406308 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/MetricMap.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/MetricMap.kt +@@ -2167,5 +2167,5 @@ object MetricMap { + "Typewriter-Regular" to typewriterRegularMap() + ) + +- val metricMap = buildMetricMap() +-} ++ val metricMap by lazy { buildMetricMap() } ++} +index 6032e60..377aeb1 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/Parser.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/Parser.kt +@@ -49,6 +49,7 @@ enum class NonAtoms : Group { + + data class CharInfo(val font: Font, val group: Group, val replace: String?) + ++@Suppress("UNUSED_PARAMETER") + data class Settings(val displayMode: Boolean = false, val throwOnError: Boolean = true, + val errorColor: String = "#cc0000", + val macros: MutableMap /*MacroMap*/ = mutableMapOf(), +@@ -145,7 +146,7 @@ data class AccentRelation(val text: String, val math: String) { + + class Parser(val input: String, val settings: Settings = Settings()) { + companion object { +- val endOfExpression = listOf("}", "\\end", "\\right", "&") ++ val endOfExpression by lazy { listOf("}", "\\end", "\\right", "&") } + val SUPSUB_GREEDINESS = 1 + + init { +@@ -669,7 +670,7 @@ class Parser(val input: String, val settings: Settings = Settings()) { + var symbol: ParseNode + if (Symbols.get(mode).containsKey(text)) { + if (settings.strict != null && mode == Mode.MATH && +- Symbols.extraLatin.contains(text)) { ++ extraLatin.contains(text)) { + this.settings.reportNonstrict("unicodeTextInMathMode", + "Latin-1/Unicode text character \"${text[0]}\" used in " + + "math mode", nucleus) +@@ -698,9 +699,9 @@ class Parser(val input: String, val settings: Settings = Settings()) { + */ + } + symbol = s +- } else if (text[0].toInt() >= 0x80) { // no symbol for e.g. ^ ++ } else if (text[0].code >= 0x80) { // no symbol for e.g. ^ + if (settings.strict != null) { +- if (!supportedCodepoint(text[0].toInt())) { ++ if (!supportedCodepoint(text[0].code)) { + this.settings.reportNonstrict("unknownSymbol", + "Unrecognized Unicode character \"${text[0]}\"" + + " (${text[0]})", nucleus) +index 8f6be18..ad74ae8 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/RenderBuilderDelimiter.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/RenderBuilderDelimiter.kt +@@ -51,36 +51,36 @@ object RenderBuilderDelimiter { + + // There are three kinds of delimiters, delimiters that stack when they become + // too large +- val stackLargeDelimiters = listOf( ++ val stackLargeDelimiters by lazy { listOf( + "(", "\\lparen", ")", "\\rparen", + "[", "\\lbrack", "]", "\\rbrack", + "\\{", "\\lbrace", "\\}", "\\rbrace", + "\\lfloor", "\\rfloor", "\u230a", "\u230b", + "\\lceil", "\\rceil", "\u2308", "\u2309", + "\\surd" +- ) ++ )} + + // delimiters that always stack +- val stackAlwaysDelimiters = listOf( ++ val stackAlwaysDelimiters by lazy { listOf( + "\\uparrow", "\\downarrow", "\\updownarrow", + "\\Uparrow", "\\Downarrow", "\\Updownarrow", + "|", "\\|", "\\vert", "\\Vert", + "\\lvert", "\\rvert", "\\lVert", "\\rVert", + "\\lgroup", "\\rgroup", "\u27ee", "\u27ef", + "\\lmoustache", "\\rmoustache", "\u23b0", "\u23b1" +- ) ++ )} + + // and delimiters that never stack +- val stackNeverDelimiters = listOf( +- "<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt") ++ val stackNeverDelimiters by lazy { listOf( ++ "<", ">", "\\langle", "\\rangle", "/", "\\backslash", "\\lt", "\\gt")} + + // Metrics of the different sizes. Found by looking at TeX's output of + // $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ + // Used to create stacked delimiters of appropriate sizes in makeSizedDelim. +- val sizeToMaxHeight = listOf(0.0, 1.2, 1.8, 2.4, 3.0) ++ val sizeToMaxHeight by lazy { listOf(0.0, 1.2, 1.8, 2.4, 3.0)} + + // Delimiters that never stack try small delimiters and large delimiters only +- val stackNeverDelimiterSequence = listOf( ++ val stackNeverDelimiterSequence by lazy { listOf( + SmallDelimiter(Style.SCRIPTSCRIPT), + SmallDelimiter(Style.SCRIPT), + SmallDelimiter(Style.TEXT), +@@ -88,18 +88,18 @@ object RenderBuilderDelimiter { + LargeDelimiter(DelimiterSize.TWO), + LargeDelimiter(DelimiterSize.THREE), + LargeDelimiter(DelimiterSize.FOUR) +- ) ++ )} + + // Delimiters that always stack try the small delimiters first, then stack +- val stackAlwaysDelimiterSequence = listOf( ++ val stackAlwaysDelimiterSequence by lazy { listOf( + SmallDelimiter(Style.SCRIPTSCRIPT), + SmallDelimiter(Style.SCRIPT), + SmallDelimiter(Style.TEXT), +- StackDelimiter) ++ StackDelimiter)} + + // Delimiters that stack when large try the small and then large delimiters, and + // stack afterwards +- val stackLargeDelimiterSequence = listOf( ++ val stackLargeDelimiterSequence by lazy { listOf( + SmallDelimiter(Style.SCRIPTSCRIPT), + SmallDelimiter(Style.SCRIPT), + SmallDelimiter(Style.TEXT), +@@ -107,7 +107,7 @@ object RenderBuilderDelimiter { + LargeDelimiter(DelimiterSize.TWO), + LargeDelimiter(DelimiterSize.THREE), + LargeDelimiter(DelimiterSize.FOUR), +- StackDelimiter) ++ StackDelimiter)} + + // All surds have 0.08em padding above the viniculum inside the SVG. + // That keeps browser span height rounding error from pinching the line. +@@ -587,7 +587,7 @@ object RenderBuilderDelimiter { + val newOptions = options.havingBaseSizing() + + // Pick the desired surd glyph from a sequence of surds. +- val delim = traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions) ++ /*val delim = */traverseSequence("\\surd", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions) + + var sizeMultiplier = newOptions.sizeMultiplier // default + +@@ -604,8 +604,8 @@ object RenderBuilderDelimiter { + // included in the TeX-like `height` used for calculation of + // vertical alignment. So texHeight = span.height < span.style.height. + +- when (delim) { +- is SmallDelimiter -> { ++ //when (delim) { ++ //is SmallDelimiter -> { + // Get an SVG that is derived from glyph U+221A in font KaTeX-Main. + viewBoxHeight = (1000 + vbPad).toDouble() // 1000 unit glyph height. + if (height < 1.0) { +@@ -618,12 +618,12 @@ object RenderBuilderDelimiter { + span = sqrtSvg("sqrtMain", spanHeight, viewBoxHeight, options) + span.style.minWidth = "0.853em" + advanceWidth = 0.833 / sizeMultiplier // from the font. +- } +- is LargeDelimiter -> { ++ //} ++ /*is LargeDelimiter -> { + // These SVGs come from fonts: KaTeX_Size1, _Size2, etc. +- viewBoxHeight = (1000 + vbPad).toDouble() * sizeToMaxHeight[delim.size.size] +- texHeight = sizeToMaxHeight[delim.size.size] / sizeMultiplier +- spanHeight = (sizeToMaxHeight[delim.size.size] + emPad) / sizeMultiplier ++ viewBoxHeight = (1000 + vbPad).toDouble() * sizeToMaxHeight[delim.size.size] * 1 ++ texHeight = (sizeToMaxHeight[delim.size.size] / sizeMultiplier) * 1 ++ spanHeight = ((sizeToMaxHeight[delim.size.size] + emPad) / sizeMultiplier) * 2 + span = sqrtSvg("sqrtSize" + delim.size, spanHeight, viewBoxHeight, options) + span.style.minWidth = "1.02em" + advanceWidth = 1.0 / sizeMultiplier // 1.0 from the font. +@@ -637,8 +637,8 @@ object RenderBuilderDelimiter { + span = sqrtSvg("sqrtTall", spanHeight, viewBoxHeight, options) + span.style.minWidth = "0.742em" + advanceWidth = 1.056 +- } +- } ++ }*/ ++ //} + + span.height = texHeight + span.style.height = spanHeight.toString() + "em" +index 3a69950..2258856 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/RenderBuilderVList.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/RenderBuilderVList.kt +@@ -37,6 +37,7 @@ data class VListParamFirstBaseLine(val children: List) : VListParam( + get() = PositionType.FirstBaseLine + } + ++@Suppress("UNUSED_PARAMETER") + object RenderBuilderVList { + + fun makeSpan(klasses: MutableSet = mutableSetOf(), children: MutableList = mutableListOf(), options: Options? = null, style: CssStyle = CssStyle()): RNodeSpan = RenderTreeBuilder.makeSpan(klasses, children, options, style) +index 75b98b1..b90963f 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/RenderNode.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/RenderNode.kt +@@ -38,9 +38,10 @@ class RNodeSpan(var children: MutableList = mutableListOf(), var wid + // PathNode in js. + class RNodePath(val path: Path) : RenderNode() { + // TODO: support other pathName ++ @Suppress("UNUSED_PARAMETER") + constructor(pathName: String) : this(SvgGeometry.sqrtMain) { +- if (pathName != "sqrtMain") +- throw NotImplementedError("TODO: RNodePath other than sqrtMain is NYI") ++ //if (pathName != "sqrtMain") ++ //throw NotImplementedError("TODO: RNodePath other than sqrtMain is NYI") + } + } + +index b3c7ce4..d1cf7eb 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/RenderTreeBuilder.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/RenderTreeBuilder.kt +@@ -16,6 +16,7 @@ data class Measurement(val number: Int, val unit: String) { + } + } + ++@Suppress("UNUSED_PARAMETER") + object RenderTreeBuilder { + val groupBuilders: MutableMap + get() = LatexFunctions.renderGroupBuilders +@@ -30,9 +31,9 @@ object RenderTreeBuilder { + * children. + */ + fun sizeElementFromChildren(elem: RNodeSpan) { +- var height = elem.children.map { it.height }.max() ?: 0.0 +- var depth = elem.children.map { it.depth }.max() ?: 0.0 +- var maxFontSize = elem.children.map { it.maxFontSize }.max() ?: 0.0 ++ var height = elem.children.map { it.height }.maxOrNull() ?: 0.0 ++ var depth = elem.children.map { it.depth }.maxOrNull() ?: 0.0 ++ var maxFontSize = elem.children.map { it.maxFontSize }.maxOrNull() ?: 0.0 + + elem.height = height + elem.depth = depth +@@ -147,11 +148,11 @@ object RenderTreeBuilder { + } + + // The following have to be loaded from Main-Italic font, using class mathit +- val mathitLetters = setOf( ++ val mathitLetters by lazy { setOf( + "\\imath", "ı", // dotless i + "\\jmath", "ȷ", // dotless j + "\\pounds", "\\mathsterling", "\\textsterling", "£" // pounds symbol +- ) ++ )} + + /** + * Determines which of the two font names (Main-Italic and Math-Italic) and +@@ -287,7 +288,7 @@ object RenderTreeBuilder { + // A map between tex font commands an MathML mathvariant attribute values + data class FontMapElem(val /* bold, normal, italic */ variant: String, val fontName: String) + +- val fontMap = mapOf( ++ val fontMap by lazy { mapOf( + // styles + "mathbf" to FontMapElem("bold", "Main-Bold"), + "mathrm" to FontMapElem( +@@ -335,19 +336,19 @@ object RenderTreeBuilder { + "monospace", + "Typewriter-Regular" + ) +- ) ++ )} + + data class OneSvgData(val path: String, val width: Double, val height: Double) + + // svgData in js +- val pathData = mapOf( ++ val pathData by lazy { mapOf( + // path, width, height + "vec" to OneSvgData("vec", 0.471, 0.714), // values from the font glyph + "oiintSize1" to OneSvgData("oiintSize1", 0.957, 0.499), // oval to overlay the integrand + "oiintSize2" to OneSvgData("oiintSize2", 1.472, 0.659), + "oiiintSize1" to OneSvgData("oiiintSize1", 1.304, 0.499), + "oiiintSize2" to OneSvgData("oiiintSize2", 1.98, 0.659) +- ) ++ )} + + // staticSvg in js. + fun staticPath(value: String, options: Options): RNodePathSpan { +@@ -675,7 +676,7 @@ object RenderTreeBuilder { + // Ignore explicit spaces (e.g., \;, \,) when determining what implicit + // spacing should go between atoms of different classes, and add dummy + // spans for determining spacings between surrounding atoms. +- val rowNonSpace = rawGroups.filter { group -> group != null && !group.klasses.contains(CssClass.mspace) } ++ val rowNonSpace = rawGroups.filter { group -> !group.klasses.contains(CssClass.mspace) } + val nonSpaces = listOf(null, *rowNonSpace.toTypedArray(), null) + /* TODO: + const nonSpaces: (?HtmlDomNode)[] = [ +index aa00106..bb64580 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/Stretchy.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/Stretchy.kt +@@ -51,7 +51,7 @@ object Stretchy { + + data class KatexImageData(val paths: List, val minWidth: Double, val viewBoxHeight: Int, val align: String = "") + +- val katexImagesData = mapOf( ++ val katexImagesData by lazy { mapOf( + // path(s), minWidth, height, align + "overrightarrow" to KatexImageData(listOf("rightarrow"), 0.888, 522, "xMaxYMin"), + "overleftarrow" to KatexImageData(listOf("leftarrow"), 0.888, 522, "xMinYMin"), +@@ -100,7 +100,7 @@ object Stretchy { + "rightharpoonaboveshortbar"), 1.75, 716), + "xleftequilibrium" to KatexImageData(listOf("shortbaraboveleftharpoon", + "shortrightharpoonabovebar"), 1.75, 716) +- ) ++ )} + + // from stretchy.js + fun groupLength(arg: ParseNode): Int { +index 3bbd817..266e00e 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/Style.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/Style.kt +@@ -29,15 +29,15 @@ data class Style(val id: Int, val size: Int, val cramped: Boolean) { + val SSc = 7 + + // Lookup tables for switching from one style to another +- val sup = listOf(S, Sc, S, Sc, SS, SSc, SS, SSc) +- val sub = listOf(Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc) +- val _fracNum = listOf(T, Tc, S, Sc, SS, SSc, SS, SSc) +- val _fracDen = listOf(Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc) +- val _cramp = listOf(Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc) +- val _text = listOf(D, Dc, T, Tc, T, Tc, T, Tc) ++ val sup by lazy { listOf(S, Sc, S, Sc, SS, SSc, SS, SSc)} ++ val sub by lazy { listOf(Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc)} ++ val _fracNum by lazy { listOf(T, Tc, S, Sc, SS, SSc, SS, SSc)} ++ val _fracDen by lazy { listOf(Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc)} ++ val _cramp by lazy { listOf(Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc)} ++ val _text by lazy { listOf(D, Dc, T, Tc, T, Tc, T, Tc)} + + // Instances of the different styles +- val styles = listOf( ++ val styles by lazy { listOf( + Style(D, 0, false), + Style(Dc, 0, true), + Style(T, 1, false), +@@ -46,12 +46,12 @@ data class Style(val id: Int, val size: Int, val cramped: Boolean) { + Style(Sc, 2, true), + Style(SS, 3, false), + Style(SSc, 3, true) +- ) ++ )} + +- val DISPLAY: Style = styles[D] +- val TEXT: Style = styles[T] +- val SCRIPT = styles[S] +- val SCRIPTSCRIPT = styles[SS] ++ val DISPLAY: Style by lazy { styles[D] } ++ val TEXT: Style by lazy { styles[T] } ++ val SCRIPT by lazy { styles[S] } ++ val SCRIPTSCRIPT by lazy { styles[SS] } + } + + /** +index 21a3bac..ddfa023 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/SymbolDefinitions.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/SymbolDefinitions.kt +@@ -32,17 +32,17 @@ object SymbolDefinitions { + val ams = "ams" + + // groups: +- val accent = NonAtoms.accent_token +- val bin = Atoms.bin +- val close = Atoms.close +- val inner = Atoms.inner +- val mathord = NonAtoms.mathord +- val op = NonAtoms.op_token +- val open = Atoms.open +- val punct = Atoms.punct +- val rel = Atoms.rel +- val spacing = NonAtoms.spacing +- val textord = NonAtoms.textord ++ val accent by lazy { NonAtoms.accent_token } ++ val bin by lazy { Atoms.bin } ++ val close by lazy { Atoms.close } ++ val inner by lazy { Atoms.inner } ++ val mathord by lazy { NonAtoms.mathord } ++ val op by lazy { NonAtoms.op_token } ++ val open by lazy { Atoms.open } ++ val punct by lazy { Atoms.punct } ++ val rel by lazy { Atoms.rel } ++ val spacing by lazy { NonAtoms.spacing } ++ val textord by lazy { NonAtoms.textord } + + // Now comes the symbol table + fun defineSymbol(mode: Mode, font: Font, group: Group, replace: String?, name: String, acceptUnicodeChar: Boolean = false) = Symbols.defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) +@@ -833,7 +833,6 @@ object SymbolDefinitions { + // but they are not actually in the font, nor are they supported by the + // Unicode accent mechanism, so they fall back to Times font and look ugly. + // TODO(edemaine): Fix this. +- val extraLatin = Symbols.extraLatin + for (cha in extraLatin) { + val ch = cha.toString() + defineSymbol(math, main, mathord, ch, ch) +index 371b290..5af0b37 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/Symbols.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/Symbols.kt +@@ -1,5 +1,7 @@ + package io.github.karino2.kotlitex + ++import java.util.concurrent.ConcurrentHashMap ++ + data class CharacterMetrics( + val depth: Double, + val height: Double, +@@ -8,9 +10,15 @@ data class CharacterMetrics( + val width: Double + ) + ++// We add these Latin-1 letters as symbols for backwards-compatibility, ++// but they are not actually in the font, nor are they supported by the ++// Unicode accent mechanism, so they fall back to Times font and look ugly. ++// TODO(edemaine): Fix this. ++const val extraLatin = "ÇÐÞçþ" ++ + object Symbols { +- val mathMap: MutableMap = mutableMapOf() +- val textMap: MutableMap = mutableMapOf() ++ val mathMap: MutableMap by lazy { ConcurrentHashMap() } ++ val textMap: MutableMap by lazy { ConcurrentHashMap() } + + fun get(mode: Mode) = if (mode == Mode.MATH) mathMap else textMap + +@@ -21,7 +29,7 @@ object Symbols { + // descenders we prefer approximations with ascenders, primarily to prevent + // the fraction bar or root line from intersecting the glyph. + // TODO(kevinb) allow union of multiple glyph metrics for better accuracy. +- val extraCharacterMap = mapOf( ++ val extraCharacterMap by lazy { mapOf( + // Latin-1 + 'Å' to 'A', + 'Ç' to 'C', +@@ -97,15 +105,16 @@ object Symbols { + 'э' to 'e', + 'ю' to 'm', + 'я' to 'r' +- ) ++ )} + + // TODO: ++ @Suppress("UNUSED_PARAMETER") + fun supportedCodepoint(ch: Int) = true + + fun getCharacterMetrics(character: String, font: String, mode: Mode): CharacterMetrics? { + val metmap = MetricMap.metricMap[font] ?: throw Exception("Font metrics not found for font: $font.") + +- val chInt = (extraCharacterMap[character[0]] ?: character[0]).toInt() ++ val chInt = (extraCharacterMap[character[0]] ?: character[0]).code + val ch = chInt.toString() + var metric = metmap[ch] + +@@ -149,13 +158,7 @@ object Symbols { + SymbolDefinitions.defineAllSymbols() + } + +- // We add these Latin-1 letters as symbols for backwards-compatibility, +- // but they are not actually in the font, nor are they supported by the +- // Unicode accent mechanism, so they fall back to Times font and look ugly. +- // TODO(edemaine): Fix this. +- val extraLatin = "ÇÐÞçþ" +- +- val unicodeAccents = mapOf( ++ val unicodeAccents by lazy { mapOf( + '\u0301' to AccentRelation("\\'", "\\acute"), + '\u0300' to AccentRelation("\\`", "\\grave"), + '\u0308' to AccentRelation("\\\"", "\\ddot"), +@@ -167,9 +170,9 @@ object Symbols { + '\u0307' to AccentRelation( "\\.", "\\dot"), + '\u030a' to AccentRelation( "\\r", "\\mathring"), + '\u030b' to AccentRelation( "\\H", "") +- ) ++ )} + +- val unicodeSymbols = mapOf( ++ val unicodeSymbols by lazy { mapOf( + '\u00e1' to "\u0061\u0301", // á = \'{a} + '\u00e0' to "\u0061\u0300", // à = \`{a} + '\u00e4' to "\u0061\u0308", // ä = \"{a} +@@ -488,5 +491,5 @@ object Symbols { + '\u1fe8' to "\u03a5\u0306", // Ῠ = \u{Υ} + '\u038f' to "\u03a9\u0301", // Ώ = \'{Ω} + '\u1ffa' to "\u03a9\u0300" // Ὼ = \`{Ω} +- ) +-} ++ )} ++} +index 1350697..dce0d15 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/functions/FunctionAccent.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/functions/FunctionAccent.kt +@@ -3,11 +3,11 @@ package io.github.karino2.kotlitex.functions + import io.github.karino2.kotlitex.* + + object FunctionAccent { +- val NON_STRETCHY_ACCENT_REGEX = ++ val NON_STRETCHY_ACCENT_REGEX by lazy { + setOf( + "\\acute", "\\grave", "\\ddot", "\\tilde", "\\bar", + "\\breve", "\\check", "\\hat", "\\vec", "\\dot", "\\mathring" +- ) ++ )} + + // utils.getBaseElem + /** +index c70e0bd..7ed235e 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/functions/FunctionFont.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/functions/FunctionFont.kt +@@ -12,12 +12,12 @@ object FunctionFont { + return RenderTreeBuilder.buildGroup(group.body, newOptions) + } + +- val fontAliases = mapOf( ++ val fontAliases by lazy { mapOf( + "\\Bbb" to "\\mathbb", + "\\bold" to "\\mathbf", + "\\frak" to "\\mathfrak", + "\\bm" to "\\boldsymbol" +- ) ++ )} + + fun defineAll() { + LatexFunctions.defineFunction( +index df8a94d..770bee3 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/functions/FunctionOp.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/functions/FunctionOp.kt +@@ -42,11 +42,11 @@ object FunctionOp { + // If this is a symbol, create the symbol. + val fontName = if(large) "Size2-Regular" else "Size1-Regular" + +- var stash = "" ++ //var stash = "" + if (group.name == "\\oiint" || group.name == "\\oiiint") { + // No font glyphs yet, so use a glyph w/o the oval. + // TODO: When font glyphs are available, delete this code. +- stash = group.name.substring(1); ++ val stash = group.name.substring(1); + // $FlowFixMe + group.name = if(stash == "oiint") "\\iint" else "\\iiint" + } +@@ -84,6 +84,7 @@ object FunctionOp { + } else if (group.body != null) { + // karino: Is this cast always success? + // If this is a list, compose that list. ++ @Suppress("UNCHECKED_CAST") + val inner = RenderTreeBuilder.buildExpression(group.body as List, options, true); + if (inner.size == 1 && inner[0] is RNodeSymbol) { + val sym = inner[0] +index 7fec49d..24a4747 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/functions/FunctionSymbolsSpacing.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/functions/FunctionSymbolsSpacing.kt +@@ -6,23 +6,23 @@ import java.lang.IllegalArgumentException + object FunctionSymbolsSpacing { + + // A map of CSS-based spacing functions to their CSS class. +- val cssSpace = mapOf( ++ val cssSpace by lazy { mapOf( + "\\nobreak" to CssClass.nobreak, + "\\allowbreak" to CssClass.allowbreak +- ) ++ )} + + // A lookup table to determine whether a spacing function/symbol should be + // treated like a regular space character. If a symbol or command is a key + // in this table, then it should be a regular space character. Furthermore, + // the associated value may have a `className` specifying an extra CSS class + // to add to the created `span`. +- val regularSpace = mapOf( ++ val regularSpace by lazy { mapOf( + " " to CssClass.EMPTY, + "\\ " to CssClass.EMPTY, + "~" to CssClass.nobreak, + "\\space" to CssClass.EMPTY, + "\\nobreakspace" to CssClass.nobreak +- ) ++ )} + + // (ParseNode, Options)->RenderNode + fun renderNodeHandler(group: ParseNode, options: Options) : RenderNode { +index 24e8b15..b0d9127 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/renderer/FontLoader.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/renderer/FontLoader.kt +@@ -64,11 +64,11 @@ class AndroidFontLoader(private val assetManager: AssetManager) : + + companion object { + fun fontToTypefaceMapKey(font: CssFont): String { +- var variant = font.variant.capitalize() ++ var variant = font.variant.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + if (variant == "Normal") { + variant = "" + } +- var weight = font.weight.capitalize() ++ var weight = font.weight.replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } + if (weight == "Normal") { + weight = "" + } +index 9a8dad5..cdac089 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/renderer/VirtualNodeBuilder.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/renderer/VirtualNodeBuilder.kt +@@ -98,6 +98,7 @@ class VirtualNodeBuilder(val children: List, baseSize: Double, val f + } + } + ++ @Suppress("UNUSED_PARAMETER") + private fun createItalicNode(node: RenderNode) {} + + /** +@@ -140,7 +141,8 @@ class VirtualNodeBuilder(val children: List, baseSize: Double, val f + is RNodeSpan -> { + node.children.forEach { createRenderingState(it) } + } ++ else -> {} + } + } + } +-} ++} +index 172ebb3..df4aa4a 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/view/MarkdownView.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/view/MarkdownView.kt +@@ -2,6 +2,7 @@ package io.github.karino2.kotlitex.view + + import android.content.Context + import android.content.res.AssetManager ++import android.graphics.Color + import android.text.Spannable + import android.text.SpannableStringBuilder + import android.util.AttributeSet +@@ -107,7 +108,7 @@ class SpannableMathSpanHandler(val assetManager: AssetManager, val baseSize: Flo + private fun appendMathSpan(exp: String, isMathMode: Boolean) { + isMathExist = true + val size = if (isMathMode) mathExpressionSize else baseSize +- val span = MathExpressionSpan(exp, size, assetManager, isMathMode) ++ val span = MathExpressionSpan(exp, size, assetManager, isMathMode, equationColor = Color.BLACK) + span.ensureDrawable() + val begin = spannable.length + spannable.append("\$\$${exp}\$\$") +@@ -128,13 +129,13 @@ class SpannableMathSpanHandler(val assetManager: AssetManager, val baseSize: Flo + + class MarkdownView(context: Context, attrSet: AttributeSet) : TextView(context, attrSet) { + companion object { +- var CACHE_ENABLED = true ++ /*var CACHE_ENABLED = true + var CACHE_SIZE = 1024 + val cache = object : LinkedHashMap(128, 0.75f, true) { + override fun removeEldestEntry(eldest: MutableMap.MutableEntry?): Boolean { + return this.size > CACHE_SIZE + } +- } ++ }*/ + } + + var job: Job? = null +@@ -147,8 +148,18 @@ class MarkdownView(context: Context, attrSet: AttributeSet) : TextView(context, + MathSpanBuilder(handler) + } + ++ @Suppress("UNUSED_PARAMETER") + fun setMarkdown(text: String) { +- val prevJob = job ++ // This has been altered to be an unsupported method since properly ++ // fixing it is a bit difficult. The problem is that views shouldn't be ++ // interacting directly with GlobalScope, especially within a library. ++ // Fixing this would require piping a coroutine dispatcher to the ++ // library to use for recomputing the view with a mechanism to safely ++ // communicate that back to the main thread (and LiveData required a ++ // lifecycle owner which View cannot satisfy). Since Oppia doesn't ++ // require this view, it can just be commented out. ++ error("Unsupported method.") ++ /*val prevJob = job + prevJob?.let { it.cancel() } + + if (CACHE_ENABLED) { +@@ -178,6 +189,6 @@ class MarkdownView(context: Context, attrSet: AttributeSet) : TextView(context, + setText(handler.spannable) + } + } +- } ++ }*/ + } +-} ++} +index 68788cb..6fdd861 100644 +--- kotlitex/src/main/java/io/github/karino2/kotlitex/view/MathExpressionSpan.kt ++++ kotlitex/src/main/java/io/github/karino2/kotlitex/view/MathExpressionSpan.kt +@@ -11,11 +11,13 @@ import io.github.karino2.kotlitex.renderer.FontLoader + import io.github.karino2.kotlitex.renderer.VirtualNodeBuilder + import io.github.karino2.kotlitex.renderer.node.* // ktlint-disable no-wildcard-imports + import java.lang.ref.WeakReference ++import kotlin.math.absoluteValue + import kotlin.math.max + import kotlin.math.roundToInt + +-private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoader: FontLoader, val isMathMode: Boolean, val drawBounds: Boolean = false) { ++private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoader: FontLoader, val isMathMode: Boolean, val drawBounds: Boolean = false, equationColor: Int) { + var rootNode: VerticalList ++ val colorEquation = equationColor + + val firstVListRowBound: Bounds? + get() { +@@ -42,7 +44,7 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + + val paint = Paint() + val textPaint = TextPaint(Paint.ANTI_ALIAS_FLAG).apply { +- color = Color.BLACK ++ color = equationColor + typeface = Typeface.SERIF + } + +@@ -53,7 +55,7 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + return y.toFloat() + } + +- private fun drawBoundsRect(canvas: Canvas, rect: RectF, color: Int) { ++ private fun drawBoundsRect(drawableSurface: DrawableSurface, rect: RectF, color: Int) { + if (! drawBounds) { + return + } +@@ -62,10 +64,10 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + paint.strokeWidth = 2.0f + paint.style = Paint.Style.STROKE + +- canvas.drawRect(rect, paint) ++ drawableSurface.drawRect(rect, paint) + } + +- private fun drawBounds(canvas: Canvas, bounds: Bounds) { ++ private fun drawBounds(drawableSurface: DrawableSurface, bounds: Bounds) { + if (! drawBounds) { + return + } +@@ -73,10 +75,10 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + val x = translateX(bounds.x) + val y = translateY(bounds.y) + +- drawBoundsRect(canvas, RectF(x, y - bounds.height.toFloat(), x + bounds.width.toFloat(), y), Color.RED) ++ drawBoundsRect(drawableSurface, RectF(x, y - bounds.height.toFloat(), x + bounds.width.toFloat(), y), Color.RED) + } + +- private fun drawWholeBound(canvas: Canvas, bounds: Bounds) { ++ private fun drawWholeBound(drawableSurface: DrawableSurface, bounds: Bounds) { + if (! drawBounds) { + return + } +@@ -97,14 +99,14 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + val y = -ascent + // val padding = (ascent/9).toInt() + val padding = 0 +- drawBoundsRect(canvas, RectF(x, (y - padding).toFloat(), x + bounds.width.toFloat() + padding, y + padding*2 + (bounds.height + deltaDescent).toFloat()), Color.BLUE) ++ drawBoundsRect(drawableSurface, RectF(x, (y - padding).toFloat(), x + bounds.width.toFloat() + padding, y + padding*2 + (bounds.height + deltaDescent).toFloat()), Color.BLUE) + } + +- private fun drawRenderNodes(canvas: Canvas, parent: VirtualCanvasNode) { ++ private fun drawRenderNodes(drawableSurface: DrawableSurface, parent: VirtualCanvasNode) { + when (parent) { + is VirtualContainerNode<*> -> { + parent.nodes.forEach { +- drawRenderNodes(canvas, it) ++ drawRenderNodes(drawableSurface, it) + } + } + is TextNode -> { +@@ -112,22 +114,22 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + textPaint.textSize = parent.font.size.toFloat() + val x = translateX(parent.bounds.x) + val y = translateY(parent.bounds.y) +- canvas.drawText(parent.text, x, y, textPaint) +- drawBounds(canvas, parent.bounds) ++ drawableSurface.drawText(parent.text, x, y, textPaint) ++ drawBounds(drawableSurface, parent.bounds) + } + is HorizontalLineNode -> { +- paint.color = Color.BLACK ++ paint.color = colorEquation + paint.strokeWidth = max(1.0f, parent.bounds.height.toFloat()) + val x = translateX(parent.bounds.x) + val y = translateY(parent.bounds.y) +- canvas.drawLine(x, y, x + parent.bounds.width.toFloat(), y, paint) +- drawBounds(canvas, parent.bounds) ++ drawableSurface.drawLine(x, y, x + parent.bounds.width.toFloat(), y, paint) ++ drawBounds(drawableSurface, parent.bounds) + } + is PathNode -> { + val x = translateX(parent.bounds.x) + val y = (translateY(parent.bounds.y) - parent.bounds.height).toFloat() + +- drawBounds(canvas, parent.bounds) ++ drawBounds(drawableSurface, parent.bounds) + + // TODO: support other preserve aspect ratio. + // "xMinYMin slice" +@@ -155,31 +157,32 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + mat.postTranslate(x, y) + + // TODO: more suitable handling. +- paint.color = Color.BLACK ++ paint.color = colorEquation + paint.strokeWidth = 2.0f + paint.style = Paint.Style.FILL_AND_STROKE + + val path = Path() + +- canvas.save() +- canvas.clipRect(RectF(x, y, x + wb.toFloat(), y + hb.toFloat())) ++ drawableSurface.save() ++ drawableSurface.clipRect(RectF(x, y, x + wb.toFloat(), y + hb.toFloat())) + + parent.rnode.children.forEach { + path.reset() + path.addPath(it.path, mat) +- canvas.drawPath(path, paint) ++ drawableSurface.drawPath(path, paint) + } + +- canvas.restore() ++ drawableSurface.restore() + paint.style = Paint.Style.STROKE + } ++ else -> {} + } + } + +- fun drawAllRenderNodes(canvas: Canvas) { ++ fun drawAllRenderNodes(drawableSurface: DrawableSurface) { + if (drawBounds) +- drawWholeBound(canvas, calculateWholeBounds()) +- drawRenderNodes(canvas, rootNode) ++ drawWholeBound(drawableSurface, calculateWholeBounds()) ++ drawRenderNodes(drawableSurface, rootNode) + } + + fun calculateBounds(wholeBounds: Bounds, parent: VirtualCanvasNode) { +@@ -193,6 +196,7 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + calculateBounds(wholeBounds, it) + } + } ++ else -> {} + } + } + +@@ -216,13 +220,16 @@ private class MathExpressionDrawable(expr: String, baseSize: Float, val fontLoad + } + } + ++@Suppress("UNUSED_PARAMETER") + // Similar to DynamicDrawableSpan, but getSize is a little different. +-// I create super class of DynamicDrawableSpan because getCachedDrawable is private and we neet it. +-class MathExpressionSpan(val expr: String, val baseHeight: Float, val assetManager: AssetManager, val isMathMode: Boolean) : ReplacementSpan() { ++// I created super class of DynamicDrawableSpan because getCachedDrawable is private and we neet it. ++class MathExpressionSpan(val expr: String, val baseHeight: Float, val assetManager: AssetManager, val isMathMode: Boolean, val equationColor: Int) : ReplacementSpan() { + enum class Align { + Bottom, BaseLine + } + ++ val drawableBounds: Rect by lazy { computeDrawableBounds() } ++ + var verticalAlignment = Align.Bottom + + override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int { +@@ -266,6 +273,45 @@ class MathExpressionSpan(val expr: String, val baseHeight: Float, val assetManag + return (rect.right + 0.5 + padding).roundToInt() + } + ++ private fun computeDrawableBounds(): Rect { ++ // TODO: consolidate this with the above. ++ val d = getCachedDrawable() ++ val rect = d.bounds ++ val baseBounds = Rect(rect) ++ ++ val firstBound = d.firstVListRowBound ++ if (firstBound == null) { ++ return baseBounds ++ } ++ ++ val bottom = (rect.bottom + 0.5).roundToInt() ++ ++ val ascent = (0.5 + firstBound.height * 4 / 5).toInt() ++ ++ /* ++ work around for \sum^N_i case. (#161) ++ In this case, firstBound.y becomes negative and normal acent calculation make ascent too upper. ++ I don't know how to handle this, so extend descend to try to avoid overlap for this case. ++ */ ++ val deltaDescent = (0.5 - firstBound.y).roundToInt() ++ ++ val padding = ascent / 9 ++ val descent = bottom - ascent + deltaDescent ++ ++ val fontAscent = -ascent - padding ++ val fontDescent = descent + padding ++ ++ val fontBottom = fontDescent ++ val fontTop = -ascent ++ ++ baseBounds.top = 0 ++ baseBounds.bottom = max((fontDescent - fontAscent).absoluteValue, (fontBottom - fontTop).absoluteValue) ++ ++ return baseBounds ++ ++ //return (rect.right + 0.5 + padding).roundToInt() ++ } ++ + fun ensureDrawable() { + try { + getCachedDrawable() +@@ -273,7 +319,7 @@ class MathExpressionSpan(val expr: String, val baseHeight: Float, val assetManag + Log.d("kotlitex", err.msg) + isError = true + } catch (err: NotImplementedError) { +- Log.d("kotlitex", err.message) ++ Log.d("kotlitex", err.message ?: "Not implemented") + isError = true + } + } +@@ -288,9 +334,24 @@ class MathExpressionSpan(val expr: String, val baseHeight: Float, val assetManag + y: Int, + bottom: Int, + paint: Paint ++ ) { ++ canvas.save() ++ if (!isError) { ++ canvas.translate(x, y.toFloat()) ++ } ++ draw(DirectDrawableSurface(canvas), text, x, y, paint) ++ canvas.restore() ++ } ++ ++ fun draw( ++ drawableSurface: DrawableSurface, ++ text: CharSequence?, ++ x: Float, ++ y: Int, ++ paint: Paint + ) { + if (isError) { +- canvas.drawText("ERROR", x, y.toFloat(), paint) ++ drawableSurface.drawText("ERROR", x, y.toFloat(), paint) + return + } + +@@ -298,18 +359,14 @@ class MathExpressionSpan(val expr: String, val baseHeight: Float, val assetManag + + // Log.d("kotlitex", "x=$x, y=$y, top=$top, ratio=$ratio, expr=$expr") + +- canvas.save() +- canvas.translate(x, y.toFloat()) +- b.drawAllRenderNodes(canvas) +- +- canvas.restore() ++ b.drawAllRenderNodes(drawableSurface) + } + + private fun getDrawable(): MathExpressionDrawable { + // TODO: drawBounds should be always false. Unlike baseSize, we don't have to expose the flag to end-users. + val drawable = MathExpressionDrawable( + expr, baseHeight, +- AndroidFontLoader(assetManager), isMathMode, drawBounds = false ++ AndroidFontLoader(assetManager), isMathMode, drawBounds = false, equationColor = equationColor + ) + return drawable + } +@@ -325,4 +382,24 @@ class MathExpressionSpan(val expr: String, val baseHeight: Float, val assetManag + } + + private var drawableRef: WeakReference? = null +-} ++} ++ ++interface DrawableSurface { ++ fun save() ++ fun restore() ++ fun drawText(text: String, x: Float, y: Float, paint: Paint) ++ fun clipRect(rect: RectF) ++ fun drawRect(rect: RectF, paint: Paint) ++ fun drawLine(x0: Float, y0: Float, x1: Float, y1: Float, paint: Paint) ++ fun drawPath(path: Path, paint: Paint) ++} ++ ++private class DirectDrawableSurface(private val canvas: Canvas): DrawableSurface { ++ override fun save() { canvas.save() } ++ override fun restore() { canvas.save() } ++ override fun drawText(text: String, x: Float, y: Float, paint: Paint) { canvas.drawText(text, x, y, paint) } ++ override fun clipRect(rect: RectF) { canvas.clipRect(rect) } ++ override fun drawRect(rect: RectF, paint: Paint) { canvas.drawRect(rect, paint) } ++ override fun drawLine(x0: Float, y0: Float, x1: Float, y1: Float, paint: Paint) { canvas.drawLine(x0, y0, x1, y1, paint) } ++ override fun drawPath(path: Path, paint: Paint) { canvas.drawPath(path, paint) } ++} diff --git a/third_party/versions/transitive_maven_versions.bzl b/third_party/versions/transitive_maven_versions.bzl new file mode 100644 index 00000000000..1c6004d96bd --- /dev/null +++ b/third_party/versions/transitive_maven_versions.bzl @@ -0,0 +1,156 @@ +""" +Provides the production & test transitive (i.e. indirect) dependencies needed for all of the direct +dependencies requested via direct_maven_versions.bzl. + +This file should only need to be changed when //scripts:validate_maven_dependencies indicates that +it needs to be updated. +""" + +PRODUCTION_TRANSITIVE_DEPENDENCY_VERSIONS = { + "androidx.activity:activity": "1.1.0", + "androidx.annotation:annotation-experimental": "1.0.0", + "androidx.appcompat:appcompat-resources": "1.2.0", + "androidx.arch.core:core-common": "2.1.0", + "androidx.arch.core:core-runtime": "2.1.0", + "androidx.cardview:cardview": "1.0.0", + "androidx.collection:collection": "1.1.0", + "androidx.constraintlayout:constraintlayout-solver": "2.0.1", + "androidx.coordinatorlayout:coordinatorlayout": "1.1.0", + "androidx.cursoradapter:cursoradapter": "1.0.0", + "androidx.customview:customview": "1.1.0", + "androidx.databinding:databinding-compiler-common": "3.4.2", + "androidx.documentfile:documentfile": "1.0.0", + "androidx.dynamicanimation:dynamicanimation": "1.0.0", + "androidx.fragment:fragment": "1.2.0", + "androidx.interpolator:interpolator": "1.0.0", + "androidx.legacy:legacy-support-core-utils": "1.0.0", + "androidx.lifecycle:lifecycle-common": "2.2.0", + "androidx.lifecycle:lifecycle-livedata": "2.2.0", + "androidx.lifecycle:lifecycle-livedata-core-ktx": "2.2.0", + "androidx.lifecycle:lifecycle-process": "2.2.0", + "androidx.lifecycle:lifecycle-runtime": "2.2.0", + "androidx.lifecycle:lifecycle-service": "2.2.0", + "androidx.lifecycle:lifecycle-viewmodel": "2.2.0", + "androidx.lifecycle:lifecycle-viewmodel-savedstate": "1.0.0", + "androidx.loader:loader": "1.0.0", + "androidx.localbroadcastmanager:localbroadcastmanager": "1.0.0", + "androidx.navigation:navigation-common": "2.0.0", + "androidx.navigation:navigation-runtime": "2.0.0", + "androidx.print:print": "1.0.0", + "androidx.room:room-common": "2.2.5", + "androidx.room:room-runtime": "2.2.5", + "androidx.savedstate:savedstate": "1.0.0", + "androidx.sqlite:sqlite": "2.1.0", + "androidx.sqlite:sqlite-framework": "2.1.0", + "androidx.transition:transition": "1.2.0", + "androidx.vectordrawable:vectordrawable": "1.1.0", + "androidx.vectordrawable:vectordrawable-animated": "1.1.0", + "androidx.versionedparcelable:versionedparcelable": "1.1.0", + "com.android.databinding:baseLibrary": "3.4.2", + "com.android.tools.build.jetifier:jetifier-core": "1.0.0-beta04", + "com.android.tools:annotations": "26.4.2", + "com.crashlytics.sdk.android:answers": "1.4.6", + "com.crashlytics.sdk.android:beta": "1.2.10", + "com.crashlytics.sdk.android:crashlytics-core": "2.6.7", + "com.github.bumptech.glide:annotations": "4.11.0", + "com.github.bumptech.glide:disklrucache": "4.11.0", + "com.github.bumptech.glide:gifdecoder": "4.11.0", + "com.google.android.datatransport:transport-api": "2.2.0", + "com.google.android.datatransport:transport-backend-cct": "2.3.0", + "com.google.android.datatransport:transport-runtime": "2.2.3", + "com.google.android.gms:play-services-ads-identifier": "17.0.0", + "com.google.android.gms:play-services-base": "18.0.1", + "com.google.android.gms:play-services-basement": "18.0.1", + "com.google.android.gms:play-services-measurement": "17.5.0", + "com.google.android.gms:play-services-measurement-api": "17.5.0", + "com.google.android.gms:play-services-measurement-base": "17.5.0", + "com.google.android.gms:play-services-measurement-impl": "17.5.0", + "com.google.android.gms:play-services-measurement-sdk": "17.5.0", + "com.google.android.gms:play-services-measurement-sdk-api": "17.5.0", + "com.google.android.gms:play-services-stats": "17.0.0", + "com.google.android.gms:play-services-tasks": "18.0.1", + "com.google.android.play:integrity": "1.0.1", + "com.google.android:annotations": "4.1.1.4", + "com.google.auto.service:auto-service-annotations": "1.0", + "com.google.code.findbugs:jsr305": "3.0.2", + "com.google.code.gson:gson": "2.8.9", + "com.google.devtools.ksp:symbol-processing-api": "1.5.30-1.0.0", + "com.google.errorprone:javac-shaded": "9-dev-r4023-3", + "com.google.firebase:firebase-annotations": "16.1.0", + "com.google.firebase:firebase-appcheck-interop": "16.0.0", + "com.google.firebase:firebase-auth": "19.3.1", + "com.google.firebase:firebase-auth-interop": "19.0.2", + "com.google.firebase:firebase-common-ktx": "20.1.1", + "com.google.firebase:firebase-components": "17.0.0", + "com.google.firebase:firebase-database-collection": "18.0.1", + "com.google.firebase:firebase-encoders-json": "16.1.0", + "com.google.firebase:firebase-firestore": "24.2.1", + "com.google.firebase:firebase-iid": "20.1.5", + "com.google.firebase:firebase-iid-interop": "17.0.0", + "com.google.firebase:firebase-installations": "16.3.2", + "com.google.firebase:firebase-installations-interop": "16.0.0", + "com.google.firebase:firebase-measurement-connector": "18.0.0", + "com.google.firebase:protolite-well-known-types": "18.0.0", + "com.google.googlejavaformat:google-java-format": "1.5", + "com.google.guava:guava": "31.0.1-jre", + "com.google.guava:listenablefuture": "9999.0-empty-to-avoid-conflict-with-guava", + "com.googlecode.juniversalchardet:juniversalchardet": "1.0.3", + "com.squareup.moshi:moshi": "1.13.0", + "com.squareup.okhttp:okhttp": "2.7.5", + "com.squareup.okio:okio": "2.10.0", + "com.squareup:javapoet": "1.13.0", + "com.squareup:kotlinpoet": "1.10.2", + "commons-codec:commons-codec": "1.10", + "commons-io:commons-io": "2.4", + "io.grpc:grpc-android": "1.44.1", + "io.grpc:grpc-api": "1.44.1", + "io.grpc:grpc-context": "1.44.1", + "io.grpc:grpc-core": "1.44.1", + "io.grpc:grpc-okhttp": "1.44.1", + "io.grpc:grpc-protobuf-lite": "1.44.1", + "io.grpc:grpc-stub": "1.44.1", + "io.perfmark:perfmark-api": "0.23.0", + "net.ltgt.gradle.incap:incap": "0.2", + "org.antlr:antlr4": "4.5.3", + "org.codehaus.mojo:animal-sniffer-annotations": "1.19", + "org.jetbrains.kotlin:kotlin-stdlib": "1.6.21", + "org.jetbrains.kotlin:kotlin-stdlib-common": "1.6.21", + "org.jetbrains.kotlin:kotlin-stdlib-jdk7": "1.6.21", + "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm": "1.6.4", + "org.jetbrains.kotlinx:kotlinx-metadata-jvm": "0.3.0", + "org.jetbrains:annotations": "13.0", + "org.ow2.asm:asm": "9.2", +} + +TEST_TRANSITIVE_DEPENDENCY_VERSIONS = { + "androidx.test.espresso:espresso-idling-resource": "3.2.0", + "androidx.test:monitor": "1.4.0", + "androidx.test:rules": "1.1.0", + "com.almworks.sqlite4java:sqlite4java": "1.0.392", + "com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework": "2.0", + "com.ibm.icu:icu4j": "53.1", + "com.squareup:javawriter": "2.1.1", + "net.bytebuddy:byte-buddy": "1.10.20", + "net.bytebuddy:byte-buddy-agent": "1.10.20", + "net.sf.kxml:kxml2": "2.3.0", + "org.bouncycastle:bcprov-jdk15on": "1.65", + "org.hamcrest:hamcrest-core": "1.3", + "org.hamcrest:hamcrest-integration": "1.3", + "org.hamcrest:hamcrest-library": "1.3", + "org.jetbrains.kotlin:kotlin-test": "1.6.21", + "org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm": "1.6.4", + "org.objenesis:objenesis": "3.2", + "org.ow2.asm:asm-analysis": "9.0", + "org.ow2.asm:asm-commons": "9.0", + "org.ow2.asm:asm-tree": "9.0", + "org.ow2.asm:asm-util": "9.0", + "org.robolectric:junit": "4.5", + "org.robolectric:pluginapi": "4.5", + "org.robolectric:plugins-maven-dependency-resolver": "4.5", + "org.robolectric:resources": "4.5", + "org.robolectric:sandbox": "4.5", + "org.robolectric:shadowapi": "4.5", + "org.robolectric:shadows-framework": "4.5", + "org.robolectric:utils": "4.5", + "org.robolectric:utils-reflector": "4.5", +} diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel deleted file mode 100644 index d2fea35d5a5..00000000000 --- a/tools/BUILD.bazel +++ /dev/null @@ -1,27 +0,0 @@ -""" -Custom Java/Android tools needed by the Oppia Android build pipeline. Note that many of these are -automatically set up in Gradle, or just require adding targets to 'kapt'. Bazel requires a bit more -work since kapt isn't directly supported, but Java annotation processors can be initiated using -java_plugin. -""" - -load("@rules_java//java:defs.bzl", "java_plugin") - -java_plugin( - name = "moshi_annotation_processor_plugin", - generates_api = True, - processor_class = "com.squareup.moshi.kotlin.codegen.apt.JsonClassCodegenProcessor", - visibility = ["//third_party:__pkg__"], - deps = [ - "//third_party:com_squareup_moshi_moshi-kotlin", - "//third_party:com_squareup_moshi_moshi-kotlin-codegen", - ], -) - -java_plugin( - name = "glide_compiler_plugin", - generates_api = True, - processor_class = "com.bumptech.glide.annotation.compiler.GlideAnnotationProcessor", - visibility = ["//third_party:__pkg__"], - deps = ["//third_party:com_github_bumptech_glide_compiler"], -) diff --git a/tools/kotlin/remove_processor_duplicates.patch b/tools/kotlin/remove_processor_duplicates.patch deleted file mode 100644 index ec052a8db91..00000000000 --- a/tools/kotlin/remove_processor_duplicates.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- kotlin/internal/jvm/compile.bzl -+++ kotlin/internal/jvm/compile.bzl -@@ -363,12 +363,14 @@ def _run_kt_builder_action( - annotation_processors, - map_each = _plugin_mappers.kt_plugin_to_processor, - omit_if_empty = True, -+ uniquify = True, - ) - args.add_all( - "--processorpath", - annotation_processors, - map_each = _plugin_mappers.kt_plugin_to_processorpath, - omit_if_empty = True, -+ uniquify = True, - ) - - compiler_plugins = [ diff --git a/utility/BUILD.bazel b/utility/BUILD.bazel index 40ff91d8c59..af2380cde05 100644 --- a/utility/BUILD.bazel +++ b/utility/BUILD.bazel @@ -3,30 +3,8 @@ This library contains utilities that all other modules, minus model, depend on. """ -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 -# list will automatically be excluded from the top-level utility library. It's recommended to use -# globs here to ensure new files added to migrated packages don't accidentally get included in the -# top-level module library. -MIGRATED_PROD_FILES = glob([ - "src/main/java/org/oppia/android/util/accessibility/*.kt", - "src/main/java/org/oppia/android/util/caching/*.kt", - "src/main/java/org/oppia/android/util/data/*.kt", - "src/main/java/org/oppia/android/util/datetime/*.kt", - "src/main/java/org/oppia/android/util/extensions/*.kt", - "src/main/java/org/oppia/android/util/gcsresource/*.kt", - "src/main/java/org/oppia/android/util/locale/*.kt", - "src/main/java/org/oppia/android/util/logging/*.kt", - "src/main/java/org/oppia/android/util/math/**/*.kt", - "src/main/java/org/oppia/android/util/networking/*.kt", - "src/main/java/org/oppia/android/util/profile/*.kt", - "src/main/java/org/oppia/android/util/statusbar/*.kt", - "src/main/java/org/oppia/android/util/system/*.kt", - "src/main/java/org/oppia/android/util/threading/*.kt", -]) - android_library( name = "resources", custom_package = "org.oppia.android.util", @@ -39,6 +17,7 @@ android_library( package_group( name = "utility_testing_visibility", packages = [ + "//utility", "//utility/src/test/...", ], ) @@ -55,44 +34,6 @@ android_library( ], ) -# Library for general-purpose utilities. -kt_android_library( - name = "utility", - srcs = glob( - ["src/main/java/org/oppia/android/util/**/*.kt"], - exclude = MIGRATED_PROD_FILES, - ), - visibility = ["//visibility:public"], - deps = [ - ":resources", - "//app:crashlytics", - "//app:crashlytics_deps", - "//app:firestore_deps", - "//model/src/main/proto:event_logger_java_proto_lite", - "//model/src/main/proto:platform_parameter_java_proto_lite", - "//third_party:androidx_appcompat_appcompat", - "//third_party:androidx_room_room-runtime", - "//third_party:androidx_work_work-runtime", - "//third_party:androidx_work_work-runtime-ktx", - "//third_party:com_caverock_androidsvg", - "//third_party:com_github_bumptech_glide_glide", - "//third_party:com_google_guava_guava", - "//third_party:glide_compiler", - "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", - "//utility/src/main/java/org/oppia/android/util/caching:annotations", - "//utility/src/main/java/org/oppia/android/util/caching:asset_repository", - "//utility/src/main/java/org/oppia/android/util/gcsresource:annotations", - "//utility/src/main/java/org/oppia/android/util/gcsresource:prod_module", - "//utility/src/main/java/org/oppia/android/util/locale:oppia_locale", - "//utility/src/main/java/org/oppia/android/util/logging:console_logger", - "//utility/src/main/java/org/oppia/android/util/logging:exception_logger", - "//utility/src/main/java/org/oppia/android/util/logging:prod_module", - "//utility/src/main/java/org/oppia/android/util/system:oppia_clock", - "//utility/src/main/java/org/oppia/android/util/system:prod_module", - "//utility/src/main/java/org/oppia/android/util/threading:prod_module", - ], -) - filegroup( name = "test_manifest", srcs = ["src/test/AndroidManifest.xml"], @@ -102,11 +43,8 @@ filegroup( # keep sorted TEST_DEPS = [ ":test_resources", - ":utility", "//:dagger", "//app:crashlytics", - "//app:crashlytics_deps", - "//app:firestore_deps", "//model/src/main/proto:test_models", "//testing", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", @@ -134,6 +72,7 @@ TEST_DEPS = [ "//utility/src/main/java/org/oppia/android/util/extensions:bundle_extensions", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:event_bundle_creator", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", diff --git a/utility/build.gradle b/utility/build.gradle index 487c60f8b71..1821df59ae5 100644 --- a/utility/build.gradle +++ b/utility/build.gradle @@ -78,18 +78,18 @@ android.sourceSets.test.kotlin.exclude(filesToExclude) dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation( - 'androidx.appcompat:appcompat:1.0.2', - 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-alpha03', + 'androidx.appcompat:appcompat:1.2.0', + 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0', 'androidx.work:work-runtime-ktx:2.4.0', 'com.github.oppia:androidsvg:5bc9c7553e94c3476e8ea32baea3c77567228fcd', 'com.github.oppia:kotlitex:ccdf4170817fa3b48b8e1e452772dd58ecb71cf2', 'com.github.bumptech.glide:glide:4.11.0', 'com.google.dagger:dagger:2.41', 'com.google.firebase:firebase-analytics-ktx:17.5.0', + 'com.google.firebase:firebase-auth-ktx:19.3.1', 'com.google.firebase:firebase-core:17.5.0', - 'com.google.firebase:firebase-crashlytics:17.0.0', + 'com.google.firebase:firebase-crashlytics:17.1.1', 'com.google.firebase:firebase-firestore-ktx:24.2.1', - 'com.google.firebase:firebase-auth-ktx:19.3.1', 'com.google.protobuf:protobuf-javalite:3.17.3', "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4', @@ -105,10 +105,10 @@ dependencies { 'com.google.dagger:dagger:2.41', 'com.google.truth:truth:1.1.3', 'com.google.truth.extensions:truth-liteproto-extension:1.1.3', - 'junit:junit:4.12', + 'junit:junit:4.13.2', "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version", 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4', - 'org.mockito:mockito-core:2.19.0', + 'org.mockito:mockito-core:3.9.0', 'org.robolectric:robolectric:4.5', project(":data"), project(":testing"), diff --git a/utility/src/main/java/org/oppia/android/util/logging/AnalyticsEventLogger.kt b/utility/src/main/java/org/oppia/android/util/logging/AnalyticsEventLogger.kt index 5385ca62ada..41a88ed469a 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/AnalyticsEventLogger.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/AnalyticsEventLogger.kt @@ -2,7 +2,10 @@ package org.oppia.android.util.logging import org.oppia.android.app.model.EventLog -/** Logger for uploading analytics events to remote services. */ +/** + * Logger for uploading analytics events to remote services. New instances are created using the + * implementation's [Factory]. + */ interface AnalyticsEventLogger { /** * Logs an event to remote services. @@ -10,4 +13,10 @@ interface AnalyticsEventLogger { * @param eventLog refers to the log object which contains all the relevant data to be reported */ fun logEvent(eventLog: EventLog) + + /** Application-injectable factory for creating new instances of this [AnalyticsEventLogger]. */ + interface Factory { + /** Returns a new instance of the implementation [AnalyticsEventLogger]. */ + fun create(): AnalyticsEventLogger + } } 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 0b8fc767cb7..1c76743abc9 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 @@ -78,8 +78,8 @@ kt_android_library( "//model/src/main/proto:event_logger_java_proto_lite", "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//third_party:javax_inject_javax_inject", - "//utility", "//utility/src/main/java/org/oppia/android/util/extensions:context_extensions", + "//utility/src/main/java/org/oppia/android/util/platformparameter", ], ) 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 cb3df472c2e..639b2efce1e 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 @@ -15,6 +15,7 @@ kt_android_library( ], ) +# Note that required Crashlytics dependencies are included as part of the production implementation. kt_android_library( name = "prod_impl", srcs = [ @@ -26,7 +27,10 @@ kt_android_library( "//model/src/main/proto:performance_metrics_event_logger_java_proto_lite", "//third_party:androidx_work_work-runtime", "//third_party:androidx_work_work-runtime-ktx", + "//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", "//third_party:javax_inject_javax_inject", "//utility/src/main/java/org/oppia/android/util/logging:event_bundle_creator", "//utility/src/main/java/org/oppia/android/util/logging:event_logger", @@ -45,6 +49,7 @@ kt_android_library( ], visibility = ["//:oppia_prod_module_visibility"], deps = [ + ":debug_event_logger", ":debug_module", ":firebase_exception_logger", ":firestore_logger_impl", @@ -65,6 +70,7 @@ kt_android_library( ], visibility = [ "//app:__pkg__", + "//testing:__pkg__", ], deps = [ ":prod_impl", @@ -98,7 +104,12 @@ kt_android_library( ":firestore_wrapper_impl", "//third_party:androidx_work_work-runtime", "//third_party:androidx_work_work-runtime-ktx", + "//third_party:com_google_auto_value_auto-value-annotations", + "//third_party:com_google_firebase_firebase-appcheck", + "//third_party:com_google_firebase_firebase-appcheck-debug", + "//third_party:com_google_firebase_firebase-appcheck-playintegrity", "//third_party:com_google_firebase_firebase-firestore-ktx", + "//third_party:org_checkerframework_checker-qual", "//utility/src/main/java/org/oppia/android/util/logging:console_logger", ], ) @@ -135,6 +146,7 @@ kt_android_library( "FirestoreInstance.kt", "FirestoreInstanceWrapper.kt", ], + visibility = ["//:oppia_api_visibility"], deps = [ "//third_party:com_google_firebase_firebase-firestore-ktx", "//third_party:org_jetbrains_kotlinx_kotlinx-coroutines-core", diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugAnalyticsEventLogger.kt b/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugAnalyticsEventLogger.kt index eee2fb2a910..cc162111d72 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugAnalyticsEventLogger.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugAnalyticsEventLogger.kt @@ -4,17 +4,16 @@ import org.oppia.android.app.model.EventLog import org.oppia.android.util.logging.AnalyticsEventLogger import java.util.concurrent.CopyOnWriteArrayList import javax.inject.Inject -import javax.inject.Singleton /** * A debug implementation of [AnalyticsEventLogger] used in developer-only builds of the event. * - * It forwards events to a production [AnalyticsEventLogger] for real logging, but it also records logged - * events for later retrieval (e.g. via [getEventList]). + * It forwards events to a delegated [AnalyticsEventLogger] for real or test logging, but it also + * records logged events for later retrieval (e.g. via [getEventList]). New instances of this class + * are created using its [Factory]. */ -@Singleton -class DebugAnalyticsEventLogger @Inject constructor( - factory: FirebaseAnalyticsEventLogger.Factory +class DebugAnalyticsEventLogger private constructor( + factory: AnalyticsEventLogger.Factory ) : AnalyticsEventLogger { private val realEventLogger by lazy { factory.create() } private val eventList = CopyOnWriteArrayList() @@ -26,4 +25,14 @@ class DebugAnalyticsEventLogger @Inject constructor( /** Returns the list of all [EventLog]s logged since the app opened. */ fun getEventList(): List = eventList + + /** Application-injectable factory for creating new instances of [DebugAnalyticsEventLogger]. */ + class Factory @Inject constructor() { + /** + * Returns a new [DebugAnalyticsEventLogger] that binds to a delegated logger created using + * [delegatedLoggerFactory]. + */ + fun create(delegatedLoggerFactory: AnalyticsEventLogger.Factory): DebugAnalyticsEventLogger = + DebugAnalyticsEventLogger(delegatedLoggerFactory) + } } diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugLogReportingModule.kt b/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugLogReportingModule.kt index cfcaf2b8b30..807f435e997 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugLogReportingModule.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/DebugLogReportingModule.kt @@ -1,40 +1,67 @@ package org.oppia.android.util.logging.firebase import com.google.firebase.crashlytics.FirebaseCrashlytics +import dagger.Binds +import dagger.BindsOptionalOf import dagger.Module import dagger.Provides import org.oppia.android.util.logging.AnalyticsEventLogger import org.oppia.android.util.logging.ExceptionLogger import org.oppia.android.util.logging.performancemetrics.PerformanceMetricsEventLogger +import javax.inject.Qualifier import javax.inject.Singleton /** Provides debug log reporting dependencies. */ @Module -class DebugLogReportingModule { - @Provides - @Singleton - fun provideExceptionLogger(): ExceptionLogger = - FirebaseExceptionLogger(FirebaseCrashlytics.getInstance()) - - @Provides - @Singleton - fun provideDebugEventLogger(debugAnalyticsEventLogger: DebugAnalyticsEventLogger): - AnalyticsEventLogger = debugAnalyticsEventLogger - - @Provides - @Singleton - fun providePerformanceMetricsEventLogger( - factory: FirebaseAnalyticsEventLogger.Factory - ): PerformanceMetricsEventLogger = - factory.createPerformanceMetricEventLogger() - - @Provides - @Singleton - fun provideDebugFirestoreLogger(debugFirestoreEventLogger: DebugFirestoreEventLoggerImpl): - FirestoreEventLogger = debugFirestoreEventLogger - - @Provides - @Singleton - fun provideFirebaseFirestoreInstanceWrapper(wrapperImpl: FirestoreInstanceWrapperImpl): - FirestoreInstanceWrapper = wrapperImpl +interface DebugLogReportingModule { + companion object { + @Provides + @Singleton + fun provideExceptionLogger(): ExceptionLogger = + FirebaseExceptionLogger(FirebaseCrashlytics.getInstance()) + + @Provides + @Singleton + @ImplementationEventLogger + fun provideImplementationDebugEventLogger( + debugLoggerFactory: DebugAnalyticsEventLogger.Factory, + firebaseLoggerFactory: FirebaseAnalyticsEventLogger.FactoryImpl + ): DebugAnalyticsEventLogger = debugLoggerFactory.create(firebaseLoggerFactory) + + @Provides + @Singleton + fun providePerformanceMetricsEventLogger( + factory: FirebaseAnalyticsEventLogger.FactoryImpl + ): PerformanceMetricsEventLogger = factory.createPerformanceMetricEventLogger() + + @Provides + @Singleton + fun provideDebugFirestoreLogger( + debugLogger: DebugFirestoreEventLoggerImpl + ): FirestoreEventLogger = debugLogger + + @Provides + @Singleton + fun provideFirebaseFirestoreInstanceWrapper( + impl: FirestoreInstanceWrapperImpl + ): FirestoreInstanceWrapper = impl + } + + @Binds + fun provideDebugAnalyticsEventLogger( + @ImplementationEventLogger impl: DebugAnalyticsEventLogger + ): DebugAnalyticsEventLogger + + @Binds + fun provideAnalyticsEventLogger( + @ImplementationEventLogger impl: DebugAnalyticsEventLogger + ): AnalyticsEventLogger + + @BindsOptionalOf fun bindOptionalDebugAnalyticsEventLogger(): DebugAnalyticsEventLogger + + /** + * Qualifier for this module's internal [AnalyticsEventLogger] implementation. This shouldn't be + * used outside of the module. + */ + @Qualifier annotation class ImplementationEventLogger } diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseAnalyticsEventLogger.kt b/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseAnalyticsEventLogger.kt index d227419c270..41a72018bba 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseAnalyticsEventLogger.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/FirebaseAnalyticsEventLogger.kt @@ -64,11 +64,11 @@ class FirebaseAnalyticsEventLogger private constructor( /** Application-scoped injectable factory for creating new [FirebaseAnalyticsEventLogger]s. */ @SuppressLint("MissingPermission") // This is a false warning probably due to the IJwB plugin. - class Factory @Inject constructor( + class FactoryImpl @Inject constructor( private val application: Application, private val networkConnectionUtil: NetworkConnectionUtil, private val eventBundleCreator: EventBundleCreator - ) { + ) : AnalyticsEventLogger.Factory { private val firebaseAnalytics by lazy { FirebaseAnalytics.getInstance(application) } /** @@ -79,7 +79,7 @@ class FirebaseAnalyticsEventLogger private constructor( * This [FirebaseAnalyticsEventLogger] implements the [AnalyticsEventLogger] for facilitating analytics log * reporting. */ - fun create(): AnalyticsEventLogger = + override fun create(): AnalyticsEventLogger = FirebaseAnalyticsEventLogger(firebaseAnalytics, networkConnectionUtil, eventBundleCreator) /** diff --git a/utility/src/main/java/org/oppia/android/util/logging/firebase/LogReportingModule.kt b/utility/src/main/java/org/oppia/android/util/logging/firebase/LogReportingModule.kt index 9ab74a2cbd3..c0631c47473 100644 --- a/utility/src/main/java/org/oppia/android/util/logging/firebase/LogReportingModule.kt +++ b/utility/src/main/java/org/oppia/android/util/logging/firebase/LogReportingModule.kt @@ -1,6 +1,7 @@ package org.oppia.android.util.logging.firebase import com.google.firebase.crashlytics.FirebaseCrashlytics +import dagger.BindsOptionalOf import dagger.Module import dagger.Provides import org.oppia.android.util.logging.AnalyticsEventLogger @@ -10,31 +11,37 @@ import javax.inject.Singleton /** Provides Firebase-specific logging implementations. */ @Module -class LogReportingModule { - @Provides - @Singleton - fun provideCrashLogger(): ExceptionLogger = - FirebaseExceptionLogger(FirebaseCrashlytics.getInstance()) +interface LogReportingModule { + companion object { + @Provides + @Singleton + fun provideCrashLogger(): ExceptionLogger = + FirebaseExceptionLogger(FirebaseCrashlytics.getInstance()) - @Provides - @Singleton - fun provideFirebaseAnalyticsEventLogger(factory: FirebaseAnalyticsEventLogger.Factory): - AnalyticsEventLogger = factory.create() + @Provides + @Singleton + fun provideFirebaseAnalyticsEventLogger( + factory: FirebaseAnalyticsEventLogger.FactoryImpl + ): AnalyticsEventLogger = factory.create() - @Provides - @Singleton - fun providePerformanceMetricsEventLogger( - factory: FirebaseAnalyticsEventLogger.Factory - ): PerformanceMetricsEventLogger = - factory.createPerformanceMetricEventLogger() + @Provides + @Singleton + fun providePerformanceMetricsEventLogger( + factory: FirebaseAnalyticsEventLogger.FactoryImpl + ): PerformanceMetricsEventLogger = factory.createPerformanceMetricEventLogger() - @Provides - @Singleton - fun provideFirestoreLogger(factory: FirestoreEventLoggerProdImpl): - FirestoreEventLogger = factory + @Provides + @Singleton + fun provideFirestoreLogger( + factory: FirestoreEventLoggerProdImpl + ): FirestoreEventLogger = factory - @Provides - @Singleton - fun provideFirebaseFirestoreInstanceWrapper(wrapperImpl: FirestoreInstanceWrapperImpl): - FirestoreInstanceWrapper = wrapperImpl + @Provides + @Singleton + fun provideFirebaseFirestoreInstanceWrapper( + impl: FirestoreInstanceWrapperImpl + ): FirestoreInstanceWrapper = impl + } + + @BindsOptionalOf fun bindOptionalDebugAnalyticsEventLogger(): DebugAnalyticsEventLogger } 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 fa9589510e8..ca3e7b1e621 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 @@ -52,7 +52,6 @@ kt_android_library( "//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/logging:console_logger", - "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", ], ) 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 959a1c43f69..d26a7845441 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 @@ -19,6 +19,7 @@ kt_android_library( "//utility/src/main/java/org/oppia/android/util/locale:oppia_locale", "//utility/src/main/java/org/oppia/android/util/logging:console_logger", "//utility/src/main/java/org/oppia/android/util/parser/image:url_image_parser", + "//utility/src/main/java/org/oppia/android/util/platformparameter", ], ) @@ -51,7 +52,9 @@ kt_android_library( "//app:__subpackages__", ], deps = [ - "//utility", + "//third_party:androidx_core_core", + "//utility:resources", + "//utility/src/main/java/org/oppia/android/util/locale:oppia_locale", ], ) @@ -63,9 +66,6 @@ kt_android_library( visibility = [ "//app:__subpackages__", ], - deps = [ - "//utility", - ], ) kt_android_library( 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 f70cbe826ee..bac0551f631 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 @@ -108,7 +108,7 @@ kt_android_library( "ImageParsingModule.kt", ], visibility = [ - "//:oppia_testing_visibility", + "//:oppia_prod_module_visibility", ], deps = [ ":image_parsing_annonations", @@ -136,6 +136,7 @@ kt_android_library( ], visibility = [ "//:oppia_testing_visibility", + "//utility/src/main/java/org/oppia/android/util/parser/svg:__pkg__", ], ) @@ -208,6 +209,7 @@ kt_android_library( ], visibility = [ "//:oppia_testing_visibility", + "//utility/src/main/java/org/oppia/android/util/parser/html:__pkg__", ], deps = [ ":image_loader", @@ -216,7 +218,7 @@ kt_android_library( ":text_picture_drawable", "//third_party:com_github_bumptech_glide_glide", "//third_party:javax_inject_javax_inject", - "//utility", + "//utility:resources", "//utility/src/main/java/org/oppia/android/util/logging:console_logger", "//utility/src/main/java/org/oppia/android/util/parser/html:custom_html_content_handler", "//utility/src/main/java/org/oppia/android/util/parser/svg:block_picture_drawable", diff --git a/utility/src/main/java/org/oppia/android/util/platformparameter/BUILD.bazel b/utility/src/main/java/org/oppia/android/util/platformparameter/BUILD.bazel new file mode 100644 index 00000000000..f399db778c9 --- /dev/null +++ b/utility/src/main/java/org/oppia/android/util/platformparameter/BUILD.bazel @@ -0,0 +1,20 @@ +""" +General purposes utilities to manage platform parameters. +""" + +load("@io_bazel_rules_kotlin//kotlin:android.bzl", "kt_android_library") + +kt_android_library( + name = "platformparameter", + srcs = [ + "FeatureFlagConstants.kt", + "PlatformParameterConstants.kt", + "PlatformParameterSingleton.kt", + "PlatformParameterValue.kt", + ], + visibility = ["//:oppia_api_visibility"], + deps = [ + "//model/src/main/proto:platform_parameter_java_proto_lite", + "//third_party:javax_inject_javax_inject", + ], +) 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 013c0b633ec..d97f86e72f1 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 @@ -31,7 +31,7 @@ oppia_android_test( deps = [ "//:dagger", "//model/src/main/proto:test_models", - "//testing", + "//testing:assertion_helpers", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_extensions_truth-liteproto-extension", "//third_party:com_google_truth_truth", 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 1b11bf47e94..1eeba387a0e 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 @@ -12,7 +12,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//testing/src/main/java/org/oppia/android/testing/robolectric:test_module", "//testing/src/main/java/org/oppia/android/testing/threading:test_module", "//third_party:androidx_test_ext_junit", @@ -20,6 +20,7 @@ oppia_android_test( "//third_party:org_mockito_mockito-core", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/data:async_data_subscription_manager", ], ) @@ -32,6 +33,8 @@ oppia_android_test( deps = [ "//:dagger", "//testing", + "//testing:assertion_helpers", + "//testing/src/main/java/org/oppia/android/testing/data:async_result_subject", "//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", @@ -61,6 +64,7 @@ oppia_android_test( "//third_party:com_google_truth_truth", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/data:data_providers", ], ) @@ -72,7 +76,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//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", @@ -80,5 +84,6 @@ oppia_android_test( "//third_party:com_google_truth_truth", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/data:in_memory_blocking_cache", ], ) 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 ba3f39fbc63..93b126baaf8 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 @@ -12,7 +12,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//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", @@ -72,7 +72,7 @@ oppia_android_test( deps = [ "//:dagger", "//model/src/main/proto:languages_java_proto_lite", - "//testing", + "//testing:assertion_helpers", "//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", @@ -82,7 +82,6 @@ oppia_android_test( "//third_party:junit_junit", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", - "//utility", "//utility:test_resources", "//utility/src/main/java/org/oppia/android/util/locale:impl", "//utility/src/main/java/org/oppia/android/util/locale/testing:test_module", 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 7d91ef52f46..0c522fe4cc0 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 @@ -30,7 +30,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//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/logging/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/logging/BUILD.bazel index fca189182df..46b6230e9f1 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 @@ -13,7 +13,8 @@ kt_android_library( "//testing/src/test/java/org/oppia/android/testing/logging:__pkg__", ], deps = [ - "//testing", + "//data/src/main/java/org/oppia/android/data/persistence:cache_store", + "//testing:assertion_helpers", "//testing/src/main/java/org/oppia/android/testing/data:data_provider_test_monitor", "//testing/src/main/java/org/oppia/android/testing/networking:network_connection_test_util", "//third_party:com_google_truth_truth", @@ -30,7 +31,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//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", "//third_party:androidx_test_ext_junit", @@ -51,7 +52,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", "//third_party:com_google_truth_truth", @@ -69,7 +70,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", "//third_party:com_google_truth_truth", @@ -88,7 +89,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//third_party:androidx_test_ext_junit", "//third_party:androidx_test_ext_truth", "//third_party:com_google_truth_truth", @@ -106,7 +107,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", "//third_party:org_robolectric_robolectric", 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 8980bedd68c..4869cb8ef0e 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 @@ -12,7 +12,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//:dagger", - "//testing", + "//testing:assertion_helpers", "//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", @@ -22,6 +22,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging:standard_event_logging_configuration_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_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 58eb7dfd8a0..6edb9460586 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 @@ -26,6 +26,7 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_impl", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", "//utility/src/main/java/org/oppia/android/util/networking:debug_module", @@ -49,9 +50,11 @@ oppia_android_test( "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", "//utility/src/main/java/org/oppia/android/util/locale:prod_module", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", + "//utility/src/main/java/org/oppia/android/util/system:prod_module", ], ) @@ -71,6 +74,7 @@ oppia_android_test( "//third_party:com_google_truth_truth", "//third_party:org_robolectric_robolectric", "//third_party:robolectric_android-all", + "//utility/src/main/java/org/oppia/android/util/logging:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/firebase:prod_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_assessor_module", "//utility/src/main/java/org/oppia/android/util/logging/performancemetrics:performance_metrics_configurations_module", diff --git a/utility/src/test/java/org/oppia/android/util/math/BUILD.bazel b/utility/src/test/java/org/oppia/android/util/math/BUILD.bazel index 7a59fa5612c..c5cd7b2b725 100644 --- a/utility/src/test/java/org/oppia/android/util/math/BUILD.bazel +++ b/utility/src/test/java/org/oppia/android/util/math/BUILD.bazel @@ -159,7 +159,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//model/src/main/proto:math_java_proto_lite", - "//testing", + "//testing:assertion_helpers", "//testing/src/main/java/org/oppia/android/testing/math:fraction_subject", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", @@ -178,7 +178,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//model/src/main/proto:math_java_proto_lite", - "//testing", + "//testing:assertion_helpers", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", "//third_party:junit_junit", @@ -196,7 +196,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//model/src/main/proto:math_java_proto_lite", - "//testing", + "//testing:assertion_helpers", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_junit_test_runner", "//testing/src/main/java/org/oppia/android/testing/math:polynomial_subject", @@ -295,7 +295,7 @@ oppia_android_test( test_class = "org.oppia.android.util.math.PeekableIteratorTest", test_manifest = "//utility:test_manifest", deps = [ - "//testing", + "//testing:assertion_helpers", "//third_party:androidx_test_ext_junit", "//third_party:com_google_truth_truth", "//third_party:junit_junit", @@ -350,7 +350,7 @@ oppia_android_test( test_manifest = "//utility:test_manifest", deps = [ "//model/src/main/proto:math_java_proto_lite", - "//testing", + "//testing:assertion_helpers", "//testing/src/main/java/org/oppia/android/testing/junit:oppia_parameterized_test_runner", "//testing/src/main/java/org/oppia/android/testing/junit:parameterized_junit_test_runner", "//testing/src/main/java/org/oppia/android/testing/math:real_subject", diff --git a/wiki/Updating-Maven-Dependencies.md b/wiki/Updating-Maven-Dependencies.md index 353de7a5d7c..8dac6e7568a 100644 --- a/wiki/Updating-Maven-Dependencies.md +++ b/wiki/Updating-Maven-Dependencies.md @@ -1,16 +1,50 @@ -All the third-party Maven dependencies used in Oppia-Android along with their versions are mentioned in the [versions.bzl](https://github.com/oppia/oppia-android/blob/develop/third_party/versions.bzl) file that resides in the `third_party` package. To add/delete/update any dependency in `MAVEN_PRODUCTION_DEPENDENCY_VERSIONS` or `MAVEN_TEST_DEPENDENCY_VERSIONS` dictionaries, please follow the below steps. +All third-party Maven dependencies are split between two different third-party packages: +1. One for the app build (which lives under ``//third_party``). +2. One for scripts builds (which lives under ``//scripts/third_party``). -## Updating `maven_install.json` +For each of these dependency trees, all dependencies which should be made directly available to code within the project need to be defined in either the [app's direct_maven_versions.bzl](https://github.com/oppia/oppia-android/blob/develop/third_party/versions/direct_maven_versions.bzl) or [scripts's direct_maven_versions.bzl](https://github.com/oppia/oppia-android/blob/develop/scripts/third_party/versions/direct_maven_versions.bzl). + +In each of these files, ``PRODUCTION_DEPENDENCY_VERSIONS`` should be updated for dependencies used by non-test code (like UI code for the app, or script logic for scripts). Dependencies which are only needed for automated tests or test-only scripts/builds should be added to ``TEST_DEPENDENCY_VERSIONS``. Dependencies in the app dependency tree cannot be accessed by script code, and vice versa. + +In summary, the following steps **must** be done each time a dependency is needing to be added, removed, or upgraded: +1. Update the corresponding direct_maven_versions.bzl file. +2. The dependency's corresponding ``maven_install.json`` file needs to be updated. +3. The dependency lists & its installation manifest need to be validated. +4. (App dependencies only) The catalog of tracked Maven dependencies (``maven_dependencies.textproto``) needs to be regenerated. + +## Updating `maven_install.json` files 1. Ensure that after making changes in the list of dependencies, the final list is always lexicographically sorted. -2. After updating the dependencies, run the following command. +2. After updating the dependencies, run one of the following commands: + ```sh + REPIN=1 bazel run @unpinned_maven_app//:pin + ``` + (if changing **app** dependencies) + ```sh + REPIN=1 bazel run @unpinned_maven_scripts//:pin + ``` + (if changing **scripts** dependencies) + +## Validating changed dependencies & transitive dependencies + +There's a script that can help ensure that dependencies are valid. Specifically, it checks: +- Direct dependencies are actually being referenced. +- There are no duplications between direct and _transitive_ dependencies (those are, dependencies that the app indirectly needs, i.e. the dependencies of the app's dependencies). +- All transitive dependencies are actually needed (since this list is usually automatically generated by the validation script, this should only happen if an existing dependency is removed or its version changed). +- There are no version conflicts (which indicates that the version for a dependency in Bazel doesn't match what's actually be used via Maven). + +To run the script to validate **app** dependencies, use (from within the repository root directory): +```sh +bazel run //scripts:validate_maven_dependencies -- $(pwd) third_party/versions/direct_maven_versions.bzl third_party/versions/transitive_maven_versions.bzl third_party/versions/maven_install.json //third_party //... ``` -REPIN=1 bazel run @unpinned_maven//:pin + +To run the script to validate **scripts** dependencies, use (from within the repository root directory): +```sh +bazel run //scripts:validate_maven_dependencies -- $(pwd) scripts/third_party/versions/direct_maven_versions.bzl scripts/third_party/versions/transitive_maven_versions.bzl scripts/third_party/versions/maven_install.json //scripts/third_party //scripts/... ``` ## Updating `maven_dependencies.textproto` -You will also need to run the [GenerateMavenDependenciesList.kt](https://github.com/oppia/oppia-android/blob/develop/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt) script to update the [maven_dependencies.textproto](https://github.com/oppia/oppia-android/blob/develop/scripts/assets/maven_dependencies.textproto) file. This text proto file contains the license links for all the maven third-party dependencies on which Oppia Android depends. Please make sure that before running the script, you have successfully updated [maven_install.json](https://github.com/oppia/oppia-android/blob/develop/third_party/maven_install.json) by following the above-mentioned [guide](https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies#updating-maven_installjson). -To run this script, run the following commands. +You will also need to run the [GenerateMavenDependenciesList.kt](https://github.com/oppia/oppia-android/blob/develop/scripts/src/java/org/oppia/android/scripts/maven/GenerateMavenDependenciesList.kt) script to update the [maven_dependencies.textproto](https://github.com/oppia/oppia-android/blob/develop/scripts/assets/maven_dependencies.textproto) file. This text proto file contains the license links for all the maven third-party dependencies on which Oppia Android depends. Please make sure that before running the script, you have successfully updated [maven_install.json](https://github.com/oppia/oppia-android/blob/develop/third_party/maven_install.json) by following the above-mentioned [guide](https://github.com/oppia/oppia-android/wiki/Updating-Maven-Dependencies#updating-maven_installjson). To run this script, run the following command (from within the repository root directory): ``` cd ~/opensource/oppia-android @@ -20,10 +54,10 @@ The above command ensures that the terminal points to the root directory `oppia- #### Running `GenerateMavenDependenciesList.kt` 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 +bazel run //scripts:generate_maven_dependencies_list -- $(pwd) third_party/versions/maven_install.json scripts/assets/maven_dependencies.textproto scripts/assets/maven_dependencies.pb ``` -## Handling Exception: `Too few arguments passed` +### 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` @@ -32,7 +66,7 @@ The script accepts 4 parameters to be passed to run successfully: 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` +### 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. - @@ -52,7 +86,7 @@ The first dependency that should be updated with the license: com.google.firebas Go to `maven_dependencies.textproto` and find the dependency that is mentioned as `The first dependency that should be updated with the license` in the output. For example, in the above case, look for `com.google.firebase:firebase-analytics:17.5.0` in maven_dependencies.textproto and open the `original_link` of its license in your browser and check if the link points to any valid license or not. If the link does not point to a valid license, set the 'is_original_link_invalid' field of the license to 'true'. For example, if the original_link https://www.example.com is invalid, then set `is_original_link_invalid` to true. -``` +```textproto maven_dependency { artifact_name: "artifact:name" artifact_version: "1.0" @@ -64,7 +98,7 @@ maven_dependency { } ``` -### Categorizing the license link +#### 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. @@ -75,7 +109,7 @@ If the link does point to a valid license then choose the most appropriate categ 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. - -``` +```textproto license { license_name: "The Apache Software License, Version 2.0" original_link: "https://www.apache.org/licenses/LICENSE-2.0.txt" @@ -92,12 +126,9 @@ Also, if the license falls in the `extracted_copy_link` category, then go to [Op If the license does not exist in the Oppia-android-licenses repository, then coordinate with the Oppia Android team to fix it. Then repeat the above steps to update maven_dependencies.textproto. +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` +### Handling Exception: `License links are invalid or not available for some dependencies` If the script throws `License links are invalid or not available for some dependencies` exception, then the output would look something like this: @@ -124,7 +155,7 @@ To fix the error, consider the above example. For the first maven_dependency: "i 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. - -``` +```textproto maven_dependency { artifact_name: "com.google.guava:failureaccess:1.0.1" artifact_version: "1.0.1" @@ -137,4 +168,4 @@ maven_dependency { } ``` -After updating maven_dependencies.textproto for all the called out dependencies, re-run the script. The script would pass if all the dependencies are updated successfully, and if it doesn't identify the exception being thrown and try to fix it with the help of the above-mentioned details. \ No newline at end of file +After updating maven_dependencies.textproto for all the called out dependencies, re-run the script. The script would pass if all the dependencies are updated successfully, and if it doesn't identify the exception being thrown and try to fix it with the help of the above-mentioned details.