diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..fc9077d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,96 @@ +[*] +charset = utf-8 +indent_style = space +insert_final_newline = true +max_line_length = 150 +trim_trailing_whitespace = true +ij_continuation_indent_size = 4 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = true +ij_smart_tabs = false +ij_visual_guides = 80, 120, 150 +ij_wrap_on_typing = false + +[{*.kt,*.kts}] +indent_size = 4 +tab_width = 4 +ij_kotlin_align_in_columns_case_branch = false +ij_kotlin_align_multiline_binary_operation = false +ij_kotlin_align_multiline_extends_list = false +ij_kotlin_align_multiline_method_parentheses = false +ij_kotlin_align_multiline_parameters = false +ij_kotlin_align_multiline_parameters_in_calls = false +ij_kotlin_allow_trailing_comma = true +ij_kotlin_allow_trailing_comma_on_call_site = true +ij_kotlin_assignment_wrap = normal +ij_kotlin_blank_lines_after_class_header = 0 +ij_kotlin_blank_lines_around_block_when_branches = 0 +ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1 +ij_kotlin_block_comment_add_space = false +ij_kotlin_block_comment_at_first_column = true +ij_kotlin_call_parameters_new_line_after_left_paren = true +ij_kotlin_call_parameters_right_paren_on_new_line = true +ij_kotlin_call_parameters_wrap = on_every_item +ij_kotlin_catch_on_new_line = false +ij_kotlin_class_annotation_wrap = split_into_lines +ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL +ij_kotlin_continuation_indent_for_chained_calls = false +ij_kotlin_continuation_indent_for_expression_bodies = false +ij_kotlin_continuation_indent_in_argument_lists = false +ij_kotlin_continuation_indent_in_elvis = false +ij_kotlin_continuation_indent_in_if_conditions = false +ij_kotlin_continuation_indent_in_parameter_lists = false +ij_kotlin_continuation_indent_in_supertype_lists = false +ij_kotlin_else_on_new_line = false +ij_kotlin_enum_constants_wrap = split_into_lines +ij_kotlin_extends_list_wrap = on_every_item +ij_kotlin_field_annotation_wrap = normal +ij_kotlin_finally_on_new_line = false +ij_kotlin_if_rparen_on_new_line = true +ij_kotlin_import_nested_classes = false +ij_kotlin_insert_whitespaces_in_simple_one_line_method = true +ij_kotlin_keep_blank_lines_before_right_brace = 2 +ij_kotlin_keep_blank_lines_in_code = 2 +ij_kotlin_keep_blank_lines_in_declarations = 2 +ij_kotlin_keep_first_column_comment = true +ij_kotlin_keep_indents_on_empty_lines = false +ij_kotlin_keep_line_breaks = true +ij_kotlin_lbrace_on_next_line = false +ij_kotlin_line_comment_add_space = false +ij_kotlin_line_comment_at_first_column = true +ij_kotlin_method_annotation_wrap = split_into_lines +ij_kotlin_method_call_chain_wrap = normal +ij_kotlin_method_parameters_new_line_after_left_paren = true +ij_kotlin_method_parameters_right_paren_on_new_line = true +ij_kotlin_method_parameters_wrap = on_every_item +ij_kotlin_name_count_to_use_star_import = 2147483647 +ij_kotlin_name_count_to_use_star_import_for_members = 2147483647 +ij_kotlin_parameter_annotation_wrap = off +ij_kotlin_space_after_comma = true +ij_kotlin_space_after_extend_colon = true +ij_kotlin_space_after_type_colon = true +ij_kotlin_space_before_catch_parentheses = true +ij_kotlin_space_before_comma = false +ij_kotlin_space_before_extend_colon = true +ij_kotlin_space_before_for_parentheses = true +ij_kotlin_space_before_if_parentheses = true +ij_kotlin_space_before_lambda_arrow = true +ij_kotlin_space_before_type_colon = false +ij_kotlin_space_before_when_parentheses = true +ij_kotlin_space_before_while_parentheses = true +ij_kotlin_spaces_around_additive_operators = true +ij_kotlin_spaces_around_assignment_operators = true +ij_kotlin_spaces_around_equality_operators = true +ij_kotlin_spaces_around_function_type_arrow = true +ij_kotlin_spaces_around_logical_operators = true +ij_kotlin_spaces_around_multiplicative_operators = true +ij_kotlin_spaces_around_range = false +ij_kotlin_spaces_around_relational_operators = true +ij_kotlin_spaces_around_unary_operator = false +ij_kotlin_spaces_around_when_arrow = true +ij_kotlin_variable_annotation_wrap = off +ij_kotlin_while_on_new_line = false +ij_kotlin_wrap_elvis_expressions = 1 +ij_kotlin_wrap_expression_body_functions = 1 +ij_kotlin_wrap_first_method_in_call_chain = false diff --git a/.github/ci-gradle.properties b/.github/ci-gradle.properties index 8b08787..d68167b 100644 --- a/.github/ci-gradle.properties +++ b/.github/ci-gradle.properties @@ -1,21 +1,23 @@ # -# Copyright 2022 Roberto Leinardi. +# Ubuntu Countdown Widget +# Copyright (C) 2023 Roberto Leinardi # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# This program is free software: you can redistribute it and/or modify it under the terms +# of the GNU General Public License as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later version. # -# https://www.apache.org/licenses/LICENSE-2.0 +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . # org.gradle.daemon=false org.gradle.workers.max=2 +# disable annoying Gradle Welcome in CI/CD +org.gradle.welcome=never kotlin.incremental=false kotlin.compiler.execution.strategy=in-process diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..11c6fc6 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,55 @@ +name: Build + +on: + workflow_dispatch: + +jobs: + build-release: + name: Build APKs + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + - name: Decrypt secrets + run: ./release/decrypt-secrets.sh + env: + ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }} + + ## Actual task + - name: Build + uses: gradle/gradle-build-action@v2 + env: + ORG_GRADLE_PROJECT_RELEASE_KEYSTORE_PWD: ${{ secrets.RELEASE_KEYSTORE_PWD }} + with: + arguments: assemble + + - name: Clean secrets + if: always() + run: ./release/clean-secrets.sh + + - name: Upload build outputs + uses: actions/upload-artifact@v3 + with: + name: build-outputs + path: apps/forlago/build/outputs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..6e58e5c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,385 @@ +name: CI + +on: + pull_request: + push: + branches: + - master + workflow_dispatch: + +# This allows a subsequently queued workflow run to interrupt previous runs +concurrency: + group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}' + cancel-in-progress: true + +jobs: + checks: + name: Checking manifest and deps + runs-on: ubuntu-latest + timeout-minutes: 15 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + ## Actual task + - name: Check merged manifests + uses: gradle/gradle-build-action@v2 + with: + arguments: copyMergedManifests + + - id: merged_manifests + run: echo "changed=$(git status --porcelain | wc -l)" >> $GITHUB_ENV + + - name: Check if there are changes + if: steps.merged_manifests.outputs.changed != 0 + run: | + echo '::error::Uncommitted changes to the merged manifests!' + git diff + exit 1 + + - name: Check compile dependencies report + uses: gradle/gradle-build-action@v2 + with: + arguments: generateRuntimeDependenciesReport + + - id: compile_dependencies_report + run: echo "changed=$(git status --porcelain | wc -l)" >> $GITHUB_ENV + + - name: Check if there are changes + if: steps.compile_dependencies_report.outputs.changed != 0 + run: | + echo '::error::Uncommitted changes to the compile dependencies report!' + exit 1 + + build-debug: + name: Build debug + runs-on: ubuntu-latest + timeout-minutes: 40 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + ## Actual tasks + - name: Build + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: false + arguments: assembleDebug assembleDebugAndroidTest -PsaveBuildLogToFile=true + + - name: Archiving violations report + if: ${{ always() && github.event_name == 'pull_request' }} + uses: actions/upload-artifact@v3 + with: + name: violations-build-debug + path: ./**/build/logs/buildlog*.txt + + build-release: + name: Build release + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + - name: Decrypt secrets + run: ./release/decrypt-secrets.sh + env: + ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }} + + ## Actual task + - name: Build + uses: gradle/gradle-build-action@v2 + env: + ORG_GRADLE_PROJECT_RELEASE_KEYSTORE_PWD: ${{ secrets.RELEASE_KEYSTORE_PWD }} + with: + arguments: :app:bundleRelease # analyzeReleaseBundle <- Disable due to https://github.com/spotify/ruler/issues/116 + + - name: Clean secrets + if: always() + run: ./release/clean-secrets.sh + + # Disable due to https://github.com/spotify/ruler/issues/116 + # - name: Upload Ruler report + # uses: actions/upload-artifact@v3 + # with: + # name: ruler + # path: apps/forlago/build/reports/ruler + + detekt: + name: Detekt + runs-on: ubuntu-latest + timeout-minutes: 40 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + ## Actual tasks + - name: Detekt + uses: gradle/gradle-build-action@v2 + with: + arguments: detektDebug detektTest + + - name: Archiving violations report + if: ${{ always() && github.event_name == 'pull_request' }} + uses: actions/upload-artifact@v3 + with: + name: violations-detekt + path: ./**/reports/detekt/*.xml + + spotless: + name: Spotless + runs-on: ubuntu-latest + timeout-minutes: 40 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + ## Actual tasks + - name: Spotless + uses: gradle/gradle-build-action@v2 + with: + arguments: spotlessCheck + + android-lint: + name: Android Lint + runs-on: ubuntu-latest + timeout-minutes: 40 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + ## Actual tasks + - name: Lint + uses: gradle/gradle-build-action@v2 + with: + arguments: lint + + - name: Upload Lint results + if: always() + uses: actions/upload-artifact@v3 + with: + name: android-lint-html-report + path: ./**/build/reports/lint-results-*.html + + - name: Archiving violations report + if: ${{ always() && github.event_name == 'pull_request' }} + uses: actions/upload-artifact@v3 + with: + name: violations-android-lint + path: ./**/reports/lint-results*.xml + + unit-tests: + name: Unit tests + runs-on: ubuntu-latest + timeout-minutes: 40 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + ## Actual tasks + - name: Unit tests + uses: gradle/gradle-build-action@v2 + with: + arguments: testDebugUnitTest + + - name: Archiving violations report + if: ${{ always() && github.event_name == 'pull_request' }} + uses: actions/upload-artifact@v3 + with: + name: violations-unit-tests + path: ./**/build/test-results/test*/*.xml + + publishing-violation: + name: Publishing violations to PR + if: ${{ always() && github.event_name == 'pull_request' }} + runs-on: ubuntu-latest + needs: [build-debug, detekt, android-lint, unit-tests] + timeout-minutes: 40 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + - name: Fetching build-debug result + uses: actions/download-artifact@v3 + with: + name: violations-build-debug + + - name: Fetching detekt result + uses: actions/download-artifact@v3 + with: + name: violations-detekt + + - name: Fetching android-lint result + uses: actions/download-artifact@v3 + with: + name: violations-android-lint + + # Uncomment once there are unit tests + # - name: Fetching unit-tests result + # uses: actions/download-artifact@v3 + # with: + # name: violations-unit-tests + + ## Actual tasks + - name: Publishing violation comments to PR + if: ${{ always() && github.event_name == 'pull_request' }} + uses: gradle/gradle-build-action@v2 + with: + cache-read-only: true + arguments: violationCommentsToGitHub -DGITHUB_PULLREQUESTID=${{ github.event.number }} -DGITHUB_OAUTH2TOKEN=${{ secrets.GITHUB_TOKEN }} --info diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..94ba2c7 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,132 @@ +name: Release + +on: + workflow_dispatch: + inputs: + semver: + description: 'Release Semantic Versioning (e.g. 4.15.2)' + required: true + track: + description: 'Track' + required: true + default: internal + type: choice + options: + - internal + - alpha + - beta + - production + updatePriority: + description: 'Update priority (5 for immediate, a.k.a force update)' + required: true + default: '0' + type: choice + options: + - '0' + - '1' + - '2' + - '3' + - '4' + - '5' + +jobs: + build-release: + name: Build release + runs-on: ubuntu-latest + timeout-minutes: 60 + env: + TERM: dumb + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Create release tag + uses: actions/github-script@v5 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.git.createRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: "refs/tags/${{ github.event.inputs.semver }}", + sha: context.sha + }) + + - name: Workaround to fetch the tag # Is there a better way to do it? + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup JDK + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17.0.7 + + - name: Copy CI gradle.properties + run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties + + - name: Validate gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + ## This is needed by secrets-gradle-plugin + - name: Create Local Properties File + run: touch local.properties + + - name: Decrypt secrets + run: ./release/decrypt-secrets.sh + env: + ENCRYPT_KEY: ${{ secrets.ENCRYPT_KEY }} + + ## Actual task + - name: Build + uses: gradle/gradle-build-action@v2 + env: + ORG_GRADLE_PROJECT_RELEASE_KEYSTORE_PWD: ${{ secrets.RELEASE_KEYSTORE_PWD }} + with: + arguments: :app:assembleDebug :app:assembleRelease :app:bundleRelease + + - name: Publish to Play Store + uses: gradle/gradle-build-action@v2 + env: + ORG_GRADLE_PROJECT_RELEASE_KEYSTORE_PWD: ${{ secrets.RELEASE_KEYSTORE_PWD }} + with: + arguments: :app:publishReleaseBundle --track ${{ github.event.inputs.track }} --update-priority ${{ github.event.inputs.updatePriority }} + + - name: Clean secrets + if: always() + run: ./release/clean-secrets.sh + + - name: Upload build outputs + if: always() + uses: actions/upload-artifact@v3 + with: + name: build-outputs + path: apps/forlago/build/outputs + + - name: Create GitHub release + uses: softprops/action-gh-release@v1 + with: + draft: true + tag_name: ${{ github.event.inputs.semver }} + fail_on_unmatched_files: true + files: | + apps/forlago/build/outputs/apk/debug/forlago-debug.apk + apps/forlago/build/outputs/apk/release/forlago-release.apk + apps/forlago/build/outputs/bundle/release/forlago-release.aab + apps/forlago/build/outputs/mapping/release/mapping.txt + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Delete release tag + if: ${{ failure() || cancelled() }} + uses: actions/github-script@v5 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.git.deleteRef({ + owner: context.repo.owner, + repo: context.repo.repo, + ref: "tags/${{ github.event.inputs.semver }}" + }) diff --git a/.github/workflows/ubuntu-release-date.yml b/.github/workflows/ubuntu-release-date.yml index 43100b0..d100c5e 100644 --- a/.github/workflows/ubuntu-release-date.yml +++ b/.github/workflows/ubuntu-release-date.yml @@ -18,7 +18,7 @@ permissions: # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: - group: "pages" + group: 'pages' cancel-in-progress: false jobs: diff --git a/.gitignore b/.gitignore index 3d4789d..9a7a0d9 100644 --- a/.gitignore +++ b/.gitignore @@ -69,8 +69,3 @@ fastlane/readme.md # Reports reports/ - -keystore/ -.gitmodules - -/app/fabric.properties diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 7e1238d..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -plugins { - id 'ubuntucountdownwidget.android-app-conventions' -} - -def getVersionName = { - try { - def tagName = 'git describe --abbrev=0 --tags'.execute().text.trim() - def tagHash = 'git rev-list --tags --max-count=1'.execute().text.trim() - def commitCount = Integer.parseInt(('git rev-list --count ' + tagHash + '..HEAD').execute().text.trim()) - - if (commitCount > 0) { - return String.format("%s.%d", tagName, commitCount) - } else { - return tagName - } - } - catch (ignored) { - return null - } -} -def commitCount = 'git rev-list --count HEAD'.execute().text.trim() -def isKeystoreInfoAvailable = file(KEYSTORE_PATH).exists() && file(KEYSTORE_PROPERTIES_PATH).exists() - -android { - namespace = "com.leinardi.ubuntucountdownwidget" - defaultConfig { - applicationId config.android.applicationId - archivesBaseName = "ubuntucountdownwidget" - applicationId "com.leinardi.ubuntucountdownwidget" - versionCode commitCount.isNumber() ? (commitCount as int) + 200 : 0 - versionName getVersionName() - } - - signingConfigs { - if (isKeystoreInfoAvailable) { - release { - Properties props = new Properties() - props.load(new FileInputStream(file(KEYSTORE_PROPERTIES_PATH))) - storeFile file(KEYSTORE_PATH) - storePassword props['store.password'] - keyAlias props['key.alias'] - keyPassword props['key.password'] - } - } - } - - buildTypes { - debug { - signingConfig signingConfigs.debug - applicationIdSuffix ".debug" - } - release { - shrinkResources true - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - if (isKeystoreInfoAvailable) { - signingConfig signingConfigs.release - } - } - } -} - -task updateVersionFile() { - doLast { - project.rootProject.file("version.txt").text = - "${project.android.defaultConfig.versionName}+${project.android.defaultConfig.versionCode}\n" - } -} - -preBuild.dependsOn updateVersionFile - -dependencies { - implementation "androidx.legacy:legacy-support-v4:1.0.0" - implementation libs.androidx.appcompat - implementation libs.material - implementation "androidx.preference:preference-ktx:1.2.0" - implementation "androidx.legacy:legacy-preference-v14:1.0.0" - implementation "com.github.gabrielemariotti.changeloglib:changelog:2.1.0" - implementation libs.timber -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..6b52cfd --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,150 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ +import com.github.triplet.gradle.androidpublisher.ReleaseStatus + +plugins { + id("ubuntucountdownwidget.android-app-conventions") + id("ubuntucountdownwidget.app-versioning-conventions") + alias(libs.plugins.tripletplay) + alias(libs.plugins.kotlinx.serialization) +} + +val useReleaseKeystore = rootProject.file("release/app-release.jks").exists() +println("Release keystore ${if (useReleaseKeystore) "" else "NOT "}found!") + +android { + defaultConfig { + applicationId = config.app.applicationId.get() + setProperty("archivesBaseName", "ubuntucountdownwidget") + + testInstrumentationRunner = + "androidx.test.runner.AndroidJUnitRunner" // https://github.com/google/dagger/issues/2033 + + vectorDrawables.useSupportLibrary = true + } + + signingConfigs { + getByName("debug") { + storeFile = rootProject.file("release/app-debug.jks") + storePassword = "android" + keyAlias = "androiddebugkey" + keyPassword = "android" + } + + create("release") { + if (useReleaseKeystore) { + storeFile = rootProject.file("release/app-release.jks") + storePassword = project.properties["RELEASE_KEYSTORE_PWD"] as String + keyAlias = "jd" + keyPassword = project.properties["RELEASE_KEYSTORE_PWD"] as String + } + } + } + + buildTypes { + getByName("debug") { + namespace = config.app.applicationId.get() + ".debug" + signingConfig = signingConfigs.getByName("debug") + applicationIdSuffix = ".debug" + } + + getByName("release") { + namespace = config.app.applicationId.get() + if (useReleaseKeystore) { + signingConfig = signingConfigs.getByName("release") + } else { + // Otherwise just use the debug keystore (this is mainly for PR CI builds) + signingConfig = signingConfigs.getByName("debug") + } + isProfileable = true + isShrinkResources = true + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro", + ) + } + } + kotlinOptions { + freeCompilerArgs = freeCompilerArgs + listOf( + "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi", + "-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi", + "-opt-in=androidx.compose.material.ExperimentalMaterialApi", + "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", + "-opt-in=androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi", + "-opt-in=androidx.compose.ui.ExperimentalComposeUiApi", + ) + } +} + +val serviceAccountCredentialsFile: File = rootProject.file("release/play-account.json") +if (serviceAccountCredentialsFile.exists()) { + play { + serviceAccountCredentials.set(serviceAccountCredentialsFile) + releaseStatus.set(if (track.get() == "internal") ReleaseStatus.COMPLETED else ReleaseStatus.DRAFT) + defaultToAppBundles.set(true) + } +} +println("play-account.json ${if (serviceAccountCredentialsFile.exists()) "" else "NOT "}found!") + +//tasks.register("updateVersionFile") { +// doLast { +// project.rootProject.file("version.txt").text = +// "${project.android.defaultConfig.versionName}+${project.android.defaultConfig.versionCode}\n" +// } +//} +// +//preBuild.dependsOn(updateVersionFile) + +dependencies { + implementation(libs.aboutlibraries) + implementation(libs.aboutlibraries.core) + implementation(libs.accompanist.placeholder) + implementation(libs.accompanist.systemuicontroller) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.compose.material) // Still needed for stuff missing in M3, like ModalBottomSheetLayout + implementation(libs.androidx.compose.material.icons.extended) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material3.window.size) + implementation(libs.androidx.compose.runtime) + implementation(libs.androidx.compose.runtime.livedata) + implementation(libs.androidx.compose.tooling) + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.constraintlayout.compose) + implementation(libs.androidx.core.splashscreen) + implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.glance) + implementation(libs.androidx.glance.material3) + implementation(libs.androidx.lifecycle.process) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.viewmodel) + implementation(libs.androidx.navigation.compose) + implementation(libs.androidx.paging) + implementation(libs.coil.compose) + implementation(libs.kotlinx.serialization) + implementation(libs.material) + implementation(libs.material) + implementation(libs.okhttp3.logging.interceptor) + implementation(libs.retrofit) + implementation(libs.retrofit.converter.scalars) + implementation(libs.retrofit.kotlinx.serialization) + implementation(libs.timber) + + kaptAndroidTest(libs.hilt.android.compiler) + + debugImplementation(libs.androidx.compose.tooling) +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index cea9406..b177737 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -2,7 +2,7 @@ # By default, the flags in this file are appended to flags specified # in /home/leinardi/android-studio/sdk/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. +# directive in build.gradle.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ca301e4..95f4bd1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ - - - + + android:theme="@style/Ui.Theme.UbuntuCountdownWidget"> - + - - - - - - + + + + + + + + + + - - + android:name=".appwidget.AppWidgetReceiver" + android:exported="true"> - - - - + android:resource="@xml/app_widget_info" /> - - - + + - - - - - - - - + - diff --git a/app/src/main/assets/gpl-3.0-standalone.html b/app/src/main/assets/gpl-3.0-standalone.html deleted file mode 100644 index 892a399..0000000 --- a/app/src/main/assets/gpl-3.0-standalone.html +++ /dev/null @@ -1,729 +0,0 @@ - - - - - - - - - GNU General Public License - GNU Project - Free Software Foundation (FSF) - - - -

GNU GENERAL PUBLIC LICENSE

-

Version 3, 29 June 2007

- -

Copyright © 2007 Free Software Foundation, Inc. - <http://fsf.org/>

-

- Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed.

- -

Preamble

- -

The GNU General Public License is a free, copyleft license for - software and other kinds of works.

- -

The licenses for most software and other practical works are designed - to take away your freedom to share and change the works. By contrast, - the GNU General Public License is intended to guarantee your freedom to - share and change all versions of a program--to make sure it remains free - software for all its users. We, the Free Software Foundation, use the - GNU General Public License for most of our software; it applies also to - any other work released this way by its authors. You can apply it to - your programs, too.

- -

When we speak of free software, we are referring to freedom, not - price. Our General Public Licenses are designed to make sure that you - have the freedom to distribute copies of free software (and charge for - them if you wish), that you receive source code or can get it if you - want it, that you can change the software or use pieces of it in new - free programs, and that you know you can do these things.

- -

To protect your rights, we need to prevent others from denying you - these rights or asking you to surrender the rights. Therefore, you have - certain responsibilities if you distribute copies of the software, or if - you modify it: responsibilities to respect the freedom of others.

- -

For example, if you distribute copies of such a program, whether - gratis or for a fee, you must pass on to the recipients the same - freedoms that you received. You must make sure that they, too, receive - or can get the source code. And you must show them these terms so they - know their rights.

- -

Developers that use the GNU GPL protect your rights with two steps: - (1) assert copyright on the software, and (2) offer you this License - giving you legal permission to copy, distribute and/or modify it.

- -

For the developers' and authors' protection, the GPL clearly explains - that there is no warranty for this free software. For both users' and - authors' sake, the GPL requires that modified versions be marked as - changed, so that their problems will not be attributed erroneously to - authors of previous versions.

- -

Some devices are designed to deny users access to install or run - modified versions of the software inside them, although the manufacturer - can do so. This is fundamentally incompatible with the aim of - protecting users' freedom to change the software. The systematic - pattern of such abuse occurs in the area of products for individuals to - use, which is precisely where it is most unacceptable. Therefore, we - have designed this version of the GPL to prohibit the practice for those - products. If such problems arise substantially in other domains, we - stand ready to extend this provision to those domains in future versions - of the GPL, as needed to protect the freedom of users.

- -

Finally, every program is threatened constantly by software patents. - States should not allow patents to restrict development and use of - software on general-purpose computers, but in those that do, we wish to - avoid the special danger that patents applied to a free program could - make it effectively proprietary. To prevent this, the GPL assures that - patents cannot be used to render the program non-free.

- -

The precise terms and conditions for copying, distribution and - modification follow.

- -

TERMS AND CONDITIONS

- -

0. Definitions.

- -

“This License” refers to version 3 of the GNU General Public License.

- -

“Copyright” also means copyright-like laws that apply to other kinds of - works, such as semiconductor masks.

- -

“The Program” refers to any copyrightable work licensed under this - License. Each licensee is addressed as “you”. “Licensees” and - “recipients” may be individuals or organizations.

- -

To “modify” a work means to copy from or adapt all or part of the work - in a fashion requiring copyright permission, other than the making of an - exact copy. The resulting work is called a “modified version” of the - earlier work or a work “based on” the earlier work.

- -

A “covered work” means either the unmodified Program or a work based - on the Program.

- -

To “propagate” a work means to do anything with it that, without - permission, would make you directly or secondarily liable for - infringement under applicable copyright law, except executing it on a - computer or modifying a private copy. Propagation includes copying, - distribution (with or without modification), making available to the - public, and in some countries other activities as well.

- -

To “convey” a work means any kind of propagation that enables other - parties to make or receive copies. Mere interaction with a user through - a computer network, with no transfer of a copy, is not conveying.

- -

An interactive user interface displays “Appropriate Legal Notices” - to the extent that it includes a convenient and prominently visible - feature that (1) displays an appropriate copyright notice, and (2) - tells the user that there is no warranty for the work (except to the - extent that warranties are provided), that licensees may convey the - work under this License, and how to view a copy of this License. If - the interface presents a list of user commands or options, such as a - menu, a prominent item in the list meets this criterion.

- -

1. Source Code.

- -

The “source code” for a work means the preferred form of the work - for making modifications to it. “Object code” means any non-source - form of a work.

- -

A “Standard Interface” means an interface that either is an official - standard defined by a recognized standards body, or, in the case of - interfaces specified for a particular programming language, one that - is widely used among developers working in that language.

- -

The “System Libraries” of an executable work include anything, other - than the work as a whole, that (a) is included in the normal form of - packaging a Major Component, but which is not part of that Major - Component, and (b) serves only to enable use of the work with that - Major Component, or to implement a Standard Interface for which an - implementation is available to the public in source code form. A - “Major Component”, in this context, means a major essential component - (kernel, window system, and so on) of the specific operating system - (if any) on which the executable work runs, or a compiler used to - produce the work, or an object code interpreter used to run it.

- -

The “Corresponding Source” for a work in object code form means all - the source code needed to generate, install, and (for an executable - work) run the object code and to modify the work, including scripts to - control those activities. However, it does not include the work's - System Libraries, or general-purpose tools or generally available free - programs which are used unmodified in performing those activities but - which are not part of the work. For example, Corresponding Source - includes interface definition files associated with source files for - the work, and the source code for shared libraries and dynamically - linked subprograms that the work is specifically designed to require, - such as by intimate data communication or control flow between those - subprograms and other parts of the work.

- -

The Corresponding Source need not include anything that users - can regenerate automatically from other parts of the Corresponding - Source.

- -

The Corresponding Source for a work in source code form is that - same work.

- -

2. Basic Permissions.

- -

All rights granted under this License are granted for the term of - copyright on the Program, and are irrevocable provided the stated - conditions are met. This License explicitly affirms your unlimited - permission to run the unmodified Program. The output from running a - covered work is covered by this License only if the output, given its - content, constitutes a covered work. This License acknowledges your - rights of fair use or other equivalent, as provided by copyright law.

- -

You may make, run and propagate covered works that you do not - convey, without conditions so long as your license otherwise remains - in force. You may convey covered works to others for the sole purpose - of having them make modifications exclusively for you, or provide you - with facilities for running those works, provided that you comply with - the terms of this License in conveying all material for which you do - not control copyright. Those thus making or running the covered works - for you must do so exclusively on your behalf, under your direction - and control, on terms that prohibit them from making any copies of - your copyrighted material outside their relationship with you.

- -

Conveying under any other circumstances is permitted solely under - the conditions stated below. Sublicensing is not allowed; section 10 - makes it unnecessary.

- -

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

- -

No covered work shall be deemed part of an effective technological - measure under any applicable law fulfilling obligations under article - 11 of the WIPO copyright treaty adopted on 20 December 1996, or - similar laws prohibiting or restricting circumvention of such - measures.

- -

When you convey a covered work, you waive any legal power to forbid - circumvention of technological measures to the extent such circumvention - is effected by exercising rights under this License with respect to - the covered work, and you disclaim any intention to limit operation or - modification of the work as a means of enforcing, against the work's - users, your or third parties' legal rights to forbid circumvention of - technological measures.

- -

4. Conveying Verbatim Copies.

- -

You may convey verbatim copies of the Program's source code as you - receive it, in any medium, provided that you conspicuously and - appropriately publish on each copy an appropriate copyright notice; - keep intact all notices stating that this License and any - non-permissive terms added in accord with section 7 apply to the code; - keep intact all notices of the absence of any warranty; and give all - recipients a copy of this License along with the Program.

- -

You may charge any price or no price for each copy that you convey, - and you may offer support or warranty protection for a fee.

- -

5. Conveying Modified Source Versions.

- -

You may convey a work based on the Program, or the modifications to - produce it from the Program, in the form of source code under the - terms of section 4, provided that you also meet all of these conditions:

- -
    -
  • a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. -
  • - -
  • b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - “keep intact all notices”. -
  • - -
  • c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. -
  • - -
  • d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. -
  • -
- -

A compilation of a covered work with other separate and independent - works, which are not by their nature extensions of the covered work, - and which are not combined with it such as to form a larger program, - in or on a volume of a storage or distribution medium, is called an - “aggregate” if the compilation and its resulting copyright are not - used to limit the access or legal rights of the compilation's users - beyond what the individual works permit. Inclusion of a covered work - in an aggregate does not cause this License to apply to the other - parts of the aggregate.

- -

6. Conveying Non-Source Forms.

- -

You may convey a covered work in object code form under the terms - of sections 4 and 5, provided that you also convey the - machine-readable Corresponding Source under the terms of this License, - in one of these ways:

- -
    -
  • a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. -
  • - -
  • b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. -
  • - -
  • c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. -
  • - -
  • d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. -
  • - -
  • e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. -
  • -
- -

A separable portion of the object code, whose source code is excluded - from the Corresponding Source as a System Library, need not be - included in conveying the object code work.

- -

A “User Product” is either (1) a “consumer product”, which means any - tangible personal property which is normally used for personal, family, - or household purposes, or (2) anything designed or sold for incorporation - into a dwelling. In determining whether a product is a consumer product, - doubtful cases shall be resolved in favor of coverage. For a particular - product received by a particular user, “normally used” refers to a - typical or common use of that class of product, regardless of the status - of the particular user or of the way in which the particular user - actually uses, or expects or is expected to use, the product. A product - is a consumer product regardless of whether the product has substantial - commercial, industrial or non-consumer uses, unless such uses represent - the only significant mode of use of the product.

- -

“Installation Information” for a User Product means any methods, - procedures, authorization keys, or other information required to install - and execute modified versions of a covered work in that User Product from - a modified version of its Corresponding Source. The information must - suffice to ensure that the continued functioning of the modified object - code is in no case prevented or interfered with solely because - modification has been made.

- -

If you convey an object code work under this section in, or with, or - specifically for use in, a User Product, and the conveying occurs as - part of a transaction in which the right of possession and use of the - User Product is transferred to the recipient in perpetuity or for a - fixed term (regardless of how the transaction is characterized), the - Corresponding Source conveyed under this section must be accompanied - by the Installation Information. But this requirement does not apply - if neither you nor any third party retains the ability to install - modified object code on the User Product (for example, the work has - been installed in ROM).

- -

The requirement to provide Installation Information does not include a - requirement to continue to provide support service, warranty, or updates - for a work that has been modified or installed by the recipient, or for - the User Product in which it has been modified or installed. Access to a - network may be denied when the modification itself materially and - adversely affects the operation of the network or violates the rules and - protocols for communication across the network.

- -

Corresponding Source conveyed, and Installation Information provided, - in accord with this section must be in a format that is publicly - documented (and with an implementation available to the public in - source code form), and must require no special password or key for - unpacking, reading or copying.

- -

7. Additional Terms.

- -

“Additional permissions” are terms that supplement the terms of this - License by making exceptions from one or more of its conditions. - Additional permissions that are applicable to the entire Program shall - be treated as though they were included in this License, to the extent - that they are valid under applicable law. If additional permissions - apply only to part of the Program, that part may be used separately - under those permissions, but the entire Program remains governed by - this License without regard to the additional permissions.

- -

When you convey a copy of a covered work, you may at your option - remove any additional permissions from that copy, or from any part of - it. (Additional permissions may be written to require their own - removal in certain cases when you modify the work.) You may place - additional permissions on material, added by you to a covered work, - for which you have or can give appropriate copyright permission.

- -

Notwithstanding any other provision of this License, for material you - add to a covered work, you may (if authorized by the copyright holders of - that material) supplement the terms of this License with terms:

- -
    -
  • a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or -
  • - -
  • b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or -
  • - -
  • c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or -
  • - -
  • d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or -
  • - -
  • e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or -
  • - -
  • f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. -
  • -
- -

All other non-permissive additional terms are considered “further - restrictions” within the meaning of section 10. If the Program as you - received it, or any part of it, contains a notice stating that it is - governed by this License along with a term that is a further - restriction, you may remove that term. If a license document contains - a further restriction but permits relicensing or conveying under this - License, you may add to a covered work material governed by the terms - of that license document, provided that the further restriction does - not survive such relicensing or conveying.

- -

If you add terms to a covered work in accord with this section, you - must place, in the relevant source files, a statement of the - additional terms that apply to those files, or a notice indicating - where to find the applicable terms.

- -

Additional terms, permissive or non-permissive, may be stated in the - form of a separately written license, or stated as exceptions; - the above requirements apply either way.

- -

8. Termination.

- -

You may not propagate or modify a covered work except as expressly - provided under this License. Any attempt otherwise to propagate or - modify it is void, and will automatically terminate your rights under - this License (including any patent licenses granted under the third - paragraph of section 11).

- -

However, if you cease all violation of this License, then your - license from a particular copyright holder is reinstated (a) - provisionally, unless and until the copyright holder explicitly and - finally terminates your license, and (b) permanently, if the copyright - holder fails to notify you of the violation by some reasonable means - prior to 60 days after the cessation.

- -

Moreover, your license from a particular copyright holder is - reinstated permanently if the copyright holder notifies you of the - violation by some reasonable means, this is the first time you have - received notice of violation of this License (for any work) from that - copyright holder, and you cure the violation prior to 30 days after - your receipt of the notice.

- -

Termination of your rights under this section does not terminate the - licenses of parties who have received copies or rights from you under - this License. If your rights have been terminated and not permanently - reinstated, you do not qualify to receive new licenses for the same - material under section 10.

- -

9. Acceptance Not Required for Having Copies.

- -

You are not required to accept this License in order to receive or - run a copy of the Program. Ancillary propagation of a covered work - occurring solely as a consequence of using peer-to-peer transmission - to receive a copy likewise does not require acceptance. However, - nothing other than this License grants you permission to propagate or - modify any covered work. These actions infringe copyright if you do - not accept this License. Therefore, by modifying or propagating a - covered work, you indicate your acceptance of this License to do so.

- -

10. Automatic Licensing of Downstream Recipients.

- -

Each time you convey a covered work, the recipient automatically - receives a license from the original licensors, to run, modify and - propagate that work, subject to this License. You are not responsible - for enforcing compliance by third parties with this License.

- -

An “entity transaction” is a transaction transferring control of an - organization, or substantially all assets of one, or subdividing an - organization, or merging organizations. If propagation of a covered - work results from an entity transaction, each party to that - transaction who receives a copy of the work also receives whatever - licenses to the work the party's predecessor in interest had or could - give under the previous paragraph, plus a right to possession of the - Corresponding Source of the work from the predecessor in interest, if - the predecessor has it or can get it with reasonable efforts.

- -

You may not impose any further restrictions on the exercise of the - rights granted or affirmed under this License. For example, you may - not impose a license fee, royalty, or other charge for exercise of - rights granted under this License, and you may not initiate litigation - (including a cross-claim or counterclaim in a lawsuit) alleging that - any patent claim is infringed by making, using, selling, offering for - sale, or importing the Program or any portion of it.

- -

11. Patents.

- -

A “contributor” is a copyright holder who authorizes use under this - License of the Program or a work on which the Program is based. The - work thus licensed is called the contributor's “contributor version”.

- -

A contributor's “essential patent claims” are all patent claims - owned or controlled by the contributor, whether already acquired or - hereafter acquired, that would be infringed by some manner, permitted - by this License, of making, using, or selling its contributor version, - but do not include claims that would be infringed only as a - consequence of further modification of the contributor version. For - purposes of this definition, “control” includes the right to grant - patent sublicenses in a manner consistent with the requirements of - this License.

- -

Each contributor grants you a non-exclusive, worldwide, royalty-free - patent license under the contributor's essential patent claims, to - make, use, sell, offer for sale, import and otherwise run, modify and - propagate the contents of its contributor version.

- -

In the following three paragraphs, a “patent license” is any express - agreement or commitment, however denominated, not to enforce a patent - (such as an express permission to practice a patent or covenant not to - sue for patent infringement). To “grant” such a patent license to a - party means to make such an agreement or commitment not to enforce a - patent against the party.

- -

If you convey a covered work, knowingly relying on a patent license, - and the Corresponding Source of the work is not available for anyone - to copy, free of charge and under the terms of this License, through a - publicly available network server or other readily accessible means, - then you must either (1) cause the Corresponding Source to be so - available, or (2) arrange to deprive yourself of the benefit of the - patent license for this particular work, or (3) arrange, in a manner - consistent with the requirements of this License, to extend the patent - license to downstream recipients. “Knowingly relying” means you have - actual knowledge that, but for the patent license, your conveying the - covered work in a country, or your recipient's use of the covered work - in a country, would infringe one or more identifiable patents in that - country that you have reason to believe are valid.

- -

If, pursuant to or in connection with a single transaction or - arrangement, you convey, or propagate by procuring conveyance of, a - covered work, and grant a patent license to some of the parties - receiving the covered work authorizing them to use, propagate, modify - or convey a specific copy of the covered work, then the patent license - you grant is automatically extended to all recipients of the covered - work and works based on it.

- -

A patent license is “discriminatory” if it does not include within - the scope of its coverage, prohibits the exercise of, or is - conditioned on the non-exercise of one or more of the rights that are - specifically granted under this License. You may not convey a covered - work if you are a party to an arrangement with a third party that is - in the business of distributing software, under which you make payment - to the third party based on the extent of your activity of conveying - the work, and under which the third party grants, to any of the - parties who would receive the covered work from you, a discriminatory - patent license (a) in connection with copies of the covered work - conveyed by you (or copies made from those copies), or (b) primarily - for and in connection with specific products or compilations that - contain the covered work, unless you entered into that arrangement, - or that patent license was granted, prior to 28 March 2007.

- -

Nothing in this License shall be construed as excluding or limiting - any implied license or other defenses to infringement that may - otherwise be available to you under applicable patent law.

- -

12. No Surrender of Others' Freedom.

- -

If conditions are imposed on you (whether by court order, agreement or - otherwise) that contradict the conditions of this License, they do not - excuse you from the conditions of this License. If you cannot convey a - covered work so as to satisfy simultaneously your obligations under this - License and any other pertinent obligations, then as a consequence you may - not convey it at all. For example, if you agree to terms that obligate you - to collect a royalty for further conveying from those to whom you convey - the Program, the only way you could satisfy both those terms and this - License would be to refrain entirely from conveying the Program.

- -

13. Use with the GNU Affero General Public License.

- -

Notwithstanding any other provision of this License, you have - permission to link or combine any covered work with a work licensed - under version 3 of the GNU Affero General Public License into a single - combined work, and to convey the resulting work. The terms of this - License will continue to apply to the part which is the covered work, - but the special requirements of the GNU Affero General Public License, - section 13, concerning interaction through a network will apply to the - combination as such.

- -

14. Revised Versions of this License.

- -

The Free Software Foundation may publish revised and/or new versions of - the GNU General Public License from time to time. Such new versions will - be similar in spirit to the present version, but may differ in detail to - address new problems or concerns.

- -

Each version is given a distinguishing version number. If the - Program specifies that a certain numbered version of the GNU General - Public License “or any later version” applies to it, you have the - option of following the terms and conditions either of that numbered - version or of any later version published by the Free Software - Foundation. If the Program does not specify a version number of the - GNU General Public License, you may choose any version ever published - by the Free Software Foundation.

- -

If the Program specifies that a proxy can decide which future - versions of the GNU General Public License can be used, that proxy's - public statement of acceptance of a version permanently authorizes you - to choose that version for the Program.

- -

Later license versions may give you additional or different - permissions. However, no additional obligations are imposed on any - author or copyright holder as a result of your choosing to follow a - later version.

- -

15. Disclaimer of Warranty.

- -

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY - APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY - OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM - IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF - ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

- -

16. Limitation of Liability.

- -

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING - WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS - THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY - GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE - USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF - DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD - PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), - EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF - SUCH DAMAGES.

- -

17. Interpretation of Sections 15 and 16.

- -

If the disclaimer of warranty and limitation of liability provided - above cannot be given local legal effect according to their terms, - reviewing courts shall apply local law that most closely approximates - an absolute waiver of all civil liability in connection with the - Program, unless a warranty or assumption of liability accompanies a - copy of the Program in return for a fee.

- -

END OF TERMS AND CONDITIONS

- -

How to Apply These Terms to Your New Programs

- -

If you develop a new program, and you want it to be of the greatest - possible use to the public, the best way to achieve this is to make it - free software which everyone can redistribute and change under these terms.

- -

To do so, attach the following notices to the program. It is safest - to attach them to the start of each source file to most effectively - state the exclusion of warranty; and each file should have at least - the “copyright” line and a pointer to where the full notice is found.

- -
    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
- -

Also add information on how to contact you by electronic and paper mail.

- -

If the program does terminal interaction, make it output a short - notice like this when it starts in an interactive mode:

- -
    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
- -

The hypothetical commands `show w' and `show c' should show the appropriate - parts of the General Public License. Of course, your program's commands - might be different; for a GUI interface, you would use an “about box”.

- -

You should also get your employer (if you work as a programmer) or school, - if any, to sign a “copyright disclaimer” for the program, if necessary. - For more information on this, and how to apply and follow the GNU GPL, see - <http://www.gnu.org/licenses/>.

- -

The GNU General Public License does not permit incorporating your program - into proprietary programs. If your program is a subroutine library, you - may consider it more useful to permit linking proprietary applications with - the library. If this is what you want to do, use the GNU Lesser General - Public License instead of this License. But first, please read - <http://www.gnu.org/philosophy/why-not-lgpl.html>. -

- - - diff --git a/app/src/main/assets/info-es.html b/app/src/main/assets/info-es.html deleted file mode 100644 index ab018d3..0000000 --- a/app/src/main/assets/info-es.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - -

FAQ

- -

Ubuntu Countdown Widget no aparece en la lista de widgets, pero la configuración funciona!

-Tu probablemente moviste la aplicación a la SD: todos los widgets DEBEN estar instalados en la -memoria interna. - -

El widget no disminuye los días faltantes, cambia después de media noche!

-El widget disminuye los dias faltantes usando el uso horario GMT+0, entonces puede haber existir una -diferencia de 12 horas desde media noche a tu uso horario. Si el día del lanzamiento coincide con el -horario de verano, puede haber una hora más de diferencia. - -

¿Cómo puedo añadir widgets a la pantalla?

-Añadir el widget de Ubuntu Countdown a tu escrotiro de Android es muy fácil! Basta seguir las -instrucciones a continuación: -
    -
  1. En tu escritorio de la pantalla de Android presiona la tecla MENU - and selecciona "Añadir" o, alternativamente, pulsa - en algún área en blanco/vacía y manten presionado tu dedo. -
  2. -
  3. En "Añadir a tu escritorio" saldrá un pop up. En esta ventana, pulsar "Widgets". -
  4. -
  5. Seleccionar uno de los dos "Ubuntu Countdown Widgets". -
  6. -
-

Reconocimientos

- -
I would like to thank all of those who directly or indirectly contributed to the creation of - this software. -
-

-
-
En particular, Gracias a:
-
-
    -
  • Martín Césare por crear el apartado gráfico. -
  • -
  • Canonical por crear esta maravillosa - distribución de GNU/Linux. -
  • -
  • Mazoyer por la traducción a Francés.
  • -
  • Monino por la traducción a Español.
  • -
  • Igor por la traducción a Italiano.
  • -
-
- - diff --git a/app/src/main/assets/info-it.html b/app/src/main/assets/info-it.html deleted file mode 100644 index 26c33a5..0000000 --- a/app/src/main/assets/info-it.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - -

FAQ

- -

Ubuntu Countdown Widget non appare nella lista dei widget, ma l'icona delle impostazioni - funziona!

-Probabilmente hai spostato l'applicazione sulla SD: tutti i widget DEVONO essere installati sulla -memoria interna. - -

Il widget non scala i giorni rimanenti/li cambia ore dopo la mezzanotte!

-UCW scala i giorni rimanenti utilizzando il fuso orario GMT+0, possono quindi esserci fino a 12 ore -di differenza rispetto alla mezzanotte del tuo fuso orario. Se il giorno di rilascio è in un -daylight time differente potrebbe esserci un'uleriore ora di differenza. - -

Come posso aggiungere un widget alla schermata Home?

-Aggiungere Ubuntu Countdown Widget alla tua schermata Home di Android è facile! Segui semplicemente -le istruzioni sottostanti: -
    -
  1. All'interno della schermata Home di Android premi il tasto MENU - e seleziona "Aggiungi" o, in alternativa, tieni - premuto il dito su un'area vuota della Home. -
  2. -
  3. Una finestra "Aggiungi a schermata Home" dovrebbe comparire. In questa finestra, premi "Widgets". -
  4. -
  5. Seleziona uno dei due "Ubuntu Countdown Widget". -
  6. -
-

Ringraziamenti

- -
Vorrei ringraziare tutti quelli che hanno direttamente o indirettamente contribuito alla - realizzazione di questa applicazione. -
-

-
-
In particolare grazie a:
-
-
    -
  • Martín Césare per aver creato tutti gli - elementi grafici del Widget. -
  • -
  • Canonical per aver creato questa favolosa - distribuzione GNU/Linux. -
  • -
  • Mazoyer per la traduzione in Francese.
  • -
  • Monino per la traduzione in Spagnolo.
  • -
  • Igor per la traduzione in Italiano.
  • -
-
- - diff --git a/app/src/main/assets/info-ptbr.html b/app/src/main/assets/info-ptbr.html deleted file mode 100644 index 2f4c5af..0000000 --- a/app/src/main/assets/info-ptbr.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - -

FAQ

- -

Ubuntu Countdown Widget não aparece na lista dos Widgets, mas as configurações estão - funcionando!

-Você provavelmente colocou o App no SD: todos os Widgets DEVEM ser instalados na memória interna. - -

O Widget não diminuiu os dias que restavam/alterou os dias mais cedo ou mais tarde!

-O Widget diminui os dias restantes usando o fuso horário GMT+0, aí pode haver até 12 horas da -diferença a partir da meia-noite do seu fuso horário. Se o dia do lançamento for num horário de dia -diferente, poderá ter mais de uma hora de diferença. - -

Como posso adicionar o Widgets à tela inicial?

-Adicionar o Ubuntu Countdown Widget à sua tela inicial no Android é fácil! Basta seguir as -instruções abaixo: -
    -
  1. Na sua tela inicial no Android clique no botão de MENU and - selecione "Adicionar" ou, alternativamente, use - clique longo em qualquer área livre na tela. -
  2. -
  3. Uma opção "Adicionar à tela inicial" irá aparecer. Dessa opção,escolha "Widgets". -
  4. -
  5. Selecione um dos dois "Ubuntu Countdown Widgets". -
  6. -
-

Agradecimentos

- -
Gostaria de agradecer a todos aqueles que contribuíram direta ou indiretamente ao - desenvolvimento deste software. -
-

-
-
Em particular, agradecimentos a:
-
-
    -
  • Martín Césare por criar toda a gráfica de - software. -
  • -
  • Canonical por criar este maravilhoso distro - GNU/Linux. -
  • -
  • Mazoyer pela tradução em francês.
  • -
  • Monino pela tradução em espanhol.
  • -
  • Igor pela tradução em italiano.
  • -
  • mezysinc pela tradução em português do Brasil.
  • -
-
- - diff --git a/app/src/main/assets/info.html b/app/src/main/assets/info.html deleted file mode 100644 index 9e434dd..0000000 --- a/app/src/main/assets/info.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - -

FAQ

- -

Ubuntu Countdown Widget does not appear in widget list, but the settings are working!

-You probably moved the application on SD: all widgets MUST be installed on internal memory. - -

The widget didn't decrease days left/it changed days hours earlier or later!

-The widget decrease days left using GMT+0 time zone, then there can be up to 12 hours of difference -from the midnight of your time zone. If the day of release is in a different daylight time there may -be another hour of difference. - -

How can I add widgets to the Home screen?

-Adding the Ubuntu Countdown Widget to your Android Home screen is easy! Just follow the instructions -below: -
    -
  1. On your Android Home screen press the MENU key and - select "Add" or, alternatively, tap any blank/empty - area and hold down your finger. -
  2. -
  3. An "Add to Home screen" window will pop up. From that window, tap "Widgets". -
  4. -
  5. Select one of the two "Ubuntu Countdown Widgets". -
  6. -
-

Acknowledgements

- -
I would like to thank all of those who directly or indirectly contributed to the creation of - this software. -
-

-
-
In particular, thanks to:
-
-
    -
  • Martín Césare for creating all the software - graphics. -
  • -
  • Canonical for creating this wonderful GNU/Linux - distribution. -
  • -
  • Mazoyer for the French translation.
  • -
  • Monino for the Spanish translation.
  • -
  • Igor for the Italian translation.
  • -
  • mezysinc for the Brazilian translation.
  • -
-
- - diff --git a/app/src/main/assets/licenses.html b/app/src/main/assets/licenses.html deleted file mode 100644 index af86374..0000000 --- a/app/src/main/assets/licenses.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - -

Notices for files:

- -
-Copyright (C) 2015 Roberto Leinardi
-
-This program is free software: you can redistribute it and/or modify it under the terms
-of the GNU General Public License as published by the Free Software Foundation,
-either version 3 of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with this
-program.  If not, see http://www.gnu.org/licenses/.
- -

Notices for files:

- -
-Copyright 2013 Gabriele Mariotti
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- - - diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/UbuntuCountdownWidget.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/UbuntuCountdownWidget.kt new file mode 100644 index 0000000..ed0960d --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/UbuntuCountdownWidget.kt @@ -0,0 +1,67 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget + +import android.app.Application +import android.os.Build +import android.os.StrictMode +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class UbuntuCountdownWidget : Application() { + override fun onCreate() { + super.onCreate() + configureStrictMode() + } + + private fun configureStrictMode() { + // This can't be initialized using `androidx.startup.Initializer` or it will cause crashes in 3rd party libs using Content Providers + // and writing data on the main thread (e.g. LeakCanary and AndroidTestRunner). + if (BuildConfig.DEBUG) { + val builderThread = StrictMode.ThreadPolicy.Builder() + .detectAll() + .permitDiskReads() + .permitCustomSlowCalls() + .penaltyLog() + .penaltyDeath() + .detectResourceMismatches() + StrictMode.setThreadPolicy(builderThread.build()) + + val builderVM = StrictMode.VmPolicy.Builder() + .detectActivityLeaks() + .detectLeakedSqlLiteObjects() + .detectLeakedRegistrationObjects() + .detectFileUriExposure() + .penaltyLog() + .penaltyDeath() + .detectCleartextNetwork() + .detectContentUriWithoutPermission() + // .detectUntaggedSockets() // https://github.com/square/okhttp/issues/3537#issuecomment-974861679 + .apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + detectCredentialProtectedWhileLocked() + detectImplicitDirectBoot() + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + detectIncorrectContextUse() + detectUnsafeIntentLaunch() + } + } + StrictMode.setVmPolicy(builderVM.build()) + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/api/RestApi.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/api/RestApi.kt new file mode 100644 index 0000000..c83891d --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/api/RestApi.kt @@ -0,0 +1,30 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.api + +import com.leinardi.ubuntucountdownwidget.model.ReleaseDateResponse +import retrofit2.Response +import retrofit2.http.GET + +interface RestApi { + @GET("$BASE_PATH/releaseDate.json") + suspend fun getReleaseDate(): Response + + companion object { + private const val BASE_PATH = "/UbuntuCountdownWidget" + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/Widget2x2Provider.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidget.kt similarity index 51% rename from app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/Widget2x2Provider.kt rename to app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidget.kt index ffc95cd..86d703b 100644 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/Widget2x2Provider.kt +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidget.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -14,20 +14,26 @@ * program. If not, see . */ -package com.leinardi.ubuntucountdownwidget.appwidgets +package com.leinardi.ubuntucountdownwidget.appwidget -import android.content.ComponentName import android.content.Context -import android.widget.RemoteViews -import com.leinardi.ubuntucountdownwidget.R +import androidx.glance.GlanceId +import androidx.glance.appwidget.GlanceAppWidget +import androidx.glance.appwidget.SizeMode +import androidx.glance.appwidget.provideContent +import com.leinardi.ubuntucountdownwidget.ui.appwidget.AppWidgetContent +import timber.log.Timber -class Widget2x2Provider : WidgetProvider() { - override fun getComponentName(context: Context): ComponentName = - ComponentName(context, Widget2x2Provider::class.java) +class AppWidget : GlanceAppWidget() { + override val sizeMode = SizeMode.Exact - override fun getRemoteViews(context: Context, isThemeDark: Boolean): RemoteViews = - RemoteViews( - context.packageName, - if (isThemeDark) R.layout.appwidget_2x2_dark else R.layout.appwidget_2x2_light, - ) + override val stateDefinition = AppWidgetStateDefinition + + override suspend fun provideGlance(context: Context, id: GlanceId) { + Timber.d("provideGlance") + + provideContent { + AppWidgetContent() + } + } } diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetReceiver.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetReceiver.kt new file mode 100644 index 0000000..37a0d27 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetReceiver.kt @@ -0,0 +1,111 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.appwidget + +import android.app.AlarmManager +import android.app.PendingIntent +import android.appwidget.AppWidgetManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import androidx.core.content.getSystemService +import androidx.glance.appwidget.GlanceAppWidget +import androidx.glance.appwidget.GlanceAppWidgetManager +import androidx.glance.appwidget.GlanceAppWidgetReceiver +import androidx.glance.appwidget.state.updateAppWidgetState +import com.leinardi.ubuntucountdownwidget.di.AppEntryPoints +import dagger.hilt.EntryPoints +import kotlinx.coroutines.runBlocking +import timber.log.Timber +import java.time.LocalDate +import java.time.LocalTime +import java.time.ZoneId + +class AppWidgetReceiver : GlanceAppWidgetReceiver() { + override val glanceAppWidget: GlanceAppWidget = AppWidget() + + override fun onReceive(context: Context, intent: Intent) { + Timber.i("Widget action: ${intent.action}") + super.onReceive(context, intent) + } + + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + appWidgetIds.forEach { appWidgetId -> + runBlocking { + updateAppWidgetState(context, AppWidgetStateDefinition, GlanceAppWidgetManager(context).getGlanceIdBy(appWidgetId)) { + EntryPoints + .get(context.applicationContext, AppEntryPoints.AppInterface::class.java) + .getAppWidgetStateProvider() + .get(appWidgetId) + } + } + } + super.onUpdate(context, appWidgetManager, appWidgetIds) + scheduleWidgetUpdate(context) + } + + private fun scheduleWidgetUpdate(context: Context) { + // Set an alarm to update widgets every x mins if the device is awake. + // Use one-shot alarm as repeating alarms get batched while the device is asleep + // and are then *all* delivered. + val alarmManager: AlarmManager? = context.getSystemService() + val nextMidnight = LocalDate.now().atTime(LocalTime.MIDNIGHT).plusDays(1).atZone(ZoneId.systemDefault()).toInstant() + Timber.d("Scheduling the next widgets UPDATE alarm for $nextMidnight") + alarmManager?.let { am -> + val pendingIntent = buildUpdatePendingIntent(context) + am.set( + AlarmManager.RTC, + nextMidnight.toEpochMilli(), + pendingIntent, + ) + Timber.d("Scheduled widget UPDATE alarm.") + } + } + + override fun onDisabled(context: Context) { + // Remove the update alarm if the last widget is gone. + val alarmManager: AlarmManager? = context.getSystemService() + alarmManager?.let { am -> + val pendingIntent = buildUpdatePendingIntent(context) + am.cancel(pendingIntent) + Timber.d("Canceled widget UPDATE alarm.") + } + } + + private fun getActiveWidgetIds(context: Context): IntArray { + val appWidgetManager = AppWidgetManager.getInstance(context) + val componentName = ComponentName(context, this::class.java) + + // return ID of all active widgets within this AppWidgetProvider + return appWidgetManager.getAppWidgetIds(componentName) + } + + private fun buildUpdatePendingIntent(context: Context): PendingIntent { + val widgetClass = this::class.java + val widgetIds = getActiveWidgetIds(context) + val updateIntent = Intent(context, widgetClass) + .setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE) + .putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds) + val flags = PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE + + return PendingIntent.getBroadcast(context, REQUEST_CODE, updateIntent, flags) + } + + companion object { + private const val REQUEST_CODE = 1982 + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetState.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetState.kt new file mode 100644 index 0000000..9c93aae --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetState.kt @@ -0,0 +1,52 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.appwidget + +import android.appwidget.AppWidgetManager +import kotlinx.serialization.Serializable + +@Serializable +sealed class AppWidgetState { + abstract val appWidgetId: Int + abstract val darkTheme: Boolean + + @Serializable + data class DaysLeft( + override val appWidgetId: Int, + override val darkTheme: Boolean, + val daysLeft: Long, + ) : AppWidgetState() + + @Serializable + data class ItIsHere( + override val appWidgetId: Int, + override val darkTheme: Boolean, + val releaseNumber: String, + ) : AppWidgetState() + + @Serializable + data class ComingSoon( + override val appWidgetId: Int, + override val darkTheme: Boolean, + ) : AppWidgetState() + + @Serializable + data class Unavailable( + override val appWidgetId: Int = AppWidgetManager.INVALID_APPWIDGET_ID, + override val darkTheme: Boolean = false, + ) : AppWidgetState() +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetStateDefinition.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetStateDefinition.kt new file mode 100644 index 0000000..90210d8 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetStateDefinition.kt @@ -0,0 +1,69 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.appwidget + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.core.Serializer +import androidx.datastore.dataStore +import androidx.datastore.dataStoreFile +import androidx.glance.state.GlanceStateDefinition +import kotlinx.serialization.json.Json +import timber.log.Timber +import java.io.File +import java.io.InputStream +import java.io.OutputStream + +object AppWidgetStateDefinition : GlanceStateDefinition { + private const val DATA_STORE_FILE_NAME = "AppWidgetState" + private val Context.datastore by dataStore(DATA_STORE_FILE_NAME, AppWidgetStateSerializer) + + override suspend fun getDataStore( + context: Context, + fileKey: String, + ): DataStore = context.datastore + + override fun getLocation( + context: Context, + fileKey: String, + ): File = context.dataStoreFile(DATA_STORE_FILE_NAME) + + object AppWidgetStateSerializer : Serializer { + override val defaultValue: AppWidgetState = AppWidgetState.Unavailable() + + override suspend fun readFrom(input: InputStream): AppWidgetState = try { + Json.decodeFromString( + AppWidgetState.serializer(), + input.readBytes().decodeToString(), + ) + } catch (@Suppress("TooGenericExceptionCaught") e: Exception) { + Timber.e(e, "Widget error") + defaultValue + } + + override suspend fun writeTo(state: AppWidgetState, output: OutputStream) { + output.use { outputStream -> + outputStream.write( + Json.encodeToString( + AppWidgetState.serializer(), + state, + ).encodeToByteArray(), + ) + } + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetStateProvider.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetStateProvider.kt new file mode 100644 index 0000000..c0d750d --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidget/AppWidgetStateProvider.kt @@ -0,0 +1,59 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.appwidget + +import com.leinardi.ubuntucountdownwidget.interactor.GetCustomDateInteractor +import com.leinardi.ubuntucountdownwidget.interactor.GetDaysLeftInteractor +import com.leinardi.ubuntucountdownwidget.interactor.GetReleaseDateInteractor +import com.leinardi.ubuntucountdownwidget.interactor.GetUseCustomDateInteractor +import com.leinardi.ubuntucountdownwidget.interactor.GetUseDarkThemeInteractor +import timber.log.Timber +import java.util.Locale +import javax.inject.Inject + +class AppWidgetStateProvider @Inject constructor( + private val getCustomDateInteractor: GetCustomDateInteractor, + private val getDaysLeftInteractor: GetDaysLeftInteractor, + private val getReleaseDateInteractor: GetReleaseDateInteractor, + private val getUseCustomDateInteractor: GetUseCustomDateInteractor, + private val getUseDarkThemeInteractor: GetUseDarkThemeInteractor, +) { + suspend fun get(appWidgetId: Int): AppWidgetState { + Timber.d("Generate new AppWidgetState") + val darkTheme = getUseDarkThemeInteractor() + val releaseDate = if (getUseCustomDateInteractor()) getCustomDateInteractor() else getReleaseDateInteractor() + val daysLeft = getDaysLeftInteractor(releaseDate) + return when { + daysLeft > 1 -> AppWidgetState.DaysLeft( + appWidgetId = appWidgetId, + darkTheme = darkTheme, + daysLeft = daysLeft, + ) + + daysLeft <= 0 -> AppWidgetState.ItIsHere( + appWidgetId = appWidgetId, + darkTheme = darkTheme, + releaseNumber = @Suppress("MagicNumber") String.format(Locale.ROOT, "%02d.%02d", releaseDate.year % 100, releaseDate.monthValue), + ) + + else -> AppWidgetState.ComingSoon( + appWidgetId = appWidgetId, + darkTheme = darkTheme, + ) + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/WidgetProvider.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/WidgetProvider.kt deleted file mode 100644 index 5298e44..0000000 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/WidgetProvider.kt +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -package com.leinardi.ubuntucountdownwidget.appwidgets - -import android.app.AlarmManager -import android.app.PendingIntent -import android.app.PendingIntent.FLAG_IMMUTABLE -import android.appwidget.AppWidgetManager -import android.appwidget.AppWidgetProvider -import android.content.ComponentName -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.text.format.DateUtils -import android.view.View -import android.widget.RemoteViews -import androidx.preference.PreferenceManager -import com.leinardi.ubuntucountdownwidget.BuildConfig -import com.leinardi.ubuntucountdownwidget.R -import com.leinardi.ubuntucountdownwidget.ui.SettingsActivity -import com.leinardi.ubuntucountdownwidget.ui.dialogs.DatePickerFragment -import com.leinardi.ubuntucountdownwidget.utils.Utils -import java.util.Calendar -import java.util.GregorianCalendar -import java.util.Locale -import java.util.TimeZone -import kotlin.math.ceil - -@Suppress("MagicNumber") -abstract class WidgetProvider : AppWidgetProvider() { - override fun onUpdate( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetIds: IntArray, - ) { - updateWidget(context) - super.onUpdate(context, appWidgetManager, appWidgetIds) - } - - override fun onReceive(context: Context, intent: Intent) { - val action = intent.action - if (action == FORCE_WIDGET_UPDATE || - action == Intent.ACTION_TIMEZONE_CHANGED || - action == Intent.ACTION_TIME_CHANGED - ) { - updateWidget(context) - } - super.onReceive(context, intent) - } - - private fun updateWidget(context: Context) { - val thisWidget = getComponentName(context) - val appWidgetManager = AppWidgetManager.getInstance(context) - val appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget) - updateWidget(context, appWidgetManager, appWidgetIds) - } - - @Suppress("NestedBlockDepth") - private fun updateWidget( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetIds: IntArray, - ) { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - val isThemeDark = - prefs.getString(context.getString(R.string.pref_theme_key), "light") == "dark" - val today = GregorianCalendar(TimeZone.getTimeZone("GMT")) - val ubuntuReleaseDay = Utils.ubuntuReleaseDate - if (prefs.getBoolean(context.getString(R.string.pref_custom_date_checkbox_key), false)) { - val ubuntuReleaseMillis = prefs.getLong( - context.getString(R.string.pref_custom_date_key), - DatePickerFragment.DEFAULT_VALUE, - ) - ubuntuReleaseDay.timeInMillis = ubuntuReleaseMillis - } - setAlarmManager(context, ubuntuReleaseDay) - val millisLeft = ubuntuReleaseDay.timeInMillis - today.timeInMillis - // Only API Level 9 --> TimeUnit.MILLISECONDS.toHours(millisLeft); - val hoursLeft = ceil(millisLeft / (1000 * 60 * 60.0)).toLong() - val daysLeft = ceil(hoursLeft / 24.0).toLong() - val views = getRemoteViews(context, isThemeDark) - for (appWidgetId in appWidgetIds) { - setupViews(context, ubuntuReleaseDay, millisLeft, daysLeft, views) - val strOnTouch = prefs.getString( - context.getString(R.string.pref_on_touch_key), - context.getString(R.string.on_touch_defaultValue), - ) - var intent = Intent() - if (strOnTouch != "disabled") { - if (strOnTouch == "config") { - intent = Intent(context, SettingsActivity::class.java) - } else { - var url = checkNotNull( - prefs.getString( - context.getString(R.string.pref_url_key), - context.getString(R.string.url_defaultValue), - ), - ) - if (!url.toLowerCase(Locale.ROOT).matches("^\\w+://.*".toRegex())) { - url = "http://$url" - } - intent = Intent(Intent.ACTION_VIEW) - intent.data = Uri.parse(url) - } - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) - } - val pendingIntent = PendingIntent.getActivity( - context, - 0, // no requestCode - intent, - FLAG_IMMUTABLE, - ) - views.setOnClickPendingIntent(R.id.rl_widget, pendingIntent) - appWidgetManager.updateAppWidget(appWidgetId, views) - } - } - - protected abstract fun getComponentName(context: Context): ComponentName - - protected abstract fun getRemoteViews(context: Context, isThemeDark: Boolean): RemoteViews - - private fun setupViews( - context: Context, - ubuntuReleaseDay: GregorianCalendar, - millisLeft: Long, - daysLeft: Long, - views: RemoteViews, - ) { - views.setViewVisibility(R.id.progress_bar, View.GONE) - views.setViewVisibility(R.id.footer_text_view, View.VISIBLE) - when { - millisLeft > DateUtils.DAY_IN_MILLIS / 2 -> { - views.setViewVisibility(R.id.header_image_view, View.VISIBLE) - views.setViewVisibility(R.id.release_text_view, View.GONE) - views.setViewVisibility(R.id.logo_image_view, View.GONE) - views.setTextViewText(R.id.counter_text_view, daysLeft.toString()) - views.setViewVisibility(R.id.counter_text_view, View.VISIBLE) - views.setTextViewText(R.id.footer_text_view, context.getString(R.string.days_left)) - } - - millisLeft < 0 -> { - val releaseNumber = String.format( - Locale.ROOT, - "%02d.%02d", - ubuntuReleaseDay[Calendar.YEAR] - 2000, - ubuntuReleaseDay[Calendar.MONTH] + 1, - ) - views.setViewVisibility(R.id.header_image_view, View.VISIBLE) - views.setViewVisibility(R.id.logo_image_view, View.GONE) - views.setViewVisibility(R.id.counter_text_view, View.GONE) - views.setTextViewText(R.id.release_text_view, releaseNumber) - views.setViewVisibility(R.id.release_text_view, View.VISIBLE) - views.setTextViewText(R.id.footer_text_view, context.getString(R.string.its_here)) - } - - else -> { - views.setViewVisibility(R.id.header_image_view, View.GONE) - views.setViewVisibility(R.id.counter_text_view, View.GONE) - views.setViewVisibility(R.id.release_text_view, View.GONE) - views.setViewVisibility(R.id.logo_image_view, View.VISIBLE) - views.setTextViewText( - R.id.footer_text_view, - context.getString(R.string.coming_soon), - ) - } - } - } - - private fun setAlarmManager(context: Context, ubuntuReleaseDay: GregorianCalendar) { - val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager - val pi = PendingIntent.getBroadcast( - context, - 0, - Intent(FORCE_WIDGET_UPDATE), - FLAG_IMMUTABLE, - ) - val now = GregorianCalendar(TimeZone.getDefault()) - val triggerCalendar = now.clone() as GregorianCalendar - triggerCalendar[Calendar.HOUR_OF_DAY] = ubuntuReleaseDay[Calendar.HOUR] - triggerCalendar[Calendar.MINUTE] = ubuntuReleaseDay[Calendar.MINUTE] - triggerCalendar[Calendar.SECOND] = ubuntuReleaseDay[Calendar.SECOND] + 1 - triggerCalendar[Calendar.MILLISECOND] = 0 - if (triggerCalendar.before(now)) { - triggerCalendar.add(Calendar.HOUR_OF_DAY, 12) - if (triggerCalendar.before(now)) { - triggerCalendar.add(Calendar.HOUR_OF_DAY, 12) - } - } - triggerCalendar.timeInMillis - alarmManager.cancel(pi) - alarmManager.setRepeating( - AlarmManager.RTC, - triggerCalendar.timeInMillis, - AlarmManager.INTERVAL_HALF_DAY, - pi, - ) - } - - companion object { - const val FORCE_WIDGET_UPDATE = BuildConfig.APPLICATION_ID + ".FORCE_WIDGET_UPDATE" - } -} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/cache/ReleaseDateCache.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/cache/ReleaseDateCache.kt new file mode 100644 index 0000000..d808a7a --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/cache/ReleaseDateCache.kt @@ -0,0 +1,50 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.cache + +import androidx.datastore.preferences.core.longPreferencesKey +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import java.time.Instant +import java.time.LocalDate +import java.time.temporal.ChronoUnit +import javax.inject.Inject + +class ReleaseDateCache @Inject constructor( + private val dataStoreRepository: DataStoreRepository, +) { + suspend fun get(ignoreExpiration: Boolean = false): LocalDate? = + if (ignoreExpiration || !isExpired()) { + dataStoreRepository.readValue(RELEASE_DATE_PREF_KEY)?.let { LocalDate.ofEpochDay(it) } + } else { + null + } + + suspend fun get(ignoreExpiration: Boolean = false, defaultValue: LocalDate): LocalDate = get(ignoreExpiration) ?: defaultValue + + suspend fun store(releaseDate: LocalDate, expiresAt: Instant = Instant.now().plus(1, ChronoUnit.MINUTES)) { + dataStoreRepository.storeValue(RELEASE_DATE_PREF_KEY, releaseDate.toEpochDay()) + dataStoreRepository.storeValue(EXPIRES_AT_PREF_KEY, expiresAt.toEpochMilli()) + } + + suspend fun isExpired(): Boolean = + dataStoreRepository.readValue(EXPIRES_AT_PREF_KEY)?.let { Instant.ofEpochMilli(it).isBefore(Instant.now()) } != false + + companion object { + private val RELEASE_DATE_PREF_KEY = longPreferencesKey("ReleaseDateCache.releaseDate") + private val EXPIRES_AT_PREF_KEY = longPreferencesKey("ReleaseDateCache.expiresAt") + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/coroutine/CoroutineDispatchers.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/coroutine/CoroutineDispatchers.kt new file mode 100644 index 0000000..a6516c7 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/coroutine/CoroutineDispatchers.kt @@ -0,0 +1,27 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.coroutine + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers + +data class CoroutineDispatchers( + val main: CoroutineDispatcher = Dispatchers.Main, + val default: CoroutineDispatcher = Dispatchers.Default, + val io: CoroutineDispatcher = Dispatchers.IO, + val unconfined: CoroutineDispatcher = Dispatchers.Unconfined, +) diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/di/AppEntryPoints.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/di/AppEntryPoints.kt new file mode 100644 index 0000000..eb7428a --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/di/AppEntryPoints.kt @@ -0,0 +1,33 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.di + +import com.leinardi.ubuntucountdownwidget.appwidget.AppWidgetStateProvider +import com.leinardi.ubuntucountdownwidget.interactor.OpenUrlInWebBrowserInteractor +import dagger.hilt.EntryPoint +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent + +object AppEntryPoints { + @EntryPoint + @InstallIn(SingletonComponent::class) + interface AppInterface { + fun getAppWidgetStateProvider(): AppWidgetStateProvider + + fun getOpenUrlInWebBrowserInteractor(): OpenUrlInWebBrowserInteractor + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/di/AppModule.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/di/AppModule.kt new file mode 100644 index 0000000..fe8f5d4 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/di/AppModule.kt @@ -0,0 +1,108 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.di + +import android.app.Application +import androidx.glance.appwidget.GlanceAppWidgetManager +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import com.leinardi.ubuntucountdownwidget.BuildConfig +import com.leinardi.ubuntucountdownwidget.api.RestApi +import com.leinardi.ubuntucountdownwidget.coroutine.CoroutineDispatchers +import com.leinardi.ubuntucountdownwidget.serializer.LocalDateSerializer +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import dagger.multibindings.IntoSet +import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Converter +import retrofit2.Retrofit +import retrofit2.create +import timber.log.Timber +import java.time.LocalDate +import java.util.concurrent.TimeUnit +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +open class AppModule { + @Provides + @Singleton + fun provideCoroutineDispatchers(): CoroutineDispatchers = CoroutineDispatchers() + + @Provides + @Singleton + fun provideGlanceAppWidgetManager(application: Application): GlanceAppWidgetManager = GlanceAppWidgetManager(application) + + @Provides + @Singleton + @IntoSet + fun provideHttpLoggingInterceptor(): Interceptor = HttpLoggingInterceptor { Timber.v(it) }.also { + it.level = if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE + } + + @Provides + @Singleton + fun provideSerializersModule() = SerializersModule { + contextual(LocalDate::class, LocalDateSerializer) + } + + @Provides + @Singleton + fun provideJson(serializerModule: SerializersModule) = Json { + ignoreUnknownKeys = true + encodeDefaults = true + serializersModule = serializerModule + } + + @Provides + @Singleton + @IntoSet + fun provideKotlinxSerializationConverterFactory(json: Json): Converter.Factory = json.asConverterFactory("application/json".toMediaType()) + + @Provides + @Singleton + fun provideOkHttpClient( + interceptorSet: Set<@JvmSuppressWildcards Interceptor>, + ): OkHttpClient = OkHttpClient.Builder().apply { + interceptorSet.forEach { addInterceptor(it) } + retryOnConnectionFailure(false) + callTimeout(NETWORK_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS) + }.build() + + @Provides + @Singleton + fun provideRestApi( + converterFactorySet: Set<@JvmSuppressWildcards Converter.Factory>, + httpClient: OkHttpClient, + ): RestApi = Retrofit.Builder() + .apply { converterFactorySet.forEach { addConverterFactory(it) } } + .baseUrl(BASE_URL) + .client(httpClient) + .build() + .create() + + companion object { + private const val BASE_URL = "https://leinardi.github.io/" + private const val NETWORK_TIMEOUT_IN_SECONDS = 30L + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/BroadcastReceiverExt.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/BroadcastReceiverExt.kt new file mode 100644 index 0000000..db1ca0f --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/BroadcastReceiverExt.kt @@ -0,0 +1,55 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ext + +import android.content.BroadcastReceiver +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import timber.log.Timber + +fun BroadcastReceiver.goAsync( + dispatcher: CoroutineDispatcher, + block: suspend CoroutineScope.() -> Unit, +) { + val pendingResult = goAsync() + + CoroutineScope(dispatcher).launch { + try { + try { + block() + } catch (e: CancellationException) { + throw e + } catch (@Suppress("TooGenericExceptionCaught") throwable: Throwable) { + Timber.e(throwable, "BroadcastReceiver execution failed", throwable) + } finally { + // Nothing can be in the `finally` block after this, as this throws a `CancellationException` + cancel() + } + } finally { + // This must be the last call, as the process may be killed after calling this. + try { + pendingResult.finish() + } catch (exception: IllegalStateException) { + // On some OEM devices, this may throw an error about "Broadcast already finished". + Timber.e(exception, "Error thrown when trying to finish broadcast") + } + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/Widget1x1Provider.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ContextExt.kt similarity index 53% rename from app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/Widget1x1Provider.kt rename to app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ContextExt.kt index 4676699..5ae705c 100644 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/appwidgets/Widget1x1Provider.kt +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ContextExt.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -14,20 +14,21 @@ * program. If not, see . */ -package com.leinardi.ubuntucountdownwidget.appwidgets +package com.leinardi.ubuntucountdownwidget.ext -import android.content.ComponentName +import android.app.Activity import android.content.Context -import android.widget.RemoteViews -import com.leinardi.ubuntucountdownwidget.R +import android.content.ContextWrapper +import android.content.res.Configuration -class Widget1x1Provider : WidgetProvider() { - override fun getComponentName(context: Context): ComponentName = - ComponentName(context, Widget1x1Provider::class.java) +fun Context.getActivity(): Activity? = + when (this) { + is Activity -> this + is ContextWrapper -> baseContext.getActivity() + else -> null + } - override fun getRemoteViews(context: Context, isThemeDark: Boolean): RemoteViews = - RemoteViews( - context.packageName, - if (isThemeDark) R.layout.appwidget_1x1_dark else R.layout.appwidget_1x1_light, - ) -} +fun Context.requireActivity(): Activity = checkNotNull(getActivity()) { "Could not find activity!" } + +val Context.isNightMode: Boolean + get() = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.config-conventions.gradle b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/InstantExt.kt similarity index 61% rename from build-conventions/src/main/groovy/ubuntucountdownwidget.config-conventions.gradle rename to app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/InstantExt.kt index 3810239..6752867 100644 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.config-conventions.gradle +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/InstantExt.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -13,16 +13,13 @@ * You should have received a copy of the GNU General Public License along with this * program. If not, see . */ -ext.config = [ - android: [ - 'applicationId': 'com.leinardi.ubuntucountdownwidget', - 'compileSdk' : 34, - 'javaVersion' : JavaVersion.VERSION_17, - 'minSdk' : 21, - 'targetSdk' : 34, - ], - params : [ - saveBuildLogToFile: Boolean.parseBoolean(project.properties['saveBuildLogToFile']) ?: false - ], -] +package com.leinardi.ubuntucountdownwidget.ext + +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.time.format.FormatStyle + +fun Instant.toLocalizedDateTime(dateTimeStyle: FormatStyle = FormatStyle.LONG): String = + atZone(ZoneId.systemDefault()).toLocalDateTime().format(DateTimeFormatter.ofLocalizedDateTime(dateTimeStyle)) diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/LocalDateExt.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/LocalDateExt.kt new file mode 100644 index 0000000..d0bddb2 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/LocalDateExt.kt @@ -0,0 +1,23 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ext + +import java.time.LocalDate +import java.time.format.DateTimeFormatter +import java.time.format.FormatStyle + +fun LocalDate.toLocalizedDate(dateStyle: FormatStyle = FormatStyle.LONG): String = format(DateTimeFormatter.ofLocalizedDate(dateStyle)) diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/initializer/TimberInitializer.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/initializer/TimberInitializer.kt new file mode 100644 index 0000000..4cebaf3 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/initializer/TimberInitializer.kt @@ -0,0 +1,33 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.initializer + +import android.content.Context +import androidx.startup.Initializer +import com.leinardi.ubuntucountdownwidget.BuildConfig +import com.leinardi.ubuntucountdownwidget.timber.DebugTree +import timber.log.Timber + +class TimberInitializer : Initializer { + override fun create(context: Context) { + if (BuildConfig.DEBUG) { + Timber.plant(DebugTree()) + } + } + + override fun dependencies(): List>> = emptyList() +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetAppVersionInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetAppVersionInteractor.kt new file mode 100644 index 0000000..dcf3b59 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetAppVersionInteractor.kt @@ -0,0 +1,36 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import android.app.Application +import android.content.pm.PackageManager +import android.os.Build +import com.leinardi.ubuntucountdownwidget.R +import javax.inject.Inject + +class GetAppVersionInteractor @Inject constructor( + private val context: Application, +) { + operator fun invoke(): String { + val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + context.packageManager.getPackageInfo(context.packageName, PackageManager.PackageInfoFlags.of(0)) + } else { + context.packageManager.getPackageInfo(context.packageName, 0) + } + return packageInfo?.versionName ?: context.getString(R.string.pref_info_version_error) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetCustomDateInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetCustomDateInteractor.kt new file mode 100644 index 0000000..0a2e049 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetCustomDateInteractor.kt @@ -0,0 +1,34 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import androidx.datastore.preferences.core.longPreferencesKey +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import java.time.LocalDate +import javax.inject.Inject + +class GetCustomDateInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, + private val getReleaseDateInteractor: GetReleaseDateInteractor, +) { + suspend operator fun invoke(): LocalDate = + dataStoreRepository.readValue(CUSTOM_DATE_PREF_KEY)?.let { LocalDate.ofEpochDay(it) } ?: getReleaseDateInteractor() + + companion object { + internal val CUSTOM_DATE_PREF_KEY = longPreferencesKey("CustomDate") + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetCustomDateStreamInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetCustomDateStreamInteractor.kt new file mode 100644 index 0000000..2f89169 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetCustomDateStreamInteractor.kt @@ -0,0 +1,33 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import com.leinardi.ubuntucountdownwidget.interactor.GetCustomDateInteractor.Companion.CUSTOM_DATE_PREF_KEY +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import java.time.LocalDate +import javax.inject.Inject + +class GetCustomDateStreamInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, + private val getReleaseDateInteractor: GetReleaseDateInteractor, +) { + operator fun invoke(): Flow = + dataStoreRepository.observeValue(CUSTOM_DATE_PREF_KEY) + .map { epochDay -> epochDay?.let { LocalDate.ofEpochDay(it) } ?: getReleaseDateInteractor() } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/utils/Utils.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetDaysLeftInteractor.kt similarity index 59% rename from app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/utils/Utils.kt rename to app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetDaysLeftInteractor.kt index c5e14e6..b582411 100644 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/utils/Utils.kt +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetDaysLeftInteractor.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -14,16 +14,15 @@ * program. If not, see . */ -package com.leinardi.ubuntucountdownwidget.utils +package com.leinardi.ubuntucountdownwidget.interactor -import java.util.Calendar -import java.util.GregorianCalendar -import java.util.TimeZone +import java.time.LocalDate +import java.time.temporal.ChronoUnit +import javax.inject.Inject -object Utils { - private val UBUNTU_RELEASE_DATE = GregorianCalendar(TimeZone.getTimeZone("GMT")).apply { - set(2023, Calendar.OCTOBER, 12, 0, 0, 0) - } - val ubuntuReleaseDate: GregorianCalendar - get() = UBUNTU_RELEASE_DATE.clone() as GregorianCalendar +class GetDaysLeftInteractor @Inject constructor( + private val getReleaseDateInteractor: GetReleaseDateInteractor, +) { + suspend operator fun invoke(releaseDate: LocalDate? = null): Long = + ChronoUnit.DAYS.between(LocalDate.now(), releaseDate ?: getReleaseDateInteractor()) } diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetReleaseDateInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetReleaseDateInteractor.kt new file mode 100644 index 0000000..9e28b74 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetReleaseDateInteractor.kt @@ -0,0 +1,51 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import com.leinardi.ubuntucountdownwidget.api.RestApi +import com.leinardi.ubuntucountdownwidget.cache.ReleaseDateCache +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import java.io.IOException +import java.time.LocalDate +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class GetReleaseDateInteractor @Inject constructor( + private val releaseDateCache: ReleaseDateCache, + private val restApi: RestApi, +) { + private val mutex = Mutex() + suspend operator fun invoke(): LocalDate = mutex.withLock { + releaseDateCache.run { if (releaseDateCache.isExpired()) fetchReleaseDate() else get() } ?: fetchReleaseDate() + } + + private suspend fun fetchReleaseDate(): LocalDate = try { + restApi.getReleaseDate().body()?.run { + releaseDate.apply { + releaseDateCache.store(this) + } + } ?: releaseDateCache.get(ignoreExpiration = true, defaultValue = DEFAULT_RELEASE_DATE) + } catch (e: IOException) { + releaseDateCache.get(ignoreExpiration = true, defaultValue = DEFAULT_RELEASE_DATE) + } + + companion object { + private val DEFAULT_RELEASE_DATE = LocalDate.of(2023, 10, 12) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseCustomDateInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseCustomDateInteractor.kt new file mode 100644 index 0000000..1755e45 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseCustomDateInteractor.kt @@ -0,0 +1,31 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import androidx.datastore.preferences.core.booleanPreferencesKey +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import javax.inject.Inject + +class GetUseCustomDateInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, +) { + suspend operator fun invoke(): Boolean = dataStoreRepository.readValue(USE_CUSTOM_DATE_PREF_KEY) == true + + companion object { + internal val USE_CUSTOM_DATE_PREF_KEY = booleanPreferencesKey("UseCustomDate") + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseCustomDateStreamInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseCustomDateStreamInteractor.kt new file mode 100644 index 0000000..b623dd9 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseCustomDateStreamInteractor.kt @@ -0,0 +1,29 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import com.leinardi.ubuntucountdownwidget.interactor.GetUseCustomDateInteractor.Companion.USE_CUSTOM_DATE_PREF_KEY +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject + +class GetUseCustomDateStreamInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, +) { + operator fun invoke(): Flow = dataStoreRepository.observeValue(USE_CUSTOM_DATE_PREF_KEY).map { it == true } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseDarkThemeInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseDarkThemeInteractor.kt new file mode 100644 index 0000000..416fffa --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseDarkThemeInteractor.kt @@ -0,0 +1,31 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import androidx.datastore.preferences.core.booleanPreferencesKey +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import javax.inject.Inject + +class GetUseDarkThemeInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, +) { + suspend operator fun invoke(): Boolean = dataStoreRepository.readValue(USE_DARK_THEME_PREF_KEY) == true + + companion object { + internal val USE_DARK_THEME_PREF_KEY = booleanPreferencesKey("UseDarkTheme") + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseDarkThemeStreamInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseDarkThemeStreamInteractor.kt new file mode 100644 index 0000000..4dac1fc --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/GetUseDarkThemeStreamInteractor.kt @@ -0,0 +1,29 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import com.leinardi.ubuntucountdownwidget.interactor.GetUseDarkThemeInteractor.Companion.USE_DARK_THEME_PREF_KEY +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject + +class GetUseDarkThemeStreamInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, +) { + operator fun invoke(): Flow = dataStoreRepository.observeValue(USE_DARK_THEME_PREF_KEY).map { it == true } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/OpenUrlInWebBrowserInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/OpenUrlInWebBrowserInteractor.kt new file mode 100644 index 0000000..059d7b4 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/OpenUrlInWebBrowserInteractor.kt @@ -0,0 +1,40 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import android.app.Application +import android.content.ActivityNotFoundException +import android.content.Intent +import android.net.Uri +import com.leinardi.ubuntucountdownwidget.R +import timber.log.Timber +import javax.inject.Inject + +class OpenUrlInWebBrowserInteractor @Inject constructor( + private val application: Application, + private val showToastInteractor: ShowToastInteractor, +) { + operator fun invoke(url: String) { + Timber.d("Opening URL in browser: $url") + try { + application.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) + } catch (exception: ActivityNotFoundException) { + Timber.i(exception) + showToastInteractor(application.getString(R.string.no_browser_installed)) + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/ReadShowLauncherIconInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/ReadShowLauncherIconInteractor.kt new file mode 100644 index 0000000..ce7d6c1 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/ReadShowLauncherIconInteractor.kt @@ -0,0 +1,38 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import android.app.Application +import android.content.ComponentName +import android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT +import android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED +import com.leinardi.ubuntucountdownwidget.ui.MainActivity +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ReadShowLauncherIconInteractor @Inject constructor( + private val application: Application, +) { + operator fun invoke(): Boolean = + when (application.packageManager.getComponentEnabledSetting(ComponentName(application, MainActivity::class.java))) { + COMPONENT_ENABLED_STATE_DEFAULT, + COMPONENT_ENABLED_STATE_ENABLED -> true + + else -> false + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/ShowToastInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/ShowToastInteractor.kt new file mode 100644 index 0000000..ed8b218 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/ShowToastInteractor.kt @@ -0,0 +1,41 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import android.app.Application +import android.widget.Toast +import com.leinardi.ubuntucountdownwidget.strictmode.noStrictMode +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ShowToastInteractor @Inject constructor( + private val application: Application, +) { + private var toast: Toast? = null + + operator fun invoke(text: String, shortLength: Boolean = false, cancelPrevious: Boolean = true) { + if (cancelPrevious) { + toast?.run { cancel() } + } + // StrictMode complains about wrong context used to show the toast, but it's a false positive since the official documentation states that + // an application context can and should be used: https://developer.android.com/guide/topics/ui/notifiers/toasts#Basics + toast = noStrictMode(disableThread = false) { + Toast.makeText(application, text, if (shortLength) Toast.LENGTH_SHORT else Toast.LENGTH_LONG).apply { show() } + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreCustomDateInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreCustomDateInteractor.kt new file mode 100644 index 0000000..59d4b74 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreCustomDateInteractor.kt @@ -0,0 +1,30 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import com.leinardi.ubuntucountdownwidget.interactor.GetCustomDateInteractor.Companion.CUSTOM_DATE_PREF_KEY +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import java.time.LocalDate +import javax.inject.Inject + +class StoreCustomDateInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, +) { + suspend operator fun invoke(date: LocalDate) { + dataStoreRepository.storeValue(CUSTOM_DATE_PREF_KEY, date.toEpochDay()) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreShowLauncherIconInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreShowLauncherIconInteractor.kt new file mode 100644 index 0000000..4ac5254 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreShowLauncherIconInteractor.kt @@ -0,0 +1,38 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import android.app.Application +import android.content.ComponentName +import android.content.pm.PackageManager +import com.leinardi.ubuntucountdownwidget.ui.MainActivity +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class StoreShowLauncherIconInteractor @Inject constructor( + private val application: Application, +) { + operator fun invoke(enabled: Boolean = true) { + val componentName = ComponentName(application, MainActivity::class.java) + application.packageManager.setComponentEnabledSetting( + componentName, + if (enabled) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP, + ) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreUseCustomDateInteractor.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreUseCustomDateInteractor.kt new file mode 100644 index 0000000..66da1ac --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreUseCustomDateInteractor.kt @@ -0,0 +1,29 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.interactor + +import com.leinardi.ubuntucountdownwidget.interactor.GetUseCustomDateInteractor.Companion.USE_CUSTOM_DATE_PREF_KEY +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import javax.inject.Inject + +class StoreUseCustomDateInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, +) { + suspend operator fun invoke(enabled: Boolean) { + dataStoreRepository.storeValue(USE_CUSTOM_DATE_PREF_KEY, enabled) + } +} diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.merged-manifests-conventions.gradle b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreUseDarkThemeInteractor.kt similarity index 55% rename from build-conventions/src/main/groovy/ubuntucountdownwidget.merged-manifests-conventions.gradle rename to app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreUseDarkThemeInteractor.kt index 2c7de49..7176a56 100644 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.merged-manifests-conventions.gradle +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/interactor/StoreUseDarkThemeInteractor.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -13,15 +13,17 @@ * You should have received a copy of the GNU General Public License along with this * program. If not, see . */ -tasks.register("copyMergedManifests", Copy) { - dependsOn tasks.matching { (it.name ==~ /^process.*Manifest$/) } - mustRunAfter tasks.matching { (it.name ==~ /^process.*Manifest$/) } - mkdir 'versions/mergedManifests' - from("$buildDir/intermediates/merged_manifests") { - include '**/*.xml' + +package com.leinardi.ubuntucountdownwidget.interactor + +import com.leinardi.ubuntucountdownwidget.interactor.GetUseDarkThemeInteractor.Companion.USE_DARK_THEME_PREF_KEY +import com.leinardi.ubuntucountdownwidget.repository.DataStoreRepository +import javax.inject.Inject + +class StoreUseDarkThemeInteractor @Inject constructor( + private val dataStoreRepository: DataStoreRepository, +) { + suspend operator fun invoke(enabled: Boolean) { + dataStoreRepository.storeValue(USE_DARK_THEME_PREF_KEY, enabled) } - into 'versions/mergedManifests' - filter { line -> line.replaceAll("(android:version.*=\".*\")|(android:testOnly=\".*\")", "") } } - -check.dependsOn tasks.named("copyMergedManifests") diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/model/ReleaseDateResponse.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/model/ReleaseDateResponse.kt new file mode 100644 index 0000000..ce74d92 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/model/ReleaseDateResponse.kt @@ -0,0 +1,28 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +@file:Suppress("diktat") + +package com.leinardi.ubuntucountdownwidget.model + +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import java.time.LocalDate + +@Serializable +data class ReleaseDateResponse( + @Contextual val releaseDate: LocalDate, +) diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/repository/DataStoreRepository.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/repository/DataStoreRepository.kt new file mode 100644 index 0000000..180959b --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/repository/DataStoreRepository.kt @@ -0,0 +1,75 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.repository + +import android.app.Application +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.emptyPreferences +import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.map +import timber.log.Timber +import java.io.IOException +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class DataStoreRepository @Inject constructor( + private val application: Application, +) { + private val Context.dataStore: DataStore by preferencesDataStore(name = "dataStoreRepository") + + suspend fun clearPreferencesStorage() { + Timber.d("Clear data store") + application.dataStore.edit { it.clear() } + } + + fun observeValue(key: Preferences.Key): Flow = application.dataStore.getFromLocalStorage(key) + + suspend fun readValue(key: Preferences.Key): T? = observeValue(key).firstOrNull() + + suspend fun readValue(key: Preferences.Key, defaultValue: T): T = + application.dataStore.getFromLocalStorage(key).map { it ?: defaultValue }.first() + + suspend fun removeKey(key: Preferences.Key) { + application.dataStore.edit { it.remove(key) } + } + + suspend fun storeValue(key: Preferences.Key, value: T) { + application.dataStore.edit { it[key] = value } + } + + private fun DataStore.getFromLocalStorage( + preferencesKey: Preferences.Key, + ): Flow = + data.catch { exception -> + if (exception is IOException) { + Timber.e(exception, "Error while reading data store.") + emit(emptyPreferences()) + } else { + throw exception + } + }.map { + it[preferencesKey] + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/serializer/LocalDateSerializer.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/serializer/LocalDateSerializer.kt new file mode 100644 index 0000000..e1b5e99 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/serializer/LocalDateSerializer.kt @@ -0,0 +1,38 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.serializer + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import java.time.LocalDate + +object LocalDateSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("LocalDate", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: LocalDate) { + encoder.encodeString(value.toString()) + } + + override fun deserialize(decoder: Decoder): LocalDate { + val string = decoder.decodeString() + return LocalDate.parse(string) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/strictmode/StrictMode.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/strictmode/StrictMode.kt new file mode 100644 index 0000000..cc27b93 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/strictmode/StrictMode.kt @@ -0,0 +1,39 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.strictmode + +import android.os.StrictMode +import com.leinardi.ubuntucountdownwidget.BuildConfig + +fun noStrictMode(disableVm: Boolean = true, disableThread: Boolean = true, block: () -> T): T { + val vmPolicy = StrictMode.getVmPolicy() + val threadPolicy = StrictMode.getThreadPolicy() + if (disableVm && BuildConfig.DEBUG) { + StrictMode.setVmPolicy(StrictMode.VmPolicy.Builder().build()) + } + if (disableThread && BuildConfig.DEBUG) { + StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder().build()) + } + return block().also { + if (disableVm && BuildConfig.DEBUG) { + StrictMode.setVmPolicy(vmPolicy) + } + if (disableThread && BuildConfig.DEBUG) { + StrictMode.setThreadPolicy(threadPolicy) + } + } +} diff --git a/settings.gradle b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/timber/DebugTree.kt similarity index 69% rename from settings.gradle rename to app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/timber/DebugTree.kt index bc65cbd..a4d32f3 100644 --- a/settings.gradle +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/timber/DebugTree.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -14,15 +14,11 @@ * program. If not, see . */ -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { - google() - mavenCentral() - } -} -rootProject.name = "ubuntucountdownwidget" +package com.leinardi.ubuntucountdownwidget.timber -includeBuild("build-conventions") +import timber.log.Timber -include ':app' +class DebugTree : Timber.DebugTree() { + override fun createStackElementTag(element: StackTraceElement) = + "(${element.fileName.orEmpty()}:${element.lineNumber})" +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/LauncherActivity.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/LauncherActivity.kt deleted file mode 100644 index 5c1f9e4..0000000 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/LauncherActivity.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -package com.leinardi.ubuntucountdownwidget.ui - -import android.content.Intent -import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.webkit.WebView -import androidx.appcompat.app.AppCompatActivity -import androidx.preference.PreferenceManager -import com.leinardi.ubuntucountdownwidget.R - -class LauncherActivity : AppCompatActivity() { - public override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if (!PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.pref_show_tutorial_key), true) - ) { - startConfigActivity() - finish() - return - } - setContentView(R.layout.activity_launcher) - val web = findViewById(R.id.wv_info) - web.loadUrl("file:///android_asset/${getString(R.string.info_filename)}") - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_launcher, menu) - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean = - if (item.itemId == R.id.action_settings) { - startConfigActivity() - true - } else { - super.onOptionsItemSelected(item) - } - - private fun startConfigActivity() { - Intent(this@LauncherActivity, SettingsActivity::class.java).apply { - flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP - } - startActivity(intent) - } -} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/MainActivity.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/MainActivity.kt new file mode 100644 index 0000000..3fb3e0d --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/MainActivity.kt @@ -0,0 +1,57 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui + +import android.appwidget.AppWidgetManager +import android.content.Intent +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.glance.appwidget.GlanceAppWidgetManager +import androidx.lifecycle.lifecycleScope +import com.leinardi.ubuntucountdownwidget.appwidget.AppWidget +import com.leinardi.ubuntucountdownwidget.appwidget.AppWidgetReceiver +import com.leinardi.ubuntucountdownwidget.appwidget.AppWidgetStateProvider +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class MainActivity : ComponentActivity() { + @Inject lateinit var appWidgetStateProvider: AppWidgetStateProvider + + @Inject lateinit var glanceAppWidgetManager: GlanceAppWidgetManager + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + lifecycleScope.launch { + glanceAppWidgetManager.requestPinGlanceAppWidget( + receiver = AppWidgetReceiver::class.java, + preview = AppWidget(), + previewState = appWidgetStateProvider.get(AppWidgetManager.INVALID_APPWIDGET_ID), + successCallback = null, + ) + finish() + } + } + + override fun onDestroy() { + // Workaround to prevent executing a deep link again on activity recreated (e.g. theme change) + if (intent.action == Intent.ACTION_VIEW) { + intent.data = null + } + super.onDestroy() + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/SettingsActivity.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/SettingsActivity.kt deleted file mode 100644 index 87700ff..0000000 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/SettingsActivity.kt +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -package com.leinardi.ubuntucountdownwidget.ui - -import android.app.Activity -import android.appwidget.AppWidgetManager -import android.content.Intent -import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import androidx.appcompat.app.AppCompatActivity -import com.google.android.material.snackbar.Snackbar -import com.leinardi.ubuntucountdownwidget.R -import com.leinardi.ubuntucountdownwidget.appwidgets.Widget1x1Provider -import com.leinardi.ubuntucountdownwidget.appwidgets.Widget2x2Provider -import com.leinardi.ubuntucountdownwidget.appwidgets.WidgetProvider - -class SettingsActivity : AppCompatActivity() { - public override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_settings) - } - - override fun onBackPressed() { - // This will be called either automatically for you on 2.0 - // or later, or by the code above on earlier versions of the - // platform. - // Log.d(TAG, "onBackPressed"); - resultIntent() - finish() - } - - override fun onPrepareOptionsMenu(menu: Menu): Boolean { - if (AppWidgetManager.ACTION_APPWIDGET_CONFIGURE == intent.action) { - val snackbar = Snackbar.make( - findViewById(R.id.main_content), - R.string.press_save_to_add_the_widget, - Snackbar.LENGTH_INDEFINITE, - ) - snackbar.setAction(R.string.close) { snackbar.dismiss() } - snackbar.show() - } else { - menu.findItem(R.id.action_save).apply { - isVisible = false - } - } - return super.onPrepareOptionsMenu(menu) - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_settings, menu) - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean = - if (item.itemId == R.id.action_save) { - onBackPressed() - true - } else { - super.onOptionsItemSelected(item) - } - - override fun onPause() { - super.onPause() - resultIntent() - } - - private fun resultIntent() { - if (CONFIGURE_ACTION == intent.action) { - val intent = intent - val extras = intent.extras - if (extras != null) { - val appWidgetId = extras.getInt( - AppWidgetManager.EXTRA_APPWIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID, - ) - val result = Intent() - result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) - setResult(Activity.RESULT_OK, result) - } - } - sendBroadcast( - Intent(this, Widget1x1Provider::class.java).apply { - action = WidgetProvider.FORCE_WIDGET_UPDATE - }, - ) - sendBroadcast( - Intent(this, Widget2x2Provider::class.java).apply { - action = WidgetProvider.FORCE_WIDGET_UPDATE - }, - ) - } - - companion object { - private const val CONFIGURE_ACTION = "android.appwidget.action.APPWIDGET_CONFIGURE" - } -} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/SettingsFragment.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/SettingsFragment.kt deleted file mode 100644 index 5ad69d6..0000000 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/SettingsFragment.kt +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -package com.leinardi.ubuntucountdownwidget.ui - -import android.content.ComponentName -import android.content.Intent -import android.content.SharedPreferences -import android.content.pm.PackageManager -import android.net.Uri -import android.os.Bundle -import androidx.preference.CheckBoxPreference -import androidx.preference.EditTextPreference -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import androidx.preference.PreferenceManager -import com.leinardi.ubuntucountdownwidget.R -import com.leinardi.ubuntucountdownwidget.ui.dialogs.ChangelogDialogFragment -import com.leinardi.ubuntucountdownwidget.ui.dialogs.DatePickerFragment -import com.leinardi.ubuntucountdownwidget.ui.dialogs.OpenSourceLicensesDialogFragment -import com.leinardi.ubuntucountdownwidget.utils.Utils -import timber.log.Timber -import java.text.DateFormat -import java.util.Locale -import java.util.TimeZone - -class SettingsFragment : - PreferenceFragmentCompat(), - SharedPreferences.OnSharedPreferenceChangeListener { - private val prefs: SharedPreferences by lazy { - PreferenceManager.getDefaultSharedPreferences( - requireContext(), - ) - } - private val customDatePicker: Preference by lazy { - checkNotNull(findPreference(getString(R.string.pref_custom_date_key))) - } - private val customDateCheckbox: CheckBoxPreference by lazy { - checkNotNull(findPreference(getString(R.string.pref_custom_date_checkbox_key))) - as CheckBoxPreference - } - private val urlEditTextPreference: EditTextPreference by lazy { - checkNotNull(findPreference(getString(R.string.pref_url_key))) as EditTextPreference - } - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setupPreferencesScreen() - } - - override fun onResume() { - super.onResume() - if (!customDateCheckbox.isChecked) { - prefs.edit().putLong( - getString(R.string.pref_custom_date_key), - Utils.ubuntuReleaseDate.timeInMillis, - ).apply() - } - // Setup the initial values - val dateInMillis = prefs.getLong( - getString(R.string.pref_custom_date_key), - DatePickerFragment.DEFAULT_VALUE, - ) - customDatePicker.summary = DateFormat.getDateInstance( - DateFormat.LONG, - Locale.getDefault(), - ).format(dateInMillis) - preferenceScreen.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) - } - - override fun onPause() { - super.onPause() - preferenceScreen.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this) - } - - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { - if (key == getString(R.string.pref_custom_date_key)) { - val dateInMillis = sharedPreferences.getLong( - getString(R.string.pref_custom_date_key), - DatePickerFragment.DEFAULT_VALUE, - ) - customDatePicker.summary = DateFormat.getDateInstance( - DateFormat.LONG, - Locale.getDefault(), - ).format(dateInMillis) - } else if (key == getString(R.string.pref_on_touch_key)) { - updateCustomUrlPreferenceState(sharedPreferences) - } - } - - private fun setupPreferencesScreen() { - addPreferencesFromResource(R.xml.preferences) - updateUbuntuReleaseDate() - setCustomDatePickerClickListener() - updateCustomUrlPreferenceState(prefs) - setShowLaucherIconClickListener() - updateAppVersion() - setReportABugClickListener() - setChangelogClickListener() - setOpenSourceLicensesClickListener() - } - - private fun setOpenSourceLicensesClickListener() { - checkNotNull(findPreference(getString(R.string.pref_licenses_key))).onPreferenceClickListener = - Preference.OnPreferenceClickListener { - OpenSourceLicensesDialogFragment().show( - parentFragmentManager, - OpenSourceLicensesDialogFragment::class.java.simpleName, - ) - true - } - } - - private fun setChangelogClickListener() { - checkNotNull(findPreference(getString(R.string.pref_changelog_key))).onPreferenceClickListener = - Preference.OnPreferenceClickListener { - ChangelogDialogFragment().show( - parentFragmentManager, - ChangelogDialogFragment::class.java.simpleName, - ) - true - } - } - - private fun setReportABugClickListener() { - checkNotNull(findPreference(getString(R.string.pref_report_a_bug_key))).onPreferenceClickListener = - Preference.OnPreferenceClickListener { - val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(REPORT_A_BUG_URL)) - startActivity(browserIntent) - false - } - } - - private fun setShowLaucherIconClickListener() { - checkNotNull(findPreference(getString(R.string.pref_show_launcher_icon_key))) - .onPreferenceClickListener = Preference.OnPreferenceClickListener { preference -> - if ((preference as CheckBoxPreference).isChecked) { - enableComponent(true, LauncherActivity::class.java) - } else { - enableComponent(false, LauncherActivity::class.java) - } - true - } - } - - private fun updateCustomUrlPreferenceState(sharedPreferences: SharedPreferences) { - val onTouchValue = sharedPreferences.getString( - getString(R.string.pref_on_touch_key), - getString(R.string.on_touch_defaultValue), - ) - urlEditTextPreference.isEnabled = "url" == onTouchValue - } - - private fun setCustomDatePickerClickListener() { - customDatePicker.onPreferenceClickListener = Preference.OnPreferenceClickListener { - val newFragment = DatePickerFragment() - newFragment.show(parentFragmentManager, getString(R.string.pref_custom_date_key)) - true - } - } - - private fun updateAppVersion() { - val version: String - version = try { - val pi = - requireActivity().packageManager.getPackageInfo(requireActivity().packageName, 0) - pi.versionName - } catch (e: PackageManager.NameNotFoundException) { - Timber.e(e, "Package name not found") - getString(R.string.pref_info_version_error) - } - checkNotNull(findPreference(getString(R.string.pref_info_version_key))).summary = - version - } - - private fun updateUbuntuReleaseDate() { - val dateInstance = DateFormat.getDateInstance( - DateFormat.LONG, - Locale.getDefault(), - ).apply { - timeZone = TimeZone.getTimeZone("GMT") - } - val releaseDate = dateInstance.format(Utils.ubuntuReleaseDate.time) - checkNotNull(findPreference(getString(R.string.pref_default_release_date_key))) - .summary = releaseDate - } - - private fun enableComponent(enable: Boolean, class1: Class<*>) { - val componentName = ComponentName(requireContext(), class1) - requireContext().packageManager.setComponentEnabledSetting( - componentName, - if (enable) { - PackageManager.COMPONENT_ENABLED_STATE_ENABLED - } else { - PackageManager.COMPONENT_ENABLED_STATE_DISABLED - }, - PackageManager.DONT_KILL_APP, - ) - } - - companion object { - private const val REPORT_A_BUG_URL = - "https://github.com/leinardi/UbuntuCountdownWidget/issues" - } -} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/annotation/DevicePreviews.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/annotation/DevicePreviews.kt new file mode 100644 index 0000000..f881142 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/annotation/DevicePreviews.kt @@ -0,0 +1,82 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.annotation + +import android.content.res.Configuration +import androidx.compose.ui.tooling.preview.Preview + +/** + * Multipreview annotation that represents various device sizes. Add this annotation to a composable + * to render various devices. + */ +@Preview( + name = "1. Phone - Light theme", + device = "spec:shape=Normal,width=360,height=640,unit=dp,dpi=480", + uiMode = Configuration.UI_MODE_NIGHT_NO, + showBackground = true, + backgroundColor = 0xFFFBFCFF, +) +@Preview( + name = "2. Phone - Dark theme", + device = "spec:shape=Normal,width=360,height=640,unit=dp,dpi=480", + uiMode = Configuration.UI_MODE_NIGHT_YES, + showBackground = true, + backgroundColor = 0xFF001E2E, +) +@Preview( + name = "3. Landscape - Light theme", + device = "spec:shape=Normal,width=640,height=360,unit=dp,dpi=480", + uiMode = Configuration.UI_MODE_NIGHT_NO, + showBackground = true, + backgroundColor = 0xFFFBFCFF, +) +@Preview( + name = "4. Landscape - Dark theme", + device = "spec:shape=Normal,width=640,height=360,unit=dp,dpi=480", + uiMode = Configuration.UI_MODE_NIGHT_YES, + showBackground = true, + backgroundColor = 0xFF001E2E, +) +@Preview( + name = "5. Foldable - Light theme", + device = "spec:shape=Normal,width=673,height=841,unit=dp,dpi=480", + uiMode = Configuration.UI_MODE_NIGHT_NO, + showBackground = true, + backgroundColor = 0xFFFBFCFF, +) +@Preview( + name = "6. Foldable - Dark theme", + device = "spec:shape=Normal,width=673,height=841,unit=dp,dpi=480", + uiMode = Configuration.UI_MODE_NIGHT_YES, + showBackground = true, + backgroundColor = 0xFF001E2E, +) +@Preview( + name = "7. Tablet - Light theme", + device = "spec:shape=Normal,width=1280,height=800,unit=dp,dpi=480", + uiMode = Configuration.UI_MODE_NIGHT_NO, + showBackground = true, + backgroundColor = 0xFFFBFCFF, +) +@Preview( + name = "8. Tablet - Dark theme", + device = "spec:shape=Normal,width=1280,height=800,unit=dp,dpi=480", + uiMode = Configuration.UI_MODE_NIGHT_YES, + showBackground = true, + backgroundColor = 0xFF001E2E, +) +annotation class DevicePreviews diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/annotation/ThemePreviews.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/annotation/ThemePreviews.kt new file mode 100644 index 0000000..882c76e --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/annotation/ThemePreviews.kt @@ -0,0 +1,38 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.annotation + +import android.content.res.Configuration +import androidx.compose.ui.tooling.preview.Preview + +/** + * Multipreview annotation that represents light and dark themes. Add this annotation to a + * composable to render both themes. + */ +@Preview( + uiMode = Configuration.UI_MODE_NIGHT_NO, + name = "1. Light theme", + showBackground = true, + backgroundColor = 0xFFFBFCFF, +) +@Preview( + uiMode = Configuration.UI_MODE_NIGHT_YES, + name = "2. Dark theme", + showBackground = true, + backgroundColor = 0xFF001E2E, +) +annotation class ThemePreviews diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/appwidget/AppWidgetContent.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/appwidget/AppWidgetContent.kt new file mode 100644 index 0000000..de955c2 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/appwidget/AppWidgetContent.kt @@ -0,0 +1,162 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.appwidget + +import android.appwidget.AppWidgetManager +import androidx.compose.runtime.Composable +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.glance.GlanceModifier +import androidx.glance.GlanceTheme +import androidx.glance.Image +import androidx.glance.ImageProvider +import androidx.glance.LocalContext +import androidx.glance.LocalSize +import androidx.glance.action.ActionParameters +import androidx.glance.action.actionParametersOf +import androidx.glance.action.actionStartActivity +import androidx.glance.action.clickable +import androidx.glance.appwidget.CircularProgressIndicator +import androidx.glance.background +import androidx.glance.currentState +import androidx.glance.layout.Alignment +import androidx.glance.layout.Box +import androidx.glance.layout.ContentScale +import androidx.glance.layout.fillMaxSize +import androidx.glance.layout.padding +import androidx.glance.layout.size +import androidx.glance.layout.width +import androidx.glance.layout.wrapContentHeight +import androidx.glance.text.FontWeight +import androidx.glance.text.Text +import androidx.glance.text.TextAlign +import androidx.glance.text.TextDefaults +import com.leinardi.ubuntucountdownwidget.R +import com.leinardi.ubuntucountdownwidget.appwidget.AppWidgetState +import com.leinardi.ubuntucountdownwidget.ui.configuration.AppWidgetConfigurationActivity +import com.leinardi.ubuntucountdownwidget.ui.theme.AppGlanceTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.textDark +import com.leinardi.ubuntucountdownwidget.ui.theme.textLight + +@Composable +fun AppWidgetContent( + modifier: GlanceModifier = GlanceModifier, +) { + val state = currentState() + AppGlanceTheme(darkTheme = false) { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + val size = with(LocalSize.current) { minOf(width, height) } + Box( + modifier = GlanceModifier + .size(size, size) + .background( + if (state.darkTheme) { + ImageProvider(R.drawable.background_dark) + } else { + ImageProvider(R.drawable.background_light) + }, + ) + .clickable( + actionStartActivity( + actionParametersOf( + ActionParameters.Key(AppWidgetManager.EXTRA_APPWIDGET_ID) to state.appWidgetId, + ), + ), + ), + contentAlignment = Alignment.Center, + ) { + when (state) { + is AppWidgetState.ComingSoon -> Image( + provider = ImageProvider(R.drawable.ubuntu_logo_circle), + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = GlanceModifier + .padding(bottom = size.value.dp / 6) + .wrapContentHeight() + .width(size.value.dp / 1.8f), + ) + + is AppWidgetState.DaysLeft -> Text( + text = state.daysLeft.toString(), + style = TextDefaults.defaultTextStyle.copy( + color = GlanceTheme.colors.primary, + fontSize = size.value.sp / 3, + fontWeight = FontWeight.Bold, + textAlign = TextAlign.Center, + ), + ) + + is AppWidgetState.ItIsHere -> Text( + text = state.releaseNumber, + style = TextDefaults.defaultTextStyle.copy( + color = GlanceTheme.colors.primary, + fontSize = size.value.sp / 3.1f, + fontWeight = FontWeight.Bold, + textAlign = TextAlign.Center, + ), + ) + + is AppWidgetState.Unavailable -> CircularProgressIndicator() + } + } + if (state is AppWidgetState.DaysLeft || state is AppWidgetState.ItIsHere) { + Box( + modifier = GlanceModifier.size(size, size), + contentAlignment = Alignment.TopCenter, + ) { + Image( + provider = if (state.darkTheme) { + ImageProvider( + R.drawable.ubuntu_logo_dark, + ) + } else { + ImageProvider(R.drawable.ubuntu_logo_light) + }, + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = GlanceModifier + .padding(top = size.value.dp / 16) + .wrapContentHeight() + .width(size.value.dp / 1.8f), + ) + } + } + Box( + modifier = GlanceModifier.size(size, size), + contentAlignment = Alignment.BottomCenter, + ) { + Text( + text = when (state) { + is AppWidgetState.ComingSoon -> LocalContext.current.getString(R.string.coming_soon) + is AppWidgetState.DaysLeft -> LocalContext.current.getString(R.string.days_left) + is AppWidgetState.ItIsHere -> LocalContext.current.getString(R.string.its_here) + is AppWidgetState.Unavailable -> "" + }, + modifier = GlanceModifier.padding(bottom = size.value.dp / 10), + style = TextDefaults.defaultTextStyle.copy( + color = if (state.darkTheme) GlanceTheme.colors.textDark else GlanceTheme.colors.textLight, + fontSize = size.value.sp / 8, + textAlign = TextAlign.Center, + ), + ) + } + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/base/BaseViewModel.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/base/BaseViewModel.kt new file mode 100644 index 0000000..fd7620f --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/base/BaseViewModel.kt @@ -0,0 +1,90 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.base + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.launch +import java.util.concurrent.atomic.AtomicInteger + +abstract class BaseViewModel : ViewModel() { + // State (current state of views) + // Everything is lazy in order to be able to use SavedStateHandle as initial value + private val initialState: UiState by lazy { provideInitialState() } + private val _viewState: MutableState by lazy { mutableStateOf(initialState) } + val viewState: State by lazy { _viewState } + + private val runningJobs = AtomicInteger(0) + + // Event (user actions) + private val _event: MutableSharedFlow = MutableSharedFlow() + + // Effect (side effects like error messages which we want to show only once) + private val _effect: Channel = Channel() + val effect = _effect.receiveAsFlow() + + init { + _event.onEach { + handleEvent(it) + }.launchIn(viewModelScope) + } + + abstract fun provideInitialState(): UiState + + open fun onLoadingChanged(loading: Boolean) {} + + protected fun updateState(reducer: UiState.() -> UiState) { + val newState = viewState.value.reducer() + _viewState.value = newState + } + + fun onUiEvent(event: UiEvent) { + viewModelScope.launch { _event.emit(event) } + } + + abstract fun handleEvent(event: UiEvent) + + protected fun sendEffect(effectBuilder: () -> UiEffect) { + viewModelScope.launch { _effect.send(effectBuilder()) } + } + + protected suspend fun load(block: suspend () -> Unit) { + require(runningJobs.get() >= 0) + if (runningJobs.get() == 0) { + onLoadingChanged(true) + } + runningJobs.incrementAndGet() + block() + if (runningJobs.decrementAndGet() == 0) { + onLoadingChanged(false) + } + } +} + +interface ViewState + +interface ViewEvent + +interface ViewEffect diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/DatePickerDialog.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/DatePickerDialog.kt new file mode 100644 index 0000000..6e850b8 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/DatePickerDialog.kt @@ -0,0 +1,84 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.component + +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.DatePickerDefaults +import androidx.compose.material3.DatePickerDialog +import androidx.compose.material3.DisplayMode +import androidx.compose.material3.SelectableDates +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.rememberDatePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import com.leinardi.ubuntucountdownwidget.ui.annotation.ThemePreviews +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.Spacing + +@Composable +fun DatePickerDialog( + show: Boolean, + onPositiveButtonClick: (Long?) -> Unit, + modifier: Modifier = Modifier, + selection: Long? = null, + selectableDates: SelectableDates = object : SelectableDates {}, + yearRange: IntRange = DatePickerDefaults.YearRange, + initialDisplayMode: DisplayMode = DisplayMode.Picker, + onNegativeButtonClick: (() -> Unit)? = null, + onDismissRequest: (() -> Unit)? = null, +) { + if (show) { + val datePickerState = rememberDatePickerState( + initialSelectedDateMillis = selection, + yearRange = yearRange, + initialDisplayMode = initialDisplayMode, + selectableDates = selectableDates, + ) + val confirmEnabled = remember { derivedStateOf { datePickerState.selectedDateMillis != null } } + DatePickerDialog( + onDismissRequest = { onDismissRequest?.invoke() }, + confirmButton = { + TextButton( + onClick = { onPositiveButtonClick(datePickerState.selectedDateMillis) }, + enabled = confirmEnabled.value, + ) { + Text(stringResource(android.R.string.ok)) + } + }, + modifier = modifier.padding(horizontal = Spacing.x08), + dismissButton = { + TextButton(onClick = { onNegativeButtonClick?.invoke() }) { + Text(stringResource(android.R.string.cancel)) + } + }, + ) { + androidx.compose.material3.DatePicker(state = datePickerState) + } + } +} + +@ThemePreviews +@Composable +private fun PreviewDatePickerDialog() { + AppTheme { + DatePickerDialog(show = true, onPositiveButtonClick = {}) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/NavHostController.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/NavHostController.kt new file mode 100644 index 0000000..da1ad15 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/NavHostController.kt @@ -0,0 +1,25 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.component + +import androidx.compose.runtime.ProvidableCompositionLocal +import androidx.compose.runtime.compositionLocalOf +import androidx.navigation.NavHostController + +val LocalNavHostController: ProvidableCompositionLocal = compositionLocalOf { error("No NavHostController provided") } + +fun NavHostController.setResult(key: String, value: T): Boolean = previousBackStackEntry?.run { savedStateHandle[key] = value } != null diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/Placeholder.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/Placeholder.kt new file mode 100644 index 0000000..66e9a5e --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/Placeholder.kt @@ -0,0 +1,51 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.component + +import androidx.compose.animation.core.spring +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.contentColorFor +import androidx.compose.ui.Modifier +import androidx.compose.ui.composed +import com.google.accompanist.placeholder.PlaceholderDefaults +import com.google.accompanist.placeholder.PlaceholderHighlight +import com.google.accompanist.placeholder.fade +import com.google.accompanist.placeholder.material3.color +import com.google.accompanist.placeholder.material3.fadeHighlightColor +import com.google.accompanist.placeholder.placeholder + +// Switch from placeholder foundation to placeholder material once it will support Material 3 +// https://github.com/google/accompanist/issues/1151 +fun Modifier.placeholder( + visible: Boolean, +): Modifier = composed { + val containerColor = MaterialTheme.colorScheme.surface + Modifier.placeholder( + visible = visible, + color = PlaceholderDefaults.color( + backgroundColor = containerColor, + contentColor = contentColorFor(containerColor), + ), + shape = MaterialTheme.shapes.small, + highlight = PlaceholderHighlight.fade( + highlightColor = PlaceholderDefaults.fadeHighlightColor(backgroundColor = containerColor), + animationSpec = PlaceholderDefaults.fadeAnimationSpec, + ), + placeholderFadeTransitionSpec = { spring() }, + contentFadeTransitionSpec = { spring() }, + ) +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsCategory.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsCategory.kt new file mode 100644 index 0000000..79e88bb --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsCategory.kt @@ -0,0 +1,135 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.ContentAlpha +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import com.leinardi.ubuntucountdownwidget.ui.annotation.ThemePreviews +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.Spacing + +@Composable +fun SettingsCategory( + title: @Composable () -> Unit, + modifier: Modifier = Modifier, + icon: (@Composable () -> Unit)? = null, + subtitle: (@Composable () -> Unit)? = null, + selected: Boolean = false, + enabled: Boolean = true, + onClick: () -> Unit = {}, +) { + Box(modifier = modifier) { + val alpha = if (enabled) 1f else ContentAlpha.disabled + Row( + modifier = Modifier + .fillMaxWidth() + .defaultMinSize(minHeight = 48.dp) + .padding(horizontal = Spacing.x01, vertical = Spacing.quarter) + .clip(CardDefaults.shape) + .then(if (selected) Modifier.background(MaterialTheme.colorScheme.secondaryContainer) else Modifier) + .clickable(enabled = enabled, onClick = onClick) + .padding(vertical = Spacing.x01) + .alpha(alpha), + verticalAlignment = Alignment.CenterVertically, + ) { + if (icon != null) { + SettingsTileIcon(icon = icon) + } else { + Spacer(modifier = Modifier.size(Spacing.x02)) + } + SettingsTileTexts(title = title, subtitle = subtitle) + } + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsCategory() { + AppTheme { + SettingsCategory( + title = { Text(text = "Hello") }, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsCategorySubtitle() { + AppTheme { + SettingsCategory( + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsCategorySelected() { + AppTheme { + SettingsCategory( + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + selected = true, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsCategoryIcon() { + AppTheme { + SettingsCategory( + icon = { Icon(imageVector = Icons.Default.Lock, contentDescription = "Lock") }, + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsCategoryIconSelected() { + AppTheme { + SettingsCategory( + icon = { Icon(imageVector = Icons.Default.Lock, contentDescription = "Lock") }, + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + selected = true, + ) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsGroup.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsGroup.kt new file mode 100644 index 0000000..695f5b3 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsGroup.kt @@ -0,0 +1,83 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.component + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ProvideTextStyle +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.leinardi.ubuntucountdownwidget.ui.annotation.ThemePreviews +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.Spacing + +@Composable +fun SettingsGroup( + modifier: Modifier = Modifier, + title: @Composable (() -> Unit)? = null, + content: @Composable ColumnScope.() -> Unit, +) { + Column(modifier = modifier.fillMaxWidth()) { + if (title != null) { + SettingsGroupTitle(title) + } + content() + } +} + +@Composable +internal fun SettingsGroupTitle( + title: @Composable () -> Unit, +) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(start = Spacing.x02, top = Spacing.x03, end = Spacing.x02, bottom = Spacing.x01), + contentAlignment = Alignment.CenterStart, + ) { + val primary = MaterialTheme.colorScheme.primary + val titleStyle = MaterialTheme.typography.titleSmall.copy(color = primary) + ProvideTextStyle(value = titleStyle) { title() } + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsGroup() { + AppTheme { + SettingsGroup( + title = { Text(text = "Title") }, + ) { + Box( + modifier = Modifier + .heightIn(64.dp) + .fillMaxWidth(), + contentAlignment = Alignment.Center, + ) { + Text(text = "Settings group") + } + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsMenuLink.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsMenuLink.kt new file mode 100644 index 0000000..c44d367 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsMenuLink.kt @@ -0,0 +1,158 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.component + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.ContentAlpha +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material3.Checkbox +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.material3.VerticalDivider +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.unit.dp +import com.leinardi.ubuntucountdownwidget.ui.annotation.ThemePreviews +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.Spacing + +@Composable +fun SettingsMenuLink( + title: @Composable () -> Unit, + modifier: Modifier = Modifier, + icon: (@Composable () -> Unit)? = null, + subtitle: (@Composable () -> Unit)? = null, + action: (@Composable () -> Unit)? = null, + enabled: Boolean = true, + onClick: () -> Unit = {}, +) { + val alpha = if (enabled) 1f else ContentAlpha.disabled + Row( + modifier = modifier + .fillMaxWidth() + .defaultMinSize(minHeight = 48.dp) + .clickable(enabled = enabled, onClick = onClick) + .padding(vertical = Spacing.x01) + .alpha(alpha), + verticalAlignment = Alignment.CenterVertically, + ) { + if (icon != null) { + SettingsTileIcon(icon = icon) + } else { + Spacer(modifier = Modifier.size(Spacing.x02)) + } + SettingsTileTexts(title = title, subtitle = subtitle) + if (action != null) { + VerticalDivider( + modifier = Modifier + .padding(vertical = Spacing.half) + .height(56.dp), + ) + SettingsTileAction { + action.invoke() + } + } + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsMenuLink() { + AppTheme { + SettingsMenuLink( + title = { Text(text = "Hello") }, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsMenuLinkSubtitle() { + AppTheme { + SettingsMenuLink( + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsMenuLinkAction() { + var rememberCheckBoxState by remember { mutableStateOf(true) } + AppTheme { + SettingsMenuLink( + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + action = { + Checkbox( + checked = rememberCheckBoxState, + onCheckedChange = { newState -> + rememberCheckBoxState = newState + }, + ) + }, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsMenuLinkIcon() { + AppTheme { + SettingsMenuLink( + icon = { Icon(imageVector = Icons.Default.Lock, contentDescription = "Lock") }, + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsMenuLinkIconAction() { + var rememberCheckBoxState by remember { mutableStateOf(true) } + AppTheme { + SettingsMenuLink( + icon = { Icon(imageVector = Icons.Default.Lock, contentDescription = "Lock") }, + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + action = { + Checkbox( + checked = rememberCheckBoxState, + onCheckedChange = { newState -> + rememberCheckBoxState = newState + }, + ) + }, + ) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsMenuSwitch.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsMenuSwitch.kt new file mode 100644 index 0000000..005f627 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsMenuSwitch.kt @@ -0,0 +1,93 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.component + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.selection.toggleable +import androidx.compose.material.ContentAlpha +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.unit.dp +import com.leinardi.ubuntucountdownwidget.ui.annotation.ThemePreviews +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.Spacing + +@Composable +fun SettingsMenuSwitch( + title: @Composable () -> Unit, + checked: Boolean, + onCheckedChange: ((Boolean) -> Unit), + modifier: Modifier = Modifier, + icon: (@Composable () -> Unit)? = null, + subtitle: (@Composable () -> Unit)? = null, + enabled: Boolean = true, +) { + val alpha = if (enabled) 1f else ContentAlpha.disabled + Row( + modifier = modifier + .fillMaxWidth() + .defaultMinSize(minHeight = 48.dp) + .toggleable(enabled = enabled, value = checked, onValueChange = onCheckedChange) + .padding(vertical = Spacing.x01) + .alpha(alpha), + verticalAlignment = Alignment.CenterVertically, + ) { + if (icon != null) { + SettingsTileIcon(icon = icon) + } else { + Spacer(modifier = Modifier.size(Spacing.x02)) + } + SettingsTileTexts(title = title, subtitle = subtitle) + SettingsTileAction { + Switch(checked = checked, onCheckedChange = onCheckedChange, modifier = Modifier.padding(end = Spacing.x01)) + } + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsMenuSwitchOn() { + AppTheme { + SettingsMenuSwitch( + checked = true, + onCheckedChange = {}, + title = { Text(text = "Hello") }, + ) + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsMenuSwitchOff() { + AppTheme { + SettingsMenuSwitch( + checked = false, + onCheckedChange = {}, + title = { Text(text = "Hello") }, + subtitle = { Text(text = "This is a longer text") }, + ) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsTile.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsTile.kt new file mode 100644 index 0000000..5e04fc1 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/component/SettingsTile.kt @@ -0,0 +1,126 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.component + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Star +import androidx.compose.material3.Icon +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ProvideTextStyle +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.leinardi.ubuntucountdownwidget.ui.annotation.ThemePreviews +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.Spacing + +@Composable +internal fun SettingsTileAction( + modifier: Modifier = Modifier, + content: @Composable () -> Unit, +) { + Box( + modifier = Modifier + .size(64.dp) + .then(modifier), + contentAlignment = Alignment.Center, + ) { + content() + } +} + +@Composable +internal fun SettingsTileIcon( + modifier: Modifier = Modifier, + icon: @Composable (() -> Unit)? = null, +) { + Box( + modifier = modifier.size(64.dp), + contentAlignment = Alignment.Center, + ) { + if (icon != null) { + CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurfaceVariant) { + icon() + } + } + } +} + +@Composable +internal fun SettingsTileTitle(title: @Composable () -> Unit) { + CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurface) { + ProvideTextStyle(value = MaterialTheme.typography.titleLarge) { + title() + } + } +} + +@Composable +internal fun RowScope.SettingsTileTexts( + title: @Composable () -> Unit, + subtitle: @Composable (() -> Unit)?, +) { + Column( + modifier = Modifier + .weight(1f) + .padding(top = 12.dp, end = Spacing.x01, bottom = 12.dp), + verticalArrangement = Arrangement.Center, + ) { + SettingsTileTitle(title) + if (subtitle != null) { + Spacer(modifier = Modifier.size(2.dp)) + SettingsTileSubtitle(subtitle) + } + } +} + +@Composable +internal fun SettingsTileSubtitle(subtitle: @Composable () -> Unit) { + ProvideTextStyle(value = MaterialTheme.typography.bodyMedium) { + CompositionLocalProvider(LocalContentColor provides MaterialTheme.colorScheme.onSurfaceVariant) { + subtitle() + } + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsIcon() { + AppTheme { + SettingsTileIcon { + Icon(imageVector = Icons.Default.Star, contentDescription = "") + } + } +} + +@ThemePreviews +@Composable +private fun PreviewSettingsIconPreviewEmpty() { + AppTheme { + SettingsTileIcon() + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationActivity.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationActivity.kt new file mode 100644 index 0000000..7e07ccf --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationActivity.kt @@ -0,0 +1,117 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.configuration + +import android.appwidget.AppWidgetManager +import android.content.Intent +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.appcompat.app.AppCompatActivity +import androidx.compose.runtime.CompositionLocalProvider +import androidx.core.view.WindowCompat +import androidx.glance.appwidget.GlanceAppWidgetManager +import androidx.glance.appwidget.state.updateAppWidgetState +import androidx.glance.appwidget.updateAll +import androidx.lifecycle.lifecycleScope +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import com.leinardi.ubuntucountdownwidget.appwidget.AppWidget +import com.leinardi.ubuntucountdownwidget.appwidget.AppWidgetStateDefinition +import com.leinardi.ubuntucountdownwidget.appwidget.AppWidgetStateProvider +import com.leinardi.ubuntucountdownwidget.ui.component.LocalNavHostController +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject + +@AndroidEntryPoint +class AppWidgetConfigurationActivity : + AppCompatActivity() { // AppCompatActivity is needed to be able to toggle Day/Night programmatically + @Inject lateinit var appWidgetStateProvider: AppWidgetStateProvider + + @Inject lateinit var glanceAppWidgetManager: GlanceAppWidgetManager + private var appWidgetId: Int = AppWidgetManager.INVALID_APPWIDGET_ID + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + appWidgetId = getAppWidgetId() + + if (setWidgetConfiguredResult()) { + return + } + + WindowCompat.setDecorFitsSystemWindows(window, false) + setContent { + AppTheme(dynamicColor = true) { + val navHostController: NavHostController = rememberNavController() + CompositionLocalProvider( + LocalNavHostController provides navHostController, + ) { + NavHost(navController = navHostController, startDestination = AppWidgetConfigurationDestination.MAIN.route) { + AppWidgetConfigurationDestination.values().forEach { category -> + composable(route = category.route) { + category.composable(this, it) + } + } + } + } + } + } + } + + override fun onPause() { + super.onPause() + setWidgetConfiguredResult() + } + + private fun setWidgetConfiguredResult(): Boolean { + // If this activity was started with an intent without an app widget ID, finish with an error. + if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { + setResult(RESULT_CANCELED) + finish() + return true + } + + // Update the app widgets + updateWidgets() + + // Make sure we pass back the original appWidgetId + val resultValue = Intent() + resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) + setResult(RESULT_OK, resultValue) + return false + } + + private fun getAppWidgetId() = intent?.extras?.getInt( + AppWidgetManager.EXTRA_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID, + ) ?: AppWidgetManager.INVALID_APPWIDGET_ID + + private fun updateWidgets() { + lifecycleScope.launch { + glanceAppWidgetManager.getGlanceIds(AppWidget::class.java).forEach { glanceId -> + updateAppWidgetState( + context = this@AppWidgetConfigurationActivity, + definition = AppWidgetStateDefinition, + glanceId = glanceId, + ) { appWidgetStateProvider.get(glanceAppWidgetManager.getAppWidgetId(glanceId)) } + } + AppWidget().updateAll(this@AppWidgetConfigurationActivity.applicationContext) + } + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationContract.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationContract.kt new file mode 100644 index 0000000..c07f18d --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationContract.kt @@ -0,0 +1,45 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.configuration + +import androidx.compose.runtime.Immutable +import com.leinardi.ubuntucountdownwidget.ui.base.ViewEffect +import com.leinardi.ubuntucountdownwidget.ui.base.ViewEvent +import com.leinardi.ubuntucountdownwidget.ui.base.ViewState +import java.time.LocalDate + +@Immutable +object AppWidgetConfigurationContract { + data class State( + val releaseDate: LocalDate? = null, + val useCustomDate: Boolean = false, + val customDate: LocalDate = LocalDate.now(), + val useDarkTheme: Boolean = false, + val showLauncherIcon: Boolean = true, + val version: String = "", + ) : ViewState + + sealed class Event : ViewEvent { + data class OnCustomDateSelected(val date: LocalDate) : Event() + data class OnShowLauncherIconChanged(val enabled: Boolean) : Event() + data class OnUseCustomDateChanged(val enabled: Boolean) : Event() + data class OnUseDarkThemeChanged(val enabled: Boolean) : Event() + data object OnBugReportClicked : Event() + } + + sealed class Effect : ViewEffect +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationDestination.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationDestination.kt new file mode 100644 index 0000000..5362e0b --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationDestination.kt @@ -0,0 +1,41 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.configuration + +import androidx.compose.animation.AnimatedContentScope +import androidx.compose.runtime.Composable +import androidx.navigation.NavBackStackEntry +import com.leinardi.ubuntucountdownwidget.ui.opensourcelibraries.OpenSourceLibrariesScreen + +enum class AppWidgetConfigurationDestination( + val route: String, + val composable: @Composable AnimatedContentScope.(backStackEntry: NavBackStackEntry) -> Unit, +) { + MAIN( + route = CategoryDestinations.MAIN_ROUTE, + composable = { AppWidgetConfigurationScreen() }, + ), + OPEN_SOURCE_LICENSES( + route = CategoryDestinations.OPEN_SOURCE_LICENSES_ROUTE, + composable = { OpenSourceLibrariesScreen() }, + ); + + private object CategoryDestinations { + const val MAIN_ROUTE = "general" + const val OPEN_SOURCE_LICENSES_ROUTE = "appearance" + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationScreen.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationScreen.kt new file mode 100644 index 0000000..8dd81a4 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationScreen.kt @@ -0,0 +1,217 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.configuration + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.consumeWindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.material3.LargeTopAppBar +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.res.stringResource +import androidx.hilt.navigation.compose.hiltViewModel +import com.leinardi.ubuntucountdownwidget.R +import com.leinardi.ubuntucountdownwidget.ext.toLocalizedDate +import com.leinardi.ubuntucountdownwidget.ui.annotation.DevicePreviews +import com.leinardi.ubuntucountdownwidget.ui.component.DatePickerDialog +import com.leinardi.ubuntucountdownwidget.ui.component.LocalNavHostController +import com.leinardi.ubuntucountdownwidget.ui.component.SettingsGroup +import com.leinardi.ubuntucountdownwidget.ui.component.SettingsMenuLink +import com.leinardi.ubuntucountdownwidget.ui.component.SettingsMenuSwitch +import com.leinardi.ubuntucountdownwidget.ui.component.placeholder +import com.leinardi.ubuntucountdownwidget.ui.configuration.AppWidgetConfigurationContract.Event +import com.leinardi.ubuntucountdownwidget.ui.configuration.AppWidgetConfigurationContract.State +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.settingsContainer +import com.leinardi.ubuntucountdownwidget.ui.theme.settingsContent +import java.time.Instant +import java.time.LocalDate +import java.time.ZoneId +import java.time.ZoneOffset + +@Composable +fun AppWidgetConfigurationScreen(viewModel: AppWidgetConfigurationViewModel = hiltViewModel()) { + AppWidgetConfigurationScreen( + state = viewModel.viewState.value, + sendEvent = { viewModel.onUiEvent(it) }, + ) +} + +@Composable +fun AppWidgetConfigurationScreen( + state: State, + sendEvent: (event: Event) -> Unit, + modifier: Modifier = Modifier, + contentPadding: PaddingValues = PaddingValues(), +) { + val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() + Scaffold( + modifier = modifier + .nestedScroll(scrollBehavior.nestedScrollConnection) + .padding(contentPadding) + .consumeWindowInsets(contentPadding) + .navigationBarsPadding(), + containerColor = MaterialTheme.colorScheme.settingsContainer, + contentColor = MaterialTheme.colorScheme.settingsContent, + topBar = { + LargeTopAppBar( + title = { Text(stringResource(R.string.app_name)) }, + colors = TopAppBarDefaults.largeTopAppBarColors(containerColor = MaterialTheme.colorScheme.settingsContainer), + scrollBehavior = scrollBehavior, + ) + }, + ) { scaffoldPadding -> + val dueDatePickerVisible = rememberSaveable { mutableStateOf(false) } + LazyColumn( + modifier = Modifier.fillMaxSize(), + contentPadding = scaffoldPadding, + ) { + countdownItems(state, sendEvent, dueDatePickerVisible) + launcherItems(state, sendEvent) + infoItems(state, sendEvent) + } + DatePickerDialog( + show = dueDatePickerVisible.value, + onPositiveButtonClick = { epochInMilli -> + epochInMilli?.let { sendEvent(Event.OnCustomDateSelected(Instant.ofEpochMilli(it).atZone(ZoneId.systemDefault()).toLocalDate())) } + dueDatePickerVisible.value = false + }, + selection = state.customDate.atStartOfDay(ZoneOffset.UTC).toInstant().toEpochMilli(), + onNegativeButtonClick = { + dueDatePickerVisible.value = false + }, + onDismissRequest = { + dueDatePickerVisible.value = false + }, + ) + } +} + +private fun LazyListScope.countdownItems( + state: State, + sendEvent: (event: Event) -> Unit, + dueDatePickerVisible: MutableState, +) { + item { + SettingsGroup( + title = { Text(stringResource(R.string.pref_countdown_options)) }, + ) {} + } + item(contentType = "SettingsMenuLink") { + SettingsMenuLink( + title = { Text(stringResource(R.string.pref_default_release_date)) }, + subtitle = { Text(text = (state.releaseDate ?: LocalDate.now()).toLocalizedDate()) }, + enabled = false, + modifier = Modifier.placeholder(state.releaseDate == null), + ) + } + item(contentType = "SettingsMenuSwitch") { + SettingsMenuSwitch( + title = { Text(stringResource(R.string.pref_custom_date_checkbox)) }, + checked = state.useCustomDate, + onCheckedChange = { sendEvent(Event.OnUseCustomDateChanged(it)) }, + subtitle = { Text(stringResource(R.string.pref_custom_date_checkbox_summary)) }, + ) + } + item(contentType = "SettingsMenuLink") { + SettingsMenuLink( + title = { Text(stringResource(R.string.pref_custom_date)) }, + subtitle = { Text(text = state.customDate.toLocalizedDate()) }, + enabled = state.useCustomDate, + onClick = { dueDatePickerVisible.value = true }, + ) + } + item(contentType = "SettingsMenuSwitch") { + SettingsMenuSwitch( + title = { Text(stringResource(R.string.pref_use_dark_theme)) }, + checked = state.useDarkTheme, + onCheckedChange = { sendEvent(Event.OnUseDarkThemeChanged(it)) }, + subtitle = { Text(stringResource(R.string.pref_use_dark_theme_summary)) }, + ) + } +} + +private fun LazyListScope.launcherItems( + state: State, + sendEvent: (event: Event) -> Unit, +) { + item { + SettingsGroup( + title = { Text(stringResource(R.string.pref_launcher_options)) }, + ) {} + } + item(contentType = "SettingsMenuSwitch") { + SettingsMenuSwitch( + title = { Text(stringResource(R.string.pref_show_launcher_icon)) }, + checked = state.showLauncherIcon, + onCheckedChange = { sendEvent(Event.OnShowLauncherIconChanged(it)) }, + subtitle = { Text(stringResource(R.string.pref_show_launcher_icon_summary)) }, + ) + } +} + +private fun LazyListScope.infoItems( + state: State, + sendEvent: (event: Event) -> Unit, +) { + item { + SettingsGroup( + title = { Text(stringResource(R.string.info)) }, + ) {} + } + item(contentType = "SettingsMenuLink") { + SettingsMenuLink( + title = { Text(stringResource(R.string.pref_info_version)) }, + subtitle = { Text(text = state.version) }, + enabled = false, + ) + } + item(contentType = "SettingsMenuLink") { + SettingsMenuLink( + title = { Text(stringResource(R.string.pref_report_a_bug)) }, + subtitle = { Text(stringResource(R.string.pref_report_a_bug_summary)) }, + onClick = { sendEvent(Event.OnBugReportClicked) }, + ) + } + item(contentType = "SettingsMenuLink") { + val navHost = LocalNavHostController.current + SettingsMenuLink( + title = { Text(stringResource(R.string.open_source_licenses)) }, + onClick = { navHost.navigate(AppWidgetConfigurationDestination.OPEN_SOURCE_LICENSES.route) { launchSingleTop = true } }, + ) + } +} + +@DevicePreviews +@Composable +fun PreviewAppWidgetConfigurationScreen() { + AppTheme { + AppWidgetConfigurationScreen(State(LocalDate.now()), {}) + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationViewModel.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationViewModel.kt new file mode 100644 index 0000000..a4e0131 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/configuration/AppWidgetConfigurationViewModel.kt @@ -0,0 +1,96 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.configuration + +import androidx.lifecycle.viewModelScope +import com.leinardi.ubuntucountdownwidget.interactor.GetAppVersionInteractor +import com.leinardi.ubuntucountdownwidget.interactor.GetCustomDateStreamInteractor +import com.leinardi.ubuntucountdownwidget.interactor.GetReleaseDateInteractor +import com.leinardi.ubuntucountdownwidget.interactor.GetUseCustomDateStreamInteractor +import com.leinardi.ubuntucountdownwidget.interactor.GetUseDarkThemeStreamInteractor +import com.leinardi.ubuntucountdownwidget.interactor.OpenUrlInWebBrowserInteractor +import com.leinardi.ubuntucountdownwidget.interactor.ReadShowLauncherIconInteractor +import com.leinardi.ubuntucountdownwidget.interactor.StoreCustomDateInteractor +import com.leinardi.ubuntucountdownwidget.interactor.StoreShowLauncherIconInteractor +import com.leinardi.ubuntucountdownwidget.interactor.StoreUseCustomDateInteractor +import com.leinardi.ubuntucountdownwidget.interactor.StoreUseDarkThemeInteractor +import com.leinardi.ubuntucountdownwidget.ui.base.BaseViewModel +import com.leinardi.ubuntucountdownwidget.ui.configuration.AppWidgetConfigurationContract.Effect +import com.leinardi.ubuntucountdownwidget.ui.configuration.AppWidgetConfigurationContract.Event +import com.leinardi.ubuntucountdownwidget.ui.configuration.AppWidgetConfigurationContract.State +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class AppWidgetConfigurationViewModel @Inject constructor( + getCustomDateStreamInteractor: GetCustomDateStreamInteractor, + getUseCustomDateStreamInteractor: GetUseCustomDateStreamInteractor, + getUseDarkThemeStreamInteractor: GetUseDarkThemeStreamInteractor, + private val getAppVersionInteractor: GetAppVersionInteractor, + private val getReleaseDateInteractor: GetReleaseDateInteractor, + private val readShowLauncherIconInteractor: ReadShowLauncherIconInteractor, + private val openUrlInWebBrowserInteractor: OpenUrlInWebBrowserInteractor, + private val storeCustomDateInteractor: StoreCustomDateInteractor, + private val storeUseCustomDateInteractor: StoreUseCustomDateInteractor, + private val storeUseDarkThemeInteractor: StoreUseDarkThemeInteractor, + private val storeShowLauncherIconInteractor: StoreShowLauncherIconInteractor, +) : BaseViewModel() { + init { + viewModelScope.launch { + val releaseDate = getReleaseDateInteractor() + updateState { copy(releaseDate = releaseDate) } + } + getCustomDateStreamInteractor().onEach { + updateState { copy(customDate = it) } + }.launchIn(viewModelScope) + getUseCustomDateStreamInteractor().onEach { + updateState { copy(useCustomDate = it) } + }.launchIn(viewModelScope) + getUseDarkThemeStreamInteractor().onEach { + updateState { copy(useDarkTheme = it) } + }.launchIn(viewModelScope) + } + + override fun provideInitialState() = State( + showLauncherIcon = readShowLauncherIconInteractor(), + version = getAppVersionInteractor(), + ) + + override fun handleEvent(event: Event) { + viewModelScope.launch { + when (event) { + is Event.OnBugReportClicked -> openUrlInWebBrowserInteractor(REPORT_A_BUG_URL) + is Event.OnCustomDateSelected -> storeCustomDateInteractor(event.date) + is Event.OnShowLauncherIconChanged -> handleOnShowLauncherIconChanged(event.enabled) + is Event.OnUseCustomDateChanged -> storeUseCustomDateInteractor(event.enabled) + is Event.OnUseDarkThemeChanged -> storeUseDarkThemeInteractor(event.enabled) + } + } + } + + private fun handleOnShowLauncherIconChanged(enabled: Boolean) { + storeShowLauncherIconInteractor(enabled) + updateState { copy(showLauncherIcon = readShowLauncherIconInteractor()) } + } + + companion object { + private const val REPORT_A_BUG_URL = "https://github.com/leinardi/UbuntuCountdownWidget/issues" + } +} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/ChangelogDialogFragment.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/ChangelogDialogFragment.kt deleted file mode 100644 index 07f2e1d..0000000 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/ChangelogDialogFragment.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -package com.leinardi.ubuntucountdownwidget.ui.dialogs - -import android.app.Dialog -import android.os.Bundle -import android.view.View -import androidx.appcompat.app.AlertDialog -import androidx.fragment.app.DialogFragment -import com.leinardi.ubuntucountdownwidget.R - -class ChangelogDialogFragment : DialogFragment() { - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val changelogView = View.inflate(activity, R.layout.dialog_changelog, null) - return AlertDialog.Builder(requireContext(), R.style.AppCompatAlertDialogTheme) - .setTitle(R.string.changelog_title) - .setView(changelogView) - .setPositiveButton(R.string.close) { _, _ -> dismiss() } - .create() - } -} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/DatePickerFragment.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/DatePickerFragment.kt deleted file mode 100644 index 2dbd815..0000000 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/DatePickerFragment.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -package com.leinardi.ubuntucountdownwidget.ui.dialogs - -import android.app.DatePickerDialog -import android.app.Dialog -import android.content.SharedPreferences -import android.os.Bundle -import android.widget.DatePicker -import androidx.fragment.app.DialogFragment -import androidx.preference.PreferenceManager -import com.leinardi.ubuntucountdownwidget.R -import com.leinardi.ubuntucountdownwidget.utils.Utils -import java.util.Calendar - -class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener { - private val sharedPreferences: SharedPreferences by lazy { - PreferenceManager.getDefaultSharedPreferences( - requireContext(), - ) - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - // Use the current date as the default date in the picker - val calendar = getPersistedCalendar(DEFAULT_VALUE) - val year = calendar[Calendar.YEAR] - val month = calendar[Calendar.MONTH] - val day = calendar[Calendar.DAY_OF_MONTH] - - // Create a new instance of DatePickerDialog and return it - return DatePickerDialog(requireContext(), this, year, month, day) - } - - override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) { - val calendar = Calendar.getInstance() - calendar[year, month, day, 0, 0] = 0 - persistLong(calendar.timeInMillis) - } - - private fun getPersistedLong(defaultReturnValue: Long) = - sharedPreferences.getLong(getString(R.string.pref_custom_date_key), defaultReturnValue) - - private fun persistLong(value: Long): Boolean { - if (value == getPersistedLong(value.inv())) { - // It's already there, so the same as persisting - return true - } - val editor = sharedPreferences.edit() - editor.putLong(getString(R.string.pref_custom_date_key), value) - tryCommit(editor) - return true - } - - private fun tryCommit(editor: SharedPreferences.Editor) { - try { - editor.apply() - } catch (unused: AbstractMethodError) { - // The app injected its own pre-Gingerbread - // SharedPreferences.Editor implementation without - // an apply method. - editor.commit() - } - } - - private fun getPersistedCalendar(defaultValue: Long) = Calendar.getInstance().apply { - timeInMillis = getPersistedLong(defaultValue) - } - - companion object { - @JvmField - val DEFAULT_VALUE = Utils.ubuntuReleaseDate.timeInMillis - } -} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/OpenSourceLicensesDialogFragment.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/OpenSourceLicensesDialogFragment.kt deleted file mode 100644 index 34fceb4..0000000 --- a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/dialogs/OpenSourceLicensesDialogFragment.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -package com.leinardi.ubuntucountdownwidget.ui.dialogs - -import android.app.Dialog -import android.os.Bundle -import android.webkit.WebView -import androidx.appcompat.app.AlertDialog -import androidx.fragment.app.DialogFragment -import com.leinardi.ubuntucountdownwidget.R - -class OpenSourceLicensesDialogFragment : DialogFragment() { - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val webView = WebView(requireContext()) - webView.loadUrl(LICENSES_PATH) - return AlertDialog.Builder(requireContext(), R.style.AppCompatAlertDialogTheme) - .setTitle(R.string.open_source_licenses) - .setView(webView) - .setPositiveButton(R.string.close) { _, _ -> dismiss() } - .create() - } - - companion object { - private const val LICENSES_PATH = "file:///android_asset/licenses.html" - } -} diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/opensourcelibraries/OpenSourceLibrariesScreen.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/opensourcelibraries/OpenSourceLibrariesScreen.kt new file mode 100644 index 0000000..1a3dcfe --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/opensourcelibraries/OpenSourceLibrariesScreen.kt @@ -0,0 +1,265 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.opensourcelibraries + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.ContentAlpha +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Badge +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.window.DialogProperties +import androidx.constraintlayout.compose.ConstraintLayout +import androidx.constraintlayout.compose.Dimension +import androidx.constraintlayout.compose.Visibility +import com.leinardi.ubuntucountdownwidget.R +import com.leinardi.ubuntucountdownwidget.ui.annotation.DevicePreviews +import com.leinardi.ubuntucountdownwidget.ui.component.LocalNavHostController +import com.leinardi.ubuntucountdownwidget.ui.theme.AppTheme +import com.leinardi.ubuntucountdownwidget.ui.theme.Spacing +import com.mikepenz.aboutlibraries.Libs +import com.mikepenz.aboutlibraries.entity.Library +import com.mikepenz.aboutlibraries.entity.License +import com.mikepenz.aboutlibraries.entity.Organization +import com.mikepenz.aboutlibraries.entity.Scm +import com.mikepenz.aboutlibraries.ui.compose.HtmlText +import com.mikepenz.aboutlibraries.ui.compose.util.author +import com.mikepenz.aboutlibraries.ui.compose.util.htmlReadyLicenseContent +import com.mikepenz.aboutlibraries.util.withContext +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList + +@Composable +fun OpenSourceLibrariesScreen() { + val libraries = remember { mutableStateOf(null) } + + val context = LocalContext.current + LaunchedEffect(libraries) { + libraries.value = Libs.Builder().withContext(context).build() + } + + OpenSourceLibrariesScreen(libraries = libraries.value?.libraries.orEmpty().toImmutableList()) +} + +@Composable +private fun OpenSourceLibrariesScreen( + libraries: ImmutableList, +) { + val navHost = LocalNavHostController.current + val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() + Scaffold( + modifier = Modifier + .nestedScroll(scrollBehavior.nestedScrollConnection) + .navigationBarsPadding(), + topBar = { + TopAppBar( + title = { Text(stringResource(R.string.open_source_licenses)) }, + navigationIcon = { + IconButton( + onClick = { navHost.popBackStack() }, + ) { + Icon( + Icons.Filled.ArrowBack, + contentDescription = stringResource(R.string.back), + ) + } + }, + scrollBehavior = scrollBehavior, + ) + }, + ) { scaffoldPadding -> + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(scaffoldPadding), + ) { + itemsIndexed(libraries) { index, library -> + var openDialog by rememberSaveable { mutableStateOf(false) } + LibraryItem( + library = library, + onClick = { openDialog = true }, + ) + if (index < libraries.size - 1) { + HorizontalDivider() + } + if (openDialog) { + val scrollState = rememberScrollState() + AlertDialog( + onDismissRequest = { + openDialog = false + }, + confirmButton = { + TextButton(onClick = { openDialog = false }) { + Text(stringResource(R.string.close)) + } + }, + text = { + Column( + modifier = Modifier.verticalScroll(scrollState), + ) { + HtmlText( + html = library.licenses.firstOrNull()?.htmlReadyLicenseContent.orEmpty(), + color = MaterialTheme.colorScheme.onSurface, + ) + } + }, + modifier = Modifier.padding(Spacing.x02), + properties = DialogProperties(usePlatformDefaultWidth = false), + ) + } + } + } + } +} + +@Composable +private fun LibraryItem( + library: Library, + onClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Surface( + modifier = Modifier + .fillMaxWidth() + .then(modifier), + ) { + ConstraintLayout( + modifier = Modifier + .clickable { onClick() } + .padding(Spacing.x02), + ) { + val (nameRef, versionRef, authorRef, licensesRef) = createRefs() + + Text( + text = library.name, + modifier = Modifier + .constrainAs(nameRef) { + top.linkTo(parent.top) + start.linkTo(parent.start) + end.linkTo(versionRef.start) + width = Dimension.fillToConstraints + }, + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurface, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + + Text( + text = library.artifactVersion.orEmpty(), + modifier = Modifier.constrainAs(versionRef) { + end.linkTo(parent.end) + baseline.linkTo(nameRef.baseline) + visibility = library.artifactVersion.orGone() + }, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurface, + ) + + Text( + text = library.author, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurface.copy(alpha = ContentAlpha.medium), + modifier = Modifier + .constrainAs(authorRef) { + end.linkTo(parent.end) + top.linkTo(versionRef.bottom, Spacing.half) + visibility = library.author.orGone() + }, + ) + + FlowRow( + modifier = Modifier + .constrainAs(licensesRef) { + start.linkTo(parent.start) + top.linkTo(nameRef.bottom, Spacing.half) + end.linkTo(authorRef.start) + width = Dimension.fillToConstraints + visibility = library.licenses.orGone() + }, + horizontalArrangement = Arrangement.spacedBy(Spacing.x01), + verticalArrangement = Arrangement.spacedBy(Spacing.half), + ) { + library.licenses.forEach { + Badge( + contentColor = MaterialTheme.colorScheme.onPrimary, + containerColor = MaterialTheme.colorScheme.primary, + ) { + Text(text = it.name) + } + } + } + } + } +} + +@DevicePreviews +@Composable +private fun PreviewOpenSourceLibrariesScreen() { + val lib = Library( + uniqueId = "", + artifactVersion = "1.0.0", + name = "Library name", + description = "", + website = "", + developers = emptyList(), + organization = Organization("Author", ""), + scm = Scm("", "", ""), + licenses = setOf( + License("License", "", "", hash = ""), + ), + ) + AppTheme { + OpenSourceLibrariesScreen(List(10) { lib }.toImmutableList()) + } +} + +private fun String?.orGone() = if (isNullOrEmpty()) Visibility.Gone else Visibility.Visible +private fun Collection<*>?.orGone() = if (this.isNullOrEmpty()) Visibility.Gone else Visibility.Visible diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Color.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Color.kt new file mode 100644 index 0000000..4364587 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Color.kt @@ -0,0 +1,114 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.ColorScheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.glance.color.ColorProviders +import androidx.glance.unit.ColorProvider +import androidx.glance.unit.FixedColorProvider + +val md_theme_light_primary = Color(0xFFE95420) +val md_theme_light_onPrimary = Color(0xFFFFFFFF) +val md_theme_light_primaryContainer = Color(0xFFFFDBD0) +val md_theme_light_onPrimaryContainer = Color(0xFF3A0B00) +val md_theme_light_secondary = Color(0xFF943B89) +val md_theme_light_onSecondary = Color(0xFFFFFFFF) +val md_theme_light_secondaryContainer = Color(0xFFFFD7F3) +val md_theme_light_onSecondaryContainer = Color(0xFF390035) +val md_theme_light_tertiary = Color(0xFF6B5E2F) +val md_theme_light_onTertiary = Color(0xFFFFFFFF) +val md_theme_light_tertiaryContainer = Color(0xFFF4E2A7) +val md_theme_light_onTertiaryContainer = Color(0xFF221B00) +val md_theme_light_error = Color(0xFFBA1A1A) +val md_theme_light_errorContainer = Color(0xFFFFDAD6) +val md_theme_light_onError = Color(0xFFFFFFFF) +val md_theme_light_onErrorContainer = Color(0xFF410002) +val md_theme_light_background = Color(0xFFFFFBFF) +val md_theme_light_onBackground = Color(0xFF251A00) +val md_theme_light_surface = Color(0xFFFFFBFF) +val md_theme_light_onSurface = Color(0xFF251A00) +val md_theme_light_surfaceVariant = Color(0xFFF5DED7) +val md_theme_light_onSurfaceVariant = Color(0xFF53433F) +val md_theme_light_outline = Color(0xFF85736E) +val md_theme_light_inverseOnSurface = Color(0xFFFFEFD3) +val md_theme_light_inverseSurface = Color(0xFF3F2E00) +val md_theme_light_inversePrimary = Color(0xFFFFB59E) +val md_theme_light_shadow = Color(0xFF000000) +val md_theme_light_surfaceTint = Color(0xFFE95420) +val md_theme_light_outlineVariant = Color(0xFFD8C2BC) +val md_theme_light_scrim = Color(0xFF000000) + +val md_theme_dark_primary = Color(0xFFFFB59E) +val md_theme_dark_onPrimary = Color(0xFF5E1700) +val md_theme_dark_primaryContainer = Color(0xFF852400) +val md_theme_dark_onPrimaryContainer = Color(0xFFFFDBD0) +val md_theme_dark_secondary = Color(0xFFFFABEE) +val md_theme_dark_onSecondary = Color(0xFF5C0157) +val md_theme_dark_secondaryContainer = Color(0xFF78226F) +val md_theme_dark_onSecondaryContainer = Color(0xFFFFD7F3) +val md_theme_dark_tertiary = Color(0xFFD7C68D) +val md_theme_dark_onTertiary = Color(0xFF3A3005) +val md_theme_dark_tertiaryContainer = Color(0xFF52461A) +val md_theme_dark_onTertiaryContainer = Color(0xFFF4E2A7) +val md_theme_dark_error = Color(0xFFFFB4AB) +val md_theme_dark_errorContainer = Color(0xFF93000A) +val md_theme_dark_onError = Color(0xFF690005) +val md_theme_dark_onErrorContainer = Color(0xFFFFDAD6) +val md_theme_dark_background = Color(0xFF251A00) +val md_theme_dark_onBackground = Color(0xFFFFDF9C) +val md_theme_dark_surface = Color(0xFF251A00) +val md_theme_dark_onSurface = Color(0xFFFFDF9C) +val md_theme_dark_surfaceVariant = Color(0xFF53433F) +val md_theme_dark_onSurfaceVariant = Color(0xFFD8C2BC) +val md_theme_dark_outline = Color(0xFFA08C87) +val md_theme_dark_inverseOnSurface = Color(0xFF251A00) +val md_theme_dark_inverseSurface = Color(0xFFFFDF9C) +val md_theme_dark_inversePrimary = Color(0xFFE95420) +val md_theme_dark_shadow = Color(0xFF000000) +val md_theme_dark_surfaceTint = Color(0xFFFFB59E) +val md_theme_dark_outlineVariant = Color(0xFF53433F) +val md_theme_dark_scrim = Color(0xFF000000) + +val seed = Color(0xFFE95420) + +val ColorScheme.settingsContainer: Color + @Composable + get() = if (isSystemInDarkTheme()) { + MaterialTheme.colorScheme.background + } else { + MaterialTheme.colorScheme.inverseOnSurface + } + +val ColorScheme.settingsContent: Color + @Composable + get() = if (isSystemInDarkTheme()) { + MaterialTheme.colorScheme.onBackground + } else { + MaterialTheme.colorScheme.inverseSurface + } + +val ColorProviders.textLight: ColorProvider + @Composable + get() = FixedColorProvider(Color(0xFF1D1D1D)) + +val ColorProviders.textDark: ColorProvider + @Composable + get() = FixedColorProvider(Color(0xFFFFFFFF)) diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.android-app-conventions.gradle b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Spacing.kt similarity index 63% rename from build-conventions/src/main/groovy/ubuntucountdownwidget.android-app-conventions.gradle rename to app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Spacing.kt index a200e17..cd8b7c3 100644 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.android-app-conventions.gradle +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Spacing.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -14,15 +14,21 @@ * program. If not, see . */ -plugins { - id 'com.android.application' - id 'ubuntucountdownwidget.android-android-conventions' - id 'ubuntucountdownwidget.merged-manifests-conventions' - id 'ubuntucountdownwidget.dependencies-conventions' - id 'ubuntucountdownwidget.ruler-conventions' -} +package com.leinardi.ubuntucountdownwidget.ui.theme + +import androidx.compose.ui.unit.dp -dependencies { - implementation libs.timber - debugImplementation libs.leakcanary +object Spacing { + val quarter = 2.dp + val half = 4.dp + val x01 = 8.dp + val x02 = 16.dp + val x03 = 24.dp + val x04 = 32.dp + val x05 = 40.dp + val x06 = 48.dp + val x07 = 56.dp + val x08 = 64.dp + val x12 = 96.dp + val x16 = 128.dp } diff --git a/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Theme.kt b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Theme.kt new file mode 100644 index 0000000..c101dd1 --- /dev/null +++ b/app/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ui/theme/Theme.kt @@ -0,0 +1,166 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ui.theme + +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.glance.GlanceTheme +import androidx.glance.LocalContext +import androidx.glance.material3.ColorProviders +import com.leinardi.ubuntucountdownwidget.ext.isNightMode +import com.leinardi.ubuntucountdownwidget.ext.requireActivity + +private val lightColorScheme = lightColorScheme( + primary = md_theme_light_primary, + onPrimary = md_theme_light_onPrimary, + primaryContainer = md_theme_light_primaryContainer, + onPrimaryContainer = md_theme_light_onPrimaryContainer, + secondary = md_theme_light_secondary, + onSecondary = md_theme_light_onSecondary, + secondaryContainer = md_theme_light_secondaryContainer, + onSecondaryContainer = md_theme_light_onSecondaryContainer, + tertiary = md_theme_light_tertiary, + onTertiary = md_theme_light_onTertiary, + tertiaryContainer = md_theme_light_tertiaryContainer, + onTertiaryContainer = md_theme_light_onTertiaryContainer, + error = md_theme_light_error, + errorContainer = md_theme_light_errorContainer, + onError = md_theme_light_onError, + onErrorContainer = md_theme_light_onErrorContainer, + background = md_theme_light_background, + onBackground = md_theme_light_onBackground, + surface = md_theme_light_surface, + onSurface = md_theme_light_onSurface, + surfaceVariant = md_theme_light_surfaceVariant, + onSurfaceVariant = md_theme_light_onSurfaceVariant, + outline = md_theme_light_outline, + inverseOnSurface = md_theme_light_inverseOnSurface, + inverseSurface = md_theme_light_inverseSurface, + inversePrimary = md_theme_light_inversePrimary, + surfaceTint = md_theme_light_surfaceTint, + outlineVariant = md_theme_light_outlineVariant, + scrim = md_theme_light_scrim, +) + +private val darkColorScheme = darkColorScheme( + primary = md_theme_dark_primary, + onPrimary = md_theme_dark_onPrimary, + primaryContainer = md_theme_dark_primaryContainer, + onPrimaryContainer = md_theme_dark_onPrimaryContainer, + secondary = md_theme_dark_secondary, + onSecondary = md_theme_dark_onSecondary, + secondaryContainer = md_theme_dark_secondaryContainer, + onSecondaryContainer = md_theme_dark_onSecondaryContainer, + tertiary = md_theme_dark_tertiary, + onTertiary = md_theme_dark_onTertiary, + tertiaryContainer = md_theme_dark_tertiaryContainer, + onTertiaryContainer = md_theme_dark_onTertiaryContainer, + error = md_theme_dark_error, + errorContainer = md_theme_dark_errorContainer, + onError = md_theme_dark_onError, + onErrorContainer = md_theme_dark_onErrorContainer, + background = md_theme_dark_background, + onBackground = md_theme_dark_onBackground, + surface = md_theme_dark_surface, + onSurface = md_theme_dark_onSurface, + surfaceVariant = md_theme_dark_surfaceVariant, + onSurfaceVariant = md_theme_dark_onSurfaceVariant, + outline = md_theme_dark_outline, + inverseOnSurface = md_theme_dark_inverseOnSurface, + inverseSurface = md_theme_dark_inverseSurface, + inversePrimary = md_theme_dark_inversePrimary, + surfaceTint = md_theme_dark_surfaceTint, + outlineVariant = md_theme_dark_outlineVariant, + scrim = md_theme_dark_scrim, +) + +@Composable +fun AppTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + dynamicColor: Boolean = false, + content: @Composable () -> Unit, +) { + val context = androidx.compose.ui.platform.LocalContext.current + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> if (darkTheme) { + dynamicDarkColorScheme(context) + } else { + dynamicLightColorScheme(context) + } + + darkTheme -> darkColorScheme + else -> lightColorScheme + } + + // https://issuetracker.google.com/issues/219993701 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !LocalInspectionMode.current) { + context.requireActivity().window.insetsController?.setSystemBarsAppearance(0, 0) + } + + MaterialTheme( + colorScheme = colorScheme, + content = content, + ) +} + +@Composable +fun AppGlanceTheme( + darkTheme: Boolean = LocalContext.current.isNightMode, + dynamicColor: Boolean = false, + content: @Composable () -> Unit, +) { + val colors = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + val dynamicDarkColorScheme = dynamicDarkColorScheme(context) + val dynamicLightColorScheme = dynamicLightColorScheme(context) + if (darkTheme) { + ColorProviders( + light = dynamicDarkColorScheme, + dark = dynamicDarkColorScheme, + ) + } else { + ColorProviders( + light = dynamicLightColorScheme, + dark = dynamicLightColorScheme, + ) + } + } + + darkTheme -> ColorProviders( + light = darkColorScheme, + dark = darkColorScheme, + ) + + else -> ColorProviders( + light = lightColorScheme, + dark = lightColorScheme, + ) + } + + GlanceTheme( + colors = colors, + content = content, + ) +} diff --git a/app/src/main/res/color/accent_selector.xml b/app/src/main/res/color/accent_selector.xml deleted file mode 100644 index e6a4dd7..0000000 --- a/app/src/main/res/color/accent_selector.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable-hdpi/ic_action_content_save.png b/app/src/main/res/drawable-hdpi/ic_action_content_save.png deleted file mode 100644 index 324ae5e..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_content_save.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_settings.png b/app/src/main/res/drawable-hdpi/ic_action_settings.png deleted file mode 100644 index 162d24a..0000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_settings.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/logo_large.png b/app/src/main/res/drawable-hdpi/logo_large.png deleted file mode 100644 index b090dff..0000000 Binary files a/app/src/main/res/drawable-hdpi/logo_large.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/logo_small.png b/app/src/main/res/drawable-hdpi/logo_small.png deleted file mode 100644 index d1e3a4e..0000000 Binary files a/app/src/main/res/drawable-hdpi/logo_small.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ubuntu_large_dark.png b/app/src/main/res/drawable-hdpi/ubuntu_large_dark.png deleted file mode 100644 index 346ae90..0000000 Binary files a/app/src/main/res/drawable-hdpi/ubuntu_large_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ubuntu_large_light.png b/app/src/main/res/drawable-hdpi/ubuntu_large_light.png deleted file mode 100644 index d9b0296..0000000 Binary files a/app/src/main/res/drawable-hdpi/ubuntu_large_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ubuntu_small_dark.png b/app/src/main/res/drawable-hdpi/ubuntu_small_dark.png deleted file mode 100644 index 2b50e2e..0000000 Binary files a/app/src/main/res/drawable-hdpi/ubuntu_small_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ubuntu_small_light.png b/app/src/main/res/drawable-hdpi/ubuntu_small_light.png deleted file mode 100644 index ebe0178..0000000 Binary files a/app/src/main/res/drawable-hdpi/ubuntu_small_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_content_save.png b/app/src/main/res/drawable-mdpi/ic_action_content_save.png deleted file mode 100644 index 478b020..0000000 Binary files a/app/src/main/res/drawable-mdpi/ic_action_content_save.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_settings.png b/app/src/main/res/drawable-mdpi/ic_action_settings.png deleted file mode 100644 index 8961e1a..0000000 Binary files a/app/src/main/res/drawable-mdpi/ic_action_settings.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/logo_large.png b/app/src/main/res/drawable-mdpi/logo_large.png deleted file mode 100644 index 27d652e..0000000 Binary files a/app/src/main/res/drawable-mdpi/logo_large.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/logo_small.png b/app/src/main/res/drawable-mdpi/logo_small.png deleted file mode 100644 index b6f6e74..0000000 Binary files a/app/src/main/res/drawable-mdpi/logo_small.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ubuntu_large_dark.png b/app/src/main/res/drawable-mdpi/ubuntu_large_dark.png deleted file mode 100644 index 1524fd4..0000000 Binary files a/app/src/main/res/drawable-mdpi/ubuntu_large_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ubuntu_large_light.png b/app/src/main/res/drawable-mdpi/ubuntu_large_light.png deleted file mode 100644 index c12e3b2..0000000 Binary files a/app/src/main/res/drawable-mdpi/ubuntu_large_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ubuntu_small_dark.png b/app/src/main/res/drawable-mdpi/ubuntu_small_dark.png deleted file mode 100644 index d60dfc5..0000000 Binary files a/app/src/main/res/drawable-mdpi/ubuntu_small_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ubuntu_small_light.png b/app/src/main/res/drawable-mdpi/ubuntu_small_light.png deleted file mode 100644 index f1755b3..0000000 Binary files a/app/src/main/res/drawable-mdpi/ubuntu_small_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-nodpi/app_widget_preview.webp b/app/src/main/res/drawable-nodpi/app_widget_preview.webp new file mode 100644 index 0000000..1e07d12 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/app_widget_preview.webp differ diff --git a/app/src/main/res/drawable-nodpi/preview_1x1.png b/app/src/main/res/drawable-nodpi/preview_1x1.png deleted file mode 100644 index ee1a80c..0000000 Binary files a/app/src/main/res/drawable-nodpi/preview_1x1.png and /dev/null differ diff --git a/app/src/main/res/drawable-nodpi/preview_2x2.png b/app/src/main/res/drawable-nodpi/preview_2x2.png deleted file mode 100644 index c8c6bed..0000000 Binary files a/app/src/main/res/drawable-nodpi/preview_2x2.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_content_save.png b/app/src/main/res/drawable-xhdpi/ic_action_content_save.png deleted file mode 100644 index 1b8bdbf..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_content_save.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_settings.png b/app/src/main/res/drawable-xhdpi/ic_action_settings.png deleted file mode 100644 index 7f186c3..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_settings.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/logo_large.png b/app/src/main/res/drawable-xhdpi/logo_large.png deleted file mode 100644 index 7edd316..0000000 Binary files a/app/src/main/res/drawable-xhdpi/logo_large.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/logo_small.png b/app/src/main/res/drawable-xhdpi/logo_small.png deleted file mode 100644 index 3f2e09e..0000000 Binary files a/app/src/main/res/drawable-xhdpi/logo_small.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ubuntu_large_dark.png b/app/src/main/res/drawable-xhdpi/ubuntu_large_dark.png deleted file mode 100644 index 2aa587f..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ubuntu_large_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ubuntu_large_light.png b/app/src/main/res/drawable-xhdpi/ubuntu_large_light.png deleted file mode 100644 index 5c1ea7e..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ubuntu_large_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ubuntu_small_dark.png b/app/src/main/res/drawable-xhdpi/ubuntu_small_dark.png deleted file mode 100644 index acb2ec4..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ubuntu_small_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ubuntu_small_light.png b/app/src/main/res/drawable-xhdpi/ubuntu_small_light.png deleted file mode 100644 index ecf8836..0000000 Binary files a/app/src/main/res/drawable-xhdpi/ubuntu_small_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_content_save.png b/app/src/main/res/drawable-xxhdpi/ic_action_content_save.png deleted file mode 100644 index 9c4930c..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_content_save.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_settings.png b/app/src/main/res/drawable-xxhdpi/ic_action_settings.png deleted file mode 100644 index a7f78c7..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_settings.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/logo_large.png b/app/src/main/res/drawable-xxhdpi/logo_large.png deleted file mode 100644 index a9c8f68..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/logo_large.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/logo_small.png b/app/src/main/res/drawable-xxhdpi/logo_small.png deleted file mode 100644 index 48fe30f..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/logo_small.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ubuntu_large_dark.png b/app/src/main/res/drawable-xxhdpi/ubuntu_large_dark.png deleted file mode 100644 index fa9fd2e..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ubuntu_large_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ubuntu_large_light.png b/app/src/main/res/drawable-xxhdpi/ubuntu_large_light.png deleted file mode 100644 index aa9162f..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ubuntu_large_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ubuntu_small_dark.png b/app/src/main/res/drawable-xxhdpi/ubuntu_small_dark.png deleted file mode 100644 index f144866..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ubuntu_small_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ubuntu_small_light.png b/app/src/main/res/drawable-xxhdpi/ubuntu_small_light.png deleted file mode 100644 index 6c1f161..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ubuntu_small_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_content_save.png b/app/src/main/res/drawable-xxxhdpi/ic_action_content_save.png deleted file mode 100644 index db41d31..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_action_content_save.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_settings.png b/app/src/main/res/drawable-xxxhdpi/ic_action_settings.png deleted file mode 100644 index b61b4cd..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_action_settings.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/logo_large.png b/app/src/main/res/drawable-xxxhdpi/logo_large.png deleted file mode 100644 index 2487551..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/logo_large.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/logo_small.png b/app/src/main/res/drawable-xxxhdpi/logo_small.png deleted file mode 100644 index 64fef13..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/logo_small.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ubuntu_large_dark.png b/app/src/main/res/drawable-xxxhdpi/ubuntu_large_dark.png deleted file mode 100644 index 4dd5679..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ubuntu_large_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ubuntu_large_light.png b/app/src/main/res/drawable-xxxhdpi/ubuntu_large_light.png deleted file mode 100644 index 05270ab..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ubuntu_large_light.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ubuntu_small_dark.png b/app/src/main/res/drawable-xxxhdpi/ubuntu_small_dark.png deleted file mode 100644 index 471a0ef..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ubuntu_small_dark.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ubuntu_small_light.png b/app/src/main/res/drawable-xxxhdpi/ubuntu_small_light.png deleted file mode 100644 index 586df59..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ubuntu_small_light.png and /dev/null differ diff --git a/app/src/main/res/drawable/background_dark.xml b/app/src/main/res/drawable/background_dark.xml index 3a45b04..d3c182d 100644 --- a/app/src/main/res/drawable/background_dark.xml +++ b/app/src/main/res/drawable/background_dark.xml @@ -1,6 +1,6 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ubuntu_logo_dark.xml b/app/src/main/res/drawable/ubuntu_logo_dark.xml new file mode 100644 index 0000000..c02c16b --- /dev/null +++ b/app/src/main/res/drawable/ubuntu_logo_dark.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ubuntu_logo_light.xml b/app/src/main/res/drawable/ubuntu_logo_light.xml new file mode 100644 index 0000000..6d63994 --- /dev/null +++ b/app/src/main/res/drawable/ubuntu_logo_light.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_launcher.xml b/app/src/main/res/layout/activity_launcher.xml deleted file mode 100644 index a52e196..0000000 --- a/app/src/main/res/layout/activity_launcher.xml +++ /dev/null @@ -1,19 +0,0 @@ - - diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml deleted file mode 100644 index 5902cc6..0000000 --- a/app/src/main/res/layout/activity_settings.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/textbullet.xml b/app/src/main/res/layout/app_widget_default_loading_layout.xml similarity index 64% rename from app/src/main/res/drawable/textbullet.xml rename to app/src/main/res/layout/app_widget_default_loading_layout.xml index ebadfb6..3f2d328 100644 --- a/app/src/main/res/drawable/textbullet.xml +++ b/app/src/main/res/layout/app_widget_default_loading_layout.xml @@ -1,6 +1,6 @@ - + - - - - + + diff --git a/app/src/main/res/layout/appwidget_1x1_dark.xml b/app/src/main/res/layout/appwidget_1x1_dark.xml deleted file mode 100644 index ede9b66..0000000 --- a/app/src/main/res/layout/appwidget_1x1_dark.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/appwidget_1x1_light.xml b/app/src/main/res/layout/appwidget_1x1_light.xml deleted file mode 100644 index 29d9d83..0000000 --- a/app/src/main/res/layout/appwidget_1x1_light.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/appwidget_2x2_dark.xml b/app/src/main/res/layout/appwidget_2x2_dark.xml deleted file mode 100644 index df26c93..0000000 --- a/app/src/main/res/layout/appwidget_2x2_dark.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/appwidget_2x2_light.xml b/app/src/main/res/layout/appwidget_2x2_light.xml deleted file mode 100644 index 0b5b7eb..0000000 --- a/app/src/main/res/layout/appwidget_2x2_light.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/changelog_row.xml b/app/src/main/res/layout/changelog_row.xml deleted file mode 100644 index bf94752..0000000 --- a/app/src/main/res/layout/changelog_row.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/changelog_rowheader.xml b/app/src/main/res/layout/changelog_rowheader.xml deleted file mode 100644 index 5eeed55..0000000 --- a/app/src/main/res/layout/changelog_rowheader.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_changelog.xml b/app/src/main/res/layout/dialog_changelog.xml deleted file mode 100644 index e461ade..0000000 --- a/app/src/main/res/layout/dialog_changelog.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/app/src/main/res/menu/menu_launcher.xml b/app/src/main/res/menu/menu_launcher.xml deleted file mode 100644 index 5bb8359..0000000 --- a/app/src/main/res/menu/menu_launcher.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/menu/menu_settings.xml b/app/src/main/res/menu/menu_settings.xml deleted file mode 100644 index f2a0ffe..0000000 --- a/app/src/main/res/menu/menu_settings.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/raw/changelog.xml b/app/src/main/res/raw/changelog.xml deleted file mode 100644 index 338882a..0000000 --- a/app/src/main/res/raw/changelog.xml +++ /dev/null @@ -1,221 +0,0 @@ - - - - - Added count down for Ubuntu 23.10 Mantic Minotaur - Updated dependencies - - - - Added count down for Ubuntu 22.10 Kinetic Kudu - Updated dependencies - - - - Added count down for Ubuntu 22.04 Jammy Jellyfish - Updated dependencies - - - Added count down for Ubuntu 21.10 Impish Indri - Updated dependencies - - - - Added count down for Ubuntu 21.04 Hirsute Hippo - Updated dependencies - - - - Added count down for Ubuntu 20.10 Groovy Gorilla! - Updated dependencies - - - - Countdown started for Ubuntu 20.04 LTS Focal Fossa! - Fixed widget background on new Android versions - #5 - Italian translation updated - Updated compileSdkVersion and buildToolsVersion to the latest version - - Crashlytics removed - - - - Countdown started for Ubuntu 18.04 LTS Bionic Beaver! - Updated compileSdkVersion and buildToolsVersion to the latest version - - Increased minSdk to 14 (Ice Cream Sandwich) since is now the minimum for the - Android Support Libraries - - - - - Countdown started for Ubuntu 17.10 Artful Aardvark! - Updated compileSdkVersion and buildToolsVersion to the latest version - - - - - Countdown started for Ubuntu 17.04 Zesty Zapus! - Updated compileSdkVersion and buildToolsVersion to the latest version - - - - - Fixed release date for Ubuntu 16.10 Yakkety Yak (sorry for the mistake...) - - - - - Countdown started for Ubuntu 16.10 Yakkety Yak! - Updated compileSdkVersion and buildToolsVersion to the latest version - - - - - Countdown started for Ubuntu 16.04 LTS Xenial Xerus! - Updated compileSdkVersion and buildToolsVersion to the latest version - - Added Crashlytics integration to the Standard flavor - Added xxhdpi and xxxhdpi resources and moved the launcher icons to mip-map - directories - - Moved from PreferenceActivity to PreferenceFragmentCompat - Added ActionBar to Launcher and Settings Activities - Replaced Buttons with Action Items - The Changelog is now using Gabriele Mariotti's Changeloglib - Probably something I'm forgetting - - - - Countdown started for Ubuntu 14.04 LTS Trusty Tahr! - - - - Countdown started for Ubuntu 13.10 Saucy Salamander! - - - - Countdown started for Ubuntu 13.04 Raring Ringtail! - - - - Countdown started for Ubuntu 12.10 Quantal Quetzal! - - - - Countdown started for Ubuntu 12.04 LTS Precise Pangolin! - Added Widget Preview (API 11+) - Added the ability to make donations with InApp-Billing :D (require Vending - Permission) - - Added anonymous usage statistics collection through Google Analytics - (require Internet Permission and Access Network State Permission) - - - - - Oops - - - - Countdown started for Ubuntu 11.10 Oneiric Ocelot! - Added Spanish localization (thanks to Monino) - - - - Added French localization (thanks to Guillaume Mazoyer) - Built with API Level 10 - - - - Added DARK THEME :D - Added "On touch action" (do nothing, open settings, open URL) - - - - Added FAQ - We are considering the possibility of adding a dark theme :-) - - - - Release on Android Market! \o/ - - - - Added Tutorial on how to add Widgets - Added Italian localization - New icon - Fixed some little bug - - - - First public beta! - - - diff --git a/app/src/main/res/values-es/arrays.xml b/app/src/main/res/values-es/arrays.xml deleted file mode 100644 index 62e0567..0000000 --- a/app/src/main/res/values-es/arrays.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Claro - Oscuro - - - - Do nothing - Abrir configuración - Abrir URL - - - diff --git a/app/src/main/res/values-es/configs.xml b/app/src/main/res/values-es/configs.xml deleted file mode 100644 index e359f6d..0000000 --- a/app/src/main/res/values-es/configs.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - info-es.html - - diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 9329050..9a226e0 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,6 +1,6 @@ Opciones Countdown - Fecha lanzamiento Ubuntu + Seleccionar una fecha personalizada Usar una fecha personalizada Usa una fecha personalizada para la cuentra atrás - Seleccionar una fecha personalizada - Tema - Selecciona si quieres un tema claro u oscuro - Acción al tocar - Elegir que se debe hacer al tocar el widget - URL - Dfinir una URL personalizada - Opciones del Launcher - Mostrar icono en Launcher - Si descarmas, esconde el widget del launcher (necesario - reiniciar) - Mostrar tutorial - Mostrar el tutorial cuando se hace click en el icono + Fecha lanzamiento Ubuntu Versión Imposible determinar la versión - Info, FAQ y reconocimientos - Comprame una cerveza - Donate - Ayudame a mantener mis aplicaciones gratis y sin anuncios + Opciones del Launcher + Acción al tocar + Elegir que se debe hacer al tocar el widget Reportar un fallo Enviar un nuevo fallo al tracker - Mostar los cambios en la aplicación - Mostrar configuración - Save - Presione Guardar para agregar el Widget + Mostrar icono en Launcher + Si descarmas, esconde el widget del launcher (necesario reiniciar) + URL + Dfinir una URL personalizada + Tema + Selecciona si quieres un tema claro u oscuro diff --git a/app/src/main/res/values-fr/configs.xml b/app/src/main/res/values-fr/configs.xml deleted file mode 100644 index 48bb15d..0000000 --- a/app/src/main/res/values-fr/configs.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - info.html - - diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 7c36e27..3d01086 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,6 +1,6 @@ Options du compte à rebours - Date de sortie de Ubuntu + Sélectionner une date personnalisée Utiliser une date personnalisée Utiliser une date de sortie personnalisée pour le compte à rebours - Sélectionner une date personnalisée - Thème - Choisissez entre le thème clair ou sombre - Action au clic - Choisir quoi faire lors du clic sur le widget - URL - Définir une URL personnalisée - Options du lanceur - Montrer l\'icône de lancement - Si non cochée, cache l\'icône de lancement (nécessite un redémarrage) - Voir le tutorial - Voir le tutorial en cliquant sur l\'iĉone de lancement + Date de sortie de Ubuntu Version Impossible de récupérer la version - Info, FAQ et remerciements - Offrez-moi une bière - Donate - Aider-moi à garder mes applications gratuites et sans pub + Options du lanceur + Action au clic + Choisir quoi faire lors du clic sur le widget Rapporter un bug Rapporter un nouveau bug - Voir les changements de l\'application - Voir les préférences - Save - Appuyez sur Enregistrer pour ajouter le Widget + Montrer l\'icône de lancement + Si non cochée, cache l\'icône de lancement (nécessite un redémarrage) + URL + Définir une URL personnalisée + Thème + Choisissez entre le thème clair ou sombre diff --git a/app/src/main/res/values-it/arrays.xml b/app/src/main/res/values-it/arrays.xml deleted file mode 100644 index 7961b98..0000000 --- a/app/src/main/res/values-it/arrays.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Chiaro - Scuro - - - - Non far nulla - Apri impostazioni widget - Apri URL - - - diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 2ffeffb..9f69133 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,6 +1,6 @@ Opzioni countdown - Data rilascio Ubuntu + Seleziona data personalizzata Usa data personalizzata Usa una data personalizzata per il countdown - Seleziona data personalizzata - Tema - Scegli se utilizzare un tema chiaro o scuro - Azione al tocco - Scegli quale azione eseguire al tocco del widget - URL - Imposta una URL personalizzata - Opzioni launcher - Icona sul launcher - Se non spuntato nasconde l\'icona del widget sul launcher - (richiede riavvio) - Visualizza tutorial - Mostra il tutorial quando si clicca l\'icona del launcher + Data rilascio Ubuntu Versione Impossibile determinare la versione - Informazioni, FAQ e Ringraziamenti - Donazioni - Offrimi una birra - Aiutami a mantenere questa app gratuita e senza pubblicità + Opzioni launcher + Azione al tocco + Scegli quale azione eseguire al tocco del widget Segnala un bug Invia un nuovo problema sull\'Issue Tracker - Display settings - Visualizza il changelog dell\'applicazione - Salva - Premi Salva per aggiungere il Widget - Note di revisione + Icona sul launcher + Se non spuntato nasconde l\'icona del widget sul launcher (richiede riavvio) + URL + Imposta una URL personalizzata + Usa tema scuro + Scegli se utilizzare un tema chiaro o scuro diff --git a/app/src/main/res/values-fr/arrays.xml b/app/src/main/res/values-night/themes.xml similarity index 51% rename from app/src/main/res/values-fr/arrays.xml rename to app/src/main/res/values-night/themes.xml index bdad55e..0ecc386 100644 --- a/app/src/main/res/values-fr/arrays.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,6 +1,8 @@ - - - Clair - Sombre - + + diff --git a/app/src/main/res/values-pt-rBR/arrays.xml b/app/src/main/res/values-pt-rBR/arrays.xml deleted file mode 100644 index d37c288..0000000 --- a/app/src/main/res/values-pt-rBR/arrays.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Claro - Escuro - - - - Não faça nada - Abrir as configurações do Widget - Abrir URL - - - diff --git a/app/src/main/res/values-pt-rBR/configs.xml b/app/src/main/res/values-pt-rBR/configs.xml deleted file mode 100644 index d6dc8b3..0000000 --- a/app/src/main/res/values-pt-rBR/configs.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - info-ptbr.html - - diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 401944e..1207272 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1,6 +1,6 @@ Opções de contagem - Data de lançamento de Ubuntu + Selecione uma data personalizada Use uma data personalizada Use uma data personalizada para a contagem regressiva - Selecione uma data personalizada - Tema - Escolha entre o tema claro ou escuro - Ação ao tocar - Escolha o que deveria ser feito quando você tocar no Widget - URL - Definir um URL personalizado - Opções do lançador - Mostrar o ícone do lançador - Se não for marcado, oculte o ícone do widget do lançador (Reinicio - necessário) - Mostrar tutorial - Mostrar o tutorial ao clicar no ícone do lançador + Data de lançamento de Ubuntu Versão Não foi possível determinar a versão - Info, FAQ e agradecimentos - Doar - Compre-me um café - Ajude-me a manter meus apps gratuitos e sem anúncios + Opções do lançador + Ação ao tocar + Escolha o que deveria ser feito quando você tocar no Widget Relatar um bug Relatar um novo bug ao rastreador de problemas - Mostrar o registro de mudanças - Mostrar configurações - Salvar - Clique no Salvar para adicionar o Widget + Mostrar o ícone do lançador + Se não for marcado, oculte o ícone do widget do lançador (Reinicio necessário) + URL + Definir um URL personalizado + Tema + Escolha entre o tema claro ou escuro diff --git a/app/src/main/res/values-it/configs.xml b/app/src/main/res/values-v27/colors.xml similarity index 86% rename from app/src/main/res/values-it/configs.xml rename to app/src/main/res/values-v27/colors.xml index 7ad491a..a44e901 100644 --- a/app/src/main/res/values-it/configs.xml +++ b/app/src/main/res/values-v27/colors.xml @@ -1,6 +1,6 @@ - - info-it.html - + @android:color/transparent diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml deleted file mode 100644 index 5273e86..0000000 --- a/app/src/main/res/values/arrays.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Light - Dark - - - - light - dark - - - - Do nothing - Open widget settings - Open URL - - - - disabled - config - url - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0238830..aa72a65 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ - - #ffffff - #DD4814 - #333333 - @color/md_grey_600 + #44000000 diff --git a/app/src/main/res/values/configs.xml b/app/src/main/res/values/configs.xml deleted file mode 100644 index cf565d9..0000000 --- a/app/src/main/res/values/configs.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - Ubuntu Countdown Widget - config - www.ubuntu.com - info.html - - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml deleted file mode 100644 index 0b48793..0000000 --- a/app/src/main/res/values/dimens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 56dp - 110dp - 40sp - 16sp - diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml deleted file mode 100644 index 7411193..0000000 --- a/app/src/main/res/values/keys.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - pref_custom_date_checkbox - pref_custom_date - pref_default_release_date - pref_theme - pref_on_touch - pref_url - pref_show_launcher_icon - pref_show_tutorial - pref_info_version - pref_info - pref_donate - pref_report_a_bug - pref_changelog - pref_licenses - diff --git a/app/src/main/res/values/material_colors.xml b/app/src/main/res/values/material_colors.xml deleted file mode 100644 index 035ff2f..0000000 --- a/app/src/main/res/values/material_colors.xml +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - - - #FFEBEE - #FFCDD2 - #EF9A9A - #E57373 - #EF5350 - #F44336 - #E53935 - #D32F2F - #C62828 - #B71C1C - #FF8A80 - #FF5252 - #FF1744 - #D50000 - - - #FCE4EC - #F8BBD0 - #F48FB1 - #F06292 - #EC407A - #E91E63 - #D81B60 - #C2185B - #AD1457 - #880E4F - #FF80AB - #FF4081 - #F50057 - #C51162 - - - #F3E5F5 - #E1BEE7 - #CE93D8 - #BA68C8 - #AB47BC - #9C27B0 - #8E24AA - #7B1FA2 - #6A1B9A - #4A148C - #EA80FC - #E040FB - #D500F9 - #AA00FF - - - #EDE7F6 - #D1C4E9 - #B39DDB - #9575CD - #7E57C2 - #673AB7 - #5E35B1 - #512DA8 - #4527A0 - #311B92 - #B388FF - #7C4DFF - #651FFF - #6200EA - - - #E8EAF6 - #C5CAE9 - #9FA8DA - #7986CB - #5C6BC0 - #3F51B5 - #3949AB - #303F9F - #283593 - #1A237E - #8C9EFF - #536DFE - #3D5AFE - #304FFE - - - #E3F2FD - #BBDEFB - #90CAF9 - #64B5F6 - #42A5F5 - #2196F3 - #1E88E5 - #1976D2 - #1565C0 - #0D47A1 - #82B1FF - #448AFF - #2979FF - #2962FF - - - #E1F5FE - #B3E5FC - #81D4fA - #4fC3F7 - #29B6FC - #03A9F4 - #039BE5 - #0288D1 - #0277BD - #01579B - #80D8FF - #40C4FF - #00B0FF - #0091EA - - - #E0F7FA - #B2EBF2 - #80DEEA - #4DD0E1 - #26C6DA - #00BCD4 - #00ACC1 - #0097A7 - #00838F - #006064 - #84FFFF - #18FFFF - #00E5FF - #00B8D4 - - - #E0F2F1 - #B2DFDB - #80CBC4 - #4DB6AC - #26A69A - #009688 - #00897B - #00796B - #00695C - #004D40 - #A7FFEB - #64FFDA - #1DE9B6 - #00BFA5 - - - #E8F5E9 - #C8E6C9 - #A5D6A7 - #81C784 - #66BB6A - #4CAF50 - #43A047 - #388E3C - #2E7D32 - #1B5E20 - #B9F6CA - #69F0AE - #00E676 - #00C853 - - - #F1F8E9 - #DCEDC8 - #C5E1A5 - #AED581 - #9CCC65 - #8BC34A - #7CB342 - #689F38 - #558B2F - #33691E - #CCFF90 - #B2FF59 - #76FF03 - #64DD17 - - - #F9FBE7 - #F0F4C3 - #E6EE9C - #DCE775 - #D4E157 - #CDDC39 - #C0CA33 - #A4B42B - #9E9D24 - #827717 - #F4FF81 - #EEFF41 - #C6FF00 - #AEEA00 - - - #FFFDE7 - #FFF9C4 - #FFF590 - #FFF176 - #FFEE58 - #FFEB3B - #FDD835 - #FBC02D - #F9A825 - #F57F17 - #FFFF82 - #FFFF00 - #FFEA00 - #FFD600 - - - #FFF8E1 - #FFECB3 - #FFE082 - #FFD54F - #FFCA28 - #FFC107 - #FFB300 - #FFA000 - #FF8F00 - #FF6F00 - #FFE57F - #FFD740 - #FFC400 - #FFAB00 - - - #FFF3E0 - #FFE0B2 - #FFCC80 - #FFB74D - #FFA726 - #FF9800 - #FB8C00 - #F57C00 - #EF6C00 - #E65100 - #FFD180 - #FFAB40 - #FF9100 - #FF6D00 - - - #FBE9A7 - #FFCCBC - #FFAB91 - #FF8A65 - #FF7043 - #FF5722 - #F4511E - #E64A19 - #D84315 - #BF360C - #FF9E80 - #FF6E40 - #FF3D00 - #DD2600 - - - #EFEBE9 - #D7CCC8 - #BCAAA4 - #A1887F - #8D6E63 - #795548 - #6D4C41 - #5D4037 - #4E342E - #3E2723 - - - #FAFAFA - #F5F5F5 - #EEEEEE - #E0E0E0 - #BDBDBD - #9E9E9E - #757575 - #616161 - #424242 - #212121 - #000000 - #ffffff - - - #ECEFF1 - #CFD8DC - #B0BBC5 - #90A4AE - #78909C - #607D8B - #546E7A - #455A64 - #37474F - #263238 - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 19b3c79..e491a55 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ Countdown options - Ubuntu release date + Select a custom date Use a custom date Use a custom release date for the countdown - Select a custom date - Theme - Choose whether you want a light or a dark theme - On touch action - Choose what should be done when you touch the widget - URL - Set a custom URL - Launcher options - Show Launcher icon - If unchecked hide the widget icon from the launcher (Restart - needed) - Show tutorial - Display the tutorial when you click on the launcher icon + Ubuntu release date Version Unable to determine version - Info, FAQ and acknowledgements - Donate - Buy me a beer - Help me to keep my apps free and without ads + Launcher options + On touch action + Choose what should be done when you touch the widget Report a bug Submit a new issue to the issue tracker - Display application changelog - Display settings - Save - Press Save to add the Widget + Show Launcher icon + If unchecked hide the widget icon from the launcher (Restart needed) + URL + Set a custom URL + Use Dark theme + Choose whether you want a light or a dark theme diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml deleted file mode 100644 index 3e0a83f..0000000 --- a/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 30b4e18..bb9d3ae 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,6 @@ - + - + - diff --git a/app/src/main/res/xml/appwidget_info_1x1.xml b/app/src/main/res/xml/app_widget_info.xml similarity index 55% rename from app/src/main/res/xml/appwidget_info_1x1.xml rename to app/src/main/res/xml/app_widget_info.xml index 154214e..20261cc 100644 --- a/app/src/main/res/xml/appwidget_info_1x1.xml +++ b/app/src/main/res/xml/app_widget_info.xml @@ -1,6 +1,6 @@ - + android:minResizeWidth="40dp" + android:minResizeHeight="40dp" + android:previewImage="@drawable/app_widget_preview" + android:resizeMode="horizontal|vertical" + android:targetCellWidth="1" + android:targetCellHeight="1" + android:updatePeriodMillis="0" + android:widgetCategory="home_screen" + android:widgetFeatures="reconfigurable" + tools:targetApi="s" /> diff --git a/app/src/main/res/xml/appwidget_info_2x2.xml b/app/src/main/res/xml/appwidget_info_2x2.xml deleted file mode 100644 index 8730ce8..0000000 --- a/app/src/main/res/xml/appwidget_info_2x2.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml deleted file mode 100755 index 9d70a5b..0000000 --- a/app/src/main/res/xml/preferences.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/versions/dependencies/debugAndroidTestRuntimeClasspathDependencies.txt b/app/versions/dependencies/debugAndroidTestRuntimeClasspathDependencies.txt index 4fb4e52..4b4552d 100644 --- a/app/versions/dependencies/debugAndroidTestRuntimeClasspathDependencies.txt +++ b/app/versions/dependencies/debugAndroidTestRuntimeClasspathDependencies.txt @@ -4,158 +4,17 @@ Project ':app' ------------------------------------------------------------ debugAndroidTestRuntimeClasspath - Runtime classpath of /debugAndroidTest. -+--- androidx.test.espresso:espresso-core:3.5.1 -| +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 -| | \--- androidx.annotation:annotation-jvm:1.6.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 -| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0 -| | \--- org.jetbrains:annotations:13.0 -> 20.1.0 -| +--- androidx.test:core:1.5.0 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.test:monitor:1.6.0 -> 1.6.1 -| | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | | +--- androidx.test:annotation:1.0.1 -| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | | | \--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | | \--- androidx.tracing:tracing:1.0.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.test.services:storage:1.4.2 -| | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*) -| | | +--- com.google.code.findbugs:jsr305:2.0.2 -| | | \--- androidx.test:annotation:1.0.1 (*) -| | +--- androidx.lifecycle:lifecycle-common:2.3.1 -> 2.5.1 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.tracing:tracing:1.0.0 (*) -| | +--- com.google.guava:listenablefuture:1.0 -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | \--- androidx.concurrent:concurrent-futures:1.1.0 -> 1.0.0 -| | +--- com.google.guava:listenablefuture:1.0 -| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.test:runner:1.5.2 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.test:annotation:1.0.1 (*) -| | +--- androidx.test:monitor:1.6.1 (*) -| | +--- androidx.test.services:storage:1.4.2 (*) -| | +--- androidx.tracing:tracing:1.0.0 (*) -| | \--- junit:junit:4.13.2 -| | \--- org.hamcrest:hamcrest-core:1.3 -| +--- androidx.test.espresso:espresso-idling-resource:3.5.1 -| +--- com.squareup:javawriter:2.1.1 -| +--- javax.inject:javax.inject:1 -| +--- org.hamcrest:hamcrest-library:1.3 -| | \--- org.hamcrest:hamcrest-core:1.3 -| +--- org.hamcrest:hamcrest-integration:1.3 -| | \--- org.hamcrest:hamcrest-library:1.3 (*) -| +--- com.google.code.findbugs:jsr305:2.0.2 -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| \--- androidx.test:annotation:1.0.1 (*) -+--- androidx.test.ext:junit-ktx:1.1.5 -| +--- androidx.test.ext:junit:1.1.5 -| | +--- junit:junit:4.13.2 (*) -| | +--- androidx.test:core:1.5.0 (*) -| | +--- androidx.test:monitor:1.6.1 (*) -| | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| +--- androidx.lifecycle:lifecycle-common:2.3.1 -> 2.5.1 (*) -| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -+--- androidx.test:runner:1.5.2 (*) -+--- io.mockk:mockk-android:1.13.5 -| +--- io.mockk:mockk:1.13.5 -| | \--- io.mockk:mockk-jvm:1.13.5 -| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) -| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0 -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) -| | +--- io.mockk:mockk-dsl:1.13.5 -| | | \--- io.mockk:mockk-dsl-jvm:1.13.5 -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 -> 1.6.1 -| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 (c) -| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 (c) -| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core -> 1.6.1 -| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 -| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1 (*) -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0 -> 1.9.0 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.0 -> 1.9.0 -| | | +--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) -| | | \--- io.mockk:mockk-core:1.13.5 -| | | \--- io.mockk:mockk-core-jvm:1.13.5 -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | | \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| | +--- io.mockk:mockk-agent:1.13.5 -| | | \--- io.mockk:mockk-agent-jvm:1.13.5 -| | | +--- org.objenesis:objenesis:3.3 -| | | +--- net.bytebuddy:byte-buddy:1.12.20 -| | | +--- net.bytebuddy:byte-buddy-agent:1.12.20 -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | | +--- io.mockk:mockk-agent-api:1.13.5 -| | | | \--- io.mockk:mockk-agent-api-jvm:1.13.5 -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | | | \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | | +--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| | | \--- io.mockk:mockk-core:1.13.5 (*) -| | +--- io.mockk:mockk-agent-api:1.13.5 (*) -| | +--- io.mockk:mockk-core:1.13.5 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | +--- org.slf4j:slf4j-api:2.0.5 -| | +--- junit:junit:4.13.2 (*) -| | +--- org.junit.jupiter:junit-jupiter:5.8.2 -| | | +--- org.junit:junit-bom:5.8.2 -| | | | +--- org.junit.jupiter:junit-jupiter:5.8.2 (c) -| | | | +--- org.junit.jupiter:junit-jupiter-api:5.8.2 (c) -| | | | +--- org.junit.jupiter:junit-jupiter-engine:5.8.2 (c) -| | | | +--- org.junit.jupiter:junit-jupiter-params:5.8.2 (c) -| | | | +--- org.junit.platform:junit-platform-commons:1.8.2 (c) -| | | | \--- org.junit.platform:junit-platform-engine:1.8.2 (c) -| | | +--- org.junit.jupiter:junit-jupiter-api:5.8.2 -| | | | +--- org.junit:junit-bom:5.8.2 (*) -| | | | +--- org.opentest4j:opentest4j:1.2.0 -| | | | \--- org.junit.platform:junit-platform-commons:1.8.2 -| | | | \--- org.junit:junit-bom:5.8.2 (*) -| | | +--- org.junit.jupiter:junit-jupiter-params:5.8.2 -| | | | +--- org.junit:junit-bom:5.8.2 (*) -| | | | \--- org.junit.jupiter:junit-jupiter-api:5.8.2 (*) -| | | \--- org.junit.jupiter:junit-jupiter-engine:5.8.2 -| | | +--- org.junit:junit-bom:5.8.2 (*) -| | | +--- org.junit.platform:junit-platform-engine:1.8.2 -| | | | +--- org.junit:junit-bom:5.8.2 (*) -| | | | +--- org.opentest4j:opentest4j:1.2.0 -| | | | \--- org.junit.platform:junit-platform-commons:1.8.2 (*) -| | | \--- org.junit.jupiter:junit-jupiter-api:5.8.2 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 -> 1.6.1 (*) -| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core -> 1.6.1 (*) -| | \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| +--- io.mockk:mockk-agent-api:1.13.5 (*) -| +--- io.mockk:mockk-agent-android:1.13.5 -| | +--- io.mockk:mockk-core:1.13.5 (*) -| | +--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| | +--- com.linkedin.dexmaker:dexmaker:2.28.1 -| | | \--- com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3 -| | +--- org.objenesis:objenesis:3.3 -| | +--- io.mockk:mockk-agent-api:1.13.5 (*) -| | +--- io.mockk:mockk-agent:1.13.5 (*) -| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -+--- androidx.annotation:annotation:{strictly 1.6.0} -> 1.6.0 (c) ++--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0 +| | \--- org.jetbrains:annotations:13.0 -> 23.0.0 +| \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) ++--- org.jetbrains.kotlin:kotlin-parcelize-runtime:{strictly 1.9.0} -> 1.9.0 (c) +--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.9.0} -> 1.9.0 (c) -+--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c) -+--- androidx.tracing:tracing:{strictly 1.0.0} -> 1.0.0 (c) -+--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.9.0} -> 1.9.0 (c) -+--- androidx.concurrent:concurrent-futures:{strictly 1.0.0} -> 1.0.0 (c) -+--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c) -+--- androidx.annotation:annotation-jvm:{strictly 1.6.0} -> 1.6.0 (c) ++--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:{strictly 1.9.0} -> 1.9.0 (c) +--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.9.0} -> 1.9.0 (c) -+--- org.jetbrains:annotations:{strictly 20.1.0} -> 20.1.0 (c) -+--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.9.0} -> 1.9.0 (c) -+--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.1} -> 1.6.1 (c) -+--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.1} -> 1.6.1 (c) -\--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.1} -> 1.6.1 (c) +\--- org.jetbrains:annotations:{strictly 23.0.0} -> 23.0.0 (c) (c) - A dependency constraint, not a dependency. The dependency affected by the constraint occurs elsewhere in the tree. (*) - Indicates repeated occurrences of a transitive dependency subtree. Gradle expands transitive dependency subtrees only once per project; repeat occurrences only display the root of the subtree, followed by this annotation. diff --git a/app/versions/dependencies/debugRuntimeClasspathDependencies.txt b/app/versions/dependencies/debugRuntimeClasspathDependencies.txt index b9954ec..421f356 100644 --- a/app/versions/dependencies/debugRuntimeClasspathDependencies.txt +++ b/app/versions/dependencies/debugRuntimeClasspathDependencies.txt @@ -7,7 +7,7 @@ debugRuntimeClasspath - Runtime classpath of /debug. +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0 -| | \--- org.jetbrains:annotations:13.0 -> 20.1.0 +| | \--- org.jetbrains:annotations:13.0 -> 23.0.0 | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0 | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) +--- com.squareup.leakcanary:leakcanary-android:2.12 @@ -16,11 +16,13 @@ debugRuntimeClasspath - Runtime classpath of /debug. | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) | | | \--- com.squareup.leakcanary:shark:2.12 | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) -| | | +--- com.squareup.okio:okio:2.2.2 -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.60 -> 1.9.0 (*) +| | | +--- com.squareup.okio:okio:2.2.2 -> 3.3.0 +| | | | \--- com.squareup.okio:okio-jvm:3.3.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0 -> 1.9.0 | | | \--- com.squareup.leakcanary:shark-graph:2.12 | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) -| | | +--- com.squareup.okio:okio:2.2.2 (*) +| | | +--- com.squareup.okio:okio:2.2.2 -> 3.3.0 (*) | | | \--- com.squareup.leakcanary:shark-hprof:2.12 | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) | | | \--- com.squareup.leakcanary:shark-log:2.12 @@ -53,281 +55,1079 @@ debugRuntimeClasspath - Runtime classpath of /debug. | | | \--- com.squareup.curtains:curtains:1.2.4 (*) | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) | \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) -+--- androidx.core:core-ktx:1.12.0-beta01 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 -| | \--- androidx.annotation:annotation-jvm:1.6.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 (*) -| +--- androidx.core:core:1.12.0-beta01 -| | +--- androidx.annotation:annotation:1.6.0 (*) -| | +--- androidx.annotation:annotation-experimental:1.3.0 -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.concurrent:concurrent-futures:1.0.0 -| | | +--- com.google.guava:listenablefuture:1.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.interpolator:interpolator:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.arch.core:core-common:2.1.0 -| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.arch.core:core-runtime:2.1.0 ++--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 +| \--- androidx.compose.ui:ui-tooling-android:1.6.0-alpha02 +| +--- androidx.activity:activity-compose:1.7.0 -> 1.7.2 +| | +--- androidx.activity:activity-ktx:1.7.2 +| | | +--- androidx.activity:activity:1.7.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 +| | | | | \--- androidx.annotation:annotation-jvm:1.6.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 +| | | | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | \--- com.google.guava:listenablefuture:1.0 +| | | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.6.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.arch.core:core-common:2.2.0 +| | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.2.0 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | \--- androidx.arch.core:core-common:2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 +| | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 +| | | | | | | | | +--- org.jetbrains:annotations:23.0.0 +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 +| | | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (c) +| | | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 (c) +| | | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (c) +| | | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 (*) +| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) +| | | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 +| | | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | | | +--- androidx.startup:startup-runtime:1.1.1 +| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | | \--- androidx.tracing:tracing:1.0.0 +| | | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | \--- com.google.guava:listenablefuture:1.0 +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | \--- androidx.core:core-ktx:1.12.0-beta01 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.core:core:1.12.0-beta01 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | | \--- androidx.core:core:1.12.0-beta01 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | | +--- androidx.savedstate:savedstate:1.2.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- androidx.tracing:tracing:1.0.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- androidx.activity:activity-compose:1.7.2 (c) +| | | | \--- androidx.activity:activity-ktx:1.7.2 (c) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | \--- androidx.savedstate:savedstate:1.2.1 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- androidx.activity:activity:1.7.2 (c) +| | | \--- androidx.activity:activity-compose:1.7.2 (c) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 +| | | \--- androidx.compose.runtime:runtime-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | +--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 (c) +| | | \--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (c) +| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.6.0-alpha02 +| | | \--- androidx.compose.runtime:runtime-saveable-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (c) +| | | \--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 +| | | \--- androidx.compose.ui:ui-android:1.6.0-alpha02 +| | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.7.2 (*) +| | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | +--- androidx.autofill:autofill:1.0.0 +| | | | \--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-geometry-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 +| | | | | \--- androidx.compose.ui:ui-util-android:1.6.0-alpha02 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | | \--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-graphics-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 +| | | | | \--- androidx.compose.ui:ui-unit-android:1.6.0-alpha02 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-text-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.6.1 +| | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | | | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.core:core:1.11.0-beta02 -> 1.12.0-beta01 (*) +| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.12.0-beta01 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) +| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.6.0-alpha02 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | +--- androidx.activity:activity-ktx:1.7.2 (c) +| | \--- androidx.activity:activity:1.7.2 (c) +| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| +--- androidx.compose.animation:animation:1.6.0-alpha02 +| | \--- androidx.compose.animation:animation-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 +| | | \--- androidx.compose.animation:animation-core-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | \--- androidx.compose.animation:animation:1.6.0-alpha02 (c) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 +| | | \--- androidx.compose.foundation:foundation-layout-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.12.0-beta01 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | \--- androidx.compose.foundation:foundation:1.6.0-alpha02 (c) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | \--- androidx.compose.animation:animation-core:1.6.0-alpha02 (c) +| +--- androidx.compose.material:material:1.0.0 -> 1.6.0-alpha02 +| | \--- androidx.compose.material:material-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 +| | | \--- androidx.compose.foundation:foundation-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.core:core:1.11.0-beta02 -> 1.12.0-beta01 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | \--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (c) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 +| | | \--- androidx.compose.material:material-icons-core-android:1.6.0-alpha02 +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| | | +--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | | \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) +| | +--- androidx.compose.material:material-ripple:1.6.0-alpha02 +| | | \--- androidx.compose.material:material-ripple-android:1.6.0-alpha02 +| | | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| | | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| | | \--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| | +--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-tooling-data-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-tooling-preview-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| \--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) ++--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) ++--- androidx.activity:activity-compose:1.7.2 (*) ++--- androidx.core:core-ktx:1.12.0-beta01 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) ++--- androidx.navigation:navigation-fragment-ktx:2.7.0 +| +--- androidx.navigation:navigation-fragment:2.7.0 +| | +--- androidx.fragment:fragment-ktx:1.6.0 +| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.7.2 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.9.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.fragment:fragment:1.6.0 +| | | | +--- androidx.activity:activity:1.5.1 -> 1.7.2 (*) | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | \--- androidx.arch.core:core-common:2.1.0 (*) -| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) -| | \--- androidx.core:core-ktx:1.12.0-beta01 (c) -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) -| \--- androidx.core:core:1.12.0-beta01 (c) -+--- androidx.multidex:multidex:2.0.1 -+--- com.jakewharton.timber:timber:5.0.1 -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.21 -> 1.9.0 (*) -| \--- org.jetbrains:annotations:20.1.0 -+--- androidx.legacy:legacy-support-v4:1.0.0 -| +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| +--- androidx.media:media:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | \--- androidx.versionedparcelable:versionedparcelable:1.0.0 -> 1.1.1 (*) -| +--- androidx.legacy:legacy-support-core-utils:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.documentfile:documentfile:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.loader:loader:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -| | | | +--- androidx.arch.core:core-runtime:2.0.0 -> 2.1.0 (*) -| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.0.0 -> 2.5.1 -| | | | | +--- androidx.arch.core:core-common:2.1.0 (*) -| | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) -| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) -| | | | \--- androidx.arch.core:core-common:2.0.0 -> 2.1.0 (*) -| | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.5.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) -| | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | \--- androidx.print:print:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| +--- androidx.legacy:legacy-support-core-ui:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) -| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.viewpager:viewpager:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | +--- androidx.coordinatorlayout:coordinatorlayout:1.0.0 -> 1.1.0 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.customview:customview:1.1.0 (*) -| | +--- androidx.slidingpanelayout:slidingpanelayout:1.0.0 -> 1.2.0 +| | | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | | | +--- androidx.loader:loader:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 2.6.1 +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.6.1 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- androidx.viewpager:viewpager:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) +| | | | \--- androidx.fragment:fragment-ktx:1.6.0 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) +| | | \--- androidx.fragment:fragment:1.6.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 +| | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.7.2 (*) +| | | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.collection:collection-ktx:1.1.0 (*) +| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 (c) +| | | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) | | | +--- androidx.customview:customview:1.1.0 (*) | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) | | | +--- androidx.window:window:1.0.0 | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.1 -| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 -| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 -| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1 -| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (c) -| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 (c) -| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 (c) -| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0 -> 1.9.0 (*) -| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.0 -> 1.9.0 -| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1 (*) -| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.7.3 (*) | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | | | +--- androidx.collection:collection:1.1.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) | | | | \--- androidx.core:core:1.3.2 -> 1.12.0-beta01 (*) | | | \--- androidx.transition:transition:1.4.1 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.interpolator:interpolator:1.0.0 (*) -| | +--- androidx.swiperefreshlayout:swiperefreshlayout:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.interpolator:interpolator:1.0.0 (*) -| | +--- androidx.asynclayoutinflater:asynclayoutinflater:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | \--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | \--- androidx.cursoradapter:cursoradapter:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| \--- androidx.fragment:fragment:1.0.0 -> 1.3.6 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) -| +--- androidx.collection:collection:1.1.0 (*) -| +--- androidx.viewpager:viewpager:1.0.0 (*) -| +--- androidx.loader:loader:1.0.0 (*) -| +--- androidx.activity:activity:1.2.4 -> 1.6.0 -| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 (*) -| | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 (*) -| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | | +--- androidx.savedstate:savedstate:1.2.0 -| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | +--- androidx.arch.core:core-common:2.1.0 (*) -| | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (*) -| | +--- androidx.savedstate:savedstate:1.2.0 (*) -| | +--- androidx.tracing:tracing:1.0.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | \--- androidx.activity:activity-ktx:1.6.0 (c) -| +--- androidx.lifecycle:lifecycle-livedata-core:2.3.1 -> 2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel:2.3.1 -> 2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1 -> 2.5.1 (*) -| +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*) -| \--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) -+--- androidx.appcompat:appcompat:1.6.1 -| +--- androidx.activity:activity:1.6.0 (*) -| +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) -| +--- androidx.appcompat:appcompat-resources:1.6.1 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 +| | | +--- androidx.navigation:navigation-common:2.7.0 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 (c) +| | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (*) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-compose:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| \--- androidx.navigation:navigation-common:2.7.0 (c) ++--- androidx.navigation:navigation-ui-ktx:2.7.0 +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (*) +| +--- androidx.navigation:navigation-ui:2.7.0 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.customview:customview:1.1.0 (*) +| | +--- androidx.drawerlayout:drawerlayout:1.1.1 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.customview:customview:1.1.0 (*) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (*) +| | +--- androidx.transition:transition:1.3.0 -> 1.4.1 (*) +| | +--- com.google.android.material:material:1.4.0-beta01 -> 1.9.0 +| | | +--- com.google.errorprone:error_prone_annotations:2.15.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.appcompat:appcompat:1.5.0 -> 1.6.1 +| | | | +--- androidx.activity:activity:1.6.0 -> 1.7.2 (*) +| | | | +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) +| | | | +--- androidx.appcompat:appcompat-resources:1.6.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | | | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | \--- androidx.appcompat:appcompat:1.6.1 (c) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core:1.9.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.cursoradapter:cursoradapter:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 (*) +| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | +--- androidx.emoji2:emoji2-views-helper:1.2.0 -> 1.3.0 +| | | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | | | \--- androidx.emoji2:emoji2:1.3.0 (c) +| | | | +--- androidx.fragment:fragment:1.3.6 -> 1.6.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 -> 2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.6.1 (*) +| | | | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) +| | | | \--- androidx.appcompat:appcompat-resources:1.6.1 (c) +| | | +--- androidx.cardview:cardview:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.constraintlayout:constraintlayout:2.0.1 +| | | | +--- androidx.appcompat:appcompat:1.2.0 -> 1.6.1 (*) +| | | | +--- androidx.core:core:1.3.1 -> 1.12.0-beta01 (*) +| | | | \--- androidx.constraintlayout:constraintlayout-solver:2.0.1 +| | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) +| | | +--- androidx.dynamicanimation:dynamicanimation:1.0.0 +| | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | \--- androidx.legacy:legacy-support-core-utils:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.documentfile:documentfile:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.loader:loader:1.0.0 (*) +| | | | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | \--- androidx.print:print:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | +--- androidx.fragment:fragment:1.2.5 -> 1.6.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.6.1 (*) +| | | +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.transition:transition:1.2.0 -> 1.4.1 (*) | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) -| | | +--- androidx.interpolator:interpolator:1.0.0 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | \--- androidx.appcompat:appcompat:1.6.1 (c) -| +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.core:core:1.9.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.viewpager2:viewpager2:1.0.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.fragment:fragment:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.recyclerview:recyclerview:1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-compose:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| \--- androidx.navigation:navigation-common:2.7.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*) ++--- com.google.dagger:hilt-android:2.47 +| +--- com.google.dagger:dagger:2.47 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.dagger:dagger-lint-aar:2.47 +| +--- com.google.dagger:hilt-core:2.47 +| | +--- com.google.dagger:dagger:2.47 (*) +| | +--- com.google.code.findbugs:jsr305:3.0.2 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.code.findbugs:jsr305:3.0.2 +| +--- androidx.activity:activity:1.5.1 -> 1.7.2 (*) +| +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| +--- androidx.fragment:fragment:1.5.1 -> 1.6.0 (*) +| +--- androidx.lifecycle:lifecycle-common:2.5.1 -> 2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -> 2.6.1 (*) +| +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| +--- javax.inject:javax.inject:1 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) ++--- androidx.hilt:hilt-navigation-compose:1.0.0 +| +--- androidx.hilt:hilt-navigation:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.9.0 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.navigation:navigation-runtime:2.3.2 -> 2.7.0 (*) +| | \--- com.google.dagger:hilt-android:2.35 -> 2.47 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0 -> 2.6.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| +--- androidx.navigation:navigation-compose:2.4.0 -> 2.7.0 +| | +--- androidx.activity:activity-compose:1.7.0 -> 1.7.2 (*) +| | +--- androidx.compose.animation:animation:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (*) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) ++--- com.michael-bull.kotlin-result:kotlin-result:1.1.18 +| \--- com.michael-bull.kotlin-result:kotlin-result-jvm:1.1.18 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.9.0 ++--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5 +| \--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.5 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.0 -> 1.9.0 ++--- com.jakewharton.timber:timber:5.0.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.21 -> 1.9.0 (*) +| \--- org.jetbrains:annotations:20.1.0 -> 23.0.0 ++--- com.mikepenz:aboutlibraries-compose:10.8.3 +| \--- com.mikepenz:aboutlibraries-compose-android:10.8.3 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.0 (*) +| +--- org.jetbrains.compose.ui:ui-tooling-preview:1.4.1 +| | \--- androidx.compose.ui:ui-tooling-preview:1.4.3 -> 1.6.0-alpha02 (*) +| +--- androidx.core:core-ktx:1.10.1 -> 1.12.0-beta01 (*) +| +--- com.mikepenz:aboutlibraries-core:10.8.3 +| | \--- com.mikepenz:aboutlibraries-core-android-debug:10.8.3 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- org.jetbrains.compose.runtime:runtime:1.4.1 +| | \--- androidx.compose.runtime:runtime:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.ui:ui:1.4.1 +| | \--- androidx.compose.ui:ui:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.foundation:foundation:1.4.1 +| | \--- androidx.compose.foundation:foundation:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.material:material:1.4.1 +| | \--- androidx.compose.material:material:1.4.3 -> 1.6.0-alpha02 (*) +| \--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5 (*) ++--- com.mikepenz:aboutlibraries-core:10.8.3 (*) ++--- com.google.accompanist:accompanist-placeholder-material3:0.33.0-alpha +| +--- androidx.compose.material3:material3:1.0.1 -> 1.2.0-alpha04 +| | \--- androidx.compose.material3:material3-android:1.2.0-alpha04 +| | +--- androidx.activity:activity-compose:1.5.0 -> 1.7.2 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-ripple:1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | \--- androidx.compose.material3:material3-window-size-class:1.2.0-alpha04 (c) +| +--- io.github.aakira:napier:1.4.1 +| | \--- io.github.aakira:napier-android-debug:1.4.1 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.9.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32 -> 1.9.0 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| +--- com.google.accompanist:accompanist-placeholder:0.33.0-alpha +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- io.github.aakira:napier:1.4.1 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- com.google.accompanist:accompanist-systemuicontroller:0.33.0-alpha | +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) -| +--- androidx.cursoradapter:cursoradapter:1.0.0 (*) -| +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 (*) -| +--- androidx.emoji2:emoji2:1.2.0 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | +--- androidx.lifecycle:lifecycle-process:2.4.1 -| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) -| | | +--- androidx.startup:startup-runtime:1.1.1 -| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | \--- androidx.tracing:tracing:1.0.0 (*) -| | | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | \--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) -| +--- androidx.emoji2:emoji2-views-helper:1.2.0 -| | +--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | \--- androidx.emoji2:emoji2:1.2.0 (*) -| +--- androidx.fragment:fragment:1.3.6 (*) -| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 -| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.savedstate:savedstate:1.2.0 (*) -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| \--- androidx.appcompat:appcompat-resources:1.6.1 (c) -+--- com.google.android.material:material:1.9.0 -| +--- com.google.errorprone:error_prone_annotations:2.15.0 +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- androidx.appcompat:appcompat:1.6.1 (*) ++--- androidx.compose.material:material:1.6.0-alpha02 (*) ++--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 +| \--- androidx.compose.material:material-icons-extended-android:1.6.0-alpha02 +| +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) ++--- androidx.compose.material3:material3:1.2.0-alpha04 (*) ++--- androidx.compose.material3:material3-window-size-class:1.1.1 -> 1.2.0-alpha04 +| \--- androidx.compose.material3:material3-window-size-class-android:1.2.0-alpha04 +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| +--- androidx.window:window:1.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| \--- androidx.compose.material3:material3:1.2.0-alpha04 (c) ++--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) ++--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (c) +| \--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (c) ++--- androidx.compose.ui:ui:1.6.0-alpha02 (*) ++--- androidx.constraintlayout:constraintlayout-compose:1.0.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.10 -> 1.9.0 (*) +| +--- androidx.compose.ui:ui:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-util:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.foundation:foundation:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.material:material:1.0.0 -> 1.6.0-alpha02 (*) +| \--- androidx.constraintlayout:constraintlayout-core:1.0.4 ++--- androidx.core:core-splashscreen:1.0.1 | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| +--- androidx.appcompat:appcompat:1.5.0 -> 1.6.1 (*) -| +--- androidx.cardview:cardview:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 (*) -| +--- androidx.constraintlayout:constraintlayout:2.0.1 -| | +--- androidx.appcompat:appcompat:1.2.0 -> 1.6.1 (*) -| | +--- androidx.core:core:1.3.1 -> 1.12.0-beta01 (*) -| | \--- androidx.constraintlayout:constraintlayout-solver:2.0.1 -| +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) -| +--- androidx.dynamicanimation:dynamicanimation:1.0.0 -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | \--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) -| +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) -| +--- androidx.fragment:fragment:1.2.5 -> 1.3.6 (*) -| +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.5.1 (*) -| +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) ++--- androidx.datastore:datastore-preferences:1.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| +--- androidx.datastore:datastore:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*) +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | \--- androidx.datastore:datastore-core:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*) +| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| \--- androidx.datastore:datastore-preferences-core:1.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| \--- androidx.datastore:datastore-core:1.0.0 (*) ++--- androidx.glance:glance-appwidget:1.0.0-rc01 +| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.core:core-ktx:1.7.0 -> 1.12.0-beta01 (*) +| +--- androidx.core:core-remoteviews:1.0.0-rc01 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.datastore:datastore:1.0.0 (*) +| +--- androidx.datastore:datastore-core:1.0.0 (*) +| +--- androidx.datastore:datastore-preferences:1.0.0 (*) +| +--- androidx.datastore:datastore-preferences-core:1.0.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.transition:transition:1.2.0 -> 1.4.1 (*) -| +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) -| \--- androidx.viewpager2:viewpager2:1.0.0 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.fragment:fragment:1.1.0 -> 1.3.6 (*) -| +--- androidx.recyclerview:recyclerview:1.1.0 (*) -| +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| \--- androidx.collection:collection:1.1.0 (*) -+--- androidx.preference:preference-ktx:1.2.0 -| +--- androidx.preference:preference:1.2.0 | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.appcompat:appcompat:1.1.0 -> 1.6.1 (*) -| | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| | +--- androidx.fragment:fragment-ktx:1.3.6 -| | | +--- androidx.fragment:fragment:1.3.6 (*) -| | | +--- androidx.activity:activity-ktx:1.2.2 -> 1.6.0 -| | | | +--- androidx.activity:activity:1.6.0 (*) -| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.datastore:datastore-core:1.0.0 (*) +| | +--- androidx.datastore:datastore-preferences:1.0.0 (*) +| | +--- androidx.datastore:datastore-preferences-core:1.0.0 (*) +| | +--- androidx.work:work-runtime:2.7.1 +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | +--- com.google.guava:listenablefuture:1.0 +| | | +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.6.1 (*) +| | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.room:room-runtime:2.2.5 +| | | | +--- androidx.room:room-common:2.2.5 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.sqlite:sqlite-framework:2.0.1 -> 2.1.0 | | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (*) -| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 -| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (*) -| | | | +--- androidx.savedstate:savedstate-ktx:1.2.0 -| | | | | +--- androidx.savedstate:savedstate:1.2.0 (*) -| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | | | \--- androidx.activity:activity:1.6.0 (c) -| | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.collection:collection-ktx:1.1.0 -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.9.0 (*) -| | | | \--- androidx.collection:collection:1.1.0 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1 -| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.3.1 -> 2.5.1 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.9.0 (*) -| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1 -> 2.5.1 (*) -| | | +--- androidx.savedstate:savedstate-ktx:1.1.0 -> 1.2.0 (*) -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.9.0 (*) -| | +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 (*) -| | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 (*) -| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| +--- androidx.fragment:fragment-ktx:1.3.6 (*) -| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) -+--- androidx.legacy:legacy-preference-v14:1.0.0 -| \--- androidx.preference:preference:1.0.0 -> 1.2.0 (*) -\--- com.github.gabrielemariotti.changeloglib:changelog:2.1.0 - +--- com.android.support:recyclerview-v7:23.3.0 -> androidx.recyclerview:recyclerview:1.1.0 (*) - \--- com.android.support:support-v4:23.3.0 -> androidx.legacy:legacy-support-v4:1.0.0 (*) +| | | | | \--- androidx.sqlite:sqlite:2.1.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.sqlite:sqlite:2.0.1 -> 2.1.0 (*) +| | | | \--- androidx.arch.core:core-runtime:2.0.1 -> 2.2.0 (*) +| | | +--- androidx.sqlite:sqlite:2.1.0 (*) +| | | +--- androidx.sqlite:sqlite-framework:2.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.lifecycle:lifecycle-service:2.1.0 -> 2.6.1 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | +--- androidx.work:work-runtime-ktx:2.7.1 +| | | +--- androidx.work:work-runtime:2.7.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.30 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0 -> 1.7.3 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.glance:glance-appwidget:1.0.0-rc01 (c) +| | \--- androidx.glance:glance-material3:1.0.0-rc01 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (c) +| \--- androidx.glance:glance-material3:1.0.0-rc01 (c) ++--- androidx.glance:glance-material3:1.0.0-rc01 +| +--- androidx.annotation:annotation:1.4.0 -> 1.6.0 (*) +| +--- androidx.compose.material3:material3:1.0.0 -> 1.2.0-alpha04 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (c) +| \--- androidx.glance:glance-appwidget:1.0.0-rc01 (c) ++--- androidx.lifecycle:lifecycle-process:2.6.1 (*) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) ++--- androidx.navigation:navigation-compose:2.7.0 (*) ++--- androidx.paging:paging-compose:3.2.0 +| +--- androidx.compose.foundation:foundation:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.paging:paging-common:3.2.0 +| | +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) +| | +--- androidx.arch.core:core-common:2.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.3 (*) +| | \--- androidx.paging:paging-compose:3.2.0 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| \--- androidx.paging:paging-common:3.2.0 (c) ++--- io.coil-kt:coil-compose:2.4.0 +| +--- io.coil-kt:coil-compose-base:2.4.0 +| | +--- androidx.core:core-ktx:1.9.0 -> 1.12.0-beta01 (*) +| | +--- com.google.accompanist:accompanist-drawablepainter:0.30.1 +| | | +--- androidx.compose.ui:ui:1.4.0 -> 1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +| | +--- io.coil-kt:coil-base:2.4.0 +| | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.6.1 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.9.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.exifinterface:exifinterface:1.3.6 +| | | | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.11.0 +| | | | +--- com.squareup.okio:okio:3.2.0 -> 3.3.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.9.0 (*) +| | | \--- com.squareup.okio:okio:3.3.0 (*) +| | +--- androidx.compose.foundation:foundation:1.4.3 -> 1.6.0-alpha02 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) +| +--- io.coil-kt:coil:2.4.0 +| | +--- io.coil-kt:coil-base:2.4.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) ++--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1 +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1 (c) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1 (c) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1 (c) +| | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21 -> 1.9.0 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21 -> 1.9.0 ++--- com.google.android.material:material:1.9.0 (*) ++--- com.squareup.okhttp3:logging-interceptor:4.11.0 +| +--- com.squareup.okhttp3:okhttp:4.11.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.9.0 (*) ++--- com.squareup.retrofit2:retrofit:2.9.0 +| \--- com.squareup.okhttp3:okhttp:3.14.9 -> 4.11.0 (*) ++--- com.squareup.retrofit2:converter-scalars:2.9.0 +| \--- com.squareup.retrofit2:retrofit:2.9.0 (*) +\--- com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0 + +--- com.squareup.retrofit2:retrofit:2.9.0 (*) + +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.0 -> 1.5.1 (*) + \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) (c) - A dependency constraint, not a dependency. The dependency affected by the constraint occurs elsewhere in the tree. (*) - Indicates repeated occurrences of a transitive dependency subtree. Gradle expands transitive dependency subtrees only once per project; repeat occurrences only display the root of the subtree, followed by this annotation. diff --git a/app/versions/dependencies/debugUnitTestRuntimeClasspathDependencies.txt b/app/versions/dependencies/debugUnitTestRuntimeClasspathDependencies.txt index 89e7dfb..f6ef263 100644 --- a/app/versions/dependencies/debugUnitTestRuntimeClasspathDependencies.txt +++ b/app/versions/dependencies/debugUnitTestRuntimeClasspathDependencies.txt @@ -5,92 +5,29 @@ Project ':app' debugUnitTestRuntimeClasspath - Runtime classpath of /debugUnitTest. +--- project :app (*) -+--- io.mockk:mockk:1.13.5 -| \--- io.mockk:mockk-jvm:1.13.5 -| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0 -| | | \--- org.jetbrains:annotations:13.0 -> 20.1.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) -| +--- io.mockk:mockk-dsl:1.13.5 -| | \--- io.mockk:mockk-dsl-jvm:1.13.5 -| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 -| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) -| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) -| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) -| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core -> 1.6.4 -| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 -| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.9.0 (*) -| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.9.0 -| | +--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) -| | \--- io.mockk:mockk-core:1.13.5 -| | \--- io.mockk:mockk-core-jvm:1.13.5 -| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| +--- io.mockk:mockk-agent:1.13.5 -| | \--- io.mockk:mockk-agent-jvm:1.13.5 -| | +--- org.objenesis:objenesis:3.3 -| | +--- net.bytebuddy:byte-buddy:1.12.20 -| | +--- net.bytebuddy:byte-buddy-agent:1.12.20 -| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | +--- io.mockk:mockk-agent-api:1.13.5 -| | | \--- io.mockk:mockk-agent-api-jvm:1.13.5 -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | | \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | +--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| | \--- io.mockk:mockk-core:1.13.5 (*) -| +--- io.mockk:mockk-agent-api:1.13.5 (*) -| +--- io.mockk:mockk-core:1.13.5 (*) -| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| +--- org.slf4j:slf4j-api:2.0.5 -| +--- junit:junit:4.13.2 -| | \--- org.hamcrest:hamcrest-core:1.3 -| +--- org.junit.jupiter:junit-jupiter:5.8.2 -| | +--- org.junit:junit-bom:5.8.2 -| | | +--- org.junit.jupiter:junit-jupiter:5.8.2 (c) -| | | +--- org.junit.jupiter:junit-jupiter-api:5.8.2 (c) -| | | +--- org.junit.jupiter:junit-jupiter-engine:5.8.2 (c) -| | | +--- org.junit.jupiter:junit-jupiter-params:5.8.2 (c) -| | | +--- org.junit.platform:junit-platform-commons:1.8.2 (c) -| | | \--- org.junit.platform:junit-platform-engine:1.8.2 (c) -| | +--- org.junit.jupiter:junit-jupiter-api:5.8.2 -| | | +--- org.junit:junit-bom:5.8.2 (*) -| | | +--- org.opentest4j:opentest4j:1.2.0 -| | | \--- org.junit.platform:junit-platform-commons:1.8.2 -| | | \--- org.junit:junit-bom:5.8.2 (*) -| | +--- org.junit.jupiter:junit-jupiter-params:5.8.2 -| | | +--- org.junit:junit-bom:5.8.2 (*) -| | | \--- org.junit.jupiter:junit-jupiter-api:5.8.2 (*) -| | \--- org.junit.jupiter:junit-jupiter-engine:5.8.2 -| | +--- org.junit:junit-bom:5.8.2 (*) -| | +--- org.junit.platform:junit-platform-engine:1.8.2 -| | | +--- org.junit:junit-bom:5.8.2 (*) -| | | +--- org.opentest4j:opentest4j:1.2.0 -| | | \--- org.junit.platform:junit-platform-commons:1.8.2 (*) -| | \--- org.junit.jupiter:junit-jupiter-api:5.8.2 (*) -| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) -| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core -> 1.6.4 (*) -| \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -+--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0 +| | \--- org.jetbrains:annotations:13.0 -> 23.0.0 +| \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) +--- com.squareup.leakcanary:leakcanary-android:2.12 | +--- com.squareup.leakcanary:leakcanary-android-core:2.12 | | +--- com.squareup.leakcanary:shark-android:2.12 | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) | | | \--- com.squareup.leakcanary:shark:2.12 | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) -| | | +--- com.squareup.okio:okio:2.2.2 -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.60 -> 1.9.0 (*) +| | | +--- com.squareup.okio:okio:2.2.2 -> 3.3.0 +| | | | \--- com.squareup.okio:okio-jvm:3.3.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0 -> 1.9.0 | | | \--- com.squareup.leakcanary:shark-graph:2.12 | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) -| | | +--- com.squareup.okio:okio:2.2.2 (*) +| | | +--- com.squareup.okio:okio:2.2.2 -> 3.3.0 (*) | | | \--- com.squareup.leakcanary:shark-hprof:2.12 | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) | | | \--- com.squareup.leakcanary:shark-log:2.12 @@ -123,274 +60,1075 @@ debugUnitTestRuntimeClasspath - Runtime classpath of /debugUnitTest. | | | \--- com.squareup.curtains:curtains:1.2.4 (*) | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) | \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.72 -> 1.9.0 (*) -+--- androidx.core:core-ktx:1.12.0-beta01 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 -| | \--- androidx.annotation:annotation-jvm:1.6.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 (*) -| +--- androidx.core:core:1.12.0-beta01 -| | +--- androidx.annotation:annotation:1.6.0 (*) -| | +--- androidx.annotation:annotation-experimental:1.3.0 -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.concurrent:concurrent-futures:1.0.0 -| | | +--- com.google.guava:listenablefuture:1.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.interpolator:interpolator:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.arch.core:core-common:2.1.0 -| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.arch.core:core-runtime:2.1.0 ++--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 +| \--- androidx.compose.ui:ui-tooling-android:1.6.0-alpha02 +| +--- androidx.activity:activity-compose:1.7.0 -> 1.7.2 +| | +--- androidx.activity:activity-ktx:1.7.2 +| | | +--- androidx.activity:activity:1.7.2 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 +| | | | | \--- androidx.annotation:annotation-jvm:1.6.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 +| | | | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | | | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | \--- com.google.guava:listenablefuture:1.0 +| | | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.6.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.arch.core:core-common:2.2.0 +| | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.2.0 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | \--- androidx.arch.core:core-common:2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 +| | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 +| | | | | | | | | +--- org.jetbrains:annotations:23.0.0 +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 +| | | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (c) +| | | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 (c) +| | | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (c) +| | | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 (*) +| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) +| | | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 +| | | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | | | +--- androidx.startup:startup-runtime:1.1.1 +| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | | \--- androidx.tracing:tracing:1.0.0 +| | | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | \--- com.google.guava:listenablefuture:1.0 +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | \--- androidx.core:core-ktx:1.12.0-beta01 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.core:core:1.12.0-beta01 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | | \--- androidx.core:core:1.12.0-beta01 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | | +--- androidx.savedstate:savedstate:1.2.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- androidx.tracing:tracing:1.0.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- androidx.activity:activity-compose:1.7.2 (c) +| | | | \--- androidx.activity:activity-ktx:1.7.2 (c) +| | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | \--- androidx.savedstate:savedstate:1.2.1 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- androidx.activity:activity:1.7.2 (c) +| | | \--- androidx.activity:activity-compose:1.7.2 (c) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 +| | | \--- androidx.compose.runtime:runtime-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | +--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 (c) +| | | \--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (c) +| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.6.0-alpha02 +| | | \--- androidx.compose.runtime:runtime-saveable-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (c) +| | | \--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 +| | | \--- androidx.compose.ui:ui-android:1.6.0-alpha02 +| | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.7.2 (*) +| | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | +--- androidx.autofill:autofill:1.0.0 +| | | | \--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-geometry-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 +| | | | | \--- androidx.compose.ui:ui-util-android:1.6.0-alpha02 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | | \--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-graphics-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 +| | | | | \--- androidx.compose.ui:ui-unit-android:1.6.0-alpha02 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (*) +| | | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-text-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.6.1 +| | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | | | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.core:core:1.11.0-beta02 -> 1.12.0-beta01 (*) +| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.12.0-beta01 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) +| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.6.0-alpha02 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | +--- androidx.activity:activity-ktx:1.7.2 (c) +| | \--- androidx.activity:activity:1.7.2 (c) +| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| +--- androidx.compose.animation:animation:1.6.0-alpha02 +| | \--- androidx.compose.animation:animation-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 +| | | \--- androidx.compose.animation:animation-core-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | \--- androidx.compose.animation:animation:1.6.0-alpha02 (c) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 +| | | \--- androidx.compose.foundation:foundation-layout-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.12.0-beta01 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | \--- androidx.compose.foundation:foundation:1.6.0-alpha02 (c) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | \--- androidx.compose.animation:animation-core:1.6.0-alpha02 (c) +| +--- androidx.compose.material:material:1.0.0 -> 1.6.0-alpha02 +| | \--- androidx.compose.material:material-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 +| | | \--- androidx.compose.foundation:foundation-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.core:core:1.11.0-beta02 -> 1.12.0-beta01 (*) +| | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | \--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (c) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 +| | | \--- androidx.compose.material:material-icons-core-android:1.6.0-alpha02 +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| | | +--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | | \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) +| | +--- androidx.compose.material:material-ripple:1.6.0-alpha02 +| | | \--- androidx.compose.material:material-ripple-android:1.6.0-alpha02 +| | | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| | | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| | | \--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| | +--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-tooling-data-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-tooling-preview-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| \--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) ++--- androidx.activity:activity-compose:1.7.2 (*) ++--- androidx.core:core-ktx:1.12.0-beta01 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) ++--- androidx.navigation:navigation-fragment-ktx:2.7.0 +| +--- androidx.navigation:navigation-fragment:2.7.0 +| | +--- androidx.fragment:fragment-ktx:1.6.0 +| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.7.2 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.9.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.fragment:fragment:1.6.0 +| | | | +--- androidx.activity:activity:1.5.1 -> 1.7.2 (*) | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | \--- androidx.arch.core:core-common:2.1.0 (*) -| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) -| | \--- androidx.core:core-ktx:1.12.0-beta01 (c) -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) -| \--- androidx.core:core:1.12.0-beta01 (c) -+--- androidx.multidex:multidex:2.0.1 -+--- com.jakewharton.timber:timber:5.0.1 -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.21 -> 1.9.0 (*) -| \--- org.jetbrains:annotations:20.1.0 -+--- androidx.legacy:legacy-support-v4:1.0.0 -| +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| +--- androidx.media:media:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | \--- androidx.versionedparcelable:versionedparcelable:1.0.0 -> 1.1.1 (*) -| +--- androidx.legacy:legacy-support-core-utils:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.documentfile:documentfile:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.loader:loader:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -| | | | +--- androidx.arch.core:core-runtime:2.0.0 -> 2.1.0 (*) -| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.0.0 -> 2.5.1 -| | | | | +--- androidx.arch.core:core-common:2.1.0 (*) -| | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) -| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) -| | | | \--- androidx.arch.core:core-common:2.0.0 -> 2.1.0 (*) -| | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.5.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) -| | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | \--- androidx.print:print:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| +--- androidx.legacy:legacy-support-core-ui:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) -| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.viewpager:viewpager:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | +--- androidx.coordinatorlayout:coordinatorlayout:1.0.0 -> 1.1.0 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.customview:customview:1.1.0 (*) -| | +--- androidx.slidingpanelayout:slidingpanelayout:1.0.0 -> 1.2.0 +| | | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | | | +--- androidx.loader:loader:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 2.6.1 +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.6.1 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- androidx.viewpager:viewpager:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) +| | | | \--- androidx.fragment:fragment-ktx:1.6.0 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) +| | | \--- androidx.fragment:fragment:1.6.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 +| | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.7.2 (*) +| | | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.collection:collection-ktx:1.1.0 (*) +| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 (c) +| | | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) | | | +--- androidx.customview:customview:1.1.0 (*) | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) | | | +--- androidx.window:window:1.0.0 | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.4 -| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) -| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) -| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.7.3 (*) | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | | | +--- androidx.collection:collection:1.1.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) | | | | \--- androidx.core:core:1.3.2 -> 1.12.0-beta01 (*) | | | \--- androidx.transition:transition:1.4.1 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.interpolator:interpolator:1.0.0 (*) -| | +--- androidx.swiperefreshlayout:swiperefreshlayout:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.interpolator:interpolator:1.0.0 (*) -| | +--- androidx.asynclayoutinflater:asynclayoutinflater:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | \--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | \--- androidx.cursoradapter:cursoradapter:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| \--- androidx.fragment:fragment:1.0.0 -> 1.3.6 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) -| +--- androidx.collection:collection:1.1.0 (*) -| +--- androidx.viewpager:viewpager:1.0.0 (*) -| +--- androidx.loader:loader:1.0.0 (*) -| +--- androidx.activity:activity:1.2.4 -> 1.6.0 -| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 (*) -| | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 (*) -| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | | +--- androidx.savedstate:savedstate:1.2.0 -| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | +--- androidx.arch.core:core-common:2.1.0 (*) -| | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) -| | +--- androidx.savedstate:savedstate:1.2.0 (*) -| | +--- androidx.tracing:tracing:1.0.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | \--- androidx.activity:activity-ktx:1.6.0 (c) -| +--- androidx.lifecycle:lifecycle-livedata-core:2.3.1 -> 2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel:2.3.1 -> 2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1 -> 2.5.1 (*) -| +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*) -| \--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) -+--- androidx.appcompat:appcompat:1.6.1 -| +--- androidx.activity:activity:1.6.0 (*) -| +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) -| +--- androidx.appcompat:appcompat-resources:1.6.1 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 +| | | +--- androidx.navigation:navigation-common:2.7.0 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 (c) +| | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (*) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-compose:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| \--- androidx.navigation:navigation-common:2.7.0 (c) ++--- androidx.navigation:navigation-ui-ktx:2.7.0 +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (*) +| +--- androidx.navigation:navigation-ui:2.7.0 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.customview:customview:1.1.0 (*) +| | +--- androidx.drawerlayout:drawerlayout:1.1.1 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.customview:customview:1.1.0 (*) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (*) +| | +--- androidx.transition:transition:1.3.0 -> 1.4.1 (*) +| | +--- com.google.android.material:material:1.4.0-beta01 -> 1.9.0 +| | | +--- com.google.errorprone:error_prone_annotations:2.15.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.appcompat:appcompat:1.5.0 -> 1.6.1 +| | | | +--- androidx.activity:activity:1.6.0 -> 1.7.2 (*) +| | | | +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) +| | | | +--- androidx.appcompat:appcompat-resources:1.6.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | | | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | \--- androidx.appcompat:appcompat:1.6.1 (c) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core:1.9.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.cursoradapter:cursoradapter:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 (*) +| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | +--- androidx.emoji2:emoji2-views-helper:1.2.0 -> 1.3.0 +| | | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | | | \--- androidx.emoji2:emoji2:1.3.0 (c) +| | | | +--- androidx.fragment:fragment:1.3.6 -> 1.6.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 -> 2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.6.1 (*) +| | | | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) +| | | | \--- androidx.appcompat:appcompat-resources:1.6.1 (c) +| | | +--- androidx.cardview:cardview:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.constraintlayout:constraintlayout:2.0.1 +| | | | +--- androidx.appcompat:appcompat:1.2.0 -> 1.6.1 (*) +| | | | +--- androidx.core:core:1.3.1 -> 1.12.0-beta01 (*) +| | | | \--- androidx.constraintlayout:constraintlayout-solver:2.0.1 +| | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) +| | | +--- androidx.dynamicanimation:dynamicanimation:1.0.0 +| | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | \--- androidx.legacy:legacy-support-core-utils:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.documentfile:documentfile:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.loader:loader:1.0.0 (*) +| | | | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | \--- androidx.print:print:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | +--- androidx.fragment:fragment:1.2.5 -> 1.6.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.6.1 (*) +| | | +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.transition:transition:1.2.0 -> 1.4.1 (*) | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) -| | | +--- androidx.interpolator:interpolator:1.0.0 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | \--- androidx.appcompat:appcompat:1.6.1 (c) -| +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.core:core:1.9.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.viewpager2:viewpager2:1.0.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.fragment:fragment:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.recyclerview:recyclerview:1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-compose:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| \--- androidx.navigation:navigation-common:2.7.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*) ++--- com.google.dagger:hilt-android:2.47 +| +--- com.google.dagger:dagger:2.47 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.dagger:dagger-lint-aar:2.47 +| +--- com.google.dagger:hilt-core:2.47 +| | +--- com.google.dagger:dagger:2.47 (*) +| | +--- com.google.code.findbugs:jsr305:3.0.2 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.code.findbugs:jsr305:3.0.2 +| +--- androidx.activity:activity:1.5.1 -> 1.7.2 (*) +| +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| +--- androidx.fragment:fragment:1.5.1 -> 1.6.0 (*) +| +--- androidx.lifecycle:lifecycle-common:2.5.1 -> 2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -> 2.6.1 (*) +| +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| +--- javax.inject:javax.inject:1 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) ++--- androidx.hilt:hilt-navigation-compose:1.0.0 +| +--- androidx.hilt:hilt-navigation:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.9.0 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.navigation:navigation-runtime:2.3.2 -> 2.7.0 (*) +| | \--- com.google.dagger:hilt-android:2.35 -> 2.47 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0 -> 2.6.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| +--- androidx.navigation:navigation-compose:2.4.0 -> 2.7.0 +| | +--- androidx.activity:activity-compose:1.7.0 -> 1.7.2 (*) +| | +--- androidx.compose.animation:animation:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (*) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) ++--- com.michael-bull.kotlin-result:kotlin-result:1.1.18 +| \--- com.michael-bull.kotlin-result:kotlin-result-jvm:1.1.18 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.9.0 ++--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5 +| \--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.5 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.0 -> 1.9.0 ++--- com.jakewharton.timber:timber:5.0.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.21 -> 1.9.0 (*) +| \--- org.jetbrains:annotations:20.1.0 -> 23.0.0 ++--- com.mikepenz:aboutlibraries-compose:10.8.3 +| \--- com.mikepenz:aboutlibraries-compose-android:10.8.3 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.0 (*) +| +--- org.jetbrains.compose.ui:ui-tooling-preview:1.4.1 +| | \--- androidx.compose.ui:ui-tooling-preview:1.4.3 -> 1.6.0-alpha02 (*) +| +--- androidx.core:core-ktx:1.10.1 -> 1.12.0-beta01 (*) +| +--- com.mikepenz:aboutlibraries-core:10.8.3 +| | \--- com.mikepenz:aboutlibraries-core-android-debug:10.8.3 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- org.jetbrains.compose.runtime:runtime:1.4.1 +| | \--- androidx.compose.runtime:runtime:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.ui:ui:1.4.1 +| | \--- androidx.compose.ui:ui:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.foundation:foundation:1.4.1 +| | \--- androidx.compose.foundation:foundation:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.material:material:1.4.1 +| | \--- androidx.compose.material:material:1.4.3 -> 1.6.0-alpha02 (*) +| \--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5 (*) ++--- com.mikepenz:aboutlibraries-core:10.8.3 (*) ++--- com.google.accompanist:accompanist-placeholder-material3:0.33.0-alpha +| +--- androidx.compose.material3:material3:1.0.1 -> 1.2.0-alpha04 +| | \--- androidx.compose.material3:material3-android:1.2.0-alpha04 +| | +--- androidx.activity:activity-compose:1.5.0 -> 1.7.2 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-ripple:1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | \--- androidx.compose.material3:material3-window-size-class:1.2.0-alpha04 (c) +| +--- io.github.aakira:napier:1.4.1 +| | \--- io.github.aakira:napier-android-debug:1.4.1 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.9.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32 -> 1.9.0 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| +--- com.google.accompanist:accompanist-placeholder:0.33.0-alpha +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- io.github.aakira:napier:1.4.1 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- com.google.accompanist:accompanist-systemuicontroller:0.33.0-alpha | +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) -| +--- androidx.cursoradapter:cursoradapter:1.0.0 (*) -| +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 (*) -| +--- androidx.emoji2:emoji2:1.2.0 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | +--- androidx.lifecycle:lifecycle-process:2.4.1 -| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) -| | | +--- androidx.startup:startup-runtime:1.1.1 -| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | \--- androidx.tracing:tracing:1.0.0 (*) -| | | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | \--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) -| +--- androidx.emoji2:emoji2-views-helper:1.2.0 -| | +--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | \--- androidx.emoji2:emoji2:1.2.0 (*) -| +--- androidx.fragment:fragment:1.3.6 (*) -| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 -| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.savedstate:savedstate:1.2.0 (*) -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| \--- androidx.appcompat:appcompat-resources:1.6.1 (c) -+--- com.google.android.material:material:1.9.0 -| +--- com.google.errorprone:error_prone_annotations:2.15.0 +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- androidx.appcompat:appcompat:1.6.1 (*) ++--- androidx.compose.material:material:1.6.0-alpha02 (*) ++--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 +| \--- androidx.compose.material:material-icons-extended-android:1.6.0-alpha02 +| +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) ++--- androidx.compose.material3:material3:1.2.0-alpha04 (*) ++--- androidx.compose.material3:material3-window-size-class:1.1.1 -> 1.2.0-alpha04 +| \--- androidx.compose.material3:material3-window-size-class-android:1.2.0-alpha04 +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| +--- androidx.window:window:1.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| \--- androidx.compose.material3:material3:1.2.0-alpha04 (c) ++--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) ++--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (c) +| \--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (c) ++--- androidx.compose.ui:ui:1.6.0-alpha02 (*) ++--- androidx.constraintlayout:constraintlayout-compose:1.0.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.10 -> 1.9.0 (*) +| +--- androidx.compose.ui:ui:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-util:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.foundation:foundation:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.material:material:1.0.0 -> 1.6.0-alpha02 (*) +| \--- androidx.constraintlayout:constraintlayout-core:1.0.4 ++--- androidx.core:core-splashscreen:1.0.1 | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| +--- androidx.appcompat:appcompat:1.5.0 -> 1.6.1 (*) -| +--- androidx.cardview:cardview:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 (*) -| +--- androidx.constraintlayout:constraintlayout:2.0.1 -| | +--- androidx.appcompat:appcompat:1.2.0 -> 1.6.1 (*) -| | +--- androidx.core:core:1.3.1 -> 1.12.0-beta01 (*) -| | \--- androidx.constraintlayout:constraintlayout-solver:2.0.1 -| +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) -| +--- androidx.dynamicanimation:dynamicanimation:1.0.0 -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | \--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) -| +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) -| +--- androidx.fragment:fragment:1.2.5 -> 1.3.6 (*) -| +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.5.1 (*) -| +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) ++--- androidx.datastore:datastore-preferences:1.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| +--- androidx.datastore:datastore:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*) +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | \--- androidx.datastore:datastore-core:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*) +| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| \--- androidx.datastore:datastore-preferences-core:1.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| \--- androidx.datastore:datastore-core:1.0.0 (*) ++--- androidx.glance:glance-appwidget:1.0.0-rc01 +| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.core:core-ktx:1.7.0 -> 1.12.0-beta01 (*) +| +--- androidx.core:core-remoteviews:1.0.0-rc01 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.datastore:datastore:1.0.0 (*) +| +--- androidx.datastore:datastore-core:1.0.0 (*) +| +--- androidx.datastore:datastore-preferences:1.0.0 (*) +| +--- androidx.datastore:datastore-preferences-core:1.0.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.transition:transition:1.2.0 -> 1.4.1 (*) -| +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) -| \--- androidx.viewpager2:viewpager2:1.0.0 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.fragment:fragment:1.1.0 -> 1.3.6 (*) -| +--- androidx.recyclerview:recyclerview:1.1.0 (*) -| +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| \--- androidx.collection:collection:1.1.0 (*) -+--- androidx.preference:preference-ktx:1.2.0 -| +--- androidx.preference:preference:1.2.0 | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.appcompat:appcompat:1.1.0 -> 1.6.1 (*) -| | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| | +--- androidx.fragment:fragment-ktx:1.3.6 -| | | +--- androidx.fragment:fragment:1.3.6 (*) -| | | +--- androidx.activity:activity-ktx:1.2.2 -> 1.6.0 -| | | | +--- androidx.activity:activity:1.6.0 (*) -| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| | +--- androidx.annotation:annotation-experimental:1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.datastore:datastore-core:1.0.0 (*) +| | +--- androidx.datastore:datastore-preferences:1.0.0 (*) +| | +--- androidx.datastore:datastore-preferences-core:1.0.0 (*) +| | +--- androidx.work:work-runtime:2.7.1 +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | +--- com.google.guava:listenablefuture:1.0 +| | | +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.6.1 (*) +| | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.room:room-runtime:2.2.5 +| | | | +--- androidx.room:room-common:2.2.5 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.sqlite:sqlite-framework:2.0.1 -> 2.1.0 | | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) -| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 -| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) -| | | | +--- androidx.savedstate:savedstate-ktx:1.2.0 -| | | | | +--- androidx.savedstate:savedstate:1.2.0 (*) -| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | | | \--- androidx.activity:activity:1.6.0 (c) -| | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.collection:collection-ktx:1.1.0 -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.9.0 (*) -| | | | \--- androidx.collection:collection:1.1.0 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1 -| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.3.1 -> 2.5.1 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.9.0 (*) -| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1 -> 2.5.1 (*) -| | | +--- androidx.savedstate:savedstate-ktx:1.1.0 -> 1.2.0 (*) -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.9.0 (*) -| | +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 (*) -| | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 (*) -| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| +--- androidx.fragment:fragment-ktx:1.3.6 (*) -| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) -+--- androidx.legacy:legacy-preference-v14:1.0.0 -| \--- androidx.preference:preference:1.0.0 -> 1.2.0 (*) -\--- com.github.gabrielemariotti.changeloglib:changelog:2.1.0 - +--- com.android.support:recyclerview-v7:23.3.0 -> androidx.recyclerview:recyclerview:1.1.0 (*) - \--- com.android.support:support-v4:23.3.0 -> androidx.legacy:legacy-support-v4:1.0.0 (*) +| | | | | \--- androidx.sqlite:sqlite:2.1.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.sqlite:sqlite:2.0.1 -> 2.1.0 (*) +| | | | \--- androidx.arch.core:core-runtime:2.0.1 -> 2.2.0 (*) +| | | +--- androidx.sqlite:sqlite:2.1.0 (*) +| | | +--- androidx.sqlite:sqlite-framework:2.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.lifecycle:lifecycle-service:2.1.0 -> 2.6.1 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | +--- androidx.work:work-runtime-ktx:2.7.1 +| | | +--- androidx.work:work-runtime:2.7.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.30 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0 -> 1.7.3 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.glance:glance-appwidget:1.0.0-rc01 (c) +| | \--- androidx.glance:glance-material3:1.0.0-rc01 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (c) +| \--- androidx.glance:glance-material3:1.0.0-rc01 (c) ++--- androidx.glance:glance-material3:1.0.0-rc01 +| +--- androidx.annotation:annotation:1.4.0 -> 1.6.0 (*) +| +--- androidx.compose.material3:material3:1.0.0 -> 1.2.0-alpha04 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (c) +| \--- androidx.glance:glance-appwidget:1.0.0-rc01 (c) ++--- androidx.lifecycle:lifecycle-process:2.6.1 (*) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) ++--- androidx.navigation:navigation-compose:2.7.0 (*) ++--- androidx.paging:paging-compose:3.2.0 +| +--- androidx.compose.foundation:foundation:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.paging:paging-common:3.2.0 +| | +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) +| | +--- androidx.arch.core:core-common:2.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.3 (*) +| | \--- androidx.paging:paging-compose:3.2.0 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| \--- androidx.paging:paging-common:3.2.0 (c) ++--- io.coil-kt:coil-compose:2.4.0 +| +--- io.coil-kt:coil-compose-base:2.4.0 +| | +--- androidx.core:core-ktx:1.9.0 -> 1.12.0-beta01 (*) +| | +--- com.google.accompanist:accompanist-drawablepainter:0.30.1 +| | | +--- androidx.compose.ui:ui:1.4.0 -> 1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +| | +--- io.coil-kt:coil-base:2.4.0 +| | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.6.1 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.9.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.exifinterface:exifinterface:1.3.6 +| | | | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.11.0 +| | | | +--- com.squareup.okio:okio:3.2.0 -> 3.3.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.9.0 (*) +| | | \--- com.squareup.okio:okio:3.3.0 (*) +| | +--- androidx.compose.foundation:foundation:1.4.3 -> 1.6.0-alpha02 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) +| +--- io.coil-kt:coil:2.4.0 +| | +--- io.coil-kt:coil-base:2.4.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) ++--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1 +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1 (c) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1 (c) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1 (c) +| | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21 -> 1.9.0 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21 -> 1.9.0 ++--- com.google.android.material:material:1.9.0 (*) ++--- com.squareup.okhttp3:logging-interceptor:4.11.0 +| +--- com.squareup.okhttp3:okhttp:4.11.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.9.0 (*) ++--- com.squareup.retrofit2:retrofit:2.9.0 +| \--- com.squareup.okhttp3:okhttp:3.14.9 -> 4.11.0 (*) ++--- com.squareup.retrofit2:converter-scalars:2.9.0 +| \--- com.squareup.retrofit2:retrofit:2.9.0 (*) +\--- com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0 + +--- com.squareup.retrofit2:retrofit:2.9.0 (*) + +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.0 -> 1.5.1 (*) + \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) (c) - A dependency constraint, not a dependency. The dependency affected by the constraint occurs elsewhere in the tree. (*) - Indicates repeated occurrences of a transitive dependency subtree. Gradle expands transitive dependency subtrees only once per project; repeat occurrences only display the root of the subtree, followed by this annotation. diff --git a/app/versions/dependencies/releaseRuntimeClasspathDependencies.txt b/app/versions/dependencies/releaseRuntimeClasspathDependencies.txt index a4b10bd..959f0b5 100644 --- a/app/versions/dependencies/releaseRuntimeClasspathDependencies.txt +++ b/app/versions/dependencies/releaseRuntimeClasspathDependencies.txt @@ -7,284 +7,1085 @@ releaseRuntimeClasspath - Runtime classpath of /release. +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0 -| | \--- org.jetbrains:annotations:13.0 -> 20.1.0 +| | \--- org.jetbrains:annotations:13.0 -> 23.0.0 | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0 | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) -+--- androidx.core:core-ktx:1.12.0-beta01 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 -| | \--- androidx.annotation:annotation-jvm:1.6.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 (*) -| +--- androidx.core:core:1.12.0-beta01 -| | +--- androidx.annotation:annotation:1.6.0 (*) -| | +--- androidx.annotation:annotation-experimental:1.3.0 -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.concurrent:concurrent-futures:1.0.0 -| | | +--- com.google.guava:listenablefuture:1.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.interpolator:interpolator:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.arch.core:core-common:2.1.0 ++--- androidx.activity:activity-compose:1.7.2 +| +--- androidx.activity:activity-ktx:1.7.2 +| | +--- androidx.activity:activity:1.7.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 +| | | | \--- androidx.annotation:annotation-jvm:1.6.0 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.arch.core:core-runtime:2.1.0 +| | | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 +| | | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | \--- com.google.guava:listenablefuture:1.0 +| | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.6.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.arch.core:core-common:2.2.0 +| | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.arch.core:core-runtime:2.2.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | \--- androidx.arch.core:core-common:2.2.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 +| | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 +| | | | | | | | +--- org.jetbrains:annotations:23.0.0 +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (c) +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 (c) +| | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (c) +| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 (*) +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 +| | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | | +--- androidx.startup:startup-runtime:1.1.1 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | \--- androidx.tracing:tracing:1.0.0 +| | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | \--- com.google.guava:listenablefuture:1.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | \--- androidx.core:core-ktx:1.12.0-beta01 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | \--- androidx.arch.core:core-common:2.1.0 (*) -| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) -| | \--- androidx.core:core-ktx:1.12.0-beta01 (c) -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) -| \--- androidx.core:core:1.12.0-beta01 (c) -+--- androidx.multidex:multidex:2.0.1 -+--- com.jakewharton.timber:timber:5.0.1 -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.21 -> 1.9.0 (*) -| \--- org.jetbrains:annotations:20.1.0 -+--- androidx.legacy:legacy-support-v4:1.0.0 -| +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| +--- androidx.media:media:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | \--- androidx.versionedparcelable:versionedparcelable:1.0.0 -> 1.1.1 (*) -| +--- androidx.legacy:legacy-support-core-utils:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.documentfile:documentfile:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.loader:loader:1.0.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.12.0-beta01 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | \--- androidx.core:core:1.12.0-beta01 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 +| | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- androidx.tracing:tracing:1.0.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- androidx.activity:activity-compose:1.7.2 (c) +| | | \--- androidx.activity:activity-ktx:1.7.2 (c) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -| | | | +--- androidx.arch.core:core-runtime:2.0.0 -> 2.1.0 (*) -| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.0.0 -> 2.5.1 -| | | | | +--- androidx.arch.core:core-common:2.1.0 (*) -| | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) -| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) -| | | | \--- androidx.arch.core:core-common:2.0.0 -> 2.1.0 (*) -| | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.5.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) -| | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | \--- androidx.print:print:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| +--- androidx.legacy:legacy-support-core-ui:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) -| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.viewpager:viewpager:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | +--- androidx.coordinatorlayout:coordinatorlayout:1.0.0 -> 1.1.0 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.customview:customview:1.1.0 (*) -| | +--- androidx.slidingpanelayout:slidingpanelayout:1.0.0 -> 1.2.0 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | +--- androidx.savedstate:savedstate-ktx:1.2.1 +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | \--- androidx.savedstate:savedstate:1.2.1 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | +--- androidx.activity:activity:1.7.2 (c) +| | \--- androidx.activity:activity-compose:1.7.2 (c) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 +| | \--- androidx.compose.runtime:runtime-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | +--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 (c) +| | \--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (c) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.6.0-alpha02 +| | \--- androidx.compose.runtime:runtime-saveable-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (c) +| | \--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-android:1.6.0-alpha02 +| | +--- androidx.activity:activity-ktx:1.7.0 -> 1.7.2 (*) +| | +--- androidx.annotation:annotation:1.6.0 (*) +| | +--- androidx.autofill:autofill:1.0.0 +| | | \--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | +--- androidx.collection:collection:1.2.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 +| | | \--- androidx.compose.ui:ui-geometry-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-util-android:1.6.0-alpha02 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 +| | | \--- androidx.compose.ui:ui-graphics-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-unit-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 +| | | \--- androidx.compose.ui:ui-text-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.6.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.core:core:1.11.0-beta02 -> 1.12.0-beta01 (*) +| | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | +--- androidx.core:core-ktx:1.5.0 -> 1.12.0-beta01 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) +| | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.6.0-alpha02 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| +--- androidx.activity:activity-ktx:1.7.2 (c) +| \--- androidx.activity:activity:1.7.2 (c) ++--- androidx.core:core-ktx:1.12.0-beta01 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) ++--- androidx.navigation:navigation-fragment-ktx:2.7.0 +| +--- androidx.navigation:navigation-fragment:2.7.0 +| | +--- androidx.fragment:fragment-ktx:1.6.0 +| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.7.2 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.9.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.fragment:fragment:1.6.0 +| | | | +--- androidx.activity:activity:1.5.1 -> 1.7.2 (*) +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | | | +--- androidx.loader:loader:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 2.6.1 +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.6.1 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- androidx.viewpager:viewpager:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) +| | | | \--- androidx.fragment:fragment-ktx:1.6.0 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) +| | | \--- androidx.fragment:fragment:1.6.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 +| | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.7.2 (*) +| | | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.collection:collection-ktx:1.1.0 (*) +| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 (c) +| | | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) | | | +--- androidx.customview:customview:1.1.0 (*) | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) | | | +--- androidx.window:window:1.0.0 | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.1 -| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 -| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 -| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1 -| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (c) -| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1 (c) -| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1 (c) -| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0 -> 1.9.0 (*) -| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.0 -> 1.9.0 -| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.1 (*) -| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.0 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.7.3 (*) | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | | | +--- androidx.collection:collection:1.1.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) | | | | \--- androidx.core:core:1.3.2 -> 1.12.0-beta01 (*) | | | \--- androidx.transition:transition:1.4.1 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.interpolator:interpolator:1.0.0 (*) -| | +--- androidx.swiperefreshlayout:swiperefreshlayout:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.interpolator:interpolator:1.0.0 (*) -| | +--- androidx.asynclayoutinflater:asynclayoutinflater:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | \--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | \--- androidx.cursoradapter:cursoradapter:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| \--- androidx.fragment:fragment:1.0.0 -> 1.3.6 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) -| +--- androidx.collection:collection:1.1.0 (*) -| +--- androidx.viewpager:viewpager:1.0.0 (*) -| +--- androidx.loader:loader:1.0.0 (*) -| +--- androidx.activity:activity:1.2.4 -> 1.6.0 -| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 (*) -| | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 (*) -| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | | +--- androidx.savedstate:savedstate:1.2.0 -| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | +--- androidx.arch.core:core-common:2.1.0 (*) -| | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (*) -| | +--- androidx.savedstate:savedstate:1.2.0 (*) -| | +--- androidx.tracing:tracing:1.0.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | \--- androidx.activity:activity-ktx:1.6.0 (c) -| +--- androidx.lifecycle:lifecycle-livedata-core:2.3.1 -> 2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel:2.3.1 -> 2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1 -> 2.5.1 (*) -| +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*) -| \--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) -+--- androidx.appcompat:appcompat:1.6.1 -| +--- androidx.activity:activity:1.6.0 (*) -| +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) -| +--- androidx.appcompat:appcompat-resources:1.6.1 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 +| | | +--- androidx.navigation:navigation-common:2.7.0 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 (c) +| | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (*) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-compose:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| \--- androidx.navigation:navigation-common:2.7.0 (c) ++--- androidx.navigation:navigation-ui-ktx:2.7.0 +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (*) +| +--- androidx.navigation:navigation-ui:2.7.0 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.customview:customview:1.1.0 (*) +| | +--- androidx.drawerlayout:drawerlayout:1.1.1 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 -| | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) -| | | +--- androidx.interpolator:interpolator:1.0.0 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | \--- androidx.appcompat:appcompat:1.6.1 (c) -| +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.core:core:1.9.0 -> 1.12.0-beta01 (*) -| +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) -| +--- androidx.cursoradapter:cursoradapter:1.0.0 (*) -| +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 (*) -| +--- androidx.emoji2:emoji2:1.2.0 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | +--- androidx.lifecycle:lifecycle-process:2.4.1 -| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) -| | | +--- androidx.startup:startup-runtime:1.1.1 +| | | +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.customview:customview:1.1.0 (*) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (*) +| | +--- androidx.transition:transition:1.3.0 -> 1.4.1 (*) +| | +--- com.google.android.material:material:1.4.0-beta01 -> 1.9.0 +| | | +--- com.google.errorprone:error_prone_annotations:2.15.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.appcompat:appcompat:1.5.0 -> 1.6.1 +| | | | +--- androidx.activity:activity:1.6.0 -> 1.7.2 (*) +| | | | +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) +| | | | +--- androidx.appcompat:appcompat-resources:1.6.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | | | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | \--- androidx.appcompat:appcompat:1.6.1 (c) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core:1.9.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.cursoradapter:cursoradapter:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 (*) +| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | +--- androidx.emoji2:emoji2-views-helper:1.2.0 -> 1.3.0 +| | | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | | | \--- androidx.emoji2:emoji2:1.3.0 (c) +| | | | +--- androidx.fragment:fragment:1.3.6 -> 1.6.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 -> 2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.6.1 (*) +| | | | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) +| | | | \--- androidx.appcompat:appcompat-resources:1.6.1 (c) +| | | +--- androidx.cardview:cardview:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | \--- androidx.tracing:tracing:1.0.0 (*) -| | | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | \--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) -| +--- androidx.emoji2:emoji2-views-helper:1.2.0 -| | +--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | \--- androidx.emoji2:emoji2:1.2.0 (*) -| +--- androidx.fragment:fragment:1.3.6 (*) -| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 -| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.savedstate:savedstate:1.2.0 (*) -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| \--- androidx.appcompat:appcompat-resources:1.6.1 (c) -+--- com.google.android.material:material:1.9.0 -| +--- com.google.errorprone:error_prone_annotations:2.15.0 +| | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.constraintlayout:constraintlayout:2.0.1 +| | | | +--- androidx.appcompat:appcompat:1.2.0 -> 1.6.1 (*) +| | | | +--- androidx.core:core:1.3.1 -> 1.12.0-beta01 (*) +| | | | \--- androidx.constraintlayout:constraintlayout-solver:2.0.1 +| | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) +| | | +--- androidx.dynamicanimation:dynamicanimation:1.0.0 +| | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | \--- androidx.legacy:legacy-support-core-utils:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.documentfile:documentfile:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.loader:loader:1.0.0 (*) +| | | | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | \--- androidx.print:print:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | +--- androidx.fragment:fragment:1.2.5 -> 1.6.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.6.1 (*) +| | | +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.transition:transition:1.2.0 -> 1.4.1 (*) +| | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | \--- androidx.viewpager2:viewpager2:1.0.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.fragment:fragment:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.recyclerview:recyclerview:1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-compose:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| \--- androidx.navigation:navigation-common:2.7.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*) ++--- com.google.dagger:hilt-android:2.47 +| +--- com.google.dagger:dagger:2.47 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.dagger:dagger-lint-aar:2.47 +| +--- com.google.dagger:hilt-core:2.47 +| | +--- com.google.dagger:dagger:2.47 (*) +| | +--- com.google.code.findbugs:jsr305:3.0.2 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.code.findbugs:jsr305:3.0.2 +| +--- androidx.activity:activity:1.5.1 -> 1.7.2 (*) | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| +--- androidx.appcompat:appcompat:1.5.0 -> 1.6.1 (*) -| +--- androidx.cardview:cardview:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 (*) -| +--- androidx.constraintlayout:constraintlayout:2.0.1 -| | +--- androidx.appcompat:appcompat:1.2.0 -> 1.6.1 (*) -| | +--- androidx.core:core:1.3.1 -> 1.12.0-beta01 (*) -| | \--- androidx.constraintlayout:constraintlayout-solver:2.0.1 -| +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) -| +--- androidx.dynamicanimation:dynamicanimation:1.0.0 -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | \--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) -| +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) -| +--- androidx.fragment:fragment:1.2.5 -> 1.3.6 (*) -| +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.5.1 (*) -| +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 +| +--- androidx.fragment:fragment:1.5.1 -> 1.6.0 (*) +| +--- androidx.lifecycle:lifecycle-common:2.5.1 -> 2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -> 2.6.1 (*) +| +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| +--- javax.inject:javax.inject:1 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) ++--- androidx.hilt:hilt-navigation-compose:1.0.0 +| +--- androidx.hilt:hilt-navigation:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.9.0 (*) | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.transition:transition:1.2.0 -> 1.4.1 (*) -| +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) -| \--- androidx.viewpager2:viewpager2:1.0.0 +| | +--- androidx.navigation:navigation-runtime:2.3.2 -> 2.7.0 (*) +| | \--- com.google.dagger:hilt-android:2.35 -> 2.47 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0 -> 2.6.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| +--- androidx.navigation:navigation-compose:2.4.0 -> 2.7.0 +| | +--- androidx.activity:activity-compose:1.7.0 -> 1.7.2 (*) +| | +--- androidx.compose.animation:animation:1.5.0 -> 1.6.0-alpha02 +| | | \--- androidx.compose.animation:animation-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 +| | | | \--- androidx.compose.animation:animation-core-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | | \--- androidx.compose.animation:animation:1.6.0-alpha02 (c) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 +| | | | \--- androidx.compose.foundation:foundation-layout-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.6.0-alpha02 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.12.0-beta01 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | \--- androidx.compose.foundation:foundation:1.6.0-alpha02 (c) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | \--- androidx.compose.animation:animation-core:1.6.0-alpha02 (c) +| | +--- androidx.compose.foundation:foundation-layout:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (*) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) ++--- com.michael-bull.kotlin-result:kotlin-result:1.1.18 +| \--- com.michael-bull.kotlin-result:kotlin-result-jvm:1.1.18 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.9.0 ++--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5 +| \--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.5 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.0 -> 1.9.0 ++--- com.jakewharton.timber:timber:5.0.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.21 -> 1.9.0 (*) +| \--- org.jetbrains:annotations:20.1.0 -> 23.0.0 ++--- com.mikepenz:aboutlibraries-compose:10.8.3 +| \--- com.mikepenz:aboutlibraries-compose-android:10.8.3 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.0 (*) +| +--- org.jetbrains.compose.ui:ui-tooling-preview:1.4.1 +| | \--- androidx.compose.ui:ui-tooling-preview:1.4.3 -> 1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-tooling-preview-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.core:core-ktx:1.10.1 -> 1.12.0-beta01 (*) +| +--- com.mikepenz:aboutlibraries-core:10.8.3 +| | \--- com.mikepenz:aboutlibraries-core-android:10.8.3 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- org.jetbrains.compose.runtime:runtime:1.4.1 +| | \--- androidx.compose.runtime:runtime:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.ui:ui:1.4.1 +| | \--- androidx.compose.ui:ui:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.foundation:foundation:1.4.1 +| | \--- androidx.compose.foundation:foundation:1.4.3 -> 1.6.0-alpha02 +| | \--- androidx.compose.foundation:foundation-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.core:core:1.11.0-beta02 -> 1.12.0-beta01 (*) +| | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | \--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (c) +| +--- org.jetbrains.compose.material:material:1.4.1 +| | \--- androidx.compose.material:material:1.4.3 -> 1.6.0-alpha02 +| | \--- androidx.compose.material:material-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 +| | | \--- androidx.compose.material:material-icons-core-android:1.6.0-alpha02 +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| | | +--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | | \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) +| | +--- androidx.compose.material:material-ripple:1.6.0-alpha02 +| | | \--- androidx.compose.material:material-ripple-android:1.6.0-alpha02 +| | | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| | | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| | | \--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| | +--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) +| \--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5 (*) ++--- com.mikepenz:aboutlibraries-core:10.8.3 (*) ++--- com.google.accompanist:accompanist-placeholder-material3:0.33.0-alpha +| +--- androidx.compose.material3:material3:1.0.1 -> 1.2.0-alpha04 +| | \--- androidx.compose.material3:material3-android:1.2.0-alpha04 +| | +--- androidx.activity:activity-compose:1.5.0 -> 1.7.2 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-ripple:1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | \--- androidx.compose.material3:material3-window-size-class:1.2.0-alpha04 (c) +| +--- io.github.aakira:napier:1.4.1 +| | \--- io.github.aakira:napier-android:1.4.1 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.9.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32 -> 1.9.0 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| +--- com.google.accompanist:accompanist-placeholder:0.33.0-alpha +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- io.github.aakira:napier:1.4.1 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- com.google.accompanist:accompanist-systemuicontroller:0.33.0-alpha +| +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- androidx.appcompat:appcompat:1.6.1 (*) ++--- androidx.compose.material:material:1.6.0-alpha02 (*) ++--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 +| \--- androidx.compose.material:material-icons-extended-android:1.6.0-alpha02 +| +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) ++--- androidx.compose.material3:material3:1.2.0-alpha04 (*) ++--- androidx.compose.material3:material3-window-size-class:1.1.1 -> 1.2.0-alpha04 +| \--- androidx.compose.material3:material3-window-size-class-android:1.2.0-alpha04 +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| +--- androidx.window:window:1.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| \--- androidx.compose.material3:material3:1.2.0-alpha04 (c) ++--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) ++--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (c) +| \--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (c) ++--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 +| \--- androidx.compose.ui:ui-tooling-android:1.6.0-alpha02 +| +--- androidx.activity:activity-compose:1.7.0 -> 1.7.2 (*) | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.fragment:fragment:1.1.0 -> 1.3.6 (*) -| +--- androidx.recyclerview:recyclerview:1.1.0 (*) -| +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| \--- androidx.collection:collection:1.1.0 (*) -+--- androidx.preference:preference-ktx:1.2.0 -| +--- androidx.preference:preference:1.2.0 +| +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| +--- androidx.compose.material:material:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-tooling-data-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| \--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) ++--- androidx.compose.ui:ui:1.6.0-alpha02 (*) ++--- androidx.constraintlayout:constraintlayout-compose:1.0.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.10 -> 1.9.0 (*) +| +--- androidx.compose.ui:ui:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-util:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.foundation:foundation:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.material:material:1.0.0 -> 1.6.0-alpha02 (*) +| \--- androidx.constraintlayout:constraintlayout-core:1.0.4 ++--- androidx.core:core-splashscreen:1.0.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) ++--- androidx.datastore:datastore-preferences:1.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| +--- androidx.datastore:datastore:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*) | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.appcompat:appcompat:1.1.0 -> 1.6.1 (*) -| | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| | +--- androidx.fragment:fragment-ktx:1.3.6 -| | | +--- androidx.fragment:fragment:1.3.6 (*) -| | | +--- androidx.activity:activity-ktx:1.2.2 -> 1.6.0 -| | | | +--- androidx.activity:activity:1.6.0 (*) -| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| | \--- androidx.datastore:datastore-core:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*) +| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| \--- androidx.datastore:datastore-preferences-core:1.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| \--- androidx.datastore:datastore-core:1.0.0 (*) ++--- androidx.glance:glance-appwidget:1.0.0-rc01 +| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.core:core-ktx:1.7.0 -> 1.12.0-beta01 (*) +| +--- androidx.core:core-remoteviews:1.0.0-rc01 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.datastore:datastore:1.0.0 (*) +| +--- androidx.datastore:datastore-core:1.0.0 (*) +| +--- androidx.datastore:datastore-preferences:1.0.0 (*) +| +--- androidx.datastore:datastore-preferences-core:1.0.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.datastore:datastore-core:1.0.0 (*) +| | +--- androidx.datastore:datastore-preferences:1.0.0 (*) +| | +--- androidx.datastore:datastore-preferences-core:1.0.0 (*) +| | +--- androidx.work:work-runtime:2.7.1 +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | +--- com.google.guava:listenablefuture:1.0 +| | | +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.6.1 (*) +| | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.room:room-runtime:2.2.5 +| | | | +--- androidx.room:room-common:2.2.5 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.sqlite:sqlite-framework:2.0.1 -> 2.1.0 | | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (*) -| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 -| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 (*) -| | | | +--- androidx.savedstate:savedstate-ktx:1.2.0 -| | | | | +--- androidx.savedstate:savedstate:1.2.0 (*) -| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | | | \--- androidx.activity:activity:1.6.0 (c) -| | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.collection:collection-ktx:1.1.0 -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.9.0 (*) -| | | | \--- androidx.collection:collection:1.1.0 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1 -| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.3.1 -> 2.5.1 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.9.0 (*) -| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1 -> 2.5.1 (*) -| | | +--- androidx.savedstate:savedstate-ktx:1.1.0 -> 1.2.0 (*) -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.9.0 (*) -| | +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 (*) -| | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 (*) -| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| +--- androidx.fragment:fragment-ktx:1.3.6 (*) -| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) -+--- androidx.legacy:legacy-preference-v14:1.0.0 -| \--- androidx.preference:preference:1.0.0 -> 1.2.0 (*) -\--- com.github.gabrielemariotti.changeloglib:changelog:2.1.0 - +--- com.android.support:recyclerview-v7:23.3.0 -> androidx.recyclerview:recyclerview:1.1.0 (*) - \--- com.android.support:support-v4:23.3.0 -> androidx.legacy:legacy-support-v4:1.0.0 (*) +| | | | | \--- androidx.sqlite:sqlite:2.1.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.sqlite:sqlite:2.0.1 -> 2.1.0 (*) +| | | | \--- androidx.arch.core:core-runtime:2.0.1 -> 2.2.0 (*) +| | | +--- androidx.sqlite:sqlite:2.1.0 (*) +| | | +--- androidx.sqlite:sqlite-framework:2.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.lifecycle:lifecycle-service:2.1.0 -> 2.6.1 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | +--- androidx.work:work-runtime-ktx:2.7.1 +| | | +--- androidx.work:work-runtime:2.7.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.30 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0 -> 1.7.3 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.glance:glance-appwidget:1.0.0-rc01 (c) +| | \--- androidx.glance:glance-material3:1.0.0-rc01 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (c) +| \--- androidx.glance:glance-material3:1.0.0-rc01 (c) ++--- androidx.glance:glance-material3:1.0.0-rc01 +| +--- androidx.annotation:annotation:1.4.0 -> 1.6.0 (*) +| +--- androidx.compose.material3:material3:1.0.0 -> 1.2.0-alpha04 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (c) +| \--- androidx.glance:glance-appwidget:1.0.0-rc01 (c) ++--- androidx.lifecycle:lifecycle-process:2.6.1 (*) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) ++--- androidx.navigation:navigation-compose:2.7.0 (*) ++--- androidx.paging:paging-compose:3.2.0 +| +--- androidx.compose.foundation:foundation:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.paging:paging-common:3.2.0 +| | +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) +| | +--- androidx.arch.core:core-common:2.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.3 (*) +| | \--- androidx.paging:paging-compose:3.2.0 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| \--- androidx.paging:paging-common:3.2.0 (c) ++--- io.coil-kt:coil-compose:2.4.0 +| +--- io.coil-kt:coil-compose-base:2.4.0 +| | +--- androidx.core:core-ktx:1.9.0 -> 1.12.0-beta01 (*) +| | +--- com.google.accompanist:accompanist-drawablepainter:0.30.1 +| | | +--- androidx.compose.ui:ui:1.4.0 -> 1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +| | +--- io.coil-kt:coil-base:2.4.0 +| | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.6.1 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.9.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.exifinterface:exifinterface:1.3.6 +| | | | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.11.0 +| | | | +--- com.squareup.okio:okio:3.2.0 -> 3.3.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.3.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0 -> 1.9.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.9.0 (*) +| | | \--- com.squareup.okio:okio:3.3.0 (*) +| | +--- androidx.compose.foundation:foundation:1.4.3 -> 1.6.0-alpha02 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) +| +--- io.coil-kt:coil:2.4.0 +| | +--- io.coil-kt:coil-base:2.4.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) ++--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1 +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1 (c) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1 (c) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1 (c) +| | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21 -> 1.9.0 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21 -> 1.9.0 ++--- com.google.android.material:material:1.9.0 (*) ++--- com.squareup.okhttp3:logging-interceptor:4.11.0 +| +--- com.squareup.okhttp3:okhttp:4.11.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.9.0 (*) ++--- com.squareup.retrofit2:retrofit:2.9.0 +| \--- com.squareup.okhttp3:okhttp:3.14.9 -> 4.11.0 (*) ++--- com.squareup.retrofit2:converter-scalars:2.9.0 +| \--- com.squareup.retrofit2:retrofit:2.9.0 (*) ++--- com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0 +| +--- com.squareup.retrofit2:retrofit:2.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.0 -> 1.5.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +\--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.0 + +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) + \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.0 + \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) (c) - A dependency constraint, not a dependency. The dependency affected by the constraint occurs elsewhere in the tree. (*) - Indicates repeated occurrences of a transitive dependency subtree. Gradle expands transitive dependency subtrees only once per project; repeat occurrences only display the root of the subtree, followed by this annotation. diff --git a/app/versions/dependencies/releaseUnitTestRuntimeClasspathDependencies.txt b/app/versions/dependencies/releaseUnitTestRuntimeClasspathDependencies.txt index 861c614..2d2065b 100644 --- a/app/versions/dependencies/releaseUnitTestRuntimeClasspathDependencies.txt +++ b/app/versions/dependencies/releaseUnitTestRuntimeClasspathDependencies.txt @@ -5,349 +5,1088 @@ Project ':app' releaseUnitTestRuntimeClasspath - Runtime classpath of /releaseUnitTest. +--- project :app (*) -+--- io.mockk:mockk:1.13.5 -| \--- io.mockk:mockk-jvm:1.13.5 -| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0 -| | | \--- org.jetbrains:annotations:13.0 -> 20.1.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) -| +--- io.mockk:mockk-dsl:1.13.5 -| | \--- io.mockk:mockk-dsl-jvm:1.13.5 -| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 -| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c) -| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c) -| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c) -| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core -> 1.6.4 -| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 -| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.9.0 (*) -| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.9.0 -| | +--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) -| | \--- io.mockk:mockk-core:1.13.5 -| | \--- io.mockk:mockk-core-jvm:1.13.5 -| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| +--- io.mockk:mockk-agent:1.13.5 -| | \--- io.mockk:mockk-agent-jvm:1.13.5 -| | +--- org.objenesis:objenesis:3.3 -| | +--- net.bytebuddy:byte-buddy:1.12.20 -| | +--- net.bytebuddy:byte-buddy-agent:1.12.20 -| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | +--- io.mockk:mockk-agent-api:1.13.5 -| | | \--- io.mockk:mockk-agent-api-jvm:1.13.5 -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | | \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| | +--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -| | \--- io.mockk:mockk-core:1.13.5 (*) -| +--- io.mockk:mockk-agent-api:1.13.5 (*) -| +--- io.mockk:mockk-core:1.13.5 (*) -| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.9.0 -| +--- org.slf4j:slf4j-api:2.0.5 -| +--- junit:junit:4.13.2 -| | \--- org.hamcrest:hamcrest-core:1.3 -| +--- org.junit.jupiter:junit-jupiter:5.8.2 -| | +--- org.junit:junit-bom:5.8.2 -| | | +--- org.junit.jupiter:junit-jupiter:5.8.2 (c) -| | | +--- org.junit.jupiter:junit-jupiter-api:5.8.2 (c) -| | | +--- org.junit.jupiter:junit-jupiter-engine:5.8.2 (c) -| | | +--- org.junit.jupiter:junit-jupiter-params:5.8.2 (c) -| | | +--- org.junit.platform:junit-platform-commons:1.8.2 (c) -| | | \--- org.junit.platform:junit-platform-engine:1.8.2 (c) -| | +--- org.junit.jupiter:junit-jupiter-api:5.8.2 -| | | +--- org.junit:junit-bom:5.8.2 (*) -| | | +--- org.opentest4j:opentest4j:1.2.0 -| | | \--- org.junit.platform:junit-platform-commons:1.8.2 -| | | \--- org.junit:junit-bom:5.8.2 (*) -| | +--- org.junit.jupiter:junit-jupiter-params:5.8.2 -| | | +--- org.junit:junit-bom:5.8.2 (*) -| | | \--- org.junit.jupiter:junit-jupiter-api:5.8.2 (*) -| | \--- org.junit.jupiter:junit-jupiter-engine:5.8.2 -| | +--- org.junit:junit-bom:5.8.2 (*) -| | +--- org.junit.platform:junit-platform-engine:1.8.2 -| | | +--- org.junit:junit-bom:5.8.2 (*) -| | | +--- org.opentest4j:opentest4j:1.2.0 -| | | \--- org.junit.platform:junit-platform-commons:1.8.2 (*) -| | \--- org.junit.jupiter:junit-jupiter-api:5.8.2 (*) -| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) -| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core -> 1.6.4 (*) -| \--- org.jetbrains.kotlin:kotlin-reflect:1.8.20 (*) -+--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) -+--- androidx.core:core-ktx:1.12.0-beta01 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 -| | \--- androidx.annotation:annotation-jvm:1.6.0 -| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 (*) -| +--- androidx.core:core:1.12.0-beta01 -| | +--- androidx.annotation:annotation:1.6.0 (*) -| | +--- androidx.annotation:annotation-experimental:1.3.0 -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.concurrent:concurrent-futures:1.0.0 -| | | +--- com.google.guava:listenablefuture:1.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.interpolator:interpolator:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.arch.core:core-common:2.1.0 ++--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0 +| | \--- org.jetbrains:annotations:13.0 -> 23.0.0 +| \--- org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.9.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) ++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 (*) ++--- androidx.activity:activity-compose:1.7.2 +| +--- androidx.activity:activity-ktx:1.7.2 +| | +--- androidx.activity:activity:1.7.2 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 +| | | | \--- androidx.annotation:annotation-jvm:1.6.0 +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.arch.core:core-runtime:2.1.0 +| | | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 +| | | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.3.0 +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | \--- com.google.guava:listenablefuture:1.0 +| | | | +--- androidx.interpolator:interpolator:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.6.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.arch.core:core-common:2.2.0 +| | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.arch.core:core-runtime:2.2.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | \--- androidx.arch.core:core-common:2.2.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 +| | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 +| | | | | | | | +--- org.jetbrains:annotations:23.0.0 +| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (c) +| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 (c) +| | | | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (c) +| | | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) +| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 (*) +| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 +| | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | | +--- androidx.concurrent:concurrent-futures:1.1.0 (*) +| | | | | | +--- androidx.startup:startup-runtime:1.1.1 +| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | | \--- androidx.tracing:tracing:1.0.0 +| | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | \--- com.google.guava:listenablefuture:1.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | \--- androidx.core:core-ktx:1.12.0-beta01 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | \--- androidx.arch.core:core-common:2.1.0 (*) -| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) -| | \--- androidx.core:core-ktx:1.12.0-beta01 (c) -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) -| \--- androidx.core:core:1.12.0-beta01 (c) -+--- androidx.multidex:multidex:2.0.1 -+--- com.jakewharton.timber:timber:5.0.1 -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.21 -> 1.9.0 (*) -| \--- org.jetbrains:annotations:20.1.0 -+--- androidx.legacy:legacy-support-v4:1.0.0 -| +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| +--- androidx.media:media:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | \--- androidx.versionedparcelable:versionedparcelable:1.0.0 -> 1.1.1 (*) -| +--- androidx.legacy:legacy-support-core-utils:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.documentfile:documentfile:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.loader:loader:1.0.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.12.0-beta01 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | | \--- androidx.core:core:1.12.0-beta01 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 +| | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- androidx.tracing:tracing:1.0.0 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- androidx.activity:activity-compose:1.7.2 (c) +| | | \--- androidx.activity:activity-ktx:1.7.2 (c) +| | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -| | | | +--- androidx.arch.core:core-runtime:2.0.0 -> 2.1.0 (*) -| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.0.0 -> 2.5.1 -| | | | | +--- androidx.arch.core:core-common:2.1.0 (*) -| | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*) -| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*) -| | | | \--- androidx.arch.core:core-common:2.0.0 -> 2.1.0 (*) -| | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.5.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c) -| | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 -| | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | \--- androidx.print:print:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| +--- androidx.legacy:legacy-support-core-ui:1.0.0 -| | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) -| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.viewpager:viewpager:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | +--- androidx.coordinatorlayout:coordinatorlayout:1.0.0 -> 1.1.0 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 -| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.customview:customview:1.1.0 (*) -| | +--- androidx.slidingpanelayout:slidingpanelayout:1.0.0 -> 1.2.0 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | +--- androidx.savedstate:savedstate-ktx:1.2.1 +| | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | \--- androidx.savedstate:savedstate:1.2.1 (c) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | +--- androidx.activity:activity:1.7.2 (c) +| | \--- androidx.activity:activity-compose:1.7.2 (c) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 +| | \--- androidx.compose.runtime:runtime-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | +--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 (c) +| | \--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (c) +| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.6.0-alpha02 +| | \--- androidx.compose.runtime:runtime-saveable-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (c) +| | \--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-android:1.6.0-alpha02 +| | +--- androidx.activity:activity-ktx:1.7.0 -> 1.7.2 (*) +| | +--- androidx.annotation:annotation:1.6.0 (*) +| | +--- androidx.autofill:autofill:1.0.0 +| | | \--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | +--- androidx.collection:collection:1.2.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 +| | | \--- androidx.compose.ui:ui-geometry-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-util-android:1.6.0-alpha02 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 +| | | \--- androidx.compose.ui:ui-graphics-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 +| | | | \--- androidx.compose.ui:ui-unit-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 +| | | \--- androidx.compose.ui:ui-text-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.core:core:1.7.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 +| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.6.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | | +--- androidx.startup:startup-runtime:1.1.1 (*) +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.core:core:1.11.0-beta02 -> 1.12.0-beta01 (*) +| | +--- androidx.customview:customview-poolingcontainer:1.0.0 +| | | +--- androidx.core:core-ktx:1.5.0 -> 1.12.0-beta01 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) +| | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.6.0-alpha02 (c) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| +--- androidx.activity:activity-ktx:1.7.2 (c) +| \--- androidx.activity:activity:1.7.2 (c) ++--- androidx.core:core-ktx:1.12.0-beta01 (*) ++--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) ++--- androidx.navigation:navigation-fragment-ktx:2.7.0 +| +--- androidx.navigation:navigation-fragment:2.7.0 +| | +--- androidx.fragment:fragment-ktx:1.6.0 +| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.7.2 (*) +| | | +--- androidx.collection:collection-ktx:1.1.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.9.0 (*) +| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.fragment:fragment:1.6.0 +| | | | +--- androidx.activity:activity:1.5.1 -> 1.7.2 (*) +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | | | +--- androidx.loader:loader:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.lifecycle:lifecycle-livedata:2.0.0 -> 2.6.1 +| | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 -> 2.2.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | | | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | | \--- androidx.lifecycle:lifecycle-viewmodel:2.0.0 -> 2.6.1 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | | | +--- androidx.viewpager:viewpager:1.0.0 +| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | | \--- androidx.customview:customview:1.0.0 -> 1.1.0 +| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) +| | | | \--- androidx.fragment:fragment-ktx:1.6.0 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) +| | | \--- androidx.fragment:fragment:1.6.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 +| | | +--- androidx.activity:activity-ktx:1.7.1 -> 1.7.2 (*) +| | | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.collection:collection-ktx:1.1.0 (*) +| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*) +| | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 (c) +| | | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) | | | +--- androidx.customview:customview:1.1.0 (*) | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) | | | +--- androidx.window:window:1.0.0 | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.4 -| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*) -| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*) -| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.7.3 (*) | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | | | +--- androidx.collection:collection:1.1.0 (*) +| | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) | | | | \--- androidx.core:core:1.3.2 -> 1.12.0-beta01 (*) | | | \--- androidx.transition:transition:1.4.1 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.interpolator:interpolator:1.0.0 (*) -| | +--- androidx.swiperefreshlayout:swiperefreshlayout:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.interpolator:interpolator:1.0.0 (*) -| | +--- androidx.asynclayoutinflater:asynclayoutinflater:1.0.0 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | \--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | \--- androidx.cursoradapter:cursoradapter:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| \--- androidx.fragment:fragment:1.0.0 -> 1.3.6 -| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) -| +--- androidx.collection:collection:1.1.0 (*) -| +--- androidx.viewpager:viewpager:1.0.0 (*) -| +--- androidx.loader:loader:1.0.0 (*) -| +--- androidx.activity:activity:1.2.4 -> 1.6.0 -| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 (*) -| | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -| | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | +--- androidx.core:core-ktx:1.2.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1 (*) -| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | | +--- androidx.savedstate:savedstate:1.2.0 -| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | +--- androidx.arch.core:core-common:2.1.0 (*) -| | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) -| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) -| | +--- androidx.savedstate:savedstate:1.2.0 (*) -| | +--- androidx.tracing:tracing:1.0.0 -| | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | \--- androidx.activity:activity-ktx:1.6.0 (c) -| +--- androidx.lifecycle:lifecycle-livedata-core:2.3.1 -> 2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel:2.3.1 -> 2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1 -> 2.5.1 (*) -| +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*) -| \--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) -+--- androidx.appcompat:appcompat:1.6.1 -| +--- androidx.activity:activity:1.6.0 (*) -| +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) -| +--- androidx.appcompat:appcompat-resources:1.6.1 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 +| | | +--- androidx.navigation:navigation-common:2.7.0 (*) +| | | +--- androidx.navigation:navigation-common:2.7.0 (c) +| | | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | | \--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (*) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-compose:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| \--- androidx.navigation:navigation-common:2.7.0 (c) ++--- androidx.navigation:navigation-ui-ktx:2.7.0 +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (*) +| +--- androidx.navigation:navigation-ui:2.7.0 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.customview:customview:1.1.0 (*) +| | +--- androidx.drawerlayout:drawerlayout:1.1.1 | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 -| | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) -| | | +--- androidx.interpolator:interpolator:1.0.0 (*) -| | | \--- androidx.collection:collection:1.1.0 (*) -| | \--- androidx.appcompat:appcompat:1.6.1 (c) -| +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.core:core:1.9.0 -> 1.12.0-beta01 (*) -| +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) -| +--- androidx.cursoradapter:cursoradapter:1.0.0 (*) -| +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 (*) -| +--- androidx.emoji2:emoji2:1.2.0 -| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | +--- androidx.lifecycle:lifecycle-process:2.4.1 -| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*) -| | | +--- androidx.startup:startup-runtime:1.1.1 +| | | +--- androidx.core:core:1.2.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.customview:customview:1.1.0 (*) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (*) +| | +--- androidx.transition:transition:1.3.0 -> 1.4.1 (*) +| | +--- com.google.android.material:material:1.4.0-beta01 -> 1.9.0 +| | | +--- com.google.errorprone:error_prone_annotations:2.15.0 +| | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.appcompat:appcompat:1.5.0 -> 1.6.1 +| | | | +--- androidx.activity:activity:1.6.0 -> 1.7.2 (*) +| | | | +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) +| | | | +--- androidx.appcompat:appcompat-resources:1.6.1 +| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 +| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.vectordrawable:vectordrawable-animated:1.1.0 +| | | | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | | | | +--- androidx.interpolator:interpolator:1.0.0 (*) +| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | \--- androidx.appcompat:appcompat:1.6.1 (c) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | +--- androidx.core:core:1.9.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.cursoradapter:cursoradapter:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.drawerlayout:drawerlayout:1.0.0 -> 1.1.1 (*) +| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*) +| | | | +--- androidx.emoji2:emoji2-views-helper:1.2.0 -> 1.3.0 +| | | | | +--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | | | | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) +| | | | | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | | | | \--- androidx.emoji2:emoji2:1.3.0 (c) +| | | | +--- androidx.fragment:fragment:1.3.6 -> 1.6.0 (*) +| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 -> 2.6.1 (*) +| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.6.1 (*) +| | | | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) +| | | | \--- androidx.appcompat:appcompat-resources:1.6.1 (c) +| | | +--- androidx.cardview:cardview:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | | | \--- androidx.tracing:tracing:1.0.0 (*) -| | | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | \--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) -| +--- androidx.emoji2:emoji2-views-helper:1.2.0 -| | +--- androidx.collection:collection:1.1.0 (*) -| | +--- androidx.core:core:1.3.0 -> 1.12.0-beta01 (*) -| | \--- androidx.emoji2:emoji2:1.2.0 (*) -| +--- androidx.fragment:fragment:1.3.6 (*) -| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 -| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.savedstate:savedstate:1.2.0 (*) -| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| \--- androidx.appcompat:appcompat-resources:1.6.1 (c) -+--- com.google.android.material:material:1.9.0 -| +--- com.google.errorprone:error_prone_annotations:2.15.0 +| | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.constraintlayout:constraintlayout:2.0.1 +| | | | +--- androidx.appcompat:appcompat:1.2.0 -> 1.6.1 (*) +| | | | +--- androidx.core:core:1.3.1 -> 1.12.0-beta01 (*) +| | | | \--- androidx.constraintlayout:constraintlayout-solver:2.0.1 +| | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) +| | | +--- androidx.dynamicanimation:dynamicanimation:1.0.0 +| | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | | \--- androidx.legacy:legacy-support-core-utils:1.0.0 +| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.documentfile:documentfile:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.loader:loader:1.0.0 (*) +| | | | +--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | \--- androidx.print:print:1.0.0 +| | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | +--- androidx.fragment:fragment:1.2.5 -> 1.6.0 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.6.1 (*) +| | | +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) +| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*) +| | | +--- androidx.transition:transition:1.2.0 -> 1.4.1 (*) +| | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) +| | | \--- androidx.viewpager2:viewpager2:1.0.0 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.fragment:fragment:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.recyclerview:recyclerview:1.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-compose:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| +--- androidx.navigation:navigation-compose:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| +--- androidx.navigation:navigation-ui:2.7.0 (c) +| +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| \--- androidx.navigation:navigation-common:2.7.0 (c) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*) ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*) ++--- com.google.dagger:hilt-android:2.47 +| +--- com.google.dagger:dagger:2.47 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.dagger:dagger-lint-aar:2.47 +| +--- com.google.dagger:hilt-core:2.47 +| | +--- com.google.dagger:dagger:2.47 (*) +| | +--- com.google.code.findbugs:jsr305:3.0.2 +| | \--- javax.inject:javax.inject:1 +| +--- com.google.code.findbugs:jsr305:3.0.2 +| +--- androidx.activity:activity:1.5.1 -> 1.7.2 (*) | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| +--- androidx.appcompat:appcompat:1.5.0 -> 1.6.1 (*) -| +--- androidx.cardview:cardview:1.0.0 -| | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| +--- androidx.coordinatorlayout:coordinatorlayout:1.1.0 (*) -| +--- androidx.constraintlayout:constraintlayout:2.0.1 -| | +--- androidx.appcompat:appcompat:1.2.0 -> 1.6.1 (*) -| | +--- androidx.core:core:1.3.1 -> 1.12.0-beta01 (*) -| | \--- androidx.constraintlayout:constraintlayout-solver:2.0.1 -| +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| +--- androidx.drawerlayout:drawerlayout:1.1.1 (*) -| +--- androidx.dynamicanimation:dynamicanimation:1.0.0 -| | +--- androidx.core:core:1.0.0 -> 1.12.0-beta01 (*) -| | +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| | \--- androidx.legacy:legacy-support-core-utils:1.0.0 (*) -| +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) -| +--- androidx.fragment:fragment:1.2.5 -> 1.3.6 (*) -| +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.5.1 (*) -| +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 +| +--- androidx.fragment:fragment:1.5.1 -> 1.6.0 (*) +| +--- androidx.lifecycle:lifecycle-common:2.5.1 -> 2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 -> 2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 -> 2.6.1 (*) +| +--- androidx.savedstate:savedstate:1.2.0 -> 1.2.1 (*) +| +--- javax.inject:javax.inject:1 +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.20 -> 1.9.0 (*) ++--- androidx.hilt:hilt-navigation-compose:1.0.0 +| +--- androidx.hilt:hilt-navigation:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.9.0 (*) | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*) -| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.transition:transition:1.2.0 -> 1.4.1 (*) -| +--- androidx.vectordrawable:vectordrawable:1.1.0 (*) -| \--- androidx.viewpager2:viewpager2:1.0.0 +| | +--- androidx.navigation:navigation-runtime:2.3.2 -> 2.7.0 (*) +| | \--- com.google.dagger:hilt-android:2.35 -> 2.47 (*) +| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0 -> 2.6.1 +| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | \--- androidx.lifecycle:lifecycle-service:2.6.1 (c) +| +--- androidx.navigation:navigation-compose:2.4.0 -> 2.7.0 +| | +--- androidx.activity:activity-compose:1.7.0 -> 1.7.2 (*) +| | +--- androidx.compose.animation:animation:1.5.0 -> 1.6.0-alpha02 +| | | \--- androidx.compose.animation:animation-android:1.6.0-alpha02 +| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 +| | | | \--- androidx.compose.animation:animation-core-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*) +| | | | \--- androidx.compose.animation:animation:1.6.0-alpha02 (c) +| | | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 +| | | | \--- androidx.compose.foundation:foundation-layout-android:1.6.0-alpha02 +| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.6.0-alpha02 (*) +| | | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | | +--- androidx.core:core:1.7.0 -> 1.12.0-beta01 (*) +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | | \--- androidx.compose.foundation:foundation:1.6.0-alpha02 (c) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | | \--- androidx.compose.animation:animation-core:1.6.0-alpha02 (c) +| | +--- androidx.compose.foundation:foundation-layout:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime-saveable:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.5.0 -> 1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (*) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.navigation:navigation-fragment:2.7.0 (c) +| | +--- androidx.navigation:navigation-fragment-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui:2.7.0 (c) +| | +--- androidx.navigation:navigation-ui-ktx:2.7.0 (c) +| | +--- androidx.navigation:navigation-runtime:2.7.0 (c) +| | +--- androidx.navigation:navigation-common-ktx:2.7.0 (c) +| | \--- androidx.navigation:navigation-common:2.7.0 (c) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) ++--- com.michael-bull.kotlin-result:kotlin-result:1.1.18 +| \--- com.michael-bull.kotlin-result:kotlin-result-jvm:1.1.18 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.9.0 ++--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5 +| \--- org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.5 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.0 -> 1.9.0 ++--- com.jakewharton.timber:timber:5.0.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.21 -> 1.9.0 (*) +| \--- org.jetbrains:annotations:20.1.0 -> 23.0.0 ++--- com.mikepenz:aboutlibraries-compose:10.8.3 +| \--- com.mikepenz:aboutlibraries-compose-android:10.8.3 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.0 (*) +| +--- org.jetbrains.compose.ui:ui-tooling-preview:1.4.1 +| | \--- androidx.compose.ui:ui-tooling-preview:1.4.3 -> 1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-tooling-preview-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.core:core-ktx:1.10.1 -> 1.12.0-beta01 (*) +| +--- com.mikepenz:aboutlibraries-core:10.8.3 +| | \--- com.mikepenz:aboutlibraries-core-android:10.8.3 +| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 1.9.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- org.jetbrains.compose.runtime:runtime:1.4.1 +| | \--- androidx.compose.runtime:runtime:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.ui:ui:1.4.1 +| | \--- androidx.compose.ui:ui:1.4.3 -> 1.6.0-alpha02 (*) +| +--- org.jetbrains.compose.foundation:foundation:1.4.1 +| | \--- androidx.compose.foundation:foundation:1.4.3 -> 1.6.0-alpha02 +| | \--- androidx.compose.foundation:foundation-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.core:core:1.11.0-beta02 -> 1.12.0-beta01 (*) +| | +--- androidx.emoji2:emoji2:1.3.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | \--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (c) +| +--- org.jetbrains.compose.material:material:1.4.1 +| | \--- androidx.compose.material:material:1.4.3 -> 1.6.0-alpha02 +| | \--- androidx.compose.material:material-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 +| | | \--- androidx.compose.material:material-icons-core-android:1.6.0-alpha02 +| | | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | | +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| | | +--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | | \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) +| | +--- androidx.compose.material:material-ripple:1.6.0-alpha02 +| | | \--- androidx.compose.material:material-ripple-android:1.6.0-alpha02 +| | | +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | | +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| | | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| | | \--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.savedstate:savedstate:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| | +--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 (c) +| | \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) +| \--- org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5 (*) ++--- com.mikepenz:aboutlibraries-core:10.8.3 (*) ++--- com.google.accompanist:accompanist-placeholder-material3:0.33.0-alpha +| +--- androidx.compose.material3:material3:1.0.1 -> 1.2.0-alpha04 +| | \--- androidx.compose.material3:material3-android:1.2.0-alpha04 +| | +--- androidx.activity:activity-compose:1.5.0 -> 1.7.2 (*) +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.animation:animation-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.foundation:foundation-layout:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (*) +| | +--- androidx.compose.material:material-ripple:1.6.0-alpha02 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*) +| | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| | \--- androidx.compose.material3:material3-window-size-class:1.2.0-alpha04 (c) +| +--- io.github.aakira:napier:1.4.1 +| | \--- io.github.aakira:napier-android:1.4.1 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.9.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32 -> 1.9.0 +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| +--- com.google.accompanist:accompanist-placeholder:0.33.0-alpha +| | +--- androidx.compose.foundation:foundation:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (*) +| | +--- io.github.aakira:napier:1.4.1 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- com.google.accompanist:accompanist-systemuicontroller:0.33.0-alpha +| +--- androidx.core:core-ktx:1.8.0 -> 1.12.0-beta01 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 (*) ++--- androidx.appcompat:appcompat:1.6.1 (*) ++--- androidx.compose.material:material:1.6.0-alpha02 (*) ++--- androidx.compose.material:material-icons-extended:1.6.0-alpha02 +| \--- androidx.compose.material:material-icons-extended-android:1.6.0-alpha02 +| +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- androidx.compose.material:material:1.6.0-alpha02 (c) +| +--- androidx.compose.material:material-icons-core:1.6.0-alpha02 (c) +| \--- androidx.compose.material:material-ripple:1.6.0-alpha02 (c) ++--- androidx.compose.material3:material3:1.2.0-alpha04 (*) ++--- androidx.compose.material3:material3-window-size-class:1.1.1 -> 1.2.0-alpha04 +| \--- androidx.compose.material3:material3-window-size-class-android:1.2.0-alpha04 +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (*) +| +--- androidx.window:window:1.0.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| \--- androidx.compose.material3:material3:1.2.0-alpha04 (c) ++--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) ++--- androidx.compose.runtime:runtime-livedata:1.6.0-alpha02 +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (*) +| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (c) +| \--- androidx.compose.runtime:runtime-saveable:1.6.0-alpha02 (c) ++--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 +| \--- androidx.compose.ui:ui-tooling-android:1.6.0-alpha02 +| +--- androidx.activity:activity-compose:1.7.0 -> 1.7.2 (*) | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) -| +--- androidx.fragment:fragment:1.1.0 -> 1.3.6 (*) -| +--- androidx.recyclerview:recyclerview:1.1.0 (*) -| +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) -| \--- androidx.collection:collection:1.1.0 (*) -+--- androidx.preference:preference-ktx:1.2.0 -| +--- androidx.preference:preference:1.2.0 +| +--- androidx.compose.animation:animation:1.6.0-alpha02 (*) +| +--- androidx.compose.material:material:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 +| | \--- androidx.compose.ui:ui-tooling-data-android:1.6.0-alpha02 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.compose.runtime:runtime:1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| | +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| | \--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (*) +| +--- androidx.lifecycle:lifecycle-common:2.6.1 (*) +| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 1.9.0 +| +--- androidx.compose.ui:ui:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-graphics:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-text:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-data:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-tooling-preview:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-unit:1.6.0-alpha02 (c) +| +--- androidx.compose.ui:ui-util:1.6.0-alpha02 (c) +| \--- androidx.compose.ui:ui-geometry:1.6.0-alpha02 (c) ++--- androidx.compose.ui:ui:1.6.0-alpha02 (*) ++--- androidx.constraintlayout:constraintlayout-compose:1.0.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.10 -> 1.9.0 (*) +| +--- androidx.compose.ui:ui:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-util:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.foundation:foundation:1.0.0 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.material:material:1.0.0 -> 1.6.0-alpha02 (*) +| \--- androidx.constraintlayout:constraintlayout-core:1.0.4 ++--- androidx.core:core-splashscreen:1.0.1 +| +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) ++--- androidx.datastore:datastore-preferences:1.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| +--- androidx.datastore:datastore:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*) | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) -| | +--- androidx.appcompat:appcompat:1.1.0 -> 1.6.1 (*) -| | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) -| | +--- androidx.fragment:fragment-ktx:1.3.6 -| | | +--- androidx.fragment:fragment:1.3.6 (*) -| | | +--- androidx.activity:activity-ktx:1.2.2 -> 1.6.0 -| | | | +--- androidx.activity:activity:1.6.0 (*) -| | | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 +| | \--- androidx.datastore:datastore-core:1.0.0 +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*) +| | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| \--- androidx.datastore:datastore-preferences-core:1.0.0 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 1.9.0 (*) +| \--- androidx.datastore:datastore-core:1.0.0 (*) ++--- androidx.glance:glance-appwidget:1.0.0-rc01 +| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.core:core-ktx:1.7.0 -> 1.12.0-beta01 (*) +| +--- androidx.core:core-remoteviews:1.0.0-rc01 +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.core:core:1.8.0 -> 1.12.0-beta01 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.datastore:datastore:1.0.0 (*) +| +--- androidx.datastore:datastore-core:1.0.0 (*) +| +--- androidx.datastore:datastore-preferences:1.0.0 (*) +| +--- androidx.datastore:datastore-preferences-core:1.0.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 +| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | +--- androidx.annotation:annotation-experimental:1.3.0 (*) +| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.6.0-alpha02 (*) +| | +--- androidx.datastore:datastore-core:1.0.0 (*) +| | +--- androidx.datastore:datastore-preferences:1.0.0 (*) +| | +--- androidx.datastore:datastore-preferences-core:1.0.0 (*) +| | +--- androidx.work:work-runtime:2.7.1 +| | | +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.3.0 (*) +| | | +--- com.google.guava:listenablefuture:1.0 +| | | +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.6.1 (*) +| | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*) +| | | +--- androidx.core:core:1.6.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.room:room-runtime:2.2.5 +| | | | +--- androidx.room:room-common:2.2.5 +| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*) +| | | | +--- androidx.sqlite:sqlite-framework:2.0.1 -> 2.1.0 | | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) -| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*) -| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) -| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 -| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*) -| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.9.0 (*) -| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*) -| | | | +--- androidx.savedstate:savedstate-ktx:1.2.0 -| | | | | +--- androidx.savedstate:savedstate:1.2.0 (*) -| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.0 (*) -| | | | \--- androidx.activity:activity:1.6.0 (c) -| | | +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| | | +--- androidx.collection:collection-ktx:1.1.0 -| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.9.0 (*) -| | | | \--- androidx.collection:collection:1.1.0 (*) -| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.1 -| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.3.1 -> 2.5.1 (*) -| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.9.0 (*) -| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1 -> 2.5.1 (*) -| | | +--- androidx.savedstate:savedstate-ktx:1.1.0 -> 1.2.0 (*) -| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.9.0 (*) -| | +--- androidx.recyclerview:recyclerview:1.0.0 -> 1.1.0 (*) -| | +--- androidx.slidingpanelayout:slidingpanelayout:1.2.0 (*) -| | \--- androidx.collection:collection:1.0.0 -> 1.1.0 (*) -| +--- androidx.core:core-ktx:1.1.0 -> 1.12.0-beta01 (*) -| +--- androidx.fragment:fragment-ktx:1.3.6 (*) -| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 1.9.0 (*) -+--- androidx.legacy:legacy-preference-v14:1.0.0 -| \--- androidx.preference:preference:1.0.0 -> 1.2.0 (*) -\--- com.github.gabrielemariotti.changeloglib:changelog:2.1.0 - +--- com.android.support:recyclerview-v7:23.3.0 -> androidx.recyclerview:recyclerview:1.1.0 (*) - \--- com.android.support:support-v4:23.3.0 -> androidx.legacy:legacy-support-v4:1.0.0 (*) +| | | | | \--- androidx.sqlite:sqlite:2.1.0 +| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.6.0 (*) +| | | | +--- androidx.sqlite:sqlite:2.0.1 -> 2.1.0 (*) +| | | | \--- androidx.arch.core:core-runtime:2.0.1 -> 2.2.0 (*) +| | | +--- androidx.sqlite:sqlite:2.1.0 (*) +| | | +--- androidx.sqlite:sqlite-framework:2.1.0 (*) +| | | +--- androidx.core:core:1.1.0 -> 1.12.0-beta01 (*) +| | | \--- androidx.lifecycle:lifecycle-service:2.1.0 -> 2.6.1 +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0 (*) +| | | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c) +| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c) +| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c) +| | +--- androidx.work:work-runtime-ktx:2.7.1 +| | | +--- androidx.work:work-runtime:2.7.1 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.30 -> 1.9.0 (*) +| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0 -> 1.7.3 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| | +--- androidx.glance:glance-appwidget:1.0.0-rc01 (c) +| | \--- androidx.glance:glance-material3:1.0.0-rc01 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (c) +| \--- androidx.glance:glance-material3:1.0.0-rc01 (c) ++--- androidx.glance:glance-material3:1.0.0-rc01 +| +--- androidx.annotation:annotation:1.4.0 -> 1.6.0 (*) +| +--- androidx.compose.material3:material3:1.0.0 -> 1.2.0-alpha04 (*) +| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.6.0-alpha02 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (*) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 1.9.0 (*) +| +--- androidx.glance:glance:1.0.0-rc01 (c) +| \--- androidx.glance:glance-appwidget:1.0.0-rc01 (c) ++--- androidx.lifecycle:lifecycle-process:2.6.1 (*) ++--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*) ++--- androidx.navigation:navigation-compose:2.7.0 (*) ++--- androidx.paging:paging-compose:3.2.0 +| +--- androidx.compose.foundation:foundation:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.0-alpha02 (*) +| +--- androidx.paging:paging-common:3.2.0 +| | +--- androidx.annotation:annotation:1.3.0 -> 1.6.0 (*) +| | +--- androidx.arch.core:core-common:2.2.0 (*) +| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.3 (*) +| | \--- androidx.paging:paging-compose:3.2.0 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| \--- androidx.paging:paging-common:3.2.0 (c) ++--- io.coil-kt:coil-compose:2.4.0 +| +--- io.coil-kt:coil-compose-base:2.4.0 +| | +--- androidx.core:core-ktx:1.9.0 -> 1.12.0-beta01 (*) +| | +--- com.google.accompanist:accompanist-drawablepainter:0.30.1 +| | | +--- androidx.compose.ui:ui:1.4.0 -> 1.6.0-alpha02 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*) +| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) +| | +--- io.coil-kt:coil-base:2.4.0 +| | | +--- androidx.annotation:annotation:1.6.0 (*) +| | | +--- androidx.appcompat:appcompat-resources:1.6.1 (*) +| | | +--- androidx.collection:collection:1.2.0 (*) +| | | +--- androidx.core:core-ktx:1.9.0 -> 1.12.0-beta01 (*) +| | | +--- androidx.exifinterface:exifinterface:1.3.6 +| | | | \--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*) +| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*) +| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*) +| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*) +| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| | | +--- com.squareup.okhttp3:okhttp:4.11.0 +| | | | +--- com.squareup.okio:okio:3.2.0 -> 3.3.0 +| | | | | \--- com.squareup.okio:okio-jvm:3.3.0 +| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0 -> 1.9.0 (*) +| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0 -> 1.9.0 +| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.9.0 (*) +| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.9.0 (*) +| | | \--- com.squareup.okio:okio:3.3.0 (*) +| | +--- androidx.compose.foundation:foundation:1.4.3 -> 1.6.0-alpha02 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) +| +--- io.coil-kt:coil:2.4.0 +| | +--- io.coil-kt:coil-base:2.4.0 (*) +| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21 -> 1.9.0 (*) ++--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1 +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1 (c) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.5.1 (c) +| | +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1 (c) +| | \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1 (c) +| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21 -> 1.9.0 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.1 +| \--- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.5.1 +| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 1.9.0 (*) +| +--- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.5.1 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.21 -> 1.9.0 ++--- com.google.android.material:material:1.9.0 (*) ++--- com.squareup.okhttp3:logging-interceptor:4.11.0 +| +--- com.squareup.okhttp3:okhttp:4.11.0 (*) +| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 -> 1.9.0 (*) ++--- com.squareup.retrofit2:retrofit:2.9.0 +| \--- com.squareup.okhttp3:okhttp:3.14.9 -> 4.11.0 (*) ++--- com.squareup.retrofit2:converter-scalars:2.9.0 +| \--- com.squareup.retrofit2:retrofit:2.9.0 (*) +\--- com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0 + +--- com.squareup.retrofit2:retrofit:2.9.0 (*) + +--- org.jetbrains.kotlinx:kotlinx-serialization-core:1.5.0 -> 1.5.1 (*) + \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0 (*) (c) - A dependency constraint, not a dependency. The dependency affected by the constraint occurs elsewhere in the tree. (*) - Indicates repeated occurrences of a transitive dependency subtree. Gradle expands transitive dependency subtrees only once per project; repeat occurrences only display the root of the subtree, followed by this annotation. diff --git a/app/versions/mergedManifests/debug/AndroidManifest.xml b/app/versions/mergedManifests/debug/AndroidManifest.xml index 247faa3..9a40475 100644 --- a/app/versions/mergedManifests/debug/AndroidManifest.xml +++ b/app/versions/mergedManifests/debug/AndroidManifest.xml @@ -1,7 +1,7 @@ - - + + + + + + + + + - - + android:name="com.leinardi.ubuntucountdownwidget.appwidget.AppWidgetReceiver" + android:exported="true" > - - - - + android:resource="@xml/app_widget_info" /> + + + + + + + + + android:name="androidx.glance.appwidget.action.ActionTrampolineActivity" + android:enabled="true" + android:excludeFromRecents="true" + android:exported="false" /> + + + + - + + + - + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:permission="android.permission.DUMP" > - + - + - + - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/versions/mergedManifests/release/AndroidManifest.xml b/app/versions/mergedManifests/release/AndroidManifest.xml index 9433b5a..99910e4 100644 --- a/app/versions/mergedManifests/release/AndroidManifest.xml +++ b/app/versions/mergedManifests/release/AndroidManifest.xml @@ -1,7 +1,7 @@ - - + + + + + + + + + - - + android:name="com.leinardi.ubuntucountdownwidget.appwidget.AppWidgetReceiver" + android:exported="true" > - - - - + android:resource="@xml/app_widget_info" /> + + + + + + + + + + + android:name="androidx.glance.appwidget.action.ActionTrampolineActivity" + android:enabled="true" + android:excludeFromRecents="true" + android:exported="false" /> + + + + - + + + - + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:permission="android.permission.DUMP" > - + - + - + - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/art/background_dark.svg b/art/background_dark.svg index 72d6c00..5bab2c4 100644 --- a/art/background_dark.svg +++ b/art/background_dark.svg @@ -1,10 +1,83 @@ - - - - - - - - - + + + + + + + + + + + + + diff --git a/art/background_light.svg b/art/background_light.svg index 25179f4..2b4ebfb 100644 --- a/art/background_light.svg +++ b/art/background_light.svg @@ -1,10 +1,99 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/media/feature_graphic.png b/art/feature_graphic.png similarity index 100% rename from media/feature_graphic.png rename to art/feature_graphic.png diff --git a/art/project.dot.png b/art/project.dot.png deleted file mode 100644 index c16de86..0000000 Binary files a/art/project.dot.png and /dev/null differ diff --git a/media/promo_graphic.png b/art/promo_graphic.png similarity index 100% rename from media/promo_graphic.png rename to art/promo_graphic.png diff --git a/art/screenshot-1.png b/art/screenshot-1.png index b197c00..01902b9 100644 Binary files a/art/screenshot-1.png and b/art/screenshot-1.png differ diff --git a/art/screenshot-2.png b/art/screenshot-2.png index bf79fc7..a45e539 100644 Binary files a/art/screenshot-2.png and b/art/screenshot-2.png differ diff --git a/art/ubuntu-logo-circle.svg b/art/ubuntu-logo-circle.svg new file mode 100644 index 0000000..d5bced0 --- /dev/null +++ b/art/ubuntu-logo-circle.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + diff --git a/art/ubuntu-logo-dark.svg b/art/ubuntu-logo-dark.svg new file mode 100644 index 0000000..6c40884 --- /dev/null +++ b/art/ubuntu-logo-dark.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/art/ubuntu-logo-light.svg b/art/ubuntu-logo-light.svg new file mode 100644 index 0000000..2ebe4f7 --- /dev/null +++ b/art/ubuntu-logo-light.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/web_hi_res_512.png b/art/web_hi_res_512.png similarity index 100% rename from media/web_hi_res_512.png rename to art/web_hi_res_512.png diff --git a/build-conventions/build.gradle b/build-conventions/build.gradle.kts similarity index 54% rename from build-conventions/build.gradle rename to build-conventions/build.gradle.kts index 9e16353..844395a 100644 --- a/build-conventions/build.gradle +++ b/build-conventions/build.gradle.kts @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -18,18 +18,23 @@ // https://docs.gradle.org/current/samples/sample_convention_plugins.html plugins { - id 'groovy-gradle-plugin' + `kotlin-dsl` + id("groovy-gradle-plugin") } dependencies { - implementation libs.plugin.android.gradle - implementation libs.plugin.appversioning - implementation libs.plugin.detekt - implementation libs.plugin.hilt - implementation libs.plugin.kotlin - implementation libs.plugin.ruler - implementation libs.plugin.spotless - implementation libs.plugin.versions - implementation libs.plugin.violation + implementation(libs.plugin.aboutlibraries) + implementation(libs.plugin.android.gradle) + implementation(libs.plugin.appversioning) + implementation(libs.plugin.detekt) + implementation(libs.plugin.easylauncher) + implementation(libs.plugin.hilt) + implementation(libs.plugin.kotlin) + implementation(libs.plugin.ruler) + implementation(libs.plugin.spotless) + implementation(libs.plugin.versions) + implementation(libs.plugin.versions.update) + implementation(libs.plugin.violation) + implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) } diff --git a/build-conventions/settings.gradle.kts b/build-conventions/settings.gradle.kts new file mode 100644 index 0000000..1355437 --- /dev/null +++ b/build-conventions/settings.gradle.kts @@ -0,0 +1,41 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} + +// https://docs.gradle.org/7.0/userguide/declaring_dependencies.html#sec:type-safe-project-accessors +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +dependencyResolutionManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} + +rootProject.name = "build-conventions" diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.android-android-conventions.gradle b/build-conventions/src/main/groovy/ubuntucountdownwidget.android-android-conventions.gradle deleted file mode 100644 index a9e06ed..0000000 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.android-android-conventions.gradle +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ -plugins { - id 'kotlin-android' - id 'kotlin-kapt' - id 'ubuntucountdownwidget.detekt-conventions' -} - -kapt { - useBuildCache = true - correctErrorTypes true - javacOptions { - option('-Xmaxerrs', Integer.MAX_VALUE) - } -} - -android { - compileSdk config.android.compileSdk - - defaultConfig { - minSdk config.android.minSdk - targetSdk config.android.targetSdk - - multiDexEnabled true - - testInstrumentationRunner "com.leinardi.ubuntucountdownwidget.core.test.runner.HiltTestRunner" - // The following argument makes the Android Test Orchestrator run its - // "pm clear" command after each test invocation. This command ensures - // that the app's state is completely cleared between tests. - testInstrumentationRunnerArguments clearPackageData: 'true' - } - compileOptions { - coreLibraryDesugaringEnabled true - // https://developer.android.com/studio/write/java8-support#library-desugaring - sourceCompatibility config.android.javaVersion - targetCompatibility config.android.javaVersion - } - kotlinOptions { - freeCompilerArgs += '-opt-in=kotlin.RequiresOptIn' - jvmTarget = config.android.javaVersion - } - testOptions { - execution 'ANDROIDX_TEST_ORCHESTRATOR' - animationsDisabled = true - unitTests { - returnDefaultValues = true - includeAndroidResources = true - all { - jvmArgs '-noverify' - } - } - } - lintOptions { - abortOnError true - checkAllWarnings false - checkDependencies true - checkReleaseBuilds false - ignoreTestSources true - warningsAsErrors false - disable 'ResourceType' - lintConfig file("${project.rootDir}/config/lint/lint.xml") - } - packagingOptions { - resources { - exclude '.readme' - exclude 'LICENSE.txt' - exclude 'fabric/*.properties' - // Exclude the Firebase/Fabric/other random properties files - exclude '/*.properties' - // Exclude AndroidX version files - exclude 'META-INF/*.version' - // Exclude consumer proguard files - exclude 'META-INF/proguard/*' - exclude 'META-INF/*.properties' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/MANIFEST.MF' - exclude 'META-INF/NOTICE.txt' - exclude "META-INF/AL2.0" - exclude "META-INF/LGPL2.1" - exclude 'META-INF/maven/com.google.guava/guava/pom.properties' - exclude 'META-INF/maven/com.google.guava/guava/pom.xml' - exclude 'META-INF/*.kotlin_module' - // for byte-buddy - exclude "META-INF/licenses/ASM" - pickFirst "win32-x86-64/attach_hotspot_windows.dll" - pickFirst "win32-x86/attach_hotspot_windows.dll" - } - } - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - test.java.srcDirs += 'src/test/kotlin' - } -} - -kotlin { - sourceSets.all { - languageSettings { - progressiveMode = true - // deprecations and bug fixes for unstable code take effect immediately - } - } -} - -tasks.withType(Test) { - testLogging { - events "skipped", "failed" - } -} - -dependencies { - implementation libs.androidx.core.ktx - implementation 'androidx.multidex:multidex:2.0.1' - coreLibraryDesugaring libs.desugar - testImplementation libs.mockk - androidTestImplementation libs.androidx.test.espresso.core - androidTestImplementation libs.androidx.test.ext.junit - androidTestImplementation libs.androidx.test.runner - androidTestImplementation libs.mockk.android - androidTestUtil libs.androidx.test.orchestrator -} diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.buildlog-conventions.gradle b/build-conventions/src/main/groovy/ubuntucountdownwidget.buildlog-conventions.gradle deleted file mode 100644 index c9b5d2d..0000000 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.buildlog-conventions.gradle +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ -import org.gradle.internal.logging.LoggingOutputInternal - -if (config.params.saveBuildLogToFile) { - def datetime = new Date().format('yyyy-MM-dd-HH-mm-ss') - def buildLogDir = "${rootDir}/build/logs" - mkdir(buildLogDir) - def buildLog = new File("${buildLogDir}/buildlog-${datetime}.txt") - - System.setProperty('org.gradle.color.error', 'RED') - - def outputListener = new StandardOutputListener() { - void onOutput(CharSequence output) { - buildLog << output - } - } - gradle.services.get(LoggingOutputInternal).addStandardOutputListener(outputListener) - gradle.services.get(LoggingOutputInternal).addStandardErrorListener(outputListener) -} diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.dependencies-conventions.gradle b/build-conventions/src/main/groovy/ubuntucountdownwidget.dependencies-conventions.gradle deleted file mode 100644 index 2599952..0000000 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.dependencies-conventions.gradle +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -afterEvaluate { - def outputPath = "versions/dependencies" - mkdir outputPath - def compileDependencyReportTask = tasks.register("generateRuntimeDependenciesReport") { - description 'Generates a text file containing the Runtime classpath dependencies.' - } - project.configurations.findAll { it.name.contains("RuntimeClasspath") }.forEach { configuration -> - def configurationTask = tasks.register("generate${configuration.name.capitalize()}DependenciesReport", DependencyReportTask) { - configurations = [configuration] - outputFile = file("$outputPath/${configuration.name}Dependencies.txt") - } - compileDependencyReportTask.configure { dependsOn configurationTask } - } - check.dependsOn tasks.named("generateRuntimeDependenciesReport") -} diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.dependency-graph-conventions.gradle b/build-conventions/src/main/groovy/ubuntucountdownwidget.dependency-graph-conventions.gradle deleted file mode 100644 index 188adee..0000000 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.dependency-graph-conventions.gradle +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ - -/** - * Taken from https://github.com/JakeWharton/SdkSearch/blob/master/gradle/projectDependencyGraph.gradle - */ - -def font = "Helvetica" - -tasks.register("projectDependencyGraph") { - doLast { - def dot = new File(rootProject.buildDir, 'reports/dependencyGraph/project.dot') - dot.parentFile.mkdirs() - dot.delete() - - dot << 'digraph {\n' - dot << " graph [label=\"${rootProject.name}\\n \",labelloc=t,fontsize=30,ranksep=1.4,fontname=\"$font\"];\n" - dot << " node [style=filled, fillcolor=\"#bbbbbb\", fontname=\"$font\"];\n" - dot << " edge [fontname = \"$font\"];" - dot << ' rankdir=TB;\n' - - def rootProjects = [] - def queue = [rootProject] - while (!queue.isEmpty()) { - def project = queue.remove(0) - rootProjects.add(project) - queue.addAll(project.childProjects.values()) - } - - def projects = new LinkedHashSet() - def dependencies = new LinkedHashMap, List>() - def featureProjects = [] - def coreProjects = [] - def multiplatformProjects = [] - def jsProjects = [] - def androidProjects = [] - def javaProjects = [] - - queue = [rootProject] - while (!queue.isEmpty()) { - def project = queue.remove(0) - queue.addAll(project.childProjects.values()) - - if (project.plugins.hasPlugin('ubuntucountdownwidget.android-feature-conventions')) { - featureProjects.add(project) - } - if (project.plugins.hasPlugin('ubuntucountdownwidget.android-core-conventions')) { - coreProjects.add(project) - } - if (project.plugins.hasPlugin('org.jetbrains.kotlin.multiplatform')) { - multiplatformProjects.add(project) - } - if (project.plugins.hasPlugin('org.jetbrains.kotlin.js')) { - jsProjects.add(project) - } - if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) { - androidProjects.add(project) - } - if (project.plugins.hasPlugin('java-library') || project.plugins.hasPlugin('java')) { - javaProjects.add(project) - } - - project.configurations.all { config -> - config.dependencies - .withType(ProjectDependency) - .collect { it.dependencyProject } - .each { dependency -> - projects.add(project) - projects.add(dependency) - rootProjects.remove(dependency) - - def graphKey = new Tuple2(project, dependency) - if (project != dependency) { - def traits = dependencies.computeIfAbsent(graphKey) { new ArrayList() } - if (config.name.toLowerCase().endsWith('implementation')) { - traits.add('style=dotted') - } - } - } - } - } - - projects = projects.sort { it.path } - - dot << '\n # Projects\n\n' - for (project in projects) { - def traits = [] - - if (rootProjects.contains(project)) { - traits.add('shape=box') - } - - if (featureProjects.contains(project)) { - traits.add('fillcolor="#729500"') - } else if (coreProjects.contains(project)) { - traits.add('fillcolor="#d8f96b"') - } else if (multiplatformProjects.contains(project)) { - traits.add('fillcolor="#a69be4"') - } else if (jsProjects.contains(project)) { - traits.add('fillcolor="#f0db4f"') - } else if (androidProjects.contains(project)) { - traits.add('fillcolor="#a4c639"') - } else if (javaProjects.contains(project)) { - traits.add('fillcolor="#f89820"') - } else { - traits.add('fillcolor="#eeeeee"') - } - - dot << " \"${project.path}\" [${traits.join(", ")}];\n" - } - - dot << '\n {rank = same;' - for (project in projects) { - if (rootProjects.contains(project)) { - dot << " \"${project.path}\";" - } - } - dot << '}\n' - - dot << '\n # Dependencies\n\n' - dependencies.forEach { key, traits -> - dot << " \"${key.getV1().path}\" -> \"${key.getV2().path}\"" - if (!traits.isEmpty()) { - dot << " [${traits.join(", ")}]" - } - dot << '\n' - } - - dot << '}\n' - - def p = 'dot -Tpng -O project.dot'.execute([], dot.parentFile) - p.waitFor() - if (p.exitValue() != 0) { - throw new RuntimeException(p.errorStream.text) - } - - println("Project module dependency graph created at ${dot.absolutePath}.png") - - copy { - from "${dot.absolutePath}.png" - into rootProject.file("art") - } - } -} - -// Add the task as check dependency only if dot is available -try { - def p = 'dot -V'.execute([]) - p.waitFor() - if (p.exitValue() == 0) { - check.dependsOn tasks.named("projectDependencyGraph") - } else { - logger.warn("w: {}", p.errorStream.text) - } -} catch (Exception e) { - logger.warn("w: {}", e.message) -} diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.versions-conventions.gradle b/build-conventions/src/main/groovy/ubuntucountdownwidget.versions-conventions.gradle deleted file mode 100644 index b6551f6..0000000 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.versions-conventions.gradle +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ -import com.github.benmanes.gradle.versions.reporter.PlainTextReporter - -plugins { - id 'com.github.ben-manes.versions' -} - -def isNonStable = { String version -> - def stableKeyword = ['RELEASE', 'FINAL', 'GA'].any { it -> version.toUpperCase().contains(it) } - def regex = /^[0-9,.v-]+(-r)?$/ - return !stableKeyword && !(version ==~ regex) -} -tasks.named("dependencyUpdates").configure { - gradleReleaseChannel = 'current' - rejectVersionIf { - isNonStable(it.candidate.version) && !isNonStable(it.currentVersion) - } - outputFormatter = { result -> - def writer = new StringWriter() - def html = new groovy.xml.MarkupBuilder(writer) - def updatable = result.outdated.dependencies - - html.html { - body { - h1 'Outdated dependencies' - if (!updatable.isEmpty()) { - table { - thead { - tr { - td { strong 'Dependency' } - td { strong 'Current version' } - td { strong 'Latest version' } - } - } - tbody { - updatable.each { dependency -> - tr { - def dependencyName = "${dependency.group}:${dependency.name}" - if (dependency.projectUrl != null) { - td { a(href: dependency.projectUrl, dependencyName) } - } else { - td(dependencyName) - } - td(style: 'color:red', dependency.version) - td(style: 'color:green', dependency.available.release ?: dependency.available.milestone) - } - } - } - } - } - - h1 'Exceed latest dependencies' - def exceeded = result.exceeded.dependencies - if (!exceeded.isEmpty()) { - table { - thead { - tr { - td { strong 'Dependency' } - td { strong 'Current version' } - td { strong 'Latest version' } - } - } - tbody { - exceeded.each { dependency -> - tr { - def dependencyName = "${dependency.group}:${dependency.name}" - if (dependency.projectUrl != null) { - td { a(href: dependency.projectUrl, dependencyName) } - } else { - td(dependencyName) - } - td(style: 'color:red', dependency.version) - td(style: 'color:green', dependency.latest) - } - } - } - } - } - - h1 'Unresolved dependencies' - def unresolved = result.unresolved.dependencies - if (!unresolved.isEmpty()) { - table { - thead { - tr { - td { strong 'Dependency' } - td { strong 'Current version' } - } - } - tbody { - unresolved.each { dependency -> - tr { - def dependencyName = "${dependency.group}:${dependency.name}" - if (dependency.projectUrl != null) { - td { a(href: dependency.projectUrl, dependencyName) } - } else { - td(dependencyName) - } - td(style: 'color:red', dependency.version) - } - } - } - } - } - - h1('Gradle') - result.gradle.with { - - table { - thead { - tr { - td { strong 'Current version' } - if (current != running) { - td { strong 'Latest version' } - } - } - } - tbody { - if (current == running) { - tr { - td(style: 'color:green', running.version) - } - } else { - tr { - td(style: 'color:red', running.version) - td(style: 'color:green', current.version) - } - } - } - } - } - - h1 'UpToDate dependencies' - def current = result.current.dependencies - if (!current.isEmpty()) { - table { - thead { - tr { - td { strong 'Dependency' } - td { strong 'Current version' } - } - } - tbody { - current.each { dependency -> - tr { - def dependencyName = "${dependency.group}:${dependency.name}" - if (dependency.projectUrl != null) { - td { a(href: dependency.projectUrl, dependencyName) } - } else { - td(dependencyName) - } - td(style: 'color:green', dependency.version) - } - } - } - } - } - } - } - new File("${project.buildDir}/reports/dependencyUpdates").mkdirs() - def file = new File("${project.buildDir}/reports/dependencyUpdates/dependencyUpdates.html") - file.createNewFile() - file.write(writer.toString()) - - PlainTextReporter plainTextReporter = new PlainTextReporter(project, revision, gradleReleaseChannel) - plainTextReporter.write(System.out, result) - } -} diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.violation-comments-to-github-conventions.gradle b/build-conventions/src/main/groovy/ubuntucountdownwidget.violation-comments-to-github-conventions.gradle deleted file mode 100644 index 0e33a46..0000000 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.violation-comments-to-github-conventions.gradle +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi - * - * This program is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Foundation, - * either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this - * program. If not, see . - */ -import se.bjurr.violations.comments.github.plugin.gradle.ViolationCommentsToGitHubTask - -plugins { - id 'se.bjurr.violations.violation-comments-to-github-gradle-plugin' -} - -tasks.register('violationCommentsToGitHub', ViolationCommentsToGitHubTask) { - repositoryOwner = "leinardi" - repositoryName = "ubuntucountdownwidget" - pullRequestId = System.properties['GITHUB_PULLREQUESTID'] - oAuth2Token = System.properties['GITHUB_OAUTH2TOKEN'] - gitHubUrl = "https://api.github.com/" - createCommentWithAllSingleFileComments = false - createSingleFileComments = true - commentOnlyChangedContent = true - keepOldComments = false - violations = [ - [ - "KOTLINGRADLE", - ".", - ".*/build/logs/buildlog.*\\.txt\$", - "Gradle" - ], - [ - "CHECKSTYLE", - ".", - ".*/reports/detekt/.*\\.xml\$", - "Detekt" - ], - [ - "ANDROIDLINT", - ".", - ".*/reports/lint-results.*\\.xml\$", - "Android Lint" - ], - [ - "JUNIT", - ".", - ".*/build/test-results/test.*/.*\\.xml\$", - "Unit" - ], - ] -} diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.detekt-conventions.gradle b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/AndroidConfigExt.kt similarity index 56% rename from build-conventions/src/main/groovy/ubuntucountdownwidget.detekt-conventions.gradle rename to build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/AndroidConfigExt.kt index 3bf8468..48a97c7 100644 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.detekt-conventions.gradle +++ b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/AndroidConfigExt.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -14,23 +14,18 @@ * program. If not, see . */ -plugins { - id 'io.gitlab.arturbosch.detekt' -} +package com.leinardi.ubuntucountdownwidget.ext -detekt { - toolVersion = libs.versions.detekt.get() - source = files("src/main/kotlin", "src/test/kotlin", "src/androidTest/kotlin") - parallel = true -} +import org.gradle.api.JavaVersion +import org.gradle.api.plugins.ExtensionAware +import org.gradle.api.provider.Property +import org.gradle.kotlin.dsl.getByType -dependencies { - detektPlugins libs.detekt - detektPlugins libs.detekt.rules.compose - detektPlugins libs.detekt.twitter.compose.rules +interface AndroidConfigExt : ExtensionAware { + val compileSdk: Property + val javaVersion: Property + val minSdk: Property + val targetSdk: Property } -afterEvaluate { - check.dependsOn tasks.named("detektMain") - check.dependsOn tasks.named("detektTest") -} +internal inline val ConfigExt.android: AndroidConfigExt get() = extensions.getByType() diff --git a/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/AppConfigExt.kt b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/AppConfigExt.kt new file mode 100644 index 0000000..fc91cae --- /dev/null +++ b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/AppConfigExt.kt @@ -0,0 +1,27 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ext + +import org.gradle.api.plugins.ExtensionAware +import org.gradle.api.provider.Property +import org.gradle.kotlin.dsl.getByType + +interface AppConfigExt : ExtensionAware { + val applicationId: Property +} + +internal inline val ConfigExt.app: AppConfigExt get() = extensions.getByType() diff --git a/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ConfigExt.kt b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ConfigExt.kt new file mode 100644 index 0000000..c079bcd --- /dev/null +++ b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ConfigExt.kt @@ -0,0 +1,25 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ext + +import org.gradle.api.Project +import org.gradle.api.plugins.ExtensionAware +import org.gradle.kotlin.dsl.getByType + +interface ConfigExt : ExtensionAware + +internal inline val Project.config: ConfigExt get() = extensions.getByType() diff --git a/build-conventions/settings.gradle b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ExtraPropertiesExtensionExt.kt similarity index 70% rename from build-conventions/settings.gradle rename to build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ExtraPropertiesExtensionExt.kt index 2598a03..43d3a41 100644 --- a/build-conventions/settings.gradle +++ b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ExtraPropertiesExtensionExt.kt @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -14,15 +14,9 @@ * program. If not, see . */ -dependencyResolutionManagement { - repositories { - gradlePluginPortal() - google() - mavenCentral() - } - versionCatalogs { - libs { - from(files("../gradle/libs.versions.toml")) - } - } -} +package com.leinardi.ubuntucountdownwidget.ext + +import org.gradle.api.plugins.ExtraPropertiesExtension + +@Suppress("UNCHECKED_CAST") +fun ExtraPropertiesExtension.getOrNull(name: String): T? = if (has(name)) get(name) as? T else null diff --git a/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ParamsConfigExt.kt b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ParamsConfigExt.kt new file mode 100644 index 0000000..b638ea7 --- /dev/null +++ b/build-conventions/src/main/kotlin/com/leinardi/ubuntucountdownwidget/ext/ParamsConfigExt.kt @@ -0,0 +1,27 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +package com.leinardi.ubuntucountdownwidget.ext + +import org.gradle.api.plugins.ExtensionAware +import org.gradle.api.provider.Property +import org.gradle.kotlin.dsl.getByType + +interface ParamsConfigExt : ExtensionAware { + val saveBuildLogToFile: Property +} + +internal inline val ConfigExt.params: ParamsConfigExt get() = extensions.getByType() diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.android-app-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.android-app-conventions.gradle.kts new file mode 100644 index 0000000..82350b5 --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.android-app-conventions.gradle.kts @@ -0,0 +1,96 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ +import com.project.starter.easylauncher.filter.ChromeLikeFilter +import org.gradle.accessors.dm.LibrariesForLibs +import com.mikepenz.aboutlibraries.plugin.DuplicateMode +import com.mikepenz.aboutlibraries.plugin.DuplicateRule + +plugins { + id("com.android.application") + id("ubuntucountdownwidget.android-conventions") + id("kotlin-parcelize") + id("com.google.dagger.hilt.android") + id("com.mikepenz.aboutlibraries.plugin") + id("ubuntucountdownwidget.merged-manifests-conventions") + id("ubuntucountdownwidget.dependencies-conventions") + id("com.starter.easylauncher") + id("ubuntucountdownwidget.ruler-conventions") +} +val libs = the() + +android { + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get() + } + compileOptions { + isCoreLibraryDesugaringEnabled = + true // https://developer.android.com/studio/write/java8-support#library-desugaring + } + testOptions { + execution = "ANDROIDX_TEST_ORCHESTRATOR" + } + kotlinOptions { + freeCompilerArgs = freeCompilerArgs + listOf( + "-opt-in=androidx.compose.material.ExperimentalMaterialApi", + "-opt-in=androidx.compose.material3.ExperimentalMaterial3Api", + "-opt-in=androidx.compose.ui.ExperimentalComposeUiApi", + "-opt-in=androidx.compose.ui.test.ExperimentalTestApi", + ) + } +} + +easylauncher { + buildTypes { + create("debug") { + filters( + chromeLike( + gravity = ChromeLikeFilter.Gravity.TOP, + label = "DEBUG", + textSizeRatio = 0.20f, + labelPadding = 10 + ) + ) + } + } +} + +aboutLibraries { + duplicationMode = DuplicateMode.MERGE + duplicationRule = DuplicateRule.SIMPLE +} + +dependencies { + coreLibraryDesugaring(libs.desugar) + debugImplementation(libs.leakcanary) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.navigation.fragment) + implementation(libs.androidx.navigation.ui.ktx) + implementation(libs.coroutines.android) + implementation(libs.coroutines.core) + implementation(libs.hilt.android) + implementation(libs.hilt.navigation.compose) + implementation(libs.kotlin.result) + implementation(libs.kotlinx.collections.immutable) + implementation(libs.timber) + kapt(libs.hilt.compiler) + + androidTestUtil(libs.androidx.test.orchestrator) +} diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.android-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.android-conventions.gradle.kts new file mode 100644 index 0000000..6518c45 --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.android-conventions.gradle.kts @@ -0,0 +1,122 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ +import com.android.build.api.dsl.CommonExtension +import com.android.build.gradle.BaseExtension +import com.android.build.gradle.api.AndroidBasePlugin +import com.leinardi.ubuntucountdownwidget.ext.android +import com.leinardi.ubuntucountdownwidget.ext.config +import org.gradle.accessors.dm.LibrariesForLibs +import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("kotlin-android") + id("kotlin-kapt") + id("ubuntucountdownwidget.detekt-conventions") + id("ubuntucountdownwidget.config-conventions") +} + +val libs = the() + +kapt { + useBuildCache = true + correctErrorTypes = true + javacOptions { + option("-Xmaxerrs", Integer.MAX_VALUE) + } +} + +plugins.withType().configureEach { + extensions.configure { + compileSdkVersion(config.android.compileSdk.get()) + + defaultConfig { + minSdk = config.android.minSdk.get() + targetSdk = config.android.targetSdk.get() + + // The following argument makes the Android Test Orchestrator run its + // "pm clear" command after each test invocation. This command ensures + // that the app's state is completely cleared between tests. + setTestInstrumentationRunnerArguments(mutableMapOf("clearPackageData" to "true")) + } + + compileOptions { + sourceCompatibility = config.android.javaVersion.get() + targetCompatibility = config.android.javaVersion.get() + } + + testOptions { + animationsDisabled = true + unitTests { + isIncludeAndroidResources = true + isReturnDefaultValues = true + } + } + + if (this is CommonExtension<*, *, *, *, *>) { + lint { + abortOnError = true + checkAllWarnings = false + checkDependencies = true + checkReleaseBuilds = false + ignoreTestSources = true + warningsAsErrors = false + disable.add("ResourceType") + lintConfig = file("${project.rootDir}/config/lint/lint.xml") + } + + kotlinOptions { + freeCompilerArgs = freeCompilerArgs + listOf( + "-opt-in=kotlin.RequiresOptIn", + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-opt-in=kotlinx.coroutines.FlowPreview", + ) + jvmTarget = config.android.javaVersion.get().toString() + } + } + + packagingOptions { + resources { + // Use this block to exclude conflicting files that breaks your APK assemble task + excludes.add("META-INF/LICENSE.md") + excludes.add("META-INF/LICENSE-notice.md") + } + } + } +} + +fun CommonExtension<*, *, *, *, *>.kotlinOptions(block: KotlinJvmOptions.() -> Unit) { + (this as ExtensionAware).extensions.configure("kotlinOptions", block) +} + +kotlin { + sourceSets.all { + languageSettings.progressiveMode = + true // deprecations and bug fixes for unstable code take effect immediately + } +} + +tasks { + withType { + kotlinOptions { + jvmTarget = config.android.javaVersion.get().toString() + } + } + + withType { + testLogging.events("skipped", "failed") + } +} diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.app-versioning-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.app-versioning-conventions.gradle.kts new file mode 100644 index 0000000..8cf2831 --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.app-versioning-conventions.gradle.kts @@ -0,0 +1,38 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +import io.github.reactivecircus.appversioning.SemVer +import java.time.Instant +import kotlin.math.log10 +import kotlin.math.pow + +plugins { + id("io.github.reactivecircus.app-versioning") +} + +appVersioning { + overrideVersionCode { gitTag, _, _ -> + val semVer = SemVer.fromGitTag(gitTag) + val version = semVer.major * 10000 + semVer.minor * 100 + semVer.patch + val versionLength = (log10(version.toDouble()) + 1).toInt() + var epoch = Instant.now().epochSecond.toInt() + epoch -= epoch % 10.0.pow(versionLength.toDouble()).toInt() + version + epoch + } + overrideVersionName { gitTag, _, variantInfo -> + "${gitTag.rawTagName}${if (variantInfo.buildType == "debug") "-dev" else ""} (${gitTag.commitHash})" + } +} diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.buildlog-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.buildlog-conventions.gradle.kts new file mode 100644 index 0000000..ba69176 --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.buildlog-conventions.gradle.kts @@ -0,0 +1,35 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +import com.leinardi.ubuntucountdownwidget.ext.config +import com.leinardi.ubuntucountdownwidget.ext.params +import org.gradle.api.internal.GradleInternal +import org.gradle.internal.logging.LoggingOutputInternal +import java.text.SimpleDateFormat +import java.util.Date + +if (config.params.saveBuildLogToFile.get()) { + val datetime = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(Date()) + val buildLogDir = "${buildDir}/logs" + mkdir(buildLogDir) + val buildLog = File("${buildLogDir}/buildlog-${datetime}.txt") + + System.setProperty("org.gradle.color.error", "RED") + + val outputListener = StandardOutputListener { output -> buildLog.appendText(output.toString()) } + (gradle as GradleInternal).services.get(LoggingOutputInternal::class.java).addStandardOutputListener(outputListener) + (gradle as GradleInternal).services.get(LoggingOutputInternal::class.java).addStandardErrorListener(outputListener) +} diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.config-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.config-conventions.gradle.kts new file mode 100644 index 0000000..84405f3 --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.config-conventions.gradle.kts @@ -0,0 +1,38 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +import com.leinardi.ubuntucountdownwidget.ext.AndroidConfigExt +import com.leinardi.ubuntucountdownwidget.ext.AppConfigExt +import com.leinardi.ubuntucountdownwidget.ext.ConfigExt +import com.leinardi.ubuntucountdownwidget.ext.ParamsConfigExt +import com.leinardi.ubuntucountdownwidget.ext.getOrNull + +val config = extensions.create("config").apply { + extensions.create("android").apply { + compileSdk.convention(34) + javaVersion.convention(JavaVersion.VERSION_17) + minSdk.convention(26) + targetSdk.convention(34) + } + + extensions.create("app").apply { + applicationId.convention("com.leinardi.ubuntucountdownwidget") + } + + extensions.create("params").apply { + saveBuildLogToFile.convention((rootProject.extra.getOrNull("saveBuildLogToFile") as? String).toBoolean()) + } +} diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.dependencies-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.dependencies-conventions.gradle.kts new file mode 100644 index 0000000..854777a --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.dependencies-conventions.gradle.kts @@ -0,0 +1,36 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ +import com.android.build.gradle.internal.tasks.factory.dependsOn +import java.util.Locale + +afterEvaluate { + val outputPath = "$projectDir/versions/dependencies" + mkdir(outputPath) + val compileDependencyReportTask = tasks.register("generateRuntimeDependenciesReport") { + description = "Generates a text file containing the Runtime classpath dependencies." + } + project.configurations.filter { it.name.contains("RuntimeClasspath") }.forEach { configuration -> + val configurationTask = tasks.register( + "generate${configuration.name.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() }}DependenciesReport", + DependencyReportTask::class.java, + ) { + configurations = setOf(configuration) + outputFile = File("$outputPath/${configuration.name}Dependencies.txt") + } + compileDependencyReportTask.configure { dependsOn(configurationTask) } + } + tasks.named("check").dependsOn(tasks.named("generateRuntimeDependenciesReport")) +} diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.detekt-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.detekt-conventions.gradle.kts new file mode 100644 index 0000000..8a3951f --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.detekt-conventions.gradle.kts @@ -0,0 +1,50 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +import io.gitlab.arturbosch.detekt.Detekt +import io.gitlab.arturbosch.detekt.extensions.DetektExtension +import org.gradle.accessors.dm.LibrariesForLibs + +plugins { + id("io.gitlab.arturbosch.detekt") +} + +val libs = the() + +detekt { + toolVersion = libs.versions.detekt.get() + source.setFrom( + DetektExtension.DEFAULT_SRC_DIR_KOTLIN, + DetektExtension.DEFAULT_TEST_SRC_DIR_KOTLIN, + "src/androidTest/kotlin", + "src/nativeMain/kotlin", + "src/nativeTest/kotlin", + ) + parallel = true + autoCorrect = true +} + +dependencies { + detektPlugins(libs.detekt) + detektPlugins(libs.detekt.rules.compose) + detektPlugins(libs.detekt.twitter.compose.rules) +} + +tasks { + named("check") { + dependsOn(withType()) + } +} diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.merged-manifests-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.merged-manifests-conventions.gradle.kts new file mode 100644 index 0000000..b8d8f67 --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.merged-manifests-conventions.gradle.kts @@ -0,0 +1,31 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ +tasks { + register("copyMergedManifests") { + dependsOn(tasks.matching { it.name matches "^process.*Manifest$".toRegex() }) + mustRunAfter(tasks.matching { it.name matches "^process.*Manifest$".toRegex() }) + mkdir("versions/mergedManifests") + from("$buildDir/intermediates/merged_manifests") { + include("**/*.xml") + } + into("versions/mergedManifests") + filter { line -> line.replace("(android:version.*=\".*\")|(android:testOnly=\".*\")".toRegex(), "") } + } + + named("check") { + dependsOn(tasks.named("copyMergedManifests")) + } +} diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.ruler-conventions.gradle b/build-conventions/src/main/kotlin/ubuntucountdownwidget.ruler-conventions.gradle.kts similarity index 83% rename from build-conventions/src/main/groovy/ubuntucountdownwidget.ruler-conventions.gradle rename to build-conventions/src/main/kotlin/ubuntucountdownwidget.ruler-conventions.gradle.kts index 902d54d..349e267 100644 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.ruler-conventions.gradle +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.ruler-conventions.gradle.kts @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -15,14 +15,14 @@ */ plugins { - id 'com.spotify.ruler' + id("com.spotify.ruler") } ruler { - abi = "arm64-v8a" - locale = "en" - screenDensity = 480 - sdkVersion = 30 + abi.set("arm64-v8a") + locale.set("en") + screenDensity.set(480) + sdkVersion.set(30) ownershipFile.set(rootProject.file("config/ruler/ownership.yaml")) defaultOwner.set("others") } diff --git a/build-conventions/src/main/groovy/ubuntucountdownwidget.spotless-conventions.gradle b/build-conventions/src/main/kotlin/ubuntucountdownwidget.spotless-conventions.gradle.kts similarity index 65% rename from build-conventions/src/main/groovy/ubuntucountdownwidget.spotless-conventions.gradle rename to build-conventions/src/main/kotlin/ubuntucountdownwidget.spotless-conventions.gradle.kts index 288c5ec..cd480e6 100644 --- a/build-conventions/src/main/groovy/ubuntucountdownwidget.spotless-conventions.gradle +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.spotless-conventions.gradle.kts @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -13,47 +13,47 @@ * You should have received a copy of the GNU General Public License along with this * program. If not, see . */ +import com.diffplug.gradle.spotless.SpotlessTask +import com.diffplug.spotless.LineEnding +import org.gradle.accessors.dm.LibrariesForLibs plugins { - id 'com.diffplug.spotless' + id("com.diffplug.spotless") } +val libs = the() + spotless { kotlin { - target '**/*.kt' - targetExclude("$buildDir/**/*.kt") + target("**/*.kt") + targetExclude("**/build/**/*.kt") diktat(libs.versions.diktat.get()).configFile("$rootDir/config/diktat/diktat-analysis.yml") trimTrailingWhitespace() indentWithSpaces() endWithNewline() } - groovyGradle { - target '**/*.gradle' - greclipse(libs.versions.greclipse.get()).configFile("$rootDir/config/greclipse/greclipse.properties") - } - - format 'graphql', { - target '**/*.graphql' + format("graphql") { + target("**/*.graphql") prettier(libs.versions.prettier.get()).configFile("$rootDir/config/prettier/prettierrc-graphql.yml") } - format 'yml', { - target '**/*.yml', '**/*.yaml' + format("yml") { + target("**/*.yml", "**/*.yaml") prettier(libs.versions.prettier.get()).configFile("$rootDir/config/prettier/prettierrc-yml.yml") } - format 'androidXml', { - target '**/AndroidManifest.xml', 'src/**/*.xml' - targetExclude '**/mergedManifests/**/AndroidManifest.xml', "**/build/**/*.xml" + format("androidXml") { + target("**/AndroidManifest.xml", "src/**/*.xml") + targetExclude("**/mergedManifests/**/AndroidManifest.xml", "**/build/**/*.xml") indentWithSpaces() trimTrailingWhitespace() endWithNewline() } - format 'misc', { + format("misc") { // define the files to apply `misc` to - target '**/*.md', '**/.gitignore' + target("**/*.md", "**/.gitignore") // define the steps to apply to those files indentWithSpaces() @@ -62,6 +62,8 @@ spotless { } } -tasks.withType(com.diffplug.gradle.spotless.SpotlessTask) { - mustRunAfter ":app:copyMergedManifests" +tasks { + withType { + mustRunAfter(":app:copyMergedManifests") + } } diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.versions-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.versions-conventions.gradle.kts new file mode 100644 index 0000000..651b028 --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.versions-conventions.gradle.kts @@ -0,0 +1,43 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ +import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask +import java.util.Locale + +plugins { + id("com.github.ben-manes.versions") + id("nl.littlerobots.version-catalog-update") +} + +versionCatalogUpdate { + keep { + keepUnusedVersions.set(true) + keepUnusedLibraries.set(true) + keepUnusedPlugins.set(true) + } +} + +val isNonStable: (String) -> Boolean = { version -> + val stableKeyword = setOf("RELEASE", "FINAL", "GA").any { version.uppercase(Locale.ROOT).contains(it) } + val regex = "^[0-9,.v-]+(-r)?$".toRegex() + !stableKeyword && !(version matches regex) +} + +tasks.withType() { + gradleReleaseChannel = "current" + rejectVersionIf { + isNonStable(candidate.version) && !isNonStable(currentVersion) + } +} diff --git a/build-conventions/src/main/kotlin/ubuntucountdownwidget.violation-comments-to-github-conventions.gradle.kts b/build-conventions/src/main/kotlin/ubuntucountdownwidget.violation-comments-to-github-conventions.gradle.kts new file mode 100644 index 0000000..f451be2 --- /dev/null +++ b/build-conventions/src/main/kotlin/ubuntucountdownwidget.violation-comments-to-github-conventions.gradle.kts @@ -0,0 +1,67 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ +import se.bjurr.violations.comments.github.plugin.gradle.ViolationCommentsToGitHubTask + +plugins { + id("se.bjurr.violations.violation-comments-to-github-gradle-plugin") +} + +tasks.register("violationCommentsToGitHub") { + notCompatibleWithConfigurationCache("https://github.com/tomasbjerre/violation-comments-to-github-gradle-plugin/issues/13") + setRepositoryOwner("leinardi") + setRepositoryName("ubuntucountdownwidget") + setPullRequestId(System.getProperties()["GITHUB_PULLREQUESTID"] as? String) + setoAuth2Token(System.getProperties()["GITHUB_OAUTH2TOKEN"] as? String) + setGitHubUrl("https://api.github.com/") + setCreateCommentWithAllSingleFileComments(false) + setCreateSingleFileComments(true) + setCommentOnlyChangedContent(true) + setKeepOldComments(false) + setViolations( + listOf( + listOf( + "KOTLINGRADLE", + ".", + ".*/build/logs/buildlog.*\\.txt\$", + "Gradle", + ), + listOf( + "CHECKSTYLE", + ".", + ".*/reports/detekt/.*\\.xml\$", + "Detekt", + ), + listOf( + "ANDROIDLINT", + ".", + ".*/reports/lint-results.*\\.xml\$", + "Android Lint", + ), + listOf( + "JUNIT", + ".", + ".*/build/test-results/test.*/.*\\.xml\$", + "JUnit", + ), + listOf( + "JUNIT", + ".", + ".*/build/sauce/saucectl-report\\.xml\$", + "Espresso", + ), + ), + ) +} diff --git a/build.gradle b/build.gradle.kts similarity index 57% rename from build.gradle rename to build.gradle.kts index 449787d..4ad63d1 100644 --- a/build.gradle +++ b/build.gradle.kts @@ -1,6 +1,6 @@ /* * Ubuntu Countdown Widget - * Copyright (C) 2022 Roberto Leinardi + * Copyright (C) 2023 Roberto Leinardi * * This program is free software: you can redistribute it and/or modify it under the terms * of the GNU General Public License as published by the Free Software Foundation, @@ -14,38 +14,27 @@ * program. If not, see . */ -buildscript { - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - plugins { - id 'ubuntucountdownwidget.config-conventions' - id 'ubuntucountdownwidget.buildlog-conventions' - id 'ubuntucountdownwidget.spotless-conventions' - id 'ubuntucountdownwidget.versions-conventions' - id 'ubuntucountdownwidget.dependency-graph-conventions' - id 'ubuntucountdownwidget.violation-comments-to-github-conventions' + id("ubuntucountdownwidget.config-conventions") + id("ubuntucountdownwidget.buildlog-conventions") + id("ubuntucountdownwidget.spotless-conventions") + id("ubuntucountdownwidget.versions-conventions") + id("ubuntucountdownwidget.violation-comments-to-github-conventions") alias(libs.plugins.gradledoctor) } -doctor { - warnWhenJetifierEnabled = false -} - subprojects { gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + tasks.withType { + options.compilerArgs.add("-Xlint:unchecked") + options.compilerArgs.add("-Xlint:deprecation") } } } - -wrapper { +tasks.withType { + description = "Regenerates the Gradle Wrapper files" + distributionType = Wrapper.DistributionType.ALL gradleVersion = libs.versions.gradle.get() distributionType = Wrapper.DistributionType.ALL } diff --git a/config/greclipse/greclipse.properties b/config/greclipse/greclipse.properties index 2a15dab..cb121cf 100644 --- a/config/greclipse/greclipse.properties +++ b/config/greclipse/greclipse.properties @@ -1,6 +1,6 @@ # # Ubuntu Countdown Widget -# Copyright (C) 2022 Roberto Leinardi +# Copyright (C) 2023 Roberto Leinardi # # This program is free software: you can redistribute it and/or modify it under the terms # of the GNU General Public License as published by the Free Software Foundation, diff --git a/config/lint/lint.xml b/config/lint/lint.xml index 44b33c0..8e5c756 100644 --- a/config/lint/lint.xml +++ b/config/lint/lint.xml @@ -1,6 +1,6 @@ -]> - - - - - - diff --git "a/media/logo-ubuntu_no\302\256-black_orange-hex.svg" "b/media/logo-ubuntu_no\302\256-black_orange-hex.svg" deleted file mode 100644 index 7d60813..0000000 --- "a/media/logo-ubuntu_no\302\256-black_orange-hex.svg" +++ /dev/null @@ -1,54 +0,0 @@ - -]> - - - - - - - - - - - - diff --git "a/media/logo-ubuntu_no\302\256-white_orange-hex.svg" "b/media/logo-ubuntu_no\302\256-white_orange-hex.svg" deleted file mode 100644 index cf14a3d..0000000 --- "a/media/logo-ubuntu_no\302\256-white_orange-hex.svg" +++ /dev/null @@ -1,54 +0,0 @@ - -]> - - - - - - - - - - - - diff --git a/media/screenshot/device-2015-12-12-162231.png b/media/screenshot/device-2015-12-12-162231.png deleted file mode 100644 index 2023c12..0000000 Binary files a/media/screenshot/device-2015-12-12-162231.png and /dev/null differ diff --git a/media/screenshot/device-2015-12-12-162311.png b/media/screenshot/device-2015-12-12-162311.png deleted file mode 100644 index 7d20b05..0000000 Binary files a/media/screenshot/device-2015-12-12-162311.png and /dev/null differ diff --git a/media/screenshot/device-2015-12-12-162345.png b/media/screenshot/device-2015-12-12-162345.png deleted file mode 100644 index 022813d..0000000 Binary files a/media/screenshot/device-2015-12-12-162345.png and /dev/null differ diff --git a/media/screenshot/device-2015-12-12-162412.png b/media/screenshot/device-2015-12-12-162412.png deleted file mode 100644 index 786b8d6..0000000 Binary files a/media/screenshot/device-2015-12-12-162412.png and /dev/null differ diff --git a/media/screenshot/device-2015-12-12-162614.png b/media/screenshot/device-2015-12-12-162614.png deleted file mode 100644 index 53ffeb7..0000000 Binary files a/media/screenshot/device-2015-12-12-162614.png and /dev/null differ diff --git a/media/screenshot/device-2015-12-12-162656.png b/media/screenshot/device-2015-12-12-162656.png deleted file mode 100644 index 9cd205a..0000000 Binary files a/media/screenshot/device-2015-12-12-162656.png and /dev/null differ diff --git a/release/app-debug.jks b/release/app-debug.jks new file mode 100644 index 0000000..159df30 Binary files /dev/null and b/release/app-debug.jks differ diff --git a/release/app-release.gpg b/release/app-release.gpg new file mode 100644 index 0000000..e572684 Binary files /dev/null and b/release/app-release.gpg differ diff --git a/release/clean-secrets.sh b/release/clean-secrets.sh new file mode 100755 index 0000000..994d52c --- /dev/null +++ b/release/clean-secrets.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# +# Ubuntu Countdown Widget +# Copyright (C) 2023 Roberto Leinardi +# +# This program is free software: you can redistribute it and/or modify it under the terms +# of the GNU General Public License as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . +# + +# Delete Release key +rm -f release/app-release.jks + +# Delete Play Store key +rm -f release/play-account.json + diff --git a/release/decrypt-secrets.sh b/release/decrypt-secrets.sh new file mode 100755 index 0000000..3ef2ca3 --- /dev/null +++ b/release/decrypt-secrets.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# +# Ubuntu Countdown Widget +# Copyright (C) 2023 Roberto Leinardi +# +# This program is free software: you can redistribute it and/or modify it under the terms +# of the GNU General Public License as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . +# + +decrypt() { + PASSPHRASE=$1 + INPUT=$2 + OUTPUT=$3 + gpg --quiet --batch --yes --decrypt --passphrase="$PASSPHRASE" --output $OUTPUT $INPUT +} + +if [[ ! -z "$ENCRYPT_KEY" ]]; then + # Decrypt Release key + decrypt ${ENCRYPT_KEY} release/app-release.gpg release/app-release.jks + # Decrypt Play Store key + decrypt ${ENCRYPT_KEY} release/play-account.gpg release/play-account.json +else + echo "ENCRYPT_KEY is empty" +fi diff --git a/release/encrypt-secrets.sh b/release/encrypt-secrets.sh new file mode 100755 index 0000000..ee821a9 --- /dev/null +++ b/release/encrypt-secrets.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# +# Ubuntu Countdown Widget +# Copyright (C) 2023 Roberto Leinardi +# +# This program is free software: you can redistribute it and/or modify it under the terms +# of the GNU General Public License as published by the Free Software Foundation, +# either version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . +# + +encrypt() { + PASSPHRASE=$1 + INPUT=$2 + OUTPUT=$3 + gpg --batch --yes --passphrase="$PASSPHRASE" --cipher-algo AES256 --symmetric --output $OUTPUT $INPUT +} + +if [[ ! -z "$ENCRYPT_KEY" ]]; then + # Encrypt Release key + encrypt ${ENCRYPT_KEY} release/app-release.jks release/app-release.gpg + # Encrypt Play Store key + encrypt ${ENCRYPT_KEY} release/play-account.json release/play-account.gpg +else + echo "ENCRYPT_KEY is empty" +fi diff --git a/release/play-account.gpg b/release/play-account.gpg new file mode 100644 index 0000000..df89fb5 Binary files /dev/null and b/release/play-account.gpg differ diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..05ee2d7 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,42 @@ +/* + * Ubuntu Countdown Widget + * Copyright (C) 2023 Roberto Leinardi + * + * This program is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + */ + +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} + +// https://docs.gradle.org/7.0/userguide/declaring_dependencies.html#sec:type-safe-project-accessors +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +// https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:stable +enableFeaturePreview("STABLE_CONFIGURATION_CACHE") + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} +rootProject.name = "ubuntucountdownwidget" + +includeBuild("build-conventions") + +include(":app")