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:
-
- 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.
-
- En "Añadir a tu escritorio" saldrá un pop up. En esta ventana, pulsar "Widgets" .
-
- Seleccionar uno de los dos "Ubuntu Countdown Widgets" .
-
-
-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:
-
- 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.
-
- Una finestra "Aggiungi a schermata Home" dovrebbe comparire. In questa finestra, premi "Widgets" .
-
- Seleziona uno dei due "Ubuntu Countdown Widget" .
-
-
-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:
-
- 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.
-
- Uma opção "Adicionar à tela inicial" irá aparecer. Dessa opção,escolha "Widgets" .
-
- Selecione um dos dois "Ubuntu Countdown Widgets" .
-
-
-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:
-
- On your Android Home screen press the MENU key and
- select "Add" or, alternatively, tap any blank/empty
- area and hold down your finger.
-
- An "Add to Home screen" window will pop up. From that window, tap "Widgets" .
-
- Select one of the two "Ubuntu Countdown Widgets" .
-
-
-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
-
+
+
-
- - Ne rien faire
- - Ouvrir les préférences
- - Ouvrir l\'URL
-
+
+
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")