diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 71dcf05c618e138a1ba943d1c0bac586ba96dcde..24c2364f949cd2894afbcdc53f47f16ad25848e8 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -26,13 +26,13 @@ jobs: - name: Copy CI gradle.properties run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'temurin' java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 + uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 - name: Quality - Spotless run: ./gradlew spotlessCheck @@ -46,8 +46,5 @@ jobs: - name: Quality - Dependency Guard run: ./gradlew dependencyGuard - - name: Build - run: ./gradlew assembleDebug - - - name: Test - run: ./gradlew testsOnCi + - name: Build (run full build and tests) + run: ./gradlew build diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index dbba88843d3326f4af926e71a17e554fde1ca97d..1b47a94f2e6de07c7d2a0b78f81130cefc998450 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,23 +22,23 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'temurin' java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 + uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 with: cache-read-only: true - - uses: github/codeql-action/init@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 + - uses: github/codeql-action/init@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 with: languages: java - name: Autobuild - uses: github/codeql-action/autobuild@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 + uses: github/codeql-action/autobuild@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 + uses: github/codeql-action/analyze@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 diff --git a/.github/workflows/daily_builds.yml b/.github/workflows/daily_builds.yml index 413c1980e6993d84c8b0abd8b3c63814424c45e7..cb4ed21f7032ccf21ef2da6bd96432831502d709 100644 --- a/.github/workflows/daily_builds.yml +++ b/.github/workflows/daily_builds.yml @@ -14,5 +14,5 @@ jobs: uses: ./.github/workflows/shippable_builds.yml secrets: inherit permissions: - contents: write # For release bumps id-token: write # For GCS publishing (ftp.mo) + contents: read diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index cc8d74ef09506706fac7bdb246aab55ec4688ca6..e406dd6e9eddd2845dad0cc86004813cfedff630 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -1,3 +1,4 @@ +--- name: Deploy docs on: @@ -9,58 +10,77 @@ on: workflow_dispatch: -permissions: - contents: read - pages: write - id-token: write - concurrency: group: "pages" cancel-in-progress: false jobs: build-docs: + if: ${{ github.repository_owner == 'thunderbird' }} runs-on: ubuntu-latest + environment: botmobile steps: - - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: App token generate + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + if: ${{ vars.BOT_CLIENT_ID }} + id: app-token + with: + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} - - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - path: | - ~/.cargo/.crates.toml - ~/.cargo/.crates2.toml - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + token: ${{ steps.app-token.outputs.token || github.token }} + + - name: Cargo cache + uses: actions-rust-lang/setup-rust-toolchain@9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9 # v1.12.0 - name: Install mdbook and extensions run: ./docs/install.sh - - name: Setup Pages - id: pages - uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 - - name: Build docs - run: mdbook build docs --dest-dir=book/docs/latest + run: mdbook build docs --dest-dir=./../book/docs/latest - name: Test docs run: mdbook test docs - - name: Upload artifact - uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1 - with: - path: ./book/docs + - name: Clean docs + run: | + rm -rf book/docs/latest/assets/draw.io + rm book/docs/latest/.gitignore + rm book/docs/latest/install.sh - deploy-docs: - environment: - name: pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build-docs - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5 + # Restore mermaid.min.js, it has already been copied over to book/docs/latest + git restore . + + + - name: Deploy docs to gh-pages + env: + APP_SLUG: ${{ steps.app-token.outputs.app-slug || 'github-actions'}} + APP_USER_ID: ${{ vars.BOT_USER_ID || '41898282' }} + run: | + git config --global user.name "${APP_SLUG}" + git config --global user.email "${APP_USER_ID}+${APP_SLUG}[bot]@users.noreply.github.com" + + # Fetch the gh-pages branch + git fetch origin gh-pages || git checkout --orphan gh-pages + git checkout gh-pages + + # Get the short commit hash + COMMIT_HASH=$(git rev-parse --short "$GITHUB_SHA") + + # Keep necessary files and clean `docs/latest/` + mkdir -p docs/latest # Ensure the folder exists + find docs/latest -mindepth 1 -delete # Delete old files inside docs/latest + + # Copy new docs to gh-pages branch + cp -r book/docs/latest/* docs/latest/ + + # Remove + rm -rf book + + # Add, commit, and push changes + git add . + git commit -m "Deploy docs update from [${COMMIT_HASH}]" || echo "No changes to commit" + git push --force-with-lease origin gh-pages diff --git a/.github/workflows/fluidscan.yml b/.github/workflows/fluidscan.yml index 16849f28c3031101b339ed957b96a7667cd0dbf9..256660711c2c9b9990f291d95af07137d7802d77 100644 --- a/.github/workflows/fluidscan.yml +++ b/.github/workflows/fluidscan.yml @@ -27,7 +27,7 @@ jobs: bash scripts/ci/run-fluidattacks-scanner.sh - name: "Upload scan results" - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: SARIF scan results path: fluidscan-results.sarif @@ -35,6 +35,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 + uses: github/codeql-action/upload-sarif@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 with: sarif_file: fluidscan-results.sarif diff --git a/.github/workflows/gradle-cache.yml b/.github/workflows/gradle-cache.yml index 94ec730a8f003019c992a35b703598782b9cf676..1f99703ed66583061d7f691c4590cfbc7931ac15 100644 --- a/.github/workflows/gradle-cache.yml +++ b/.github/workflows/gradle-cache.yml @@ -23,12 +23,13 @@ jobs: steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'temurin' java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 + uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 - - run: ./gradlew assemble + - name: Build (run full build and tests) + run: ./gradlew build diff --git a/.github/workflows/markdown.yml b/.github/workflows/markdown.yml index f8fc334ea46d606353c2e0ff493f4be7dcb9dd4c..34596206155133f1fbdd13b478cd5f56d735b61b 100644 --- a/.github/workflows/markdown.yml +++ b/.github/workflows/markdown.yml @@ -13,18 +13,28 @@ jobs: markdown_quality: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + + - name: Cargo cache + uses: actions-rust-lang/setup-rust-toolchain@9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9 # v1.12.0 + + - name: Install mdbook and extensions + run: ./docs/install.sh - name: Copy CI gradle.properties run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'temurin' java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 + uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 - name: Quality - Spotless Markdown Check - run: ./gradlew spotlessMarkdownCheck + run: ./gradlew spotlessFlexmarkCheck + + - name: Test mdbook docs + run: mdbook test docs diff --git a/.github/workflows/needinfo-answered.yml b/.github/workflows/needinfo-answered.yml new file mode 100644 index 0000000000000000000000000000000000000000..a536f7ad69ef4078e94c462f6d72c84134ad0d95 --- /dev/null +++ b/.github/workflows/needinfo-answered.yml @@ -0,0 +1,37 @@ + +--- +name: Remove answered label + +on: + issues: + types: + - labeled + +permissions: + issues: write + +jobs: + build: + runs-on: ubuntu-latest + if: | + contains(github.event.issue.labels.*.name, 'status: needs information') && + contains(github.event.issue.labels.*.name, 'status: answered') + environment: botmobile + permissions: + issues: write + pull-requests: write + steps: + - name: App token generate + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + if: ${{ vars.BOT_CLIENT_ID }} + id: app-token + with: + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + + - name: Remove answered label if both exist + env: + ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }} + run: | + gh issue edit $ISSUE_NUMBER --repo "$GITHUB_REPOSITORY" --remove-label "status: answered" diff --git a/.github/workflows/needinfo-remove.yml b/.github/workflows/needinfo-remove.yml index a805ee3a95b84cbfeb96083a8338e8681c99d7f7..2d302b9a153fb7dd2020268b9185d880c97f49e2 100644 --- a/.github/workflows/needinfo-remove.yml +++ b/.github/workflows/needinfo-remove.yml @@ -8,6 +8,7 @@ on: permissions: contents: read + issues: write jobs: build: @@ -17,20 +18,22 @@ jobs: github.event.comment.author_association != 'OWNER' && github.event.comment.author_association != 'MEMBER' && github.event.comment.author_association != 'COLLABORATOR' + environment: botmobile permissions: issues: write pull-requests: write steps: - # https://github.com/octokit/request-action/issues/118 - - name: Remove needinfo label - run: | - curl --request DELETE \ - --url 'https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/labels/status%3A%20needs%20information' \ - --header 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' - - name: Add answered label + - name: App token generate + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + if: ${{ vars.BOT_CLIENT_ID }} + id: app-token + with: + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + + - name: Remove needinfo label and add answered label + env: + ISSUE_NUMBER: ${{ github.event.issue.number }} + GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }} run: | - curl --request POST \ - --url 'https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/labels' \ - --header 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' \ - --header 'Content-Type: application/json' \ - --data '{"labels": ["status: answered"]}' + gh issue edit $ISSUE_NUMBER --repo "$GITHUB_REPOSITORY" --remove-label "status: needs information" --add-label "status: answered" diff --git a/.github/workflows/needinfo-stale.yml b/.github/workflows/needinfo-stale.yml index 35d13e0130d30c8cd1091ed2ec5ea310c3675b14..6b6651ddd3f419e20aacae1cb19c63cafe5fce52 100644 --- a/.github/workflows/needinfo-stale.yml +++ b/.github/workflows/needinfo-stale.yml @@ -8,18 +8,28 @@ on: permissions: contents: read + issues: write jobs: build: runs-on: ubuntu-latest + environment: botmobile permissions: issues: write pull-requests: write steps: + - name: App token generate + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + if: ${{ vars.BOT_CLIENT_ID }} + id: app-token + with: + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + - name: Close old issues with the needinfo tag - uses: imhoffd/needs-reply@71e8d5144caa0d4a1e292348bfafa3866d08c855 # v2.0.0 + uses: imhoffd/needs-reply@71e8d5144caa0d4a1e292348bfafa3866d08c855 # v2.0.0 with: - repo-token: ${{ secrets.GITHUB_TOKEN }} + repo-token: ${{ steps.app-token.outputs.token || github.token }} issue-label: "status: needs information" days-before-close: 30 close-message: > diff --git a/.github/workflows/pulls-merged.yml b/.github/workflows/pulls-merged.yml new file mode 100644 index 0000000000000000000000000000000000000000..e86d42d1cf84de4934a2ad18d6a0ad7569b3e1ed --- /dev/null +++ b/.github/workflows/pulls-merged.yml @@ -0,0 +1,70 @@ +--- +name: PR Merged Actions + +# Warning, this job is running on pull_request_target and therefore has access to issue content. +# Don't add any steps that act on external code. +on: + pull_request_target: + branches: [main] + types: [closed] + +permissions: + pull-requests: write + issues: write + +jobs: + pull-request-merged: + if: github.event.pull_request.merged + runs-on: ubuntu-latest + environment: botmobile + steps: + - name: App token generate + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + if: ${{ vars.BOT_CLIENT_ID }} + id: app-token + with: + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + + - name: Get active milestone + id: milestone + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }} + run: | + # The furthest open milestone in the future should be current main + gh api repos/$GITHUB_REPOSITORY/milestones --jq ' + map(select(.state == "open" and .due_on != null)) + | sort_by(.due_on) | reverse + | .[0] | { number, title } + | to_entries + | map(.key + "=" + (.value|tostring)) | join("\n")' | tee -a $GITHUB_OUTPUT + + - name: Thank you + if: | + github.event.pull_request.author_association != 'OWNER' && + github.event.pull_request.author_association != 'MEMBER' && + github.event.pull_request.author_association != 'COLLABORATOR' && + github.event.pull_request.author_association != 'CONTRIBUTOR' + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }} + MILESTONE: ${{ steps.milestone.outputs.title }} + MESSAGE: >- + Thanks for your contribution! Your pull request has been merged and will be part of + ${{ steps.milestone.outputs.title }}. We appreciate the time and effort you put into + improving Thunderbird. If you haven’t already, you’re welcome to join our Matrix chat + for contributors. It’s where we discuss development and help each other out. + https://matrix.to/#/#tb-android-dev:mozilla.org + + Hope to see you there! 🚀📱🐦 + run: | + gh pr comment $PR_NUMBER --repo $GITHUB_REPOSITORY --body "$MESSAGE" + + - name: Set active milestone on PR + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }} + MILESTONE: ${{ steps.milestone.outputs.number }} + run: | + gh api --method PATCH /repos/$GITHUB_REPOSITORY/issues/$PR_NUMBER -f milestone=$MILESTONE diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index aac39686205c2a4af97f8848787f823b17219700..7df7561a8cd9844b85e7b9689a887018a6e63436 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -38,7 +38,7 @@ jobs: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@62b2cac7ed8198b15735ed49ab1e5cf35480ba46 # v2.4.0 + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 with: results_file: results.sarif results_format: sarif @@ -54,7 +54,7 @@ jobs: # Upload the results as artifacts. - name: "Upload artifact" - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: SARIF file path: results.sarif @@ -62,6 +62,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 + uses: github/codeql-action/upload-sarif@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 with: sarif_file: results.sarif diff --git a/.github/workflows/shippable_builds.yml b/.github/workflows/shippable_builds.yml index 2302ce6235a9ca79acb748ee828ab04d66b8e4a3..8a1f3f68f9244a110097d04d886a886157ce1533 100644 --- a/.github/workflows/shippable_builds.yml +++ b/.github/workflows/shippable_builds.yml @@ -197,8 +197,6 @@ jobs: max-parallel: 1 matrix: include: "${{ fromJSON(needs.dump_config.outputs.matrixInclude) }}" - permissions: - contents: write outputs: k9mail_sha: ${{ steps.commit.outputs.k9mail_sha }} thunderbird_sha: ${{ steps.commit.outputs.thunderbird_sha }} @@ -207,25 +205,34 @@ jobs: old_version_code: ${{ steps.new_version_code.outputs.old_version_code }} new_version_code: ${{ steps.new_version_code.outputs.new_version_code }} steps: + - name: App Token Generate + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + if: ${{ vars.BOT_CLIENT_ID }} + id: app-token + with: + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + - name: Checkout repository if: ${{ contains(matrix.releaseTarget, 'github') || needs.dump_config.outputs.releaseType == 'daily' }} uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + token: ${{ steps.app-token.outputs.token || github.token }} - name: Copy CI gradle.properties if: ${{ contains(matrix.releaseTarget, 'github') || needs.dump_config.outputs.releaseType == 'daily' }} shell: bash run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 if: ${{ contains(matrix.releaseTarget, 'github') || needs.dump_config.outputs.releaseType == 'daily' }} with: distribution: 'temurin' java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 + uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 if: ${{ contains(matrix.releaseTarget, 'github') || needs.dump_config.outputs.releaseType == 'daily' }} with: cache-disabled: "${{ contains(fromJSON('[\"beta\", \"release\"]'), needs.dump_config.outputs.releaseType) }}" @@ -246,7 +253,7 @@ jobs: RELEASE_TYPE=release fi - ./gradlew :app-${APP_NAME}:printVersionInfo -PbuildType=${RELEASE_TYPE} -PflavorName=${PACKAGE_FLAVOR} --configure-on-demand + ./gradlew :app-${APP_NAME}:printVersionInfo${PACKAGE_FLAVOR^}${RELEASE_TYPE^} -PoutputFile=${GITHUB_OUTPUT} - name: Determine new version code id: new_version_code @@ -369,9 +376,11 @@ jobs: APP_NAME: ${{ matrix.appName }} FULL_VERSION_NAME: ${{ steps.appinfo.outputs.VERSION_NAME }}${{ steps.bump_version_suffix.outputs.SUFFIX || steps.appinfo.outputs.VERSION_NAME_SUFFIX }} RELEASE_TYPE: ${{ vars.RELEASE_TYPE }} + APP_SLUG: ${{ steps.app-token.outputs.app-slug || 'github-actions'}} + APP_USER_ID: ${{ vars.BOT_USER_ID || '41898282' }} run: | - git config --global user.name "GitHub Actions Bot" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config --global user.name "${APP_SLUG}" + git config --global user.email "${APP_USER_ID}+${APP_SLUG}[bot]@users.noreply.github.com" # We need the metadata to point to the right application for the release commit set -x @@ -386,17 +395,7 @@ jobs: if [[ "$APP_NAME" = "k9mail" ]]; then git add ./app-${APP_NAME}/src/main/res/raw/changelog_master.xml elif [[ "$APP_NAME" = "thunderbird" ]]; then - case "$RELEASE_TYPE" in - "daily") - git add ./app-${APP_NAME}/src/daily/res/raw/changelog_master.xml - ;; - "beta") - git add ./app-${APP_NAME}/src/beta/res/raw/changelog_master.xml - ;; - "release") - git add ./app-${APP_NAME}/src/release/res/raw/changelog_master.xml - ;; - esac + git add ./app-${APP_NAME}/src/${RELEASE_TYPE}/res/raw/changelog_master.xml fi git add ./app-${APP_NAME}/build.gradle.kts git add metadata @@ -475,13 +474,13 @@ jobs: shell: bash run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties - - uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 with: distribution: 'temurin' java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 + uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 with: cache-disabled: "${{ contains(fromJSON('[\"beta\", \"release\"]'), needs.dump_config.outputs.releaseType) }}" add-job-summary: on-failure @@ -564,7 +563,7 @@ jobs: ls -l ${UPLOAD_PATH}/ - name: Upload unsigned - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 env: UPLOAD_PATH: "uploads" with: @@ -584,7 +583,7 @@ jobs: env: RELEASE_TYPE: ${{ needs.dump_config.outputs.releaseType }} steps: - - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: unsigned-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor }} path: uploads/ @@ -613,7 +612,7 @@ jobs: rm -f uploads/*.jks - name: Upload signed - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: signed-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor }} if-no-files-found: error @@ -705,7 +704,7 @@ jobs: ref: ${{ steps.shanotes.outputs.app_sha }} - name: Download Artifacts - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: signed-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor }} path: "uploads/" @@ -766,17 +765,17 @@ jobs: ls -l uploads/${PKG_FILE_PRETTY} - name: App Token Generate - uses: actions/create-github-app-token@0d564482f06ca65fa9e77e2510873638c82206f2 # v1.11.5 - if: ${{ contains(matrix.releaseTarget, 'github') && vars.RELEASER_APP_CLIENT_ID }} + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + if: ${{ contains(matrix.releaseTarget, 'github') && vars.BOT_CLIENT_ID }} id: app-token with: - app-id: ${{ vars.RELEASER_APP_CLIENT_ID }} - private-key: ${{ secrets.RELEASER_APP_PRIVATE_KEY }} + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} - name: Publish to GitHub Releases id: publish_gh if: ${{ contains(matrix.releaseTarget, 'github') }} - uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2.2.1 + uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2.2.2 with: token: ${{ steps.app-token.outputs.token || github.token }} target_commitish: ${{ steps.shanotes.outputs.app_sha }} @@ -914,7 +913,7 @@ jobs: - name: Auth to GCS for FTP if: ${{ !inputs.skipFtp && contains(matrix.releaseTarget, 'ftp') && matrix.packageFormat == 'apk' }} - uses: google-github-actions/auth@71f986410dfbc7added4569d411d040a91dc6935 # v2.1.8 + uses: google-github-actions/auth@ba79af03959ebeac9769e648f473a284504d9193 # v2.1.10 with: service_account: ${{ steps.prepare_ftp.outputs.SERVICE_ACCOUNT }} workload_identity_provider: ${{ steps.prepare_ftp.outputs.WORKLOAD_IDENTITY_PROVIDER }} diff --git a/.github/workflows/uplift-merges.yml b/.github/workflows/uplift-merges.yml index 986e88c20be5b23d06b55077658c548cac836e7d..df981084cf5c8696a0676eff07753913160630bc 100644 --- a/.github/workflows/uplift-merges.yml +++ b/.github/workflows/uplift-merges.yml @@ -15,24 +15,36 @@ jobs: uplift: name: Uplift runs-on: ubuntu-latest + environment: botmobile permissions: pull-requests: write - contents: write steps: + - name: App token generate + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + if: ${{ !inputs.dryRun && vars.BOT_CLIENT_ID }} + id: app-token + with: + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + - name: Checkout repository uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 + token: ${{ steps.app-token.outputs.token || github.token }} - name: Configure for push if: ${{ !inputs.dryRun }} + env: + APP_SLUG: ${{ steps.app-token.outputs.app-slug || 'github-actions'}} + APP_USER_ID: ${{ vars.BOT_USER_ID || '41898282' }} run: | - git config --global user.name "GitHub Actions Bot" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config --global user.name "${APP_SLUG}" + git config --global user.email "${APP_USER_ID}+${APP_SLUG}[bot]@users.noreply.github.com" - name: Run uplift script env: - GH_TOKEN: ${{ github.token }} + GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }} DRYRUN: ${{ !inputs.dryRun && '--no-dry-run' || '' }} BRANCH: ${{ github.ref_name }} PUSH: ${{ !inputs.dryRun && '--push' || '' }} diff --git a/.github/workflows/validate-gradle.yml b/.github/workflows/validate-gradle.yml index 1538d6bfcfa5dce4c01fb55aa1c0c4d8088dc815..536d40fb837d96a7f773ef5c7f29bebd42e9c92e 100644 --- a/.github/workflows/validate-gradle.yml +++ b/.github/workflows/validate-gradle.yml @@ -1,7 +1,6 @@ name: "Validate Gradle Wrapper" on: - push: pull_request: permissions: @@ -13,4 +12,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: gradle/actions/wrapper-validation@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 + - uses: gradle/actions/wrapper-validation@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 diff --git a/.github/workflows/validate-workflows.yml b/.github/workflows/validate-workflows.yml index c9d327d6978b4e29833315980b421f3cbd46b50e..8c6dee3be57befd3eb7dc69f9baac6136e158f1c 100644 --- a/.github/workflows/validate-workflows.yml +++ b/.github/workflows/validate-workflows.yml @@ -1,7 +1,6 @@ name: "Validate Workflows" on: - push: pull_request: workflow_dispatch: inputs: diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 7f630e90f77415bea7b1e28d8a36c98a38acee12..d1084871bb2d2d227b1894caaf575581c8b9e7cd 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -28,6 +28,7 @@ + diff --git a/.java-version b/.java-version index 03b6389f32ad57a6291e98c2bf98ce821a187f16..aabe6ec3909c9d4871f8f89ef88ca3b6795ebd29 100644 --- a/.java-version +++ b/.java-version @@ -1 +1 @@ -17.0 +21 diff --git a/README.md b/README.md index 3cf886b88c1ec140627127702d5db39be232b61f..7fbd43fd39033c6148804826f78e4f1fba41a5a2 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ By using Thunderbird for Android Beta, you have early access to current developm Check out the [Release Notes](https://github.com/thunderbird/thunderbird-android/releases) to find out what changed in each version of Thunderbird for Android. +The SHA-256 fingerprints for our signing certificates are available in [SECURITY.md](./SECURITY.md#verifying-fingerprints). + ## Need Help? Found a bug? Have an idea? Want to chat? If the app is not behaving like it should, or you are not sure if you've encountered a bug: @@ -64,28 +66,6 @@ For more information about our ADRs, please see the [ADRs README](docs/architect We encourage team members and contributors to read through our ADRs to understand the architectural decisions that have shaped this project so far. Feel free to propose new ADRs or suggest modifications to existing ones as needed. -## Security - -The code in this repository was undergoing an extensive security audit in collaboration with the Open Source Technology -Improvement Fund ([OSTIF](https://ostif.org/)) and [7ASecurity](https://7asecurity.com/) in the first half of 2023. For -more details, see -our [blog post](https://blog.thunderbird.net/2023/07/k-9-mail-collaborates-with-ostif-and-7asecurity-security-audit/). - -You can report a security vulnerability [through the respective issues form](https://github.com/thunderbird/thunderbird-android/security/advisories/new). - -These are the SHA-256 fingerprints for our signing certificates: - -- Thunderbird: `B6:52:47:79:B3:DB:BC:5A:C1:7A:5A:C2:71:DD:B2:9D:CF:BF:72:35:78:C2:38:E0:3C:3C:21:78:11:35:6D:D1` -- Thunderbird Beta: `05:6B:FA:FB:45:02:49:50:2F:D9:22:62:28:70:4C:25:29:E1:B8:22:DA:06:76:0D:47:A8:5C:95:57:74:1F:BD` -- K-9 Mail: `55:C8:A5:23:B9:73:35:F5:BF:60:DF:E8:A9:F3:E1:DD:E7:44:51:6D:93:57:E8:0A:92:5B:7B:22:E4:F5:55:24` - -You can use the following command to retrieve and [verify](https://developer.android.com/tools/apksigner#usage-verify) -the certificate before installation: - -```bash -apksigner verify -v --print-certs -``` - ## K-9 Mail In June 2022, [K-9 Mail joined the Thunderbird family](https://k9mail.app/2022/06/13/K-9-Mail-and-Thunderbird.html) @@ -106,14 +86,4 @@ If you want to use a fork of this project please ensure that you replace the OAu ## License - 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. +Thunderbird for Android is licensed under the [Apache License, Version 2.0](LICENSE). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000000000000000000000000000000000..cf7c8772229410cfac666494c784c3d00e436a50 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,29 @@ +# Thunderbird for Android Security + +## Security Audit + +The code in this repository underwent an extensive security audit in collaboration with the Open Source Technology +Improvement Fund ([OSTIF](https://ostif.org/)) and [7ASecurity](https://7asecurity.com/) in the first half of 2023. For +more details, see +our [blog post](https://blog.thunderbird.net/2023/07/k-9-mail-collaborates-with-ostif-and-7asecurity-security-audit/). + +## Verifying Fingerprints + +These are the SHA-256 fingerprints for our signing certificates: + +- Thunderbird: `B6:52:47:79:B3:DB:BC:5A:C1:7A:5A:C2:71:DD:B2:9D:CF:BF:72:35:78:C2:38:E0:3C:3C:21:78:11:35:6D:D1` +- Thunderbird Beta: `05:6B:FA:FB:45:02:49:50:2F:D9:22:62:28:70:4C:25:29:E1:B8:22:DA:06:76:0D:47:A8:5C:95:57:74:1F:BD` +- K-9 Mail: `55:C8:A5:23:B9:73:35:F5:BF:60:DF:E8:A9:F3:E1:DD:E7:44:51:6D:93:57:E8:0A:92:5B:7B:22:E4:F5:55:24` + +You can use the following command to retrieve and [verify](https://developer.android.com/tools/apksigner#usage-verify) +the certificate before installation: + +```bash +apksigner verify -v --print-certs +``` + +## Reporting Vulnerabilities + +You can report a security vulnerability through the [vulnerability reporting form](https://github.com/thunderbird/thunderbird-android/security/advisories/new). + +We appreciate your support in making Thunderbird for Android as safe as possible! diff --git a/app-common/build.gradle.kts b/app-common/build.gradle.kts index 9879ff5fafbb37dad58cdf3d23b67495422f6c37..8fa9edbaa7025fee5048d16048b184864b2e26d6 100644 --- a/app-common/build.gradle.kts +++ b/app-common/build.gradle.kts @@ -2,11 +2,31 @@ plugins { id(ThunderbirdPlugins.Library.android) } +android { + namespace = "net.thunderbird.app.common" +} + dependencies { api(projects.legacy.common) + + api(projects.legacy.ui.legacy) + + api(projects.feature.account.core) + + api(projects.feature.launcher) + + api(projects.feature.navigation.drawer.api) + + implementation(projects.legacy.core) + implementation(projects.legacy.account) + + implementation(projects.core.account) + + implementation(projects.core.featureflags) + implementation(projects.core.ui.legacy.theme2.common) + + implementation(projects.feature.account.setup) implementation(projects.feature.migration.provider) -} -android { - namespace = "app.k9mail.common" + implementation(projects.mail.protocols.imap) } diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/AppCommonModule.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/AppCommonModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..a6a5259401d07fd8077e19601e7a0ef4e8528367 --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/AppCommonModule.kt @@ -0,0 +1,11 @@ +package net.thunderbird.app.common + +import net.thunderbird.app.common.account.appCommonAccountModule +import org.koin.core.module.Module +import org.koin.dsl.module + +val appCommonModule: Module = module { + includes( + appCommonAccountModule, + ) +} diff --git a/legacy/common/src/main/java/com/fsck/k9/account/AccountColorPicker.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountColorPicker.kt similarity index 91% rename from legacy/common/src/main/java/com/fsck/k9/account/AccountColorPicker.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountColorPicker.kt index 777650879e98820de57b5949289dd8d568fe8fb6..47f9c84ff236b1c529638c213e319cf07bfef16e 100644 --- a/legacy/common/src/main/java/com/fsck/k9/account/AccountColorPicker.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountColorPicker.kt @@ -1,8 +1,8 @@ -package com.fsck.k9.account +package net.thunderbird.app.common.account import android.content.res.Resources +import app.k9mail.core.ui.legacy.theme2.common.R import app.k9mail.legacy.account.AccountManager -import com.fsck.k9.core.R class AccountColorPicker( private val accountManager: AccountManager, diff --git a/legacy/common/src/main/java/com/fsck/k9/account/AccountCreator.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountCreator.kt similarity index 92% rename from legacy/common/src/main/java/com/fsck/k9/account/AccountCreator.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountCreator.kt index 5e2adbd990eb0e1ded98713ec41e25830d21ca25..adddacde92fd1be04bcb85719ea2f951fe405902 100644 --- a/legacy/common/src/main/java/com/fsck/k9/account/AccountCreator.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountCreator.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.account +package net.thunderbird.app.common.account import android.content.Context import app.k9mail.core.common.mail.Protocols @@ -7,9 +7,11 @@ import app.k9mail.feature.account.common.domain.entity.SpecialFolderOption import app.k9mail.feature.account.common.domain.entity.SpecialFolderSettings import app.k9mail.feature.account.setup.AccountSetupExternalContract import app.k9mail.feature.account.setup.AccountSetupExternalContract.AccountCreator.AccountCreatorResult -import app.k9mail.legacy.account.Account.SpecialFolderSelection +import app.k9mail.legacy.account.LegacyAccount +import app.k9mail.legacy.account.SpecialFolderSelection import com.fsck.k9.Core import com.fsck.k9.Preferences +import com.fsck.k9.account.DeletePolicyProvider import com.fsck.k9.controller.MessagingController import com.fsck.k9.logging.Timber import com.fsck.k9.mail.ServerSettings @@ -18,13 +20,11 @@ import com.fsck.k9.mail.store.imap.ImapStoreSettings.createExtra import com.fsck.k9.mail.store.imap.ImapStoreSettings.isSendClientInfo import com.fsck.k9.mail.store.imap.ImapStoreSettings.isUseCompression import com.fsck.k9.mail.store.imap.ImapStoreSettings.pathPrefix -import com.fsck.k9.mailstore.SpecialFolderUpdater import com.fsck.k9.mailstore.SpecialLocalFoldersCreator import com.fsck.k9.preferences.UnifiedInboxConfigurator import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import app.k9mail.legacy.account.Account as K9Account // TODO Move to feature/account/setup class AccountCreator( @@ -99,9 +99,9 @@ class AccountCreator( * Set special folders by name. * * Since the folder list hasn't been synced yet, we don't have database IDs for the folders. So we use the same - * mechanism that is used when importing settings. See [SpecialFolderUpdater] for details. + * mechanism that is used when importing settings. See [com.fsck.k9.mailstore.SpecialFolderUpdater] for details. */ - private fun K9Account.setSpecialFolders(specialFolders: SpecialFolderSettings) { + private fun LegacyAccount.setSpecialFolders(specialFolders: SpecialFolderSettings) { importedArchiveFolder = specialFolders.archiveSpecialFolderOption.toFolderServerId() archiveFolderSelection = specialFolders.archiveSpecialFolderOption.toFolderSelection() @@ -141,7 +141,7 @@ class AccountCreator( } } -private fun K9Account.setIncomingServerSettings(serverSettings: ServerSettings) { +private fun LegacyAccount.setIncomingServerSettings(serverSettings: ServerSettings) { if (serverSettings.type == Protocols.IMAP) { useCompression = serverSettings.isUseCompression isSendClientInfoEnabled = serverSettings.isSendClientInfo diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/account/AppCommonAccountModule.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AppCommonAccountModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..2d0044b63e83a77e84e292ecdb0615e50b5bb87b --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AppCommonAccountModule.kt @@ -0,0 +1,55 @@ +package net.thunderbird.app.common.account + +import app.k9mail.feature.account.setup.AccountSetupExternalContract +import app.k9mail.legacy.account.AccountDefaultsProvider +import app.k9mail.legacy.account.LegacyAccountWrapperManager +import net.thunderbird.app.common.account.data.CommonAccountProfileLocalDataSource +import net.thunderbird.app.common.account.data.CommonLegacyAccountWrapperManager +import net.thunderbird.feature.account.core.AccountCoreExternalContract.AccountProfileLocalDataSource +import net.thunderbird.feature.account.core.featureAccountCoreModule +import org.koin.android.ext.koin.androidApplication +import org.koin.dsl.module + +internal val appCommonAccountModule = module { + includes( + featureAccountCoreModule, + ) + + single { + CommonLegacyAccountWrapperManager( + accountManager = get(), + ) + } + + single { + CommonAccountProfileLocalDataSource( + accountManager = get(), + ) + } + + single { + CommonAccountDefaultsProvider( + resourceProvider = get(), + featureFlagProvider = get(), + ) + } + + factory { + AccountColorPicker( + accountManager = get(), + resources = get(), + ) + } + + factory { + AccountCreator( + accountColorPicker = get(), + localFoldersCreator = get(), + preferences = get(), + context = androidApplication(), + deletePolicyProvider = get(), + messagingController = get(), + unifiedInboxConfigurator = get(), + ) + } +} diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProvider.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProvider.kt new file mode 100644 index 0000000000000000000000000000000000000000..15e79d43c9bd4db949cc090d8785910865da9638 --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProvider.kt @@ -0,0 +1,132 @@ +package net.thunderbird.app.common.account + +import app.k9mail.core.featureflag.FeatureFlagProvider +import app.k9mail.core.featureflag.toFeatureFlagKey +import app.k9mail.legacy.account.AccountDefaultsProvider +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_MAXIMUM_AUTO_DOWNLOAD_MESSAGE_SIZE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_FORMAT +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_FORMAT_AUTO +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_READ_RECEIPT +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTED_TEXT_SHOWN +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTE_PREFIX +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTE_STYLE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_REMOTE_SEARCH_NUM_RESULTS +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_REPLY_AFTER_QUOTE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_RINGTONE_URI +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_SORT_ASCENDING +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_SORT_TYPE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_STRIP_SIGNATURE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_SYNC_INTERVAL +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.NO_OPENPGP_KEY +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.UNASSIGNED_ACCOUNT_NUMBER +import app.k9mail.legacy.account.Expunge +import app.k9mail.legacy.account.FolderMode +import app.k9mail.legacy.account.Identity +import app.k9mail.legacy.account.LegacyAccount +import app.k9mail.legacy.account.ShowPictures +import app.k9mail.legacy.account.SpecialFolderSelection +import com.fsck.k9.CoreResourceProvider +import com.fsck.k9.K9 +import net.thunderbird.feature.notification.NotificationLight +import net.thunderbird.feature.notification.NotificationSettings +import net.thunderbird.feature.notification.NotificationVibration + +@Suppress("MagicNumber") +class CommonAccountDefaultsProvider( + private val resourceProvider: CoreResourceProvider, + private val featureFlagProvider: FeatureFlagProvider, +) : AccountDefaultsProvider { + + override fun applyDefaults(account: LegacyAccount) = with(account) { + applyLegacyDefaults() + } + + override fun applyOverwrites(account: LegacyAccount) = with(account) { + isNotifyNewMail = featureFlagProvider.provide( + "email_notification_default".toFeatureFlagKey(), + ).whenEnabledOrNot( + onEnabled = { true }, + onDisabledOrUnavailable = { false }, + ) + + isNotifySelfNewMail = featureFlagProvider.provide( + "email_notification_default".toFeatureFlagKey(), + ).whenEnabledOrNot( + onEnabled = { true }, + onDisabledOrUnavailable = { false }, + ) + } + + @Suppress("LongMethod") + private fun LegacyAccount.applyLegacyDefaults() { + automaticCheckIntervalMinutes = DEFAULT_SYNC_INTERVAL + idleRefreshMinutes = 24 + displayCount = K9.DEFAULT_VISIBLE_LIMIT + accountNumber = UNASSIGNED_ACCOUNT_NUMBER + isNotifyNewMail = true + folderNotifyNewMailMode = FolderMode.ALL + isNotifySync = false + isNotifySelfNewMail = true + isNotifyContactsMailOnly = false + isIgnoreChatMessages = false + messagesNotificationChannelVersion = 0 + folderDisplayMode = FolderMode.NOT_SECOND_CLASS + folderSyncMode = FolderMode.FIRST_CLASS + folderPushMode = FolderMode.NONE + sortType = DEFAULT_SORT_TYPE + setSortAscending(DEFAULT_SORT_TYPE, DEFAULT_SORT_ASCENDING) + showPictures = ShowPictures.NEVER + isSignatureBeforeQuotedText = false + expungePolicy = Expunge.EXPUNGE_IMMEDIATELY + importedAutoExpandFolder = null + legacyInboxFolder = null + maxPushFolders = 10 + isSubscribedFoldersOnly = false + maximumPolledMessageAge = -1 + maximumAutoDownloadMessageSize = DEFAULT_MAXIMUM_AUTO_DOWNLOAD_MESSAGE_SIZE + messageFormat = DEFAULT_MESSAGE_FORMAT + isMessageFormatAuto = DEFAULT_MESSAGE_FORMAT_AUTO + isMessageReadReceipt = DEFAULT_MESSAGE_READ_RECEIPT + quoteStyle = DEFAULT_QUOTE_STYLE + quotePrefix = DEFAULT_QUOTE_PREFIX + isDefaultQuotedTextShown = DEFAULT_QUOTED_TEXT_SHOWN + isReplyAfterQuote = DEFAULT_REPLY_AFTER_QUOTE + isStripSignature = DEFAULT_STRIP_SIGNATURE + isSyncRemoteDeletions = true + openPgpKey = NO_OPENPGP_KEY + isRemoteSearchFullText = false + remoteSearchNumResults = DEFAULT_REMOTE_SEARCH_NUM_RESULTS + isUploadSentMessages = true + isMarkMessageAsReadOnView = true + isMarkMessageAsReadOnDelete = true + isAlwaysShowCcBcc = false + lastSyncTime = 0L + lastFolderListRefreshTime = 0L + + setArchiveFolderId(null, SpecialFolderSelection.AUTOMATIC) + setDraftsFolderId(null, SpecialFolderSelection.AUTOMATIC) + setSentFolderId(null, SpecialFolderSelection.AUTOMATIC) + setSpamFolderId(null, SpecialFolderSelection.AUTOMATIC) + setTrashFolderId(null, SpecialFolderSelection.AUTOMATIC) + + identities = ArrayList() + + val identity = Identity( + signatureUse = false, + signature = null, + description = resourceProvider.defaultIdentityDescription(), + ) + identities.add(identity) + + updateNotificationSettings { + NotificationSettings( + isRingEnabled = true, + ringtone = DEFAULT_RINGTONE_URI, + light = NotificationLight.Disabled, + vibration = NotificationVibration.DEFAULT, + ) + } + + resetChangeMarkers() + } +} diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/CommonAccountProfileLocalDataSource.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/CommonAccountProfileLocalDataSource.kt new file mode 100644 index 0000000000000000000000000000000000000000..a73caf741ef5038c883cb9db4c5050bfc8645d99 --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/CommonAccountProfileLocalDataSource.kt @@ -0,0 +1,39 @@ +package net.thunderbird.app.common.account.data + +import app.k9mail.legacy.account.LegacyAccountWrapperManager +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.flow.map +import net.thunderbird.feature.account.api.AccountId +import net.thunderbird.feature.account.api.profile.AccountProfile +import net.thunderbird.feature.account.core.AccountCoreExternalContract.AccountProfileLocalDataSource + +class CommonAccountProfileLocalDataSource( + private val accountManager: LegacyAccountWrapperManager, +) : AccountProfileLocalDataSource { + + override fun getById(accountId: AccountId): Flow { + return accountManager.getById(accountId.value) + .map { account -> + account?.let { + AccountProfile( + accountId = AccountId.from(account.uuid), + name = account.displayName, + color = account.chipColor, + ) + } + } + } + + override suspend fun update(accountProfile: AccountProfile) { + val currentAccount = accountManager.getById(accountProfile.accountId.value) + .firstOrNull() ?: return + + val updatedAccount = currentAccount.copy( + displayName = accountProfile.name, + chipColor = accountProfile.color, + ) + + accountManager.update(updatedAccount) + } +} diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/CommonLegacyAccountWrapperManager.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/CommonLegacyAccountWrapperManager.kt new file mode 100644 index 0000000000000000000000000000000000000000..c49343282b82adb9451792fb7414a054291ad61a --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/CommonLegacyAccountWrapperManager.kt @@ -0,0 +1,31 @@ +package net.thunderbird.app.common.account.data + +import app.k9mail.legacy.account.AccountManager +import app.k9mail.legacy.account.LegacyAccountWrapper +import app.k9mail.legacy.account.LegacyAccountWrapperManager +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +class CommonLegacyAccountWrapperManager( + private val accountManager: AccountManager, +) : LegacyAccountWrapperManager { + + override fun getAll(): Flow> { + return accountManager.getAccountsFlow() + .map { list -> + list.map { account -> + LegacyAccountWrapper.from(account) + } + } + } + + override fun getById(id: String): Flow { + return accountManager.getAccountFlow(id).map { account -> + account?.let { LegacyAccountWrapper.from(it) } + } + } + + override suspend fun update(account: LegacyAccountWrapper) { + accountManager.saveAccount(LegacyAccountWrapper.to(account)) + } +} diff --git a/legacy/common/src/main/java/com/fsck/k9/feature/AccountSetupFinishedLauncher.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/AccountSetupFinishedLauncher.kt similarity index 91% rename from legacy/common/src/main/java/com/fsck/k9/feature/AccountSetupFinishedLauncher.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/feature/AccountSetupFinishedLauncher.kt index 1f717f517b146f76c4d0b1957f5ff47cd0621626..9324615fb20737135ce8f621ef9ee92fec3be3db 100644 --- a/legacy/common/src/main/java/com/fsck/k9/feature/AccountSetupFinishedLauncher.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/AccountSetupFinishedLauncher.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.feature +package net.thunderbird.app.common.feature import android.content.Context import app.k9mail.feature.launcher.FeatureLauncherExternalContract diff --git a/legacy/common/src/main/java/com/fsck/k9/feature/FeatureModule.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/FeatureModule.kt similarity index 81% rename from legacy/common/src/main/java/com/fsck/k9/feature/FeatureModule.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/feature/FeatureModule.kt index 5c8bd0de3f179fa08d654b704f979029e0621af7..c03304c44e6b67e6bf413d9d74692851b49221e3 100644 --- a/legacy/common/src/main/java/com/fsck/k9/feature/FeatureModule.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/FeatureModule.kt @@ -1,7 +1,7 @@ -package com.fsck.k9.feature +package net.thunderbird.app.common.feature import app.k9mail.feature.launcher.FeatureLauncherExternalContract -import app.k9mail.feature.navigation.drawer.NavigationDrawerExternalContract +import net.thunderbird.feature.navigation.drawer.api.NavigationDrawerExternalContract import org.koin.android.ext.koin.androidContext import org.koin.dsl.module diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigLoader.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigLoader.kt new file mode 100644 index 0000000000000000000000000000000000000000..a0a232c6c20631ceb80066a2263e96235a95b636 --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigLoader.kt @@ -0,0 +1,12 @@ +package net.thunderbird.app.common.feature + +import com.fsck.k9.preferences.DrawerConfigManager +import kotlinx.coroutines.flow.Flow +import net.thunderbird.feature.navigation.drawer.api.NavigationDrawerExternalContract + +class NavigationDrawerConfigLoader(private val drawerConfigManager: DrawerConfigManager) : + NavigationDrawerExternalContract.DrawerConfigLoader { + override fun loadDrawerConfigFlow(): Flow { + return drawerConfigManager.getConfigFlow() + } +} diff --git a/legacy/common/src/main/java/com/fsck/k9/feature/NavigationDrawerConfigWriter.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigWriter.kt similarity index 58% rename from legacy/common/src/main/java/com/fsck/k9/feature/NavigationDrawerConfigWriter.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigWriter.kt index 0ff44dd935e394e4fd750134bd25ebf28a91ae2a..d0f2c0eda54c67d65c700ac4653a2bcc002508c3 100644 --- a/legacy/common/src/main/java/com/fsck/k9/feature/NavigationDrawerConfigWriter.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigWriter.kt @@ -1,8 +1,8 @@ -package com.fsck.k9.feature +package net.thunderbird.app.common.feature -import app.k9mail.feature.navigation.drawer.NavigationDrawerExternalContract -import app.k9mail.feature.navigation.drawer.NavigationDrawerExternalContract.DrawerConfig import com.fsck.k9.preferences.DrawerConfigManager +import net.thunderbird.feature.navigation.drawer.api.NavigationDrawerExternalContract +import net.thunderbird.feature.navigation.drawer.api.NavigationDrawerExternalContract.DrawerConfig class NavigationDrawerConfigWriter( private val drawerConfigManager: DrawerConfigManager, diff --git a/app-common/src/test/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProviderTest.kt b/app-common/src/test/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProviderTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..a7b9478cad69eefc61045e522c6535e7efbb2706 --- /dev/null +++ b/app-common/src/test/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProviderTest.kt @@ -0,0 +1,189 @@ +package net.thunderbird.app.common.account + +import app.k9mail.core.featureflag.FeatureFlagResult +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_MAXIMUM_AUTO_DOWNLOAD_MESSAGE_SIZE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_FORMAT +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_FORMAT_AUTO +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_READ_RECEIPT +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTED_TEXT_SHOWN +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTE_PREFIX +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTE_STYLE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_REMOTE_SEARCH_NUM_RESULTS +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_REPLY_AFTER_QUOTE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_RINGTONE_URI +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_SORT_ASCENDING +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_SORT_TYPE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_STRIP_SIGNATURE +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.DEFAULT_SYNC_INTERVAL +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.NO_OPENPGP_KEY +import app.k9mail.legacy.account.AccountDefaultsProvider.Companion.UNASSIGNED_ACCOUNT_NUMBER +import app.k9mail.legacy.account.Expunge +import app.k9mail.legacy.account.FolderMode +import app.k9mail.legacy.account.Identity +import app.k9mail.legacy.account.LegacyAccount +import app.k9mail.legacy.account.ShowPictures +import app.k9mail.legacy.account.SpecialFolderSelection +import assertk.assertThat +import assertk.assertions.isEqualTo +import assertk.assertions.isFalse +import assertk.assertions.isNull +import assertk.assertions.isTrue +import com.fsck.k9.CoreResourceProvider +import com.fsck.k9.K9 +import net.thunderbird.feature.notification.NotificationLight +import net.thunderbird.feature.notification.NotificationSettings +import net.thunderbird.feature.notification.NotificationVibration +import org.junit.Test +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock + +class CommonAccountDefaultsProviderTest { + + @Suppress("LongMethod") + @Test + fun `applyDefaults should return default values`() { + // arrange + val resourceProvider = mock { + on { defaultIdentityDescription() } doReturn "Default Identity" + } + val account = LegacyAccount( + uuid = "test-uuid", + isSensitiveDebugLoggingEnabled = { false }, + ) + val identities = listOf( + Identity( + signatureUse = false, + signature = null, + description = resourceProvider.defaultIdentityDescription(), + ), + ) + val notificationSettings = NotificationSettings( + isRingEnabled = true, + ringtone = DEFAULT_RINGTONE_URI, + light = NotificationLight.Disabled, + vibration = NotificationVibration.DEFAULT, + ) + val testSubject = CommonAccountDefaultsProvider( + resourceProvider = resourceProvider, + featureFlagProvider = { + FeatureFlagResult.Disabled + }, + ) + + // act + testSubject.applyDefaults(account) + + // assert + assertThat(account.automaticCheckIntervalMinutes).isEqualTo(DEFAULT_SYNC_INTERVAL) + assertThat(account.idleRefreshMinutes).isEqualTo(24) + assertThat(account.displayCount).isEqualTo(K9.DEFAULT_VISIBLE_LIMIT) + assertThat(account.accountNumber).isEqualTo(UNASSIGNED_ACCOUNT_NUMBER) + assertThat(account.isNotifyNewMail).isTrue() + assertThat(account.folderNotifyNewMailMode).isEqualTo(FolderMode.ALL) + assertThat(account.isNotifySync).isFalse() + assertThat(account.isNotifySelfNewMail).isTrue() + assertThat(account.isNotifyContactsMailOnly).isFalse() + assertThat(account.isIgnoreChatMessages).isFalse() + assertThat(account.messagesNotificationChannelVersion).isEqualTo(0) + assertThat(account.folderDisplayMode).isEqualTo(FolderMode.NOT_SECOND_CLASS) + assertThat(account.folderSyncMode).isEqualTo(FolderMode.FIRST_CLASS) + assertThat(account.folderPushMode).isEqualTo(FolderMode.NONE) + assertThat(account.sortType).isEqualTo(DEFAULT_SORT_TYPE) + assertThat(account.isSortAscending(DEFAULT_SORT_TYPE)).isEqualTo(DEFAULT_SORT_ASCENDING) + assertThat(account.showPictures).isEqualTo(ShowPictures.NEVER) + assertThat(account.isSignatureBeforeQuotedText).isFalse() + assertThat(account.expungePolicy).isEqualTo(Expunge.EXPUNGE_IMMEDIATELY) + assertThat(account.importedAutoExpandFolder).isNull() + assertThat(account.legacyInboxFolder).isNull() + assertThat(account.maxPushFolders).isEqualTo(10) + assertThat(account.isSubscribedFoldersOnly).isFalse() + assertThat(account.maximumPolledMessageAge).isEqualTo(-1) + assertThat(account.maximumAutoDownloadMessageSize).isEqualTo(DEFAULT_MAXIMUM_AUTO_DOWNLOAD_MESSAGE_SIZE) + assertThat(account.messageFormat).isEqualTo(DEFAULT_MESSAGE_FORMAT) + assertThat(account.isMessageFormatAuto).isEqualTo(DEFAULT_MESSAGE_FORMAT_AUTO) + assertThat(account.isMessageReadReceipt).isEqualTo(DEFAULT_MESSAGE_READ_RECEIPT) + assertThat(account.quoteStyle).isEqualTo(DEFAULT_QUOTE_STYLE) + assertThat(account.quotePrefix).isEqualTo(DEFAULT_QUOTE_PREFIX) + assertThat(account.isDefaultQuotedTextShown).isEqualTo(DEFAULT_QUOTED_TEXT_SHOWN) + assertThat(account.isReplyAfterQuote).isEqualTo(DEFAULT_REPLY_AFTER_QUOTE) + assertThat(account.isStripSignature).isEqualTo(DEFAULT_STRIP_SIGNATURE) + assertThat(account.isSyncRemoteDeletions).isTrue() + assertThat(account.openPgpKey).isEqualTo(NO_OPENPGP_KEY) + assertThat(account.isRemoteSearchFullText).isFalse() + assertThat(account.remoteSearchNumResults).isEqualTo(DEFAULT_REMOTE_SEARCH_NUM_RESULTS) + assertThat(account.isUploadSentMessages).isTrue() + assertThat(account.isMarkMessageAsReadOnView).isTrue() + assertThat(account.isMarkMessageAsReadOnDelete).isTrue() + assertThat(account.isAlwaysShowCcBcc).isFalse() + assertThat(account.lastSyncTime).isEqualTo(0L) + assertThat(account.lastFolderListRefreshTime).isEqualTo(0L) + + assertThat(account.archiveFolderId).isNull() + assertThat(account.archiveFolderSelection).isEqualTo(SpecialFolderSelection.AUTOMATIC) + assertThat(account.draftsFolderId).isNull() + assertThat(account.draftsFolderSelection).isEqualTo(SpecialFolderSelection.AUTOMATIC) + assertThat(account.sentFolderId).isNull() + assertThat(account.sentFolderSelection).isEqualTo(SpecialFolderSelection.AUTOMATIC) + assertThat(account.spamFolderId).isNull() + assertThat(account.spamFolderSelection).isEqualTo(SpecialFolderSelection.AUTOMATIC) + assertThat(account.trashFolderId).isNull() + assertThat(account.trashFolderSelection).isEqualTo(SpecialFolderSelection.AUTOMATIC) + assertThat(account.archiveFolderId).isNull() + assertThat(account.archiveFolderSelection).isEqualTo(SpecialFolderSelection.AUTOMATIC) + + assertThat(account.identities).isEqualTo(identities) + assertThat(account.notificationSettings).isEqualTo(notificationSettings) + + assertThat(account.isChangedVisibleLimits).isFalse() + } + + @Test + fun `applyOverwrites should return patched account when disabled`() { + // arrange + val resourceProvider = mock { + on { defaultIdentityDescription() } doReturn "Default Identity" + } + val account = LegacyAccount( + uuid = "test-uuid", + isSensitiveDebugLoggingEnabled = { false }, + ) + val testSubject = CommonAccountDefaultsProvider( + resourceProvider = resourceProvider, + featureFlagProvider = { + FeatureFlagResult.Disabled + }, + ) + + // act + testSubject.applyOverwrites(account) + + // assert + assertThat(account.isNotifyNewMail).isFalse() + assertThat(account.isNotifySelfNewMail).isFalse() + } + + @Test + fun `applyOverwrites should return patched account when enabled`() { + // arrange + val resourceProvider = mock { + on { defaultIdentityDescription() } doReturn "Default Identity" + } + val account = LegacyAccount( + uuid = "test-uuid", + isSensitiveDebugLoggingEnabled = { false }, + ) + val testSubject = CommonAccountDefaultsProvider( + resourceProvider = resourceProvider, + featureFlagProvider = { + FeatureFlagResult.Enabled + }, + ) + + // act + testSubject.applyOverwrites(account) + + // assert + assertThat(account.isNotifyNewMail).isTrue() + assertThat(account.isNotifySelfNewMail).isTrue() + } +} diff --git a/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/FakeLegacyAccountWrapperManager.kt b/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/FakeLegacyAccountWrapperManager.kt new file mode 100644 index 0000000000000000000000000000000000000000..0aea0502b43ec87b333019ad6771008f83d92d47 --- /dev/null +++ b/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/FakeLegacyAccountWrapperManager.kt @@ -0,0 +1,35 @@ +package net.thunderbird.app.common.account.data + +import app.k9mail.legacy.account.LegacyAccountWrapper +import app.k9mail.legacy.account.LegacyAccountWrapperManager +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.update + +internal class FakeLegacyAccountWrapperManager( + initialAccounts: List = emptyList(), +) : LegacyAccountWrapperManager { + + private val accountsState = MutableStateFlow>( + initialAccounts, + ) + private val accounts: StateFlow> = accountsState + + override fun getAll(): Flow> = accounts + + override fun getById(id: String): Flow = accounts + .map { list -> + list.find { it.uuid == id } + } + + override suspend fun update(account: LegacyAccountWrapper) { + accountsState.update { currentList -> + currentList.toMutableList().apply { + removeIf { it.uuid == account.uuid } + add(account) + } + } + } +} diff --git a/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/LegacyAccountProfileLocalDataSourceTest.kt b/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/LegacyAccountProfileLocalDataSourceTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..53acd663797402b7d6048b735fc511a73ecc90df --- /dev/null +++ b/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/LegacyAccountProfileLocalDataSourceTest.kt @@ -0,0 +1,147 @@ +package net.thunderbird.app.common.account.data + +import app.cash.turbine.test +import app.k9mail.legacy.account.Identity +import app.k9mail.legacy.account.LegacyAccountWrapper +import assertk.assertThat +import assertk.assertions.isEqualTo +import com.fsck.k9.mail.AuthType +import com.fsck.k9.mail.ConnectionSecurity +import com.fsck.k9.mail.ServerSettings +import kotlinx.coroutines.test.runTest +import net.thunderbird.feature.account.api.AccountId +import net.thunderbird.feature.account.api.profile.AccountProfile +import org.junit.Test +import app.k9mail.legacy.account.LegacyAccount as LegacyAccount + +class LegacyAccountProfileLocalDataSourceTest { + + @Test + fun `getById should return account profile`() = runTest { + // arrange + val accountId = AccountId.create() + val legacyAccount = createLegacyAccount(accountId.value) + val accountProfile = createAccountProfile(accountId) + + val testSubject = CommonAccountProfileLocalDataSource( + accountManager = FakeLegacyAccountWrapperManager( + initialAccounts = listOf( + legacyAccount, + ), + ), + ) + + // act & assert + testSubject.getById(accountId).test { + assertThat(awaitItem()).isEqualTo(accountProfile) + } + } + + @Test + fun `getById should return null when account is not found`() = runTest { + // arrange + val accountId = AccountId.create() + + val testSubject = CommonAccountProfileLocalDataSource( + accountManager = FakeLegacyAccountWrapperManager(), + ) + + // act & assert + testSubject.getById(accountId).test { + assertThat(awaitItem()).isEqualTo(null) + } + } + + @Test + fun `update should save account profile`() = runTest { + // arrange + val accountId = AccountId.create() + val legacyAccount = createLegacyAccount(accountId.value) + val accountProfile = createAccountProfile(accountId) + + val updatedName = "updatedName" + val updatedAccountProfile = accountProfile.copy(name = updatedName) + + val accountManager = FakeLegacyAccountWrapperManager( + initialAccounts = listOf( + legacyAccount, + ), + ) + + val testSubject = CommonAccountProfileLocalDataSource( + accountManager = accountManager, + ) + + // act & assert + testSubject.getById(accountId).test { + assertThat(awaitItem()).isEqualTo(accountProfile) + + testSubject.update(updatedAccountProfile) + + assertThat(awaitItem()).isEqualTo(updatedAccountProfile) + } + } + + private companion object { + const val NAME = "name" + const val COLOR = 0xFF333333.toInt() + + fun createLegacyAccount( + accountId: String, + displayName: String = NAME, + color: Int = COLOR, + ): LegacyAccountWrapper { + return LegacyAccountWrapper.from( + LegacyAccount( + uuid = accountId, + isSensitiveDebugLoggingEnabled = { true }, + ).apply { + identities = ArrayList() + + val identity = Identity( + signatureUse = false, + description = "Demo User", + ) + identities.add(identity) + + name = displayName + chipColor = color + email = "demo@example.com" + + incomingServerSettings = ServerSettings( + type = "imap", + host = "imap.example.com", + port = 993, + connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED, + authenticationType = AuthType.PLAIN, + username = "test", + password = "password", + clientCertificateAlias = null, + ) + outgoingServerSettings = ServerSettings( + type = "smtp", + host = "smtp.example.com", + port = 465, + connectionSecurity = ConnectionSecurity.SSL_TLS_REQUIRED, + authenticationType = AuthType.PLAIN, + username = "test", + password = "password", + clientCertificateAlias = null, + ) + }, + ) + } + + fun createAccountProfile( + accountId: AccountId, + name: String = NAME, + color: Int = COLOR, + ): AccountProfile { + return AccountProfile( + accountId = accountId, + name = name, + color = color, + ) + } + } +} diff --git a/app-k9mail/badging/fossRelease-badging.txt b/app-k9mail/badging/fossRelease-badging.txt index 036053d250e25541a2e0f21a584bdb33b0a225c3..a2f2128f7b71a4631834d1e1494d6cb1b4c113ac 100644 --- a/app-k9mail/badging/fossRelease-badging.txt +++ b/app-k9mail/badging/fossRelease-badging.txt @@ -14,6 +14,7 @@ uses-permission: name='android.permission.FOREGROUND_SERVICE' uses-permission: name='android.permission.FOREGROUND_SERVICE_DATA_SYNC' maxSdkVersion='33' uses-permission: name='android.permission.FOREGROUND_SERVICE_SPECIAL_USE' uses-permission: name='android.permission.SCHEDULE_EXACT_ALARM' +uses-permission: name='android.permission.CAMERA' uses-permission: name='android.permission.USE_BIOMETRIC' uses-permission: name='android.permission.USE_FINGERPRINT' uses-permission: name='com.fsck.k9.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' @@ -36,7 +37,7 @@ application-label-et:'K-9 Mail' application-label-eu:'K-9 Mail' application-label-fa:'نامهٔ کی۹' application-label-fi:'K-9 Mail' -application-label-fr:'Courriel K-9 Mail' +application-label-fr:'Courriel K-9' application-label-fy:'K-9 Mail' application-label-ga:'K-9 Post' application-label-gl:'K-9 Mail' @@ -54,7 +55,7 @@ application-label-nb:'K-9 e-post' application-label-nl:'K-9 Mail' application-label-nn:'K-9 e-post' application-label-pl:'K-9 Mail' -application-label-pt:'K-9 Mail' +application-label-pt:'Email K-9' application-label-pt-BR:'K-9 Mail' application-label-pt-PT:'K-9 Mail' application-label-ro:'K-9 Mail' @@ -62,7 +63,7 @@ application-label-ru:'Почта K-9' application-label-sk:'K-9 Mail' application-label-sl:'Pošta K-9' application-label-sq:'K-9 Mail' -application-label-sr:'К-9 Пошта' +application-label-sr:'K-9 Mail' application-label-sv:'K-9 Mail' application-label-tr:'K-9 Posta' application-label-uk:'K-9 Mail' @@ -84,6 +85,7 @@ property: name='android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE' value='This servic uses-library-not-required:'androidx.window.extensions' uses-library-not-required:'androidx.window.sidecar' feature-group: label='' + uses-feature-not-required: name='android.hardware.camera' uses-feature-not-required: name='android.hardware.touchscreen' provides-component:'app-widget' main diff --git a/app-k9mail/badging/fullRelease-badging.txt b/app-k9mail/badging/fullRelease-badging.txt index 078ff87d9d8bc9e03baf4b54f1f8fd28d751cf57..8d12d4f38de0b6f8ff47a5b8037bdf7b7a4476fc 100644 --- a/app-k9mail/badging/fullRelease-badging.txt +++ b/app-k9mail/badging/fullRelease-badging.txt @@ -14,6 +14,7 @@ uses-permission: name='android.permission.FOREGROUND_SERVICE' uses-permission: name='android.permission.FOREGROUND_SERVICE_DATA_SYNC' maxSdkVersion='33' uses-permission: name='android.permission.FOREGROUND_SERVICE_SPECIAL_USE' uses-permission: name='android.permission.SCHEDULE_EXACT_ALARM' +uses-permission: name='android.permission.CAMERA' uses-permission: name='android.permission.USE_BIOMETRIC' uses-permission: name='android.permission.USE_FINGERPRINT' uses-permission: name='com.android.vending.BILLING' @@ -37,7 +38,7 @@ application-label-et:'K-9 Mail' application-label-eu:'K-9 Mail' application-label-fa:'نامهٔ کی۹' application-label-fi:'K-9 Mail' -application-label-fr:'Courriel K-9 Mail' +application-label-fr:'Courriel K-9' application-label-fy:'K-9 Mail' application-label-ga:'K-9 Post' application-label-gl:'K-9 Mail' @@ -55,7 +56,7 @@ application-label-nb:'K-9 e-post' application-label-nl:'K-9 Mail' application-label-nn:'K-9 e-post' application-label-pl:'K-9 Mail' -application-label-pt:'K-9 Mail' +application-label-pt:'Email K-9' application-label-pt-BR:'K-9 Mail' application-label-pt-PT:'K-9 Mail' application-label-ro:'K-9 Mail' @@ -63,7 +64,7 @@ application-label-ru:'Почта K-9' application-label-sk:'K-9 Mail' application-label-sl:'Pošta K-9' application-label-sq:'K-9 Mail' -application-label-sr:'К-9 Пошта' +application-label-sr:'K-9 Mail' application-label-sv:'K-9 Mail' application-label-tr:'K-9 Posta' application-label-uk:'K-9 Mail' @@ -85,6 +86,7 @@ property: name='android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE' value='This servic uses-library-not-required:'androidx.window.extensions' uses-library-not-required:'androidx.window.sidecar' feature-group: label='' + uses-feature-not-required: name='android.hardware.camera' uses-feature-not-required: name='android.hardware.touchscreen' provides-component:'app-widget' main diff --git a/app-k9mail/build.gradle.kts b/app-k9mail/build.gradle.kts index 84b360adc8865e993f033953485eeee51c815b73..05443d06e99018a738f254b536c221d3e0cdc753 100644 --- a/app-k9mail/build.gradle.kts +++ b/app-k9mail/build.gradle.kts @@ -1,10 +1,7 @@ -import javax.xml.parsers.DocumentBuilderFactory -import javax.xml.xpath.XPathConstants -import javax.xml.xpath.XPathFactory - plugins { id(ThunderbirdPlugins.App.androidCompose) alias(libs.plugins.dependency.guard) + id("thunderbird.app.version.info") id("thunderbird.quality.badging") } @@ -21,7 +18,7 @@ android { testApplicationId = "com.fsck.k9.tests" versionCode = 39021 - versionName = "10.0" + versionName = "11.0" versionNameSuffix = "b1" // Keep in sync with the resource string array "supported_languages" @@ -147,12 +144,15 @@ dependencies { implementation(projects.core.featureflags) + implementation(projects.feature.account.settings.impl) + "fossImplementation"(projects.feature.funding.noop) "fullImplementation"(projects.feature.funding.googleplay) implementation(projects.feature.migration.launcher.noop) implementation(projects.feature.onboarding.migration.noop) implementation(projects.feature.telemetry.noop) implementation(projects.feature.widget.messageList) + implementation(projects.feature.widget.messageListGlance) implementation(projects.feature.widget.shortcut) implementation(projects.feature.widget.unread) @@ -163,54 +163,9 @@ dependencies { debugImplementation(projects.feature.autodiscovery.demo) testImplementation(libs.robolectric) - - // Required for DependencyInjectionTest to be able to resolve OpenPgpApiManager - testImplementation(projects.plugins.openpgpApiLib.openpgpApi) - testImplementation(projects.feature.account.setup) } dependencyGuard { configuration("fossReleaseRuntimeClasspath") configuration("fullReleaseRuntimeClasspath") } - -tasks.register("printVersionInfo") { - val targetBuildType = project.findProperty("buildType") ?: "debug" - - doLast { - android.applicationVariants.all { variant -> - if (variant.buildType.name == targetBuildType) { - val flavor = variant.mergedFlavor - - var buildTypeSource = android.sourceSets.getByName(targetBuildType).res.srcDirs.first() - var stringsXmlFile = File(buildTypeSource, "values/strings.xml") - if (!stringsXmlFile.exists()) { - buildTypeSource = android.sourceSets.getByName("main").res.srcDirs.first() - stringsXmlFile = File(buildTypeSource, "values/strings.xml") - } - - val xmlDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stringsXmlFile) - val xPath = XPathFactory.newInstance().newXPath() - val expression = "/resources/string[@name='app_name']/text()" - val appName = xPath.evaluate(expression, xmlDocument, XPathConstants.STRING) as String - - val output = """ - APPLICATION_ID=${variant.applicationId} - APPLICATION_LABEL=$appName - VERSION_CODE=${flavor.versionCode} - VERSION_NAME=${flavor.versionName} - VERSION_NAME_SUFFIX=${flavor.versionNameSuffix ?: ""} - FULL_VERSION_NAME=${flavor.versionName}${flavor.versionNameSuffix ?: ""} - """.trimIndent() - - println(output) - val githubOutput = System.getenv("GITHUB_OUTPUT") - if (githubOutput != null) { - val outputFile = File(githubOutput) - outputFile.writeText(output + "\n") - } - } - true - } - } -} diff --git a/app-k9mail/dependencies/fossReleaseRuntimeClasspath.txt b/app-k9mail/dependencies/fossReleaseRuntimeClasspath.txt index 9b56e58c0bd5feac84d70ea8ddd7301acf262804..c6daa4daf60c75b2f5e49917ed1f4bf63d1e5a0d 100644 --- a/app-k9mail/dependencies/fossReleaseRuntimeClasspath.txt +++ b/app-k9mail/dependencies/fossReleaseRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 androidx.annotation:annotation-experimental:1.4.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 @@ -15,61 +15,78 @@ androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 -androidx.compose.animation:animation-android:1.7.5 -androidx.compose.animation:animation-core-android:1.7.5 -androidx.compose.animation:animation-core:1.7.5 -androidx.compose.animation:animation:1.7.5 -androidx.compose.foundation:foundation-android:1.7.5 -androidx.compose.foundation:foundation-layout-android:1.7.5 -androidx.compose.foundation:foundation-layout:1.7.5 -androidx.compose.foundation:foundation:1.7.5 +androidx.compose.animation:animation-android:1.7.8 +androidx.compose.animation:animation-core-android:1.7.8 +androidx.compose.animation:animation-core:1.7.8 +androidx.compose.animation:animation:1.7.8 +androidx.compose.foundation:foundation-android:1.7.8 +androidx.compose.foundation:foundation-layout-android:1.7.8 +androidx.compose.foundation:foundation-layout:1.7.8 +androidx.compose.foundation:foundation:1.7.8 +androidx.compose.material3.adaptive:adaptive-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation:1.0.0 +androidx.compose.material3.adaptive:adaptive:1.0.0 androidx.compose.material3:material3-android:1.3.1 androidx.compose.material3:material3:1.3.1 -androidx.compose.material:material-icons-core-android:1.7.5 -androidx.compose.material:material-icons-core:1.7.5 -androidx.compose.material:material-icons-extended-android:1.7.5 -androidx.compose.material:material-icons-extended:1.7.5 -androidx.compose.material:material-ripple-android:1.7.5 -androidx.compose.material:material-ripple:1.7.5 -androidx.compose.runtime:runtime-android:1.7.5 -androidx.compose.runtime:runtime-saveable-android:1.7.5 -androidx.compose.runtime:runtime-saveable:1.7.5 -androidx.compose.runtime:runtime:1.7.5 -androidx.compose.ui:ui-android:1.7.5 -androidx.compose.ui:ui-geometry-android:1.7.5 -androidx.compose.ui:ui-geometry:1.7.5 -androidx.compose.ui:ui-graphics-android:1.7.5 -androidx.compose.ui:ui-graphics:1.7.5 -androidx.compose.ui:ui-text-android:1.7.5 -androidx.compose.ui:ui-text:1.7.5 -androidx.compose.ui:ui-tooling-preview-android:1.7.5 -androidx.compose.ui:ui-tooling-preview:1.7.5 -androidx.compose.ui:ui-unit-android:1.7.5 -androidx.compose.ui:ui-unit:1.7.5 -androidx.compose.ui:ui-util-android:1.7.5 -androidx.compose.ui:ui-util:1.7.5 -androidx.compose.ui:ui:1.7.5 -androidx.compose:compose-bom:2024.11.00 +androidx.compose.material:material-icons-core-android:1.7.8 +androidx.compose.material:material-icons-core:1.7.8 +androidx.compose.material:material-icons-extended-android:1.7.8 +androidx.compose.material:material-icons-extended:1.7.8 +androidx.compose.material:material-ripple-android:1.7.8 +androidx.compose.material:material-ripple:1.7.8 +androidx.compose.runtime:runtime-android:1.7.8 +androidx.compose.runtime:runtime-saveable-android:1.7.8 +androidx.compose.runtime:runtime-saveable:1.7.8 +androidx.compose.runtime:runtime:1.7.8 +androidx.compose.ui:ui-android:1.7.8 +androidx.compose.ui:ui-geometry-android:1.7.8 +androidx.compose.ui:ui-geometry:1.7.8 +androidx.compose.ui:ui-graphics-android:1.7.8 +androidx.compose.ui:ui-graphics:1.7.8 +androidx.compose.ui:ui-text-android:1.7.8 +androidx.compose.ui:ui-text:1.7.8 +androidx.compose.ui:ui-tooling-preview-android:1.7.8 +androidx.compose.ui:ui-tooling-preview:1.7.8 +androidx.compose.ui:ui-unit-android:1.7.8 +androidx.compose.ui:ui-unit:1.7.8 +androidx.compose.ui:ui-util-android:1.7.8 +androidx.compose.ui:ui-util:1.7.8 +androidx.compose.ui:ui:1.7.8 +androidx.compose:compose-bom:2025.02.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.constraintlayout:constraintlayout-core:1.1.0 -androidx.constraintlayout:constraintlayout:2.2.0 -androidx.coordinatorlayout:coordinatorlayout:1.2.0 +androidx.constraintlayout:constraintlayout-core:1.1.1 +androidx.constraintlayout:constraintlayout:2.2.1 +androidx.coordinatorlayout:coordinatorlayout:1.3.0 androidx.core:core-ktx:1.15.0 +androidx.core:core-remoteviews:1.1.0 androidx.core:core-splashscreen:1.0.1 +androidx.core:core-viewtree:1.0.0 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 androidx.emoji2:emoji2:1.3.0 androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.5 -androidx.fragment:fragment-ktx:1.8.5 -androidx.fragment:fragment:1.8.5 +androidx.fragment:fragment-compose:1.8.6 +androidx.fragment:fragment-ktx:1.8.6 +androidx.fragment:fragment:1.8.6 +androidx.glance:glance-appwidget-external-protobuf:1.1.1 +androidx.glance:glance-appwidget-proto:1.1.1 +androidx.glance:glance-appwidget:1.1.1 +androidx.glance:glance-material3:1.1.1 +androidx.glance:glance:1.1.1 androidx.graphics:graphics-path:1.0.1 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 @@ -96,17 +113,17 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.4 -androidx.navigation:navigation-common:2.8.4 -androidx.navigation:navigation-compose:2.8.4 -androidx.navigation:navigation-fragment:2.8.4 -androidx.navigation:navigation-runtime-ktx:2.8.4 -androidx.navigation:navigation-runtime:2.8.4 -androidx.navigation:navigation-ui:2.8.4 +androidx.navigation:navigation-common-ktx:2.8.8 +androidx.navigation:navigation-common:2.8.8 +androidx.navigation:navigation-compose:2.8.8 +androidx.navigation:navigation-fragment:2.8.8 +androidx.navigation:navigation-runtime-ktx:2.8.8 +androidx.navigation:navigation-runtime:2.8.8 +androidx.navigation:navigation-ui:2.8.8 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 -androidx.recyclerview:recyclerview:1.3.2 +androidx.recyclerview:recyclerview:1.4.0 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 @@ -126,7 +143,12 @@ androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 -androidx.window:window:1.0.0 +androidx.webkit:webkit:1.13.0 +androidx.window.extensions.core:core:1.0.0 +androidx.window:window-core-android:1.3.0 +androidx.window:window-core:1.3.0 +androidx.window:window:1.3.0 +androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -140,10 +162,10 @@ com.github.bumptech.glide:annotations:4.16.0 com.github.bumptech.glide:disklrucache:4.16.0 com.github.bumptech.glide:gifdecoder:4.16.0 com.github.bumptech.glide:glide:4.16.0 -com.github.skydoves:landscapist-android:2.4.4 -com.github.skydoves:landscapist-coil3-android:2.4.4 -com.github.skydoves:landscapist-coil3:2.4.4 -com.github.skydoves:landscapist:2.4.4 +com.github.skydoves:landscapist-android:2.4.7 +com.github.skydoves:landscapist-coil3-android:2.4.7 +com.github.skydoves:landscapist-coil3:2.4.7 +com.github.skydoves:landscapist:2.4.7 com.google.android.flexbox:flexbox:3.0.0 com.google.android.material:material:1.12.0 com.google.errorprone:error_prone_annotations:2.15.0 @@ -155,27 +177,27 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0 com.mikepenz:fastadapter-extensions-swipe:5.7.0 com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 -com.squareup.moshi:moshi:1.15.1 +com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.9.1 -com.squareup.okio:okio:3.9.1 +com.squareup.okio:okio-jvm:3.10.2 +com.squareup.okio:okio:3.10.2 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 com.takisoft.preferencex:preferencex-datetimepicker:1.1.0 com.takisoft.preferencex:preferencex:1.1.0 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.18.0 de.cketti.library.changelog:ckchangelog-core:2.0.0-beta02 de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0 de.hdodenhof:circleimageview:3.1.0 -io.coil-kt.coil3:coil-android:3.0.4 -io.coil-kt.coil3:coil-core-android:3.0.4 -io.coil-kt.coil3:coil-core:3.0.4 -io.coil-kt.coil3:coil-network-core-android:3.0.4 -io.coil-kt.coil3:coil-network-core:3.0.4 -io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4 -io.coil-kt.coil3:coil-network-okhttp:3.0.4 -io.coil-kt.coil3:coil:3.0.4 +io.coil-kt.coil3:coil-android:3.1.0 +io.coil-kt.coil3:coil-core-android:3.1.0 +io.coil-kt.coil3:coil-core:3.1.0 +io.coil-kt.coil3:coil-network-core-android:3.1.0 +io.coil-kt.coil3:coil-network-core:3.1.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0 +io.coil-kt.coil3:coil-network-okhttp:3.1.0 +io.coil-kt.coil3:coil:3.1.0 io.insert-koin:koin-android:3.5.6 io.insert-koin:koin-androidx-compose:3.5.6 io.insert-koin:koin-bom:3.5.6 @@ -187,55 +209,56 @@ net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 org.apache.commons:commons-text:1.3 -org.apache.httpcomponents.client5:httpclient5:5.4.1 -org.apache.httpcomponents.core5:httpcore5-h2:5.3.1 -org.apache.httpcomponents.core5:httpcore5:5.3.1 -org.apache.james:apache-mime4j-core:0.8.9 -org.apache.james:apache-mime4j-dom:0.8.9 +org.apache.httpcomponents.client5:httpclient5:5.4.2 +org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 +org.apache.httpcomponents.core5:httpcore5:5.3.3 +org.apache.james:apache-mime4j-core:0.8.12 +org.apache.james:apache-mime4j-dom:0.8.12 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4 -org.jetbrains.compose.animation:animation-core:1.7.1 -org.jetbrains.compose.animation:animation:1.7.1 -org.jetbrains.compose.annotation-internal:annotation:1.7.1 -org.jetbrains.compose.collection-internal:collection:1.7.1 -org.jetbrains.compose.components:components-resources-android:1.7.1 -org.jetbrains.compose.components:components-resources:1.7.1 -org.jetbrains.compose.foundation:foundation-layout:1.7.1 -org.jetbrains.compose.foundation:foundation:1.7.1 -org.jetbrains.compose.runtime:runtime-saveable:1.7.1 -org.jetbrains.compose.runtime:runtime:1.7.1 -org.jetbrains.compose.ui:ui-geometry:1.7.1 -org.jetbrains.compose.ui:ui-graphics:1.7.1 -org.jetbrains.compose.ui:ui-text:1.7.1 -org.jetbrains.compose.ui:ui-unit:1.7.1 -org.jetbrains.compose.ui:ui-util:1.7.1 -org.jetbrains.compose.ui:ui:1.7.1 -org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-bom:2.1.0 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib:2.1.0 +org.jetbrains.compose.animation:animation-core:1.7.3 +org.jetbrains.compose.animation:animation:1.7.3 +org.jetbrains.compose.annotation-internal:annotation:1.7.3 +org.jetbrains.compose.collection-internal:collection:1.7.3 +org.jetbrains.compose.components:components-resources-android:1.7.3 +org.jetbrains.compose.components:components-resources:1.7.3 +org.jetbrains.compose.foundation:foundation-layout:1.7.3 +org.jetbrains.compose.foundation:foundation:1.7.3 +org.jetbrains.compose.runtime:runtime-saveable:1.7.3 +org.jetbrains.compose.runtime:runtime:1.7.3 +org.jetbrains.compose.ui:ui-geometry:1.7.3 +org.jetbrains.compose.ui:ui-graphics:1.7.3 +org.jetbrains.compose.ui:ui-text:1.7.3 +org.jetbrains.compose.ui:ui-unit:1.7.3 +org.jetbrains.compose.ui:ui-util:1.7.3 +org.jetbrains.compose.ui:ui:1.7.3 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-bom:2.1.10 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib:2.1.10 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 -org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -org.jetbrains:annotations:26.0.1 -org.jsoup:jsoup:1.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 +org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 +org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains:annotations:26.0.2 +org.jsoup:jsoup:1.19.1 +org.jspecify:jspecify:1.0.0 org.minidns:minidns-client:1.0.5 org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 diff --git a/app-k9mail/dependencies/fullReleaseRuntimeClasspath.txt b/app-k9mail/dependencies/fullReleaseRuntimeClasspath.txt index 7d61fb6c5c568c95907686c5e5d0e4631df2ed8e..82126e7ca9491d4c7ffb5efc0fb4ad3ad5511a43 100644 --- a/app-k9mail/dependencies/fullReleaseRuntimeClasspath.txt +++ b/app-k9mail/dependencies/fullReleaseRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 androidx.annotation:annotation-experimental:1.4.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 @@ -15,61 +15,78 @@ androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 -androidx.compose.animation:animation-android:1.7.5 -androidx.compose.animation:animation-core-android:1.7.5 -androidx.compose.animation:animation-core:1.7.5 -androidx.compose.animation:animation:1.7.5 -androidx.compose.foundation:foundation-android:1.7.5 -androidx.compose.foundation:foundation-layout-android:1.7.5 -androidx.compose.foundation:foundation-layout:1.7.5 -androidx.compose.foundation:foundation:1.7.5 +androidx.compose.animation:animation-android:1.7.8 +androidx.compose.animation:animation-core-android:1.7.8 +androidx.compose.animation:animation-core:1.7.8 +androidx.compose.animation:animation:1.7.8 +androidx.compose.foundation:foundation-android:1.7.8 +androidx.compose.foundation:foundation-layout-android:1.7.8 +androidx.compose.foundation:foundation-layout:1.7.8 +androidx.compose.foundation:foundation:1.7.8 +androidx.compose.material3.adaptive:adaptive-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation:1.0.0 +androidx.compose.material3.adaptive:adaptive:1.0.0 androidx.compose.material3:material3-android:1.3.1 androidx.compose.material3:material3:1.3.1 -androidx.compose.material:material-icons-core-android:1.7.5 -androidx.compose.material:material-icons-core:1.7.5 -androidx.compose.material:material-icons-extended-android:1.7.5 -androidx.compose.material:material-icons-extended:1.7.5 -androidx.compose.material:material-ripple-android:1.7.5 -androidx.compose.material:material-ripple:1.7.5 -androidx.compose.runtime:runtime-android:1.7.5 -androidx.compose.runtime:runtime-saveable-android:1.7.5 -androidx.compose.runtime:runtime-saveable:1.7.5 -androidx.compose.runtime:runtime:1.7.5 -androidx.compose.ui:ui-android:1.7.5 -androidx.compose.ui:ui-geometry-android:1.7.5 -androidx.compose.ui:ui-geometry:1.7.5 -androidx.compose.ui:ui-graphics-android:1.7.5 -androidx.compose.ui:ui-graphics:1.7.5 -androidx.compose.ui:ui-text-android:1.7.5 -androidx.compose.ui:ui-text:1.7.5 -androidx.compose.ui:ui-tooling-preview-android:1.7.5 -androidx.compose.ui:ui-tooling-preview:1.7.5 -androidx.compose.ui:ui-unit-android:1.7.5 -androidx.compose.ui:ui-unit:1.7.5 -androidx.compose.ui:ui-util-android:1.7.5 -androidx.compose.ui:ui-util:1.7.5 -androidx.compose.ui:ui:1.7.5 -androidx.compose:compose-bom:2024.11.00 +androidx.compose.material:material-icons-core-android:1.7.8 +androidx.compose.material:material-icons-core:1.7.8 +androidx.compose.material:material-icons-extended-android:1.7.8 +androidx.compose.material:material-icons-extended:1.7.8 +androidx.compose.material:material-ripple-android:1.7.8 +androidx.compose.material:material-ripple:1.7.8 +androidx.compose.runtime:runtime-android:1.7.8 +androidx.compose.runtime:runtime-saveable-android:1.7.8 +androidx.compose.runtime:runtime-saveable:1.7.8 +androidx.compose.runtime:runtime:1.7.8 +androidx.compose.ui:ui-android:1.7.8 +androidx.compose.ui:ui-geometry-android:1.7.8 +androidx.compose.ui:ui-geometry:1.7.8 +androidx.compose.ui:ui-graphics-android:1.7.8 +androidx.compose.ui:ui-graphics:1.7.8 +androidx.compose.ui:ui-text-android:1.7.8 +androidx.compose.ui:ui-text:1.7.8 +androidx.compose.ui:ui-tooling-preview-android:1.7.8 +androidx.compose.ui:ui-tooling-preview:1.7.8 +androidx.compose.ui:ui-unit-android:1.7.8 +androidx.compose.ui:ui-unit:1.7.8 +androidx.compose.ui:ui-util-android:1.7.8 +androidx.compose.ui:ui-util:1.7.8 +androidx.compose.ui:ui:1.7.8 +androidx.compose:compose-bom:2025.02.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.constraintlayout:constraintlayout-core:1.1.0 -androidx.constraintlayout:constraintlayout:2.2.0 -androidx.coordinatorlayout:coordinatorlayout:1.2.0 +androidx.constraintlayout:constraintlayout-core:1.1.1 +androidx.constraintlayout:constraintlayout:2.2.1 +androidx.coordinatorlayout:coordinatorlayout:1.3.0 androidx.core:core-ktx:1.15.0 +androidx.core:core-remoteviews:1.1.0 androidx.core:core-splashscreen:1.0.1 +androidx.core:core-viewtree:1.0.0 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 androidx.emoji2:emoji2:1.3.0 androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.5 -androidx.fragment:fragment-ktx:1.8.5 -androidx.fragment:fragment:1.8.5 +androidx.fragment:fragment-compose:1.8.6 +androidx.fragment:fragment-ktx:1.8.6 +androidx.fragment:fragment:1.8.6 +androidx.glance:glance-appwidget-external-protobuf:1.1.1 +androidx.glance:glance-appwidget-proto:1.1.1 +androidx.glance:glance-appwidget:1.1.1 +androidx.glance:glance-material3:1.1.1 +androidx.glance:glance:1.1.1 androidx.graphics:graphics-path:1.0.1 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 @@ -96,17 +113,17 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.4 -androidx.navigation:navigation-common:2.8.4 -androidx.navigation:navigation-compose:2.8.4 -androidx.navigation:navigation-fragment:2.8.4 -androidx.navigation:navigation-runtime-ktx:2.8.4 -androidx.navigation:navigation-runtime:2.8.4 -androidx.navigation:navigation-ui:2.8.4 +androidx.navigation:navigation-common-ktx:2.8.8 +androidx.navigation:navigation-common:2.8.8 +androidx.navigation:navigation-compose:2.8.8 +androidx.navigation:navigation-fragment:2.8.8 +androidx.navigation:navigation-runtime-ktx:2.8.8 +androidx.navigation:navigation-runtime:2.8.8 +androidx.navigation:navigation-ui:2.8.8 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 -androidx.recyclerview:recyclerview:1.3.2 +androidx.recyclerview:recyclerview:1.4.0 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 @@ -126,7 +143,12 @@ androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 -androidx.window:window:1.0.0 +androidx.webkit:webkit:1.13.0 +androidx.window.extensions.core:core:1.0.0 +androidx.window:window-core-android:1.3.0 +androidx.window:window-core:1.3.0 +androidx.window:window:1.3.0 +androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -142,10 +164,10 @@ com.github.bumptech.glide:annotations:4.16.0 com.github.bumptech.glide:disklrucache:4.16.0 com.github.bumptech.glide:gifdecoder:4.16.0 com.github.bumptech.glide:glide:4.16.0 -com.github.skydoves:landscapist-android:2.4.4 -com.github.skydoves:landscapist-coil3-android:2.4.4 -com.github.skydoves:landscapist-coil3:2.4.4 -com.github.skydoves:landscapist:2.4.4 +com.github.skydoves:landscapist-android:2.4.7 +com.github.skydoves:landscapist-coil3-android:2.4.7 +com.github.skydoves:landscapist-coil3:2.4.7 +com.github.skydoves:landscapist:2.4.7 com.google.android.datatransport:transport-api:3.0.0 com.google.android.datatransport:transport-backend-cct:3.1.8 com.google.android.datatransport:transport-runtime:3.1.8 @@ -168,27 +190,27 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0 com.mikepenz:fastadapter-extensions-swipe:5.7.0 com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 -com.squareup.moshi:moshi:1.15.1 +com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.9.1 -com.squareup.okio:okio:3.9.1 +com.squareup.okio:okio-jvm:3.10.2 +com.squareup.okio:okio:3.10.2 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 com.takisoft.preferencex:preferencex-datetimepicker:1.1.0 com.takisoft.preferencex:preferencex:1.1.0 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.18.0 de.cketti.library.changelog:ckchangelog-core:2.0.0-beta02 de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0 de.hdodenhof:circleimageview:3.1.0 -io.coil-kt.coil3:coil-android:3.0.4 -io.coil-kt.coil3:coil-core-android:3.0.4 -io.coil-kt.coil3:coil-core:3.0.4 -io.coil-kt.coil3:coil-network-core-android:3.0.4 -io.coil-kt.coil3:coil-network-core:3.0.4 -io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4 -io.coil-kt.coil3:coil-network-okhttp:3.0.4 -io.coil-kt.coil3:coil:3.0.4 +io.coil-kt.coil3:coil-android:3.1.0 +io.coil-kt.coil3:coil-core-android:3.1.0 +io.coil-kt.coil3:coil-core:3.1.0 +io.coil-kt.coil3:coil-network-core-android:3.1.0 +io.coil-kt.coil3:coil-network-core:3.1.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0 +io.coil-kt.coil3:coil-network-okhttp:3.1.0 +io.coil-kt.coil3:coil:3.1.0 io.insert-koin:koin-android:3.5.6 io.insert-koin:koin-androidx-compose:3.5.6 io.insert-koin:koin-bom:3.5.6 @@ -201,55 +223,56 @@ net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 org.apache.commons:commons-text:1.3 -org.apache.httpcomponents.client5:httpclient5:5.4.1 -org.apache.httpcomponents.core5:httpcore5-h2:5.3.1 -org.apache.httpcomponents.core5:httpcore5:5.3.1 -org.apache.james:apache-mime4j-core:0.8.9 -org.apache.james:apache-mime4j-dom:0.8.9 +org.apache.httpcomponents.client5:httpclient5:5.4.2 +org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 +org.apache.httpcomponents.core5:httpcore5:5.3.3 +org.apache.james:apache-mime4j-core:0.8.12 +org.apache.james:apache-mime4j-dom:0.8.12 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4 -org.jetbrains.compose.animation:animation-core:1.7.1 -org.jetbrains.compose.animation:animation:1.7.1 -org.jetbrains.compose.annotation-internal:annotation:1.7.1 -org.jetbrains.compose.collection-internal:collection:1.7.1 -org.jetbrains.compose.components:components-resources-android:1.7.1 -org.jetbrains.compose.components:components-resources:1.7.1 -org.jetbrains.compose.foundation:foundation-layout:1.7.1 -org.jetbrains.compose.foundation:foundation:1.7.1 -org.jetbrains.compose.runtime:runtime-saveable:1.7.1 -org.jetbrains.compose.runtime:runtime:1.7.1 -org.jetbrains.compose.ui:ui-geometry:1.7.1 -org.jetbrains.compose.ui:ui-graphics:1.7.1 -org.jetbrains.compose.ui:ui-text:1.7.1 -org.jetbrains.compose.ui:ui-unit:1.7.1 -org.jetbrains.compose.ui:ui-util:1.7.1 -org.jetbrains.compose.ui:ui:1.7.1 -org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-bom:2.1.0 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib:2.1.0 +org.jetbrains.compose.animation:animation-core:1.7.3 +org.jetbrains.compose.animation:animation:1.7.3 +org.jetbrains.compose.annotation-internal:annotation:1.7.3 +org.jetbrains.compose.collection-internal:collection:1.7.3 +org.jetbrains.compose.components:components-resources-android:1.7.3 +org.jetbrains.compose.components:components-resources:1.7.3 +org.jetbrains.compose.foundation:foundation-layout:1.7.3 +org.jetbrains.compose.foundation:foundation:1.7.3 +org.jetbrains.compose.runtime:runtime-saveable:1.7.3 +org.jetbrains.compose.runtime:runtime:1.7.3 +org.jetbrains.compose.ui:ui-geometry:1.7.3 +org.jetbrains.compose.ui:ui-graphics:1.7.3 +org.jetbrains.compose.ui:ui-text:1.7.3 +org.jetbrains.compose.ui:ui-unit:1.7.3 +org.jetbrains.compose.ui:ui-util:1.7.3 +org.jetbrains.compose.ui:ui:1.7.3 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-bom:2.1.10 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib:2.1.10 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 -org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -org.jetbrains:annotations:26.0.1 -org.jsoup:jsoup:1.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 +org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 +org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains:annotations:26.0.2 +org.jsoup:jsoup:1.19.1 +org.jspecify:jspecify:1.0.0 org.minidns:minidns-client:1.0.5 org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 diff --git a/app-k9mail/src/debug/AndroidManifest.xml b/app-k9mail/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..689e9c615a44160357f6b334b6d42064f2fe809d --- /dev/null +++ b/app-k9mail/src/debug/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/app-k9mail/src/debug/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt b/app-k9mail/src/debug/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt index a34eaec6679a1927ce5bbb48d23608b6f255a770..f19f3db1baac2d4bf156208adf50da021573d2cf 100644 --- a/app-k9mail/src/debug/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt +++ b/app-k9mail/src/debug/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt @@ -64,6 +64,8 @@ class K9OAuthConfigurationFactory : OAuthConfigurationFactory { ) to OAuthConfiguration( clientId = "e647013a-ada4-4114-b419-e43d250f99c5", scopes = listOf( + "openid", + "email", "https://outlook.office.com/IMAP.AccessAsUser.All", "https://outlook.office.com/SMTP.Send", "offline_access", diff --git a/app-k9mail/src/debug/kotlin/app/k9mail/dev/DemoBackendFactory.kt b/app-k9mail/src/debug/kotlin/app/k9mail/dev/DemoBackendFactory.kt index 63244bd08c6aaf7f882422f07817359673543990..9a12c3eab0612b27e127c798b4528338994d3bdc 100644 --- a/app-k9mail/src/debug/kotlin/app/k9mail/dev/DemoBackendFactory.kt +++ b/app-k9mail/src/debug/kotlin/app/k9mail/dev/DemoBackendFactory.kt @@ -1,13 +1,13 @@ package app.k9mail.dev import app.k9mail.backend.demo.DemoBackend -import app.k9mail.legacy.account.Account +import app.k9mail.legacy.account.LegacyAccount import com.fsck.k9.backend.BackendFactory import com.fsck.k9.backend.api.Backend import com.fsck.k9.mailstore.K9BackendStorageFactory class DemoBackendFactory(private val backendStorageFactory: K9BackendStorageFactory) : BackendFactory { - override fun createBackend(account: Account): Backend { + override fun createBackend(account: LegacyAccount): Backend { val backendStorage = backendStorageFactory.createBackendStorage(account) return DemoBackend(backendStorage) } diff --git a/app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt b/app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..83180e4aaad5e679605f1e6a77a0814041d0688f --- /dev/null +++ b/app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt @@ -0,0 +1,17 @@ +package app.k9mail.featureflag + +import app.k9mail.core.featureflag.FeatureFlag +import app.k9mail.core.featureflag.FeatureFlagFactory +import app.k9mail.core.featureflag.toFeatureFlagKey + +class K9FeatureFlagFactory : FeatureFlagFactory { + override fun createFeatureCatalog(): List { + return listOf( + FeatureFlag("archive_marks_as_read".toFeatureFlagKey(), enabled = true), + FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = true), + FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true), + FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true), + FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true), + ) + } +} diff --git a/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt b/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt index 313f8522d3a76dbdee01a128023590cdec4c11a2..5eff8918815692226aee72c4c5e8fb70ee7190be 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt @@ -21,12 +21,14 @@ import com.fsck.k9.preferences.FilePrefixProvider import com.fsck.k9.provider.K9ThemeProvider import com.fsck.k9.provider.UnreadWidgetProvider import com.fsck.k9.widget.list.MessageListWidgetProvider +import net.thunderbird.app.common.appCommonModule import org.koin.android.ext.koin.androidContext import org.koin.core.qualifier.named import org.koin.dsl.binds import org.koin.dsl.module val appModule = module { + includes(appCommonModule) includes(appWidgetModule) includes(featureModule) diff --git a/app-k9mail/src/main/kotlin/app/k9mail/feature/FeatureModule.kt b/app-k9mail/src/main/kotlin/app/k9mail/feature/FeatureModule.kt index 45a8ba6881046ae3099aba467459a6afa5219936..d9558ee3c4c0fd72949cabb294b8afa497058e59 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/feature/FeatureModule.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/feature/FeatureModule.kt @@ -5,11 +5,14 @@ import app.k9mail.feature.funding.featureFundingModule import app.k9mail.feature.migration.launcher.featureMigrationModule import app.k9mail.feature.onboarding.migration.onboardingMigrationModule import app.k9mail.feature.telemetry.telemetryModule -import com.fsck.k9.feature.featureLauncherModule +import net.thunderbird.app.common.feature.featureLauncherModule +import net.thunderbird.feature.account.settings.featureAccountSettingsModule import org.koin.dsl.module val featureModule = module { includes(featureLauncherModule) + + includes(featureAccountSettingsModule) includes(telemetryModule) includes(featureFundingModule) includes(onboardingMigrationModule) diff --git a/app-k9mail/src/main/kotlin/app/k9mail/widget/KoinModule.kt b/app-k9mail/src/main/kotlin/app/k9mail/widget/KoinModule.kt index 2c9ad58f9c1d32ed83b11d67328112b2a57e4e9e..b2e70a6f05a67e372cdc5550a7e4cb05369ddb34 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/widget/KoinModule.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/widget/KoinModule.kt @@ -2,9 +2,12 @@ package app.k9mail.widget import app.k9mail.feature.widget.message.list.MessageListWidgetConfig import app.k9mail.feature.widget.unread.UnreadWidgetConfig +import net.thunderbird.feature.widget.message.list.featureWidgetMessageListModule import org.koin.dsl.module val appWidgetModule = module { + includes(featureWidgetMessageListModule) + single { K9MessageListWidgetConfig() } single { K9UnreadWidgetConfig() } } diff --git a/app-k9mail/src/main/res/values-bn/strings.xml b/app-k9mail/src/main/res/values-bn/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..9e1dc1c72dfae6746171adc8972b4fe2c1f7271a --- /dev/null +++ b/app-k9mail/src/main/res/values-bn/strings.xml @@ -0,0 +1,4 @@ + + + K-9 মেইল + diff --git a/app-k9mail/src/main/res/values-fr/strings.xml b/app-k9mail/src/main/res/values-fr/strings.xml index e7aecf46267d5a66dcc25ad6286302a5738a2d41..f3b0d138ef200db3563d00a239946eb5716f4269 100644 --- a/app-k9mail/src/main/res/values-fr/strings.xml +++ b/app-k9mail/src/main/res/values-fr/strings.xml @@ -1,4 +1,4 @@ - Courriel K-9 Mail - \ No newline at end of file + Courriel K-9 + diff --git a/app-k9mail/src/main/res/values/strings.xml b/app-k9mail/src/main/res/values/strings.xml index f115016e412bd22bb930db821e334696707a4c69..7bf1920009a0f148800ac5038476ec71b74c93ad 100644 --- a/app-k9mail/src/main/res/values/strings.xml +++ b/app-k9mail/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ + K-9 Mail diff --git a/app-k9mail/src/main/res/values/themes.xml b/app-k9mail/src/main/res/values/themes.xml index 85a4357c9b6caa8eb760cbd44f155a4a9641d87d..64e698fa2ada11317b31fcb8a6cfb6e565cbbcab 100644 --- a/app-k9mail/src/main/res/values/themes.xml +++ b/app-k9mail/src/main/res/values/themes.xml @@ -15,13 +15,6 @@ @android:color/primary_text_light @android:color/secondary_text_light - ?android:attr/windowBackground - #ffd8d8d8 - ?attr/messageListRegularItemBackgroundColor - ?attr/colorSecondaryVariant - 60% - ?attr/colorSurface - @color/material_blue_600 @color/material_blue_600 @color/material_orange_600 @@ -59,13 +52,6 @@ @android:color/primary_text_dark @android:color/secondary_text_dark - ?android:attr/windowBackground - ?attr/messageListRegularItemBackgroundColor - #ff505050 - ?attr/colorSecondaryVariant - 50% - ?attr/colorSurface - @color/material_blue_700 @color/material_blue_700 @color/material_orange_700 diff --git a/app-k9mail/src/release/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt b/app-k9mail/src/release/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt index f106d20f196fd4ee4e8f25e00bab29b3996c6794..f787afc21d014b4fec61e1474ae41e41d04e1b7a 100644 --- a/app-k9mail/src/release/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt +++ b/app-k9mail/src/release/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt @@ -64,6 +64,8 @@ class K9OAuthConfigurationFactory : OAuthConfigurationFactory { ) to OAuthConfiguration( clientId = "e647013a-ada4-4114-b419-e43d250f99c5", scopes = listOf( + "openid", + "email", "https://outlook.office.com/IMAP.AccessAsUser.All", "https://outlook.office.com/SMTP.Send", "offline_access", diff --git a/app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt b/app-k9mail/src/release/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt similarity index 54% rename from app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt rename to app-k9mail/src/release/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt index 6ea64fb42623a6bc499014a1a3627f8fa7480b22..76553011596815274c5089576b2022580e7d4e37 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt +++ b/app-k9mail/src/release/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt @@ -8,6 +8,10 @@ class K9FeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List { return listOf( FeatureFlag("archive_marks_as_read".toFeatureFlagKey(), enabled = false), + FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = false), + FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = false), + FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = false), + FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = false), ) } } diff --git a/app-k9mail/src/test/kotlin/app/k9mail/DependencyInjectionTest.kt b/app-k9mail/src/test/kotlin/app/k9mail/DependencyInjectionTest.kt index ec49c894fe64d4004e458be112b785bc8ef7800d..1d7197f291e10e382d54e90ab5402151b6e42602 100644 --- a/app-k9mail/src/test/kotlin/app/k9mail/DependencyInjectionTest.kt +++ b/app-k9mail/src/test/kotlin/app/k9mail/DependencyInjectionTest.kt @@ -3,19 +3,16 @@ package app.k9mail import android.view.ContextThemeWrapper import androidx.lifecycle.LifecycleOwner import androidx.work.WorkerParameters -import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract -import app.k9mail.feature.account.server.validation.ui.ServerValidationContract import app.k9mail.legacy.ui.folder.FolderIconProvider import app.k9mail.legacy.ui.folder.FolderNameFormatter import com.fsck.k9.R -import com.fsck.k9.account.AccountRemoverWorker -import com.fsck.k9.job.MailSyncWorker import com.fsck.k9.mail.oauth.AuthStateStorage import com.fsck.k9.ui.changelog.ChangeLogMode import com.fsck.k9.ui.changelog.ChangelogViewModel import com.fsck.k9.ui.endtoend.AutocryptKeyTransferActivity import com.fsck.k9.ui.endtoend.AutocryptKeyTransferPresenter import com.fsck.k9.ui.helper.SizeFormatter +import net.thunderbird.feature.account.api.AccountId import org.junit.Test import org.junit.runner.RunWith import org.koin.core.annotation.KoinInternalApi @@ -26,7 +23,6 @@ import org.koin.test.AutoCloseKoinTest import org.koin.test.check.checkModules import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock -import org.openintents.openpgp.OpenPgpApiManager import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment @@ -44,22 +40,20 @@ class DependencyInjectionTest : AutoCloseKoinTest() { KoinJavaComponent.getKoin().setupLogger(PrintLogger()) getKoin().checkModules { - withParameter { lifecycleOwner } withParameters { parametersOf(lifecycleOwner, autocryptTransferView) } withParameter { RuntimeEnvironment.getApplication() } withParameter { RuntimeEnvironment.getApplication() } withParameter { ChangeLogMode.CHANGE_LOG } - withParameter { mock() } withParameter { ContextThemeWrapper(RuntimeEnvironment.getApplication(), R.style.Theme_K9_DayNight).theme } withParameters(clazz = Class.forName("com.fsck.k9.view.K9WebViewClient").kotlin) { parametersOf(null, null) } - withParameter { authStateStorage } - withParameter { authStateStorage } - withParameter { authStateStorage } - withParameter { mock() } + withInstance(authStateStorage) + withInstance(lifecycleOwner) + withInstance(mock()) + withInstance(AccountId.create()) } } } diff --git a/app-metadata/com.fsck.k9/en-US/changelogs/.gitkeep b/app-metadata/com.fsck.k9/en-US/changelogs/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app-metadata/com.fsck.k9/gd/short_description.txt b/app-metadata/com.fsck.k9/gd/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..66fa56987d7b1385afd2fbca5ad3baa99a2bebcb --- /dev/null +++ b/app-metadata/com.fsck.k9/gd/short_description.txt @@ -0,0 +1 @@ +Cliant puist-d uile-chomasach diff --git a/app-metadata/com.fsck.k9/gd/title.txt b/app-metadata/com.fsck.k9/gd/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..cbbad650d871472a689d8af7c5851c0ce73e6a9b --- /dev/null +++ b/app-metadata/com.fsck.k9/gd/title.txt @@ -0,0 +1 @@ +Post K-9 diff --git a/app-metadata/com.fsck.k9/hi-IN/full_description.txt b/app-metadata/com.fsck.k9/hi-IN/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..c67b6a887cd4b1935db98252e397329a84fd8a06 --- /dev/null +++ b/app-metadata/com.fsck.k9/hi-IN/full_description.txt @@ -0,0 +1,24 @@ +के-९ मेल एक मुक्त स्रोत डाक ग्राहक है जो मूलतः सभी डाक प्रदाताओं के साथ कार्य करता है। + +विशेषतायें + +* बहु-खाताओं का समर्थन +* एकीकृत संदेश-पेटिका +* निजता-हितैषी (किसी प्रकार की निगरानी नहीं, केवल आपके डाक प्रदाता से जुड़ता है) +* पृष्ठभूमि में स्वचालित समन्वय या प्रेरित सूचनायें +* स्थानीय और सेवक-पक्ष खोज +* OpenPGP डाक कूटलेखन (PGP/MIME) + +OpenPGP द्वारा अपने डाक का गुप्तकरण या उघाटन करने के लिये OpenKeychain: Easy PGP ऐप संस्थापित करें। + + +सहायता + +यदि आपको के-९ मेल से जुड़ी कोई परेशानी हो रही है, तो हमारी सहारा गोष्ठी में सहायता मांगें। + + +सहायता करने के इच्छुक? + +के-९ मेल समुदाय द्वारा चालित एक परियोजना है। यदि आप ऐप के विकास में सहायता करने के इच्छुक हैं तो कृपया हमसे जुड़ैं! +हमारे त्रुटि-खोजी, कोड-स्रोत, और विकी आपको https://github.com/thunderbird/thunderbird-android पर मिलेंगे। +हम नये विकासकों, रचनाकारों, अनुवादकों, त्रुटि विभाजकों और मित्रों का स्वागत करने के में सदैव सुखी होते हैं। diff --git a/app-metadata/com.fsck.k9/ta-IN/full_description.txt b/app-metadata/com.fsck.k9/ta-IN/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..c088c78cd1c434caaef366858d0d4cf3acf7b41a --- /dev/null +++ b/app-metadata/com.fsck.k9/ta-IN/full_description.txt @@ -0,0 +1,24 @@ +கே -9 மெயில் என்பது ஒரு திறந்த மூல மின்னஞ்சல் கிளையன்ட் ஆகும், இது அடிப்படையில் ஒவ்வொரு மின்னஞ்சல் வழங்குநருடனும் செயல்படுகிறது. + + நற்பொருத்தங்கள் + + * பல கணக்குகளை ஆதரிக்கிறது + * ஒருங்கிணைந்த இன்பாக்ச் + * தனியுரிமை நட்பு (எந்த கண்காணிப்பும் இல்லை, உங்கள் மின்னஞ்சல் வழங்குநருடன் மட்டுமே இணைகிறது) + * தானியங்கி பின்னணி ஒத்திசைவு அல்லது புச் அறிவிப்புகள் + * உள்ளக மற்றும் சேவையக பக்க தேடல் + * OpenPGP மின்னஞ்சல் குறியாக்கம் (PGP/MIME) + + OpenPGP ஐப் பயன்படுத்தி உங்கள் மின்னஞ்சல்களை குறியாக்கம்/மறைகுறியாக்க ESPENCEKECHAIN: EUSIONCEKECHAIN: EUSIONKECHAIN "> OpenKechain" என்ற பயன்பாட்டை உதவி + + K-9 அஞ்சலில் உங்களுக்கு சிக்கல் இருந்தால், எங்கள் உதவி மன்றம் இல் உதவி கேளுங்கள். + + + உதவ வேண்டுமா? + + கே -9 மெயில் என்பது ஒரு சமூக வளர்ந்த திட்டமாகும். பயன்பாட்டை மேம்படுத்த உதவ நீங்கள் ஆர்வமாக இருந்தால், தயவுசெய்து எங்களுடன் சேருங்கள்! + எங்கள் பிழை டிராக்கர், மூலக் குறியீடு மற்றும் விக்கியை https://github.com/thunderbird/thunderbird-android இல் காணலாம். + புதிய உருவாக்குபவர்கள், வடிவமைப்பாளர்கள், ஆவணங்கள், மொழிபெயர்ப்பாளர்கள், பிழை முக்கோணங்கள் மற்றும் நண்பர்களை வரவேற்பதில் நாங்கள் எப்போதும் மகிழ்ச்சியடைகிறோம். diff --git a/app-metadata/com.fsck.k9/ta-IN/short_description.txt b/app-metadata/com.fsck.k9/ta-IN/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..8091a6e8b0b456e759f2106ef0d55d814727caa2 --- /dev/null +++ b/app-metadata/com.fsck.k9/ta-IN/short_description.txt @@ -0,0 +1 @@ +முழு அம்சமான மின்னஞ்சல் வாங்கி diff --git a/app-metadata/com.fsck.k9/ta-IN/title.txt b/app-metadata/com.fsck.k9/ta-IN/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..deb7248228ba92cbd746973d0168002735b3b515 --- /dev/null +++ b/app-metadata/com.fsck.k9/ta-IN/title.txt @@ -0,0 +1 @@ +கே -9 மே மாதம் diff --git a/app-metadata/net.thunderbird.android.beta/en-US/changelogs/.gitkeep b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app-metadata/net.thunderbird.android.beta/gd/short_description.txt b/app-metadata/net.thunderbird.android.beta/gd/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..bbd8a6d4227102751911e3d9e48a8b268218b589 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/gd/short_description.txt @@ -0,0 +1 @@ +Tha Thunderbird na aplacaid le còd fosgailte ⁊ cudrom air prìobhaideachd. diff --git a/app-metadata/net.thunderbird.android.beta/gd/title.txt b/app-metadata/net.thunderbird.android.beta/gd/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..341a7d3974cb60cc57028aa5d58e829618382636 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/gd/title.txt @@ -0,0 +1 @@ +Tb Beta do dh’fheuchadairean diff --git a/app-metadata/net.thunderbird.android.beta/no-NO/short_description.txt b/app-metadata/net.thunderbird.android.beta/no-NO/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..13669599c69ac259ae423c9820a408297a2df821 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/no-NO/short_description.txt @@ -0,0 +1 @@ +Thunderbird er en 100% åpenkildekodet og privatlivsfokusert e-postapp. diff --git a/app-metadata/net.thunderbird.android.beta/no-NO/title.txt b/app-metadata/net.thunderbird.android.beta/no-NO/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..f364f71fda4c7085425a226c62eb05f8a2c27c2b --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/no-NO/title.txt @@ -0,0 +1 @@ +Thunderbird Beta for testere diff --git a/app-metadata/net.thunderbird.android.beta/sk/short_description.txt b/app-metadata/net.thunderbird.android.beta/sk/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..fe5777cf5034f1738488b4c15804757ad1520882 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/sk/short_description.txt @@ -0,0 +1 @@ +Thunderbird je 100% open source e-mailová aplikácia zameraná na súkromie. diff --git a/app-metadata/net.thunderbird.android.beta/ta-IN/full_description.txt b/app-metadata/net.thunderbird.android.beta/ta-IN/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..3ff1c74efc6c1b7930176ff7455889f9c6a91ce8 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/ta-IN/full_description.txt @@ -0,0 +1,37 @@ +தண்டர்பேர்ட் பீட்டாவைப் பதிவிறக்குவதன் மூலமும், அதிகாரப்பூர்வமாக வெளியிடப்படுவதற்கு முன்பு அண்மைக் கால நற்பொருத்தங்கள் மற்றும் பிழைத் திருத்தங்களுக்கான ஆரம்ப அணுகலைப் பெறுவதன் மூலமும் அடுத்த தண்டர்பேர்ட் வெளியீட்டை முடிந்தவரை அருமையாக மாற்ற உதவுங்கள். உங்கள் சோதனை மற்றும் பின்னூட்டங்கள் முதன்மை, எனவே பிழைகள், கடினமான விளிம்புகளைப் புகாரளித்து, உங்கள் எண்ணங்களை எங்களுடன் பகிர்ந்து கொள்ளுங்கள்! + + எங்கள் பிழை டிராக்கர், மூலக் குறியீடு மற்றும் விக்கியை https://github.com/thunderbird/thunderbird-android இல் கண்டறியவும். + + புதிய உருவாக்குபவர்கள், வடிவமைப்பாளர்கள், ஆவணங்கள், மொழிபெயர்ப்பாளர்கள், பிழை முக்கோணங்கள் மற்றும் நண்பர்களை வரவேற்பதில் நாங்கள் எப்போதும் மகிழ்ச்சியடைகிறோம். தொடங்குவதற்கு நீங்கள் என்ன செய்ய முடியும் + + பல பயன்பாடுகள் மற்றும் வெப்மெயிலை நீக்குகிறது. உங்கள் நாள் முழுவதும் சக்திக்கு விருப்பமான ஒருங்கிணைந்த இன்பாக்சுடன் ஒரு பயன்பாட்டைப் பயன்படுத்தவும். + உங்கள் தனிப்பட்ட தரவை ஒருபோதும் சேகரிக்கவோ விற்கவோ ஒருபோதும் தனியுரிமை நட்பு மின்னஞ்சல் கிளையண்டை அனுபவிக்கவும். உங்கள் மின்னஞ்சல் வழங்குநருடன் நாங்கள் உங்களை நேரடியாக இணைக்கிறோம். அதுதான்! + உங்கள் செய்திகளை குறியாக்க மற்றும் மறைகுறியாக்க, “ஓபன் கெய்ன்” பயன்பாட்டுடன் ஓபன் பிசிபி மின்னஞ்சல் குறியாக்கத்தை (பிசிபி/எம்ஐஎம்) பயன்படுத்துவதன் மூலம் உங்கள் தனியுரிமையை அடுத்த கட்டத்திற்கு கொண்டு செல்லுங்கள். + உங்கள் மின்னஞ்சலை உடனடியாக, அமைக்கப்பட்ட இடைவெளியில் அல்லது தேவைக்கேற்ப ஒத்திசைக்கத் தேர்வுசெய்க. இருப்பினும் உங்கள் மின்னஞ்சலை சரிபார்க்க விரும்பினால், அது உங்களுடையது! + உள்ளக மற்றும் சேவையக பக்க தேடலைப் பயன்படுத்தி உங்கள் முக்கியமான செய்திகளைக் கண்டறியவும். + + + பொருந்தக்கூடிய தன்மை + + தண்டர்பேர்ட் IMAP மற்றும் POP3 நெறிமுறைகளுடன் செயல்படுகிறது, சிமெயில், அவுட்லுக், யாகூ மெயில், ஐக்ளவுட் மற்றும் பலவற்றை உள்ளடக்கிய பலவிதமான மின்னஞ்சல் வழங்குநர்களை ஆதரிக்கிறது. + + + தண்டர்பேர்டை ஏன் பயன்படுத்த வேண்டும் + + 20 ஆண்டுகளுக்கும் மேலாக மின்னஞ்சலில் நம்பகமான பெயர் - இப்போது ஆண்ட்ராய்டு இல். + எங்கள் பயனர்களிடமிருந்து தன்னார்வ பங்களிப்புகளால் தண்டர்பேர்ட் முழுமையாக நிதியளிக்கப்படுகிறது. உங்கள் தனிப்பட்ட தரவை நாங்கள் சுரங்கப்படுத்த மாட்டோம். நீங்கள் ஒருபோதும் தயாரிப்பு அல்ல. + உங்களைப் போலவே செயல்திறன் மனம் கொண்ட ஒரு குழுவால் தயாரிக்கப்பட்டது. பதிலுக்கு அதிகபட்சம் பெறும்போது பயன்பாட்டைப் பயன்படுத்தி நீங்கள் குறைந்த நேரத்தை செலவிட வேண்டும் என்று நாங்கள் விரும்புகிறோம். + உலகெங்கிலும் இருந்து பங்களிப்பாளர்களுடன், ஆண்ட்ராய்டுக்கான தண்டர்பேர்ட் 20 க்கும் மேற்பட்ட மொழிகளில் மொழிபெயர்க்கப்பட்டுள்ளது. + மொசில்லா அறக்கட்டளையின் முழு உரிமையாளரான MZLA டெக்னாலசிச் கார்ப்பரேசனால் ஆதரிக்கப்படுகிறது. + + + திறந்த மூல மற்றும் சமூகம் + + தண்டர்பேர்ட் இலவசம் மற்றும் திறந்த மூலமாகும், அதாவது அதன் குறியீடு சுதந்திரமாக பார்க்க, மாற்ற, பயன்படுத்த மற்றும் பகிர்ந்து கொள்ள கிடைக்கிறது. அதன் உரிமம் அது என்றென்றும் சுதந்திரமாக இருக்கும் என்பதையும் உறுதி செய்கிறது. உங்களுக்கு ஆயிரக்கணக்கான பங்களிப்பாளர்களின் பரிசாக தண்டர்பேர்டை நீங்கள் நினைக்கலாம். + எங்கள் வலைப்பதிவு மற்றும் அஞ்சல் பட்டியல்களில் வழக்கமான, வெளிப்படையான புதுப்பிப்புகளுடன் திறந்த வெளியில் உருவாக்குகிறோம். + எங்கள் பயனர் உதவி எங்கள் உலகளாவிய சமூகத்தால் இயக்கப்படுகிறது. உங்களுக்கு தேவையான பதில்களைக் கண்டுபிடி, அல்லது பங்களிப்பாளரின் பாத்திரத்தில் நுழைவது - இது கேள்விகளுக்கு பதிலளிக்கிறதா, பயன்பாட்டை மொழிபெயர்ப்பதா, அல்லது தண்டர்பேர்டைப் பற்றி உங்கள் நண்பர்கள் மற்றும் குடும்பத்தினரிடம் சொல்கிறதா. + diff --git a/app-metadata/net.thunderbird.android.beta/ta-IN/short_description.txt b/app-metadata/net.thunderbird.android.beta/ta-IN/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..ad491bb3195bc11405fb68ac5f4737c682358bfa --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/ta-IN/short_description.txt @@ -0,0 +1 @@ +இடிபறவை என்பது 100% திறந்த மூலமாகும், தனியுரிமை கவனம் செலுத்திய மின்னஞ்சல் பயன்பாடு. diff --git a/app-metadata/net.thunderbird.android.beta/ta-IN/title.txt b/app-metadata/net.thunderbird.android.beta/ta-IN/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..2236a872364cf0982f693c8d6435e7f91ca17e73 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/ta-IN/title.txt @@ -0,0 +1 @@ +சோதனையாளர்களுக்கான தண்டர்பேர்ட் பீட்டா diff --git a/app-metadata/net.thunderbird.android/en-US/changelogs/.gitkeep b/app-metadata/net.thunderbird.android/en-US/changelogs/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app-metadata/net.thunderbird.android/gd/short_description.txt b/app-metadata/net.thunderbird.android/gd/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..bbd8a6d4227102751911e3d9e48a8b268218b589 --- /dev/null +++ b/app-metadata/net.thunderbird.android/gd/short_description.txt @@ -0,0 +1 @@ +Tha Thunderbird na aplacaid le còd fosgailte ⁊ cudrom air prìobhaideachd. diff --git a/app-metadata/net.thunderbird.android/no-NO/short_description.txt b/app-metadata/net.thunderbird.android/no-NO/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..13669599c69ac259ae423c9820a408297a2df821 --- /dev/null +++ b/app-metadata/net.thunderbird.android/no-NO/short_description.txt @@ -0,0 +1 @@ +Thunderbird er en 100% åpenkildekodet og privatlivsfokusert e-postapp. diff --git a/app-metadata/net.thunderbird.android/no-NO/title.txt b/app-metadata/net.thunderbird.android/no-NO/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..c56feb8b2cb3052ad7985e16444a8eab779d4047 --- /dev/null +++ b/app-metadata/net.thunderbird.android/no-NO/title.txt @@ -0,0 +1 @@ +Thunderbird for Android diff --git a/app-metadata/net.thunderbird.android/sk/short_description.txt b/app-metadata/net.thunderbird.android/sk/short_description.txt index cef26132d46994bb43d359f94fe0607e36e29988..fe5777cf5034f1738488b4c15804757ad1520882 100644 --- a/app-metadata/net.thunderbird.android/sk/short_description.txt +++ b/app-metadata/net.thunderbird.android/sk/short_description.txt @@ -1 +1 @@ -Thunderbird je 100% open source e-mailová aplikácia, zo zameraním na súkromie. +Thunderbird je 100% open source e-mailová aplikácia zameraná na súkromie. diff --git a/app-metadata/net.thunderbird.android/ta-IN/full_description.txt b/app-metadata/net.thunderbird.android/ta-IN/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..f21741d00a1324f7c5c94a5101218d7ad9e75e8e --- /dev/null +++ b/app-metadata/net.thunderbird.android/ta-IN/full_description.txt @@ -0,0 +1,31 @@ +இடிபறவை ஒரு சக்திவாய்ந்த, தனியுரிமையை மையமாகக் கொண்ட மின்னஞ்சல் பயன்பாடு. அதிகபட்ச உற்பத்தித்திறனுக்கான ஒருங்கிணைந்த இன்பாக்ச் விருப்பத்துடன், ஒரு பயன்பாட்டிலிருந்து பல மின்னஞ்சல் கணக்குகளைச் சிரமமின்றி நிர்வகிக்கவும். திறந்த-மூல தொழில்நுட்பத்தில் கட்டமைக்கப்பட்டு, தன்னார்வலர்களின் உலகளாவிய சமூகத்துடன் ஒரு பிரத்யேக உருவாக்குபவர்கள் குழுவால் ஆதரிக்கப்படுகிறது, தண்டர்பேர்ட் உங்கள் தனிப்பட்ட தரவை ஒரு தயாரிப்பாக ஒருபோதும் கருதுவதில்லை. எங்கள் பயனர்களிடமிருந்து பொருள் பங்களிப்புகளால் மட்டுமே ஆதரிக்கப்படுகிறது, எனவே உங்கள் மின்னஞ்சல்களுடன் மீண்டும் கலந்த விளம்பரங்களை நீங்கள் ஒருபோதும் பார்க்க வேண்டியதில்லை. + + நீங்கள் என்ன செய்ய முடியும் + + பல பயன்பாடுகள் மற்றும் வெப்மெயிலை நீக்குகிறது. உங்கள் நாள் முழுவதும் சக்திக்கு விருப்பமான ஒருங்கிணைந்த இன்பாக்சுடன் ஒரு பயன்பாட்டைப் பயன்படுத்தவும். + உங்கள் தனிப்பட்ட தரவை ஒருபோதும் சேகரிக்கவோ விற்கவோ ஒருபோதும் தனியுரிமை நட்பு மின்னஞ்சல் கிளையண்டை அனுபவிக்கவும். உங்கள் மின்னஞ்சல் வழங்குநருடன் நாங்கள் உங்களை நேரடியாக இணைக்கிறோம். அதுதான்! + உங்கள் செய்திகளைக் குறியாக்க மற்றும் மறைகுறியாக்க, “ஓபன் கெய்ன்” பயன்பாட்டுடன் ஓபன் பிசிபி மின்னஞ்சல் குறியாக்கத்தை (பிசிபி/எம்ஐஎம்) பயன்படுத்துவதன் மூலம் உங்கள் தனியுரிமையை அடுத்த கட்டத்திற்கு கொண்டு செல்லுங்கள். + உங்கள் மின்னஞ்சலை உடனடியாக, அமைக்கப்பட்ட இடைவெளியில் அல்லது தேவைக்கேற்ப ஒத்திசைக்கத் தேர்வுசெய்க. இருப்பினும் உங்கள் மின்னஞ்சலைச் சரிபார்க்க விரும்பினால், அது உங்களுடையது! + உள்ளக மற்றும் சேவையக பக்க தேடலைப் பயன்படுத்தி உங்கள் முக்கியமான செய்திகளைக் கண்டறியவும். + + + பொருந்தக்கூடிய தன்மை + + இடிபறவை IMAP மற்றும் POP3 நெறிமுறைகளுடன் செயல்படுகிறது, சிமெயில், அவுட்லுக், யாகூ மெயில், ஐக்ளவுட் மற்றும் பலவற்றை உள்ளடக்கிய பலவிதமான மின்னஞ்சல் வழங்குநர்களை ஆதரிக்கிறது. + + + தண்டர்பேர்டை ஏன் பயன்படுத்த வேண்டும் + + 20 ஆண்டுகளுக்கும் மேலாக மின்னஞ்சலில் நம்பகமான பெயர் - இப்போது ஆண்ட்ராய்டு இல். + எங்கள் பயனர்களிடமிருந்து தன்னார்வ பங்களிப்புகளால் தண்டர்பேர்ட் முழுமையாக நிதியளிக்கப்படுகிறது. உங்கள் தனிப்பட்ட தரவை நாங்கள் சுரங்கப்படுத்த மாட்டோம். நீங்கள் ஒருபோதும் தயாரிப்பு அல்ல. + உங்களைப் போலவே செயல்திறன் மனம் கொண்ட ஒரு குழுவால் தயாரிக்கப்பட்டது. பதிலுக்கு அதிகபட்சம் பெறும்போது பயன்பாட்டைப் பயன்படுத்தி நீங்கள் குறைந்த நேரத்தைச் செலவிட வேண்டும் என்று நாங்கள் விரும்புகிறோம். + உலகெங்கிலும் இருந்து பங்களிப்பாளர்களுடன், ஆண்ட்ராய்டுக்கான தண்டர்பேர்ட் 20 க்கும் மேற்பட்ட மொழிகளில் மொழிபெயர்க்கப்பட்டுள்ளது. + மொசில்லா அறக்கட்டளையின் முழு உரிமையாளரான MZLA டெக்னாலசிச் கார்ப்பரேசனால் ஆதரிக்கப்படுகிறது. + + + திறந்த மூல மற்றும் சமூகம் + + தண்டர்பேர்ட் இலவசம் மற்றும் திறந்த மூலமாகும், அதாவது அதன் குறியீடு சுதந்திரமாகப் பார்க்க, மாற்ற, பயன்படுத்த மற்றும் பகிர்ந்து கொள்ள கிடைக்கிறது. அதன் உரிமம் அது என்றென்றும் சுதந்திரமாக இருக்கும் என்பதையும் உறுதி செய்கிறது. உங்களுக்கு ஆயிரக்கணக்கான பங்களிப்பாளர்களின் பரிசாக இடிபறவையை நீங்கள் நினைக்கலாம். + எங்கள் வலைப்பதிவு மற்றும் அஞ்சல் பட்டியல்களில் வழக்கமான, வெளிப்படையான புதுப்பிப்புகளுடன் திறந்த வெளியில் உருவாக்குகிறோம். + எங்கள் பயனர் உதவி எங்கள் உலகளாவிய சமூகத்தால் இயக்கப்படுகிறது. உங்களுக்குத் தேவையான பதில்களைக் கண்டுபிடி, அல்லது பங்களிப்பாளரின் பாத்திரத்தில் நுழைவது - இது கேள்விகளுக்குப் பதிலளிக்கிறதா, பயன்பாட்டை மொழிபெயர்ப்பதா, அல்லது தண்டர்பேர்டைப் பற்றி உங்கள் நண்பர்கள் மற்றும் குடும்பத்தினரிடம் சொல்கிறதா. + diff --git a/app-metadata/net.thunderbird.android/ta-IN/short_description.txt b/app-metadata/net.thunderbird.android/ta-IN/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..ad491bb3195bc11405fb68ac5f4737c682358bfa --- /dev/null +++ b/app-metadata/net.thunderbird.android/ta-IN/short_description.txt @@ -0,0 +1 @@ +இடிபறவை என்பது 100% திறந்த மூலமாகும், தனியுரிமை கவனம் செலுத்திய மின்னஞ்சல் பயன்பாடு. diff --git a/app-metadata/net.thunderbird.android/ta-IN/title.txt b/app-metadata/net.thunderbird.android/ta-IN/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..3cf629974159c75d6e9089b58a47f6bc14ea20d4 --- /dev/null +++ b/app-metadata/net.thunderbird.android/ta-IN/title.txt @@ -0,0 +1 @@ +இடிபறவை: உங்கள் உள்பெட்டி விடுவி diff --git a/app-thunderbird/build.gradle.kts b/app-thunderbird/build.gradle.kts index 08a5d9c6706023369e769cca9b8322df849345ba..73a16b952356c48ca921e3c2134606a44c7c124c 100644 --- a/app-thunderbird/build.gradle.kts +++ b/app-thunderbird/build.gradle.kts @@ -1,10 +1,7 @@ -import javax.xml.parsers.DocumentBuilderFactory -import javax.xml.xpath.XPathConstants -import javax.xml.xpath.XPathFactory - plugins { id(ThunderbirdPlugins.App.androidCompose) alias(libs.plugins.dependency.guard) + id("thunderbird.app.version.info") id("thunderbird.quality.badging") } @@ -21,7 +18,7 @@ android { testApplicationId = "net.thunderbird.android.tests" versionCode = 13 - versionName = "10.0" + versionName = "11.0" // Keep in sync with the resource string array "supported_languages" resourceConfigurations.addAll( @@ -121,7 +118,7 @@ android { signingConfig = signingConfigs.getByType(SigningType.TB_BETA) applicationIdSuffix = ".beta" - versionNameSuffix = "b2" + versionNameSuffix = "b1" isMinifyEnabled = true isShrinkResources = true @@ -214,7 +211,10 @@ dependencies { implementation(projects.core.featureflags) + implementation(projects.feature.account.settings.impl) + implementation(projects.feature.widget.messageList) + implementation(projects.feature.widget.messageListGlance) implementation(projects.feature.widget.shortcut) implementation(projects.feature.widget.unread) @@ -244,10 +244,6 @@ dependencies { releaseImplementation(libs.appauth) testImplementation(libs.robolectric) - - // Required for DependencyInjectionTest to be able to resolve OpenPgpApiManager - testImplementation(projects.plugins.openpgpApiLib.openpgpApi) - testImplementation(projects.feature.account.setup) } dependencyGuard { @@ -270,45 +266,3 @@ tasks.register("printConfigurations") { } } } - -tasks.register("printVersionInfo") { - val targetBuildType = project.findProperty("buildType") ?: "debug" - val targetFlavorName = project.findProperty("flavorName") ?: "full" - - doLast { - android.applicationVariants.all { variant -> - if (variant.buildType.name == targetBuildType && variant.flavorName == targetFlavorName) { - val flavor = variant.mergedFlavor - - var buildTypeSource = android.sourceSets.getByName(targetBuildType).res.srcDirs.first() - var stringsXmlFile = File(buildTypeSource, "values/strings.xml") - if (!stringsXmlFile.exists()) { - buildTypeSource = android.sourceSets.getByName("main").res.srcDirs.first() - stringsXmlFile = File(buildTypeSource, "values/strings.xml") - } - - val xmlDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stringsXmlFile) - val xPath = XPathFactory.newInstance().newXPath() - val expression = "/resources/string[@name='app_name']/text()" - val appName = xPath.evaluate(expression, xmlDocument, XPathConstants.STRING) as String - - val output = """ - APPLICATION_ID=${variant.applicationId} - APPLICATION_LABEL=$appName - VERSION_CODE=${flavor.versionCode} - VERSION_NAME=${flavor.versionName} - VERSION_NAME_SUFFIX=${variant.buildType.versionNameSuffix ?: ""} - FULL_VERSION_NAME=${flavor.versionName}${variant.buildType.versionNameSuffix ?: ""} - """.trimIndent() - - println(output) - val githubOutput = System.getenv("GITHUB_OUTPUT") - if (githubOutput != null) { - val outputFile = File(githubOutput) - outputFile.writeText(output + "\n") - } - } - true - } - } -} diff --git a/app-thunderbird/dependencies/fossBetaRuntimeClasspath.txt b/app-thunderbird/dependencies/fossBetaRuntimeClasspath.txt index 4f62e3414485f66b270d456bfd0a8ab67af11407..401ecc6d344f7dbf5f41b9294099a3cc763837a4 100644 --- a/app-thunderbird/dependencies/fossBetaRuntimeClasspath.txt +++ b/app-thunderbird/dependencies/fossBetaRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 androidx.annotation:annotation-experimental:1.4.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 @@ -11,70 +11,87 @@ androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 androidx.biometric:biometric:1.1.0 androidx.browser:browser:1.3.0 -androidx.camera:camera-camera2:1.4.0 -androidx.camera:camera-core:1.4.0 -androidx.camera:camera-lifecycle:1.4.0 -androidx.camera:camera-video:1.4.0 -androidx.camera:camera-view:1.4.0 +androidx.camera:camera-camera2:1.4.1 +androidx.camera:camera-core:1.4.1 +androidx.camera:camera-lifecycle:1.4.1 +androidx.camera:camera-video:1.4.1 +androidx.camera:camera-view:1.4.1 androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 -androidx.compose.animation:animation-android:1.7.5 -androidx.compose.animation:animation-core-android:1.7.5 -androidx.compose.animation:animation-core:1.7.5 -androidx.compose.animation:animation:1.7.5 -androidx.compose.foundation:foundation-android:1.7.5 -androidx.compose.foundation:foundation-layout-android:1.7.5 -androidx.compose.foundation:foundation-layout:1.7.5 -androidx.compose.foundation:foundation:1.7.5 +androidx.compose.animation:animation-android:1.7.8 +androidx.compose.animation:animation-core-android:1.7.8 +androidx.compose.animation:animation-core:1.7.8 +androidx.compose.animation:animation:1.7.8 +androidx.compose.foundation:foundation-android:1.7.8 +androidx.compose.foundation:foundation-layout-android:1.7.8 +androidx.compose.foundation:foundation-layout:1.7.8 +androidx.compose.foundation:foundation:1.7.8 +androidx.compose.material3.adaptive:adaptive-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation:1.0.0 +androidx.compose.material3.adaptive:adaptive:1.0.0 androidx.compose.material3:material3-android:1.3.1 androidx.compose.material3:material3:1.3.1 -androidx.compose.material:material-icons-core-android:1.7.5 -androidx.compose.material:material-icons-core:1.7.5 -androidx.compose.material:material-icons-extended-android:1.7.5 -androidx.compose.material:material-icons-extended:1.7.5 -androidx.compose.material:material-ripple-android:1.7.5 -androidx.compose.material:material-ripple:1.7.5 -androidx.compose.runtime:runtime-android:1.7.5 -androidx.compose.runtime:runtime-saveable-android:1.7.5 -androidx.compose.runtime:runtime-saveable:1.7.5 -androidx.compose.runtime:runtime:1.7.5 -androidx.compose.ui:ui-android:1.7.5 -androidx.compose.ui:ui-geometry-android:1.7.5 -androidx.compose.ui:ui-geometry:1.7.5 -androidx.compose.ui:ui-graphics-android:1.7.5 -androidx.compose.ui:ui-graphics:1.7.5 -androidx.compose.ui:ui-text-android:1.7.5 -androidx.compose.ui:ui-text:1.7.5 -androidx.compose.ui:ui-tooling-preview-android:1.7.5 -androidx.compose.ui:ui-tooling-preview:1.7.5 -androidx.compose.ui:ui-unit-android:1.7.5 -androidx.compose.ui:ui-unit:1.7.5 -androidx.compose.ui:ui-util-android:1.7.5 -androidx.compose.ui:ui-util:1.7.5 -androidx.compose.ui:ui:1.7.5 -androidx.compose:compose-bom:2024.11.00 +androidx.compose.material:material-icons-core-android:1.7.8 +androidx.compose.material:material-icons-core:1.7.8 +androidx.compose.material:material-icons-extended-android:1.7.8 +androidx.compose.material:material-icons-extended:1.7.8 +androidx.compose.material:material-ripple-android:1.7.8 +androidx.compose.material:material-ripple:1.7.8 +androidx.compose.runtime:runtime-android:1.7.8 +androidx.compose.runtime:runtime-saveable-android:1.7.8 +androidx.compose.runtime:runtime-saveable:1.7.8 +androidx.compose.runtime:runtime:1.7.8 +androidx.compose.ui:ui-android:1.7.8 +androidx.compose.ui:ui-geometry-android:1.7.8 +androidx.compose.ui:ui-geometry:1.7.8 +androidx.compose.ui:ui-graphics-android:1.7.8 +androidx.compose.ui:ui-graphics:1.7.8 +androidx.compose.ui:ui-text-android:1.7.8 +androidx.compose.ui:ui-text:1.7.8 +androidx.compose.ui:ui-tooling-preview-android:1.7.8 +androidx.compose.ui:ui-tooling-preview:1.7.8 +androidx.compose.ui:ui-unit-android:1.7.8 +androidx.compose.ui:ui-unit:1.7.8 +androidx.compose.ui:ui-util-android:1.7.8 +androidx.compose.ui:ui-util:1.7.8 +androidx.compose.ui:ui:1.7.8 +androidx.compose:compose-bom:2025.02.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.constraintlayout:constraintlayout-core:1.1.0 -androidx.constraintlayout:constraintlayout:2.2.0 -androidx.coordinatorlayout:coordinatorlayout:1.2.0 +androidx.constraintlayout:constraintlayout-core:1.1.1 +androidx.constraintlayout:constraintlayout:2.2.1 +androidx.coordinatorlayout:coordinatorlayout:1.3.0 androidx.core:core-ktx:1.15.0 +androidx.core:core-remoteviews:1.1.0 androidx.core:core-splashscreen:1.0.1 +androidx.core:core-viewtree:1.0.0 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 androidx.emoji2:emoji2:1.3.0 androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.5 -androidx.fragment:fragment-ktx:1.8.5 -androidx.fragment:fragment:1.8.5 +androidx.fragment:fragment-compose:1.8.6 +androidx.fragment:fragment-ktx:1.8.6 +androidx.fragment:fragment:1.8.6 +androidx.glance:glance-appwidget-external-protobuf:1.1.1 +androidx.glance:glance-appwidget-proto:1.1.1 +androidx.glance:glance-appwidget:1.1.1 +androidx.glance:glance-material3:1.1.1 +androidx.glance:glance:1.1.1 androidx.graphics:graphics-path:1.0.1 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 @@ -101,17 +118,17 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.4 -androidx.navigation:navigation-common:2.8.4 -androidx.navigation:navigation-compose:2.8.4 -androidx.navigation:navigation-fragment:2.8.4 -androidx.navigation:navigation-runtime-ktx:2.8.4 -androidx.navigation:navigation-runtime:2.8.4 -androidx.navigation:navigation-ui:2.8.4 +androidx.navigation:navigation-common-ktx:2.8.8 +androidx.navigation:navigation-common:2.8.8 +androidx.navigation:navigation-compose:2.8.8 +androidx.navigation:navigation-fragment:2.8.8 +androidx.navigation:navigation-runtime-ktx:2.8.8 +androidx.navigation:navigation-runtime:2.8.8 +androidx.navigation:navigation-ui:2.8.8 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 -androidx.recyclerview:recyclerview:1.3.2 +androidx.recyclerview:recyclerview:1.4.0 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 @@ -131,7 +148,12 @@ androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 -androidx.window:window:1.0.0 +androidx.webkit:webkit:1.13.0 +androidx.window.extensions.core:core:1.0.0 +androidx.window:window-core-android:1.3.0 +androidx.window:window-core:1.3.0 +androidx.window:window:1.3.0 +androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -145,10 +167,10 @@ com.github.bumptech.glide:annotations:4.16.0 com.github.bumptech.glide:disklrucache:4.16.0 com.github.bumptech.glide:gifdecoder:4.16.0 com.github.bumptech.glide:glide:4.16.0 -com.github.skydoves:landscapist-android:2.4.4 -com.github.skydoves:landscapist-coil3-android:2.4.4 -com.github.skydoves:landscapist-coil3:2.4.4 -com.github.skydoves:landscapist:2.4.4 +com.github.skydoves:landscapist-android:2.4.7 +com.github.skydoves:landscapist-coil3-android:2.4.7 +com.github.skydoves:landscapist-coil3:2.4.7 +com.github.skydoves:landscapist:2.4.7 com.google.android.flexbox:flexbox:3.0.0 com.google.android.material:material:1.12.0 com.google.auto.value:auto-value-annotations:1.6.3 @@ -162,27 +184,27 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0 com.mikepenz:fastadapter-extensions-swipe:5.7.0 com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 -com.squareup.moshi:moshi:1.15.1 +com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.9.1 -com.squareup.okio:okio:3.9.1 +com.squareup.okio:okio-jvm:3.10.2 +com.squareup.okio:okio:3.10.2 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 com.takisoft.preferencex:preferencex-datetimepicker:1.1.0 com.takisoft.preferencex:preferencex:1.1.0 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.18.0 de.cketti.library.changelog:ckchangelog-core:2.0.0-beta02 de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0 de.hdodenhof:circleimageview:3.1.0 -io.coil-kt.coil3:coil-android:3.0.4 -io.coil-kt.coil3:coil-core-android:3.0.4 -io.coil-kt.coil3:coil-core:3.0.4 -io.coil-kt.coil3:coil-network-core-android:3.0.4 -io.coil-kt.coil3:coil-network-core:3.0.4 -io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4 -io.coil-kt.coil3:coil-network-okhttp:3.0.4 -io.coil-kt.coil3:coil:3.0.4 +io.coil-kt.coil3:coil-android:3.1.0 +io.coil-kt.coil3:coil-core-android:3.1.0 +io.coil-kt.coil3:coil-core:3.1.0 +io.coil-kt.coil3:coil-network-core-android:3.1.0 +io.coil-kt.coil3:coil-network-core:3.1.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0 +io.coil-kt.coil3:coil-network-okhttp:3.1.0 +io.coil-kt.coil3:coil:3.1.0 io.insert-koin:koin-android:3.5.6 io.insert-koin:koin-androidx-compose:3.5.6 io.insert-koin:koin-bom:3.5.6 @@ -194,55 +216,56 @@ net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 org.apache.commons:commons-text:1.3 -org.apache.httpcomponents.client5:httpclient5:5.4.1 -org.apache.httpcomponents.core5:httpcore5-h2:5.3.1 -org.apache.httpcomponents.core5:httpcore5:5.3.1 -org.apache.james:apache-mime4j-core:0.8.9 -org.apache.james:apache-mime4j-dom:0.8.9 +org.apache.httpcomponents.client5:httpclient5:5.4.2 +org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 +org.apache.httpcomponents.core5:httpcore5:5.3.3 +org.apache.james:apache-mime4j-core:0.8.12 +org.apache.james:apache-mime4j-dom:0.8.12 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4 -org.jetbrains.compose.animation:animation-core:1.7.1 -org.jetbrains.compose.animation:animation:1.7.1 -org.jetbrains.compose.annotation-internal:annotation:1.7.1 -org.jetbrains.compose.collection-internal:collection:1.7.1 -org.jetbrains.compose.components:components-resources-android:1.7.1 -org.jetbrains.compose.components:components-resources:1.7.1 -org.jetbrains.compose.foundation:foundation-layout:1.7.1 -org.jetbrains.compose.foundation:foundation:1.7.1 -org.jetbrains.compose.runtime:runtime-saveable:1.7.1 -org.jetbrains.compose.runtime:runtime:1.7.1 -org.jetbrains.compose.ui:ui-geometry:1.7.1 -org.jetbrains.compose.ui:ui-graphics:1.7.1 -org.jetbrains.compose.ui:ui-text:1.7.1 -org.jetbrains.compose.ui:ui-unit:1.7.1 -org.jetbrains.compose.ui:ui-util:1.7.1 -org.jetbrains.compose.ui:ui:1.7.1 -org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-bom:2.1.0 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib:2.1.0 +org.jetbrains.compose.animation:animation-core:1.7.3 +org.jetbrains.compose.animation:animation:1.7.3 +org.jetbrains.compose.annotation-internal:annotation:1.7.3 +org.jetbrains.compose.collection-internal:collection:1.7.3 +org.jetbrains.compose.components:components-resources-android:1.7.3 +org.jetbrains.compose.components:components-resources:1.7.3 +org.jetbrains.compose.foundation:foundation-layout:1.7.3 +org.jetbrains.compose.foundation:foundation:1.7.3 +org.jetbrains.compose.runtime:runtime-saveable:1.7.3 +org.jetbrains.compose.runtime:runtime:1.7.3 +org.jetbrains.compose.ui:ui-geometry:1.7.3 +org.jetbrains.compose.ui:ui-graphics:1.7.3 +org.jetbrains.compose.ui:ui-text:1.7.3 +org.jetbrains.compose.ui:ui-unit:1.7.3 +org.jetbrains.compose.ui:ui-util:1.7.3 +org.jetbrains.compose.ui:ui:1.7.3 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-bom:2.1.10 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib:2.1.10 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 -org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -org.jetbrains:annotations:26.0.1 -org.jsoup:jsoup:1.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 +org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 +org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains:annotations:26.0.2 +org.jsoup:jsoup:1.19.1 +org.jspecify:jspecify:1.0.0 org.minidns:minidns-client:1.0.5 org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 diff --git a/app-thunderbird/dependencies/fossDailyRuntimeClasspath.txt b/app-thunderbird/dependencies/fossDailyRuntimeClasspath.txt index 4f62e3414485f66b270d456bfd0a8ab67af11407..401ecc6d344f7dbf5f41b9294099a3cc763837a4 100644 --- a/app-thunderbird/dependencies/fossDailyRuntimeClasspath.txt +++ b/app-thunderbird/dependencies/fossDailyRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 androidx.annotation:annotation-experimental:1.4.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 @@ -11,70 +11,87 @@ androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 androidx.biometric:biometric:1.1.0 androidx.browser:browser:1.3.0 -androidx.camera:camera-camera2:1.4.0 -androidx.camera:camera-core:1.4.0 -androidx.camera:camera-lifecycle:1.4.0 -androidx.camera:camera-video:1.4.0 -androidx.camera:camera-view:1.4.0 +androidx.camera:camera-camera2:1.4.1 +androidx.camera:camera-core:1.4.1 +androidx.camera:camera-lifecycle:1.4.1 +androidx.camera:camera-video:1.4.1 +androidx.camera:camera-view:1.4.1 androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 -androidx.compose.animation:animation-android:1.7.5 -androidx.compose.animation:animation-core-android:1.7.5 -androidx.compose.animation:animation-core:1.7.5 -androidx.compose.animation:animation:1.7.5 -androidx.compose.foundation:foundation-android:1.7.5 -androidx.compose.foundation:foundation-layout-android:1.7.5 -androidx.compose.foundation:foundation-layout:1.7.5 -androidx.compose.foundation:foundation:1.7.5 +androidx.compose.animation:animation-android:1.7.8 +androidx.compose.animation:animation-core-android:1.7.8 +androidx.compose.animation:animation-core:1.7.8 +androidx.compose.animation:animation:1.7.8 +androidx.compose.foundation:foundation-android:1.7.8 +androidx.compose.foundation:foundation-layout-android:1.7.8 +androidx.compose.foundation:foundation-layout:1.7.8 +androidx.compose.foundation:foundation:1.7.8 +androidx.compose.material3.adaptive:adaptive-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation:1.0.0 +androidx.compose.material3.adaptive:adaptive:1.0.0 androidx.compose.material3:material3-android:1.3.1 androidx.compose.material3:material3:1.3.1 -androidx.compose.material:material-icons-core-android:1.7.5 -androidx.compose.material:material-icons-core:1.7.5 -androidx.compose.material:material-icons-extended-android:1.7.5 -androidx.compose.material:material-icons-extended:1.7.5 -androidx.compose.material:material-ripple-android:1.7.5 -androidx.compose.material:material-ripple:1.7.5 -androidx.compose.runtime:runtime-android:1.7.5 -androidx.compose.runtime:runtime-saveable-android:1.7.5 -androidx.compose.runtime:runtime-saveable:1.7.5 -androidx.compose.runtime:runtime:1.7.5 -androidx.compose.ui:ui-android:1.7.5 -androidx.compose.ui:ui-geometry-android:1.7.5 -androidx.compose.ui:ui-geometry:1.7.5 -androidx.compose.ui:ui-graphics-android:1.7.5 -androidx.compose.ui:ui-graphics:1.7.5 -androidx.compose.ui:ui-text-android:1.7.5 -androidx.compose.ui:ui-text:1.7.5 -androidx.compose.ui:ui-tooling-preview-android:1.7.5 -androidx.compose.ui:ui-tooling-preview:1.7.5 -androidx.compose.ui:ui-unit-android:1.7.5 -androidx.compose.ui:ui-unit:1.7.5 -androidx.compose.ui:ui-util-android:1.7.5 -androidx.compose.ui:ui-util:1.7.5 -androidx.compose.ui:ui:1.7.5 -androidx.compose:compose-bom:2024.11.00 +androidx.compose.material:material-icons-core-android:1.7.8 +androidx.compose.material:material-icons-core:1.7.8 +androidx.compose.material:material-icons-extended-android:1.7.8 +androidx.compose.material:material-icons-extended:1.7.8 +androidx.compose.material:material-ripple-android:1.7.8 +androidx.compose.material:material-ripple:1.7.8 +androidx.compose.runtime:runtime-android:1.7.8 +androidx.compose.runtime:runtime-saveable-android:1.7.8 +androidx.compose.runtime:runtime-saveable:1.7.8 +androidx.compose.runtime:runtime:1.7.8 +androidx.compose.ui:ui-android:1.7.8 +androidx.compose.ui:ui-geometry-android:1.7.8 +androidx.compose.ui:ui-geometry:1.7.8 +androidx.compose.ui:ui-graphics-android:1.7.8 +androidx.compose.ui:ui-graphics:1.7.8 +androidx.compose.ui:ui-text-android:1.7.8 +androidx.compose.ui:ui-text:1.7.8 +androidx.compose.ui:ui-tooling-preview-android:1.7.8 +androidx.compose.ui:ui-tooling-preview:1.7.8 +androidx.compose.ui:ui-unit-android:1.7.8 +androidx.compose.ui:ui-unit:1.7.8 +androidx.compose.ui:ui-util-android:1.7.8 +androidx.compose.ui:ui-util:1.7.8 +androidx.compose.ui:ui:1.7.8 +androidx.compose:compose-bom:2025.02.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.constraintlayout:constraintlayout-core:1.1.0 -androidx.constraintlayout:constraintlayout:2.2.0 -androidx.coordinatorlayout:coordinatorlayout:1.2.0 +androidx.constraintlayout:constraintlayout-core:1.1.1 +androidx.constraintlayout:constraintlayout:2.2.1 +androidx.coordinatorlayout:coordinatorlayout:1.3.0 androidx.core:core-ktx:1.15.0 +androidx.core:core-remoteviews:1.1.0 androidx.core:core-splashscreen:1.0.1 +androidx.core:core-viewtree:1.0.0 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 androidx.emoji2:emoji2:1.3.0 androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.5 -androidx.fragment:fragment-ktx:1.8.5 -androidx.fragment:fragment:1.8.5 +androidx.fragment:fragment-compose:1.8.6 +androidx.fragment:fragment-ktx:1.8.6 +androidx.fragment:fragment:1.8.6 +androidx.glance:glance-appwidget-external-protobuf:1.1.1 +androidx.glance:glance-appwidget-proto:1.1.1 +androidx.glance:glance-appwidget:1.1.1 +androidx.glance:glance-material3:1.1.1 +androidx.glance:glance:1.1.1 androidx.graphics:graphics-path:1.0.1 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 @@ -101,17 +118,17 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.4 -androidx.navigation:navigation-common:2.8.4 -androidx.navigation:navigation-compose:2.8.4 -androidx.navigation:navigation-fragment:2.8.4 -androidx.navigation:navigation-runtime-ktx:2.8.4 -androidx.navigation:navigation-runtime:2.8.4 -androidx.navigation:navigation-ui:2.8.4 +androidx.navigation:navigation-common-ktx:2.8.8 +androidx.navigation:navigation-common:2.8.8 +androidx.navigation:navigation-compose:2.8.8 +androidx.navigation:navigation-fragment:2.8.8 +androidx.navigation:navigation-runtime-ktx:2.8.8 +androidx.navigation:navigation-runtime:2.8.8 +androidx.navigation:navigation-ui:2.8.8 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 -androidx.recyclerview:recyclerview:1.3.2 +androidx.recyclerview:recyclerview:1.4.0 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 @@ -131,7 +148,12 @@ androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 -androidx.window:window:1.0.0 +androidx.webkit:webkit:1.13.0 +androidx.window.extensions.core:core:1.0.0 +androidx.window:window-core-android:1.3.0 +androidx.window:window-core:1.3.0 +androidx.window:window:1.3.0 +androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -145,10 +167,10 @@ com.github.bumptech.glide:annotations:4.16.0 com.github.bumptech.glide:disklrucache:4.16.0 com.github.bumptech.glide:gifdecoder:4.16.0 com.github.bumptech.glide:glide:4.16.0 -com.github.skydoves:landscapist-android:2.4.4 -com.github.skydoves:landscapist-coil3-android:2.4.4 -com.github.skydoves:landscapist-coil3:2.4.4 -com.github.skydoves:landscapist:2.4.4 +com.github.skydoves:landscapist-android:2.4.7 +com.github.skydoves:landscapist-coil3-android:2.4.7 +com.github.skydoves:landscapist-coil3:2.4.7 +com.github.skydoves:landscapist:2.4.7 com.google.android.flexbox:flexbox:3.0.0 com.google.android.material:material:1.12.0 com.google.auto.value:auto-value-annotations:1.6.3 @@ -162,27 +184,27 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0 com.mikepenz:fastadapter-extensions-swipe:5.7.0 com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 -com.squareup.moshi:moshi:1.15.1 +com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.9.1 -com.squareup.okio:okio:3.9.1 +com.squareup.okio:okio-jvm:3.10.2 +com.squareup.okio:okio:3.10.2 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 com.takisoft.preferencex:preferencex-datetimepicker:1.1.0 com.takisoft.preferencex:preferencex:1.1.0 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.18.0 de.cketti.library.changelog:ckchangelog-core:2.0.0-beta02 de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0 de.hdodenhof:circleimageview:3.1.0 -io.coil-kt.coil3:coil-android:3.0.4 -io.coil-kt.coil3:coil-core-android:3.0.4 -io.coil-kt.coil3:coil-core:3.0.4 -io.coil-kt.coil3:coil-network-core-android:3.0.4 -io.coil-kt.coil3:coil-network-core:3.0.4 -io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4 -io.coil-kt.coil3:coil-network-okhttp:3.0.4 -io.coil-kt.coil3:coil:3.0.4 +io.coil-kt.coil3:coil-android:3.1.0 +io.coil-kt.coil3:coil-core-android:3.1.0 +io.coil-kt.coil3:coil-core:3.1.0 +io.coil-kt.coil3:coil-network-core-android:3.1.0 +io.coil-kt.coil3:coil-network-core:3.1.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0 +io.coil-kt.coil3:coil-network-okhttp:3.1.0 +io.coil-kt.coil3:coil:3.1.0 io.insert-koin:koin-android:3.5.6 io.insert-koin:koin-androidx-compose:3.5.6 io.insert-koin:koin-bom:3.5.6 @@ -194,55 +216,56 @@ net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 org.apache.commons:commons-text:1.3 -org.apache.httpcomponents.client5:httpclient5:5.4.1 -org.apache.httpcomponents.core5:httpcore5-h2:5.3.1 -org.apache.httpcomponents.core5:httpcore5:5.3.1 -org.apache.james:apache-mime4j-core:0.8.9 -org.apache.james:apache-mime4j-dom:0.8.9 +org.apache.httpcomponents.client5:httpclient5:5.4.2 +org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 +org.apache.httpcomponents.core5:httpcore5:5.3.3 +org.apache.james:apache-mime4j-core:0.8.12 +org.apache.james:apache-mime4j-dom:0.8.12 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4 -org.jetbrains.compose.animation:animation-core:1.7.1 -org.jetbrains.compose.animation:animation:1.7.1 -org.jetbrains.compose.annotation-internal:annotation:1.7.1 -org.jetbrains.compose.collection-internal:collection:1.7.1 -org.jetbrains.compose.components:components-resources-android:1.7.1 -org.jetbrains.compose.components:components-resources:1.7.1 -org.jetbrains.compose.foundation:foundation-layout:1.7.1 -org.jetbrains.compose.foundation:foundation:1.7.1 -org.jetbrains.compose.runtime:runtime-saveable:1.7.1 -org.jetbrains.compose.runtime:runtime:1.7.1 -org.jetbrains.compose.ui:ui-geometry:1.7.1 -org.jetbrains.compose.ui:ui-graphics:1.7.1 -org.jetbrains.compose.ui:ui-text:1.7.1 -org.jetbrains.compose.ui:ui-unit:1.7.1 -org.jetbrains.compose.ui:ui-util:1.7.1 -org.jetbrains.compose.ui:ui:1.7.1 -org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-bom:2.1.0 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib:2.1.0 +org.jetbrains.compose.animation:animation-core:1.7.3 +org.jetbrains.compose.animation:animation:1.7.3 +org.jetbrains.compose.annotation-internal:annotation:1.7.3 +org.jetbrains.compose.collection-internal:collection:1.7.3 +org.jetbrains.compose.components:components-resources-android:1.7.3 +org.jetbrains.compose.components:components-resources:1.7.3 +org.jetbrains.compose.foundation:foundation-layout:1.7.3 +org.jetbrains.compose.foundation:foundation:1.7.3 +org.jetbrains.compose.runtime:runtime-saveable:1.7.3 +org.jetbrains.compose.runtime:runtime:1.7.3 +org.jetbrains.compose.ui:ui-geometry:1.7.3 +org.jetbrains.compose.ui:ui-graphics:1.7.3 +org.jetbrains.compose.ui:ui-text:1.7.3 +org.jetbrains.compose.ui:ui-unit:1.7.3 +org.jetbrains.compose.ui:ui-util:1.7.3 +org.jetbrains.compose.ui:ui:1.7.3 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-bom:2.1.10 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib:2.1.10 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 -org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -org.jetbrains:annotations:26.0.1 -org.jsoup:jsoup:1.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 +org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 +org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains:annotations:26.0.2 +org.jsoup:jsoup:1.19.1 +org.jspecify:jspecify:1.0.0 org.minidns:minidns-client:1.0.5 org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 diff --git a/app-thunderbird/dependencies/fossReleaseRuntimeClasspath.txt b/app-thunderbird/dependencies/fossReleaseRuntimeClasspath.txt index 4f62e3414485f66b270d456bfd0a8ab67af11407..401ecc6d344f7dbf5f41b9294099a3cc763837a4 100644 --- a/app-thunderbird/dependencies/fossReleaseRuntimeClasspath.txt +++ b/app-thunderbird/dependencies/fossReleaseRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 androidx.annotation:annotation-experimental:1.4.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 @@ -11,70 +11,87 @@ androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 androidx.biometric:biometric:1.1.0 androidx.browser:browser:1.3.0 -androidx.camera:camera-camera2:1.4.0 -androidx.camera:camera-core:1.4.0 -androidx.camera:camera-lifecycle:1.4.0 -androidx.camera:camera-video:1.4.0 -androidx.camera:camera-view:1.4.0 +androidx.camera:camera-camera2:1.4.1 +androidx.camera:camera-core:1.4.1 +androidx.camera:camera-lifecycle:1.4.1 +androidx.camera:camera-video:1.4.1 +androidx.camera:camera-view:1.4.1 androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 -androidx.compose.animation:animation-android:1.7.5 -androidx.compose.animation:animation-core-android:1.7.5 -androidx.compose.animation:animation-core:1.7.5 -androidx.compose.animation:animation:1.7.5 -androidx.compose.foundation:foundation-android:1.7.5 -androidx.compose.foundation:foundation-layout-android:1.7.5 -androidx.compose.foundation:foundation-layout:1.7.5 -androidx.compose.foundation:foundation:1.7.5 +androidx.compose.animation:animation-android:1.7.8 +androidx.compose.animation:animation-core-android:1.7.8 +androidx.compose.animation:animation-core:1.7.8 +androidx.compose.animation:animation:1.7.8 +androidx.compose.foundation:foundation-android:1.7.8 +androidx.compose.foundation:foundation-layout-android:1.7.8 +androidx.compose.foundation:foundation-layout:1.7.8 +androidx.compose.foundation:foundation:1.7.8 +androidx.compose.material3.adaptive:adaptive-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation:1.0.0 +androidx.compose.material3.adaptive:adaptive:1.0.0 androidx.compose.material3:material3-android:1.3.1 androidx.compose.material3:material3:1.3.1 -androidx.compose.material:material-icons-core-android:1.7.5 -androidx.compose.material:material-icons-core:1.7.5 -androidx.compose.material:material-icons-extended-android:1.7.5 -androidx.compose.material:material-icons-extended:1.7.5 -androidx.compose.material:material-ripple-android:1.7.5 -androidx.compose.material:material-ripple:1.7.5 -androidx.compose.runtime:runtime-android:1.7.5 -androidx.compose.runtime:runtime-saveable-android:1.7.5 -androidx.compose.runtime:runtime-saveable:1.7.5 -androidx.compose.runtime:runtime:1.7.5 -androidx.compose.ui:ui-android:1.7.5 -androidx.compose.ui:ui-geometry-android:1.7.5 -androidx.compose.ui:ui-geometry:1.7.5 -androidx.compose.ui:ui-graphics-android:1.7.5 -androidx.compose.ui:ui-graphics:1.7.5 -androidx.compose.ui:ui-text-android:1.7.5 -androidx.compose.ui:ui-text:1.7.5 -androidx.compose.ui:ui-tooling-preview-android:1.7.5 -androidx.compose.ui:ui-tooling-preview:1.7.5 -androidx.compose.ui:ui-unit-android:1.7.5 -androidx.compose.ui:ui-unit:1.7.5 -androidx.compose.ui:ui-util-android:1.7.5 -androidx.compose.ui:ui-util:1.7.5 -androidx.compose.ui:ui:1.7.5 -androidx.compose:compose-bom:2024.11.00 +androidx.compose.material:material-icons-core-android:1.7.8 +androidx.compose.material:material-icons-core:1.7.8 +androidx.compose.material:material-icons-extended-android:1.7.8 +androidx.compose.material:material-icons-extended:1.7.8 +androidx.compose.material:material-ripple-android:1.7.8 +androidx.compose.material:material-ripple:1.7.8 +androidx.compose.runtime:runtime-android:1.7.8 +androidx.compose.runtime:runtime-saveable-android:1.7.8 +androidx.compose.runtime:runtime-saveable:1.7.8 +androidx.compose.runtime:runtime:1.7.8 +androidx.compose.ui:ui-android:1.7.8 +androidx.compose.ui:ui-geometry-android:1.7.8 +androidx.compose.ui:ui-geometry:1.7.8 +androidx.compose.ui:ui-graphics-android:1.7.8 +androidx.compose.ui:ui-graphics:1.7.8 +androidx.compose.ui:ui-text-android:1.7.8 +androidx.compose.ui:ui-text:1.7.8 +androidx.compose.ui:ui-tooling-preview-android:1.7.8 +androidx.compose.ui:ui-tooling-preview:1.7.8 +androidx.compose.ui:ui-unit-android:1.7.8 +androidx.compose.ui:ui-unit:1.7.8 +androidx.compose.ui:ui-util-android:1.7.8 +androidx.compose.ui:ui-util:1.7.8 +androidx.compose.ui:ui:1.7.8 +androidx.compose:compose-bom:2025.02.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.constraintlayout:constraintlayout-core:1.1.0 -androidx.constraintlayout:constraintlayout:2.2.0 -androidx.coordinatorlayout:coordinatorlayout:1.2.0 +androidx.constraintlayout:constraintlayout-core:1.1.1 +androidx.constraintlayout:constraintlayout:2.2.1 +androidx.coordinatorlayout:coordinatorlayout:1.3.0 androidx.core:core-ktx:1.15.0 +androidx.core:core-remoteviews:1.1.0 androidx.core:core-splashscreen:1.0.1 +androidx.core:core-viewtree:1.0.0 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 androidx.emoji2:emoji2:1.3.0 androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.5 -androidx.fragment:fragment-ktx:1.8.5 -androidx.fragment:fragment:1.8.5 +androidx.fragment:fragment-compose:1.8.6 +androidx.fragment:fragment-ktx:1.8.6 +androidx.fragment:fragment:1.8.6 +androidx.glance:glance-appwidget-external-protobuf:1.1.1 +androidx.glance:glance-appwidget-proto:1.1.1 +androidx.glance:glance-appwidget:1.1.1 +androidx.glance:glance-material3:1.1.1 +androidx.glance:glance:1.1.1 androidx.graphics:graphics-path:1.0.1 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 @@ -101,17 +118,17 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.4 -androidx.navigation:navigation-common:2.8.4 -androidx.navigation:navigation-compose:2.8.4 -androidx.navigation:navigation-fragment:2.8.4 -androidx.navigation:navigation-runtime-ktx:2.8.4 -androidx.navigation:navigation-runtime:2.8.4 -androidx.navigation:navigation-ui:2.8.4 +androidx.navigation:navigation-common-ktx:2.8.8 +androidx.navigation:navigation-common:2.8.8 +androidx.navigation:navigation-compose:2.8.8 +androidx.navigation:navigation-fragment:2.8.8 +androidx.navigation:navigation-runtime-ktx:2.8.8 +androidx.navigation:navigation-runtime:2.8.8 +androidx.navigation:navigation-ui:2.8.8 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 -androidx.recyclerview:recyclerview:1.3.2 +androidx.recyclerview:recyclerview:1.4.0 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 @@ -131,7 +148,12 @@ androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 -androidx.window:window:1.0.0 +androidx.webkit:webkit:1.13.0 +androidx.window.extensions.core:core:1.0.0 +androidx.window:window-core-android:1.3.0 +androidx.window:window-core:1.3.0 +androidx.window:window:1.3.0 +androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -145,10 +167,10 @@ com.github.bumptech.glide:annotations:4.16.0 com.github.bumptech.glide:disklrucache:4.16.0 com.github.bumptech.glide:gifdecoder:4.16.0 com.github.bumptech.glide:glide:4.16.0 -com.github.skydoves:landscapist-android:2.4.4 -com.github.skydoves:landscapist-coil3-android:2.4.4 -com.github.skydoves:landscapist-coil3:2.4.4 -com.github.skydoves:landscapist:2.4.4 +com.github.skydoves:landscapist-android:2.4.7 +com.github.skydoves:landscapist-coil3-android:2.4.7 +com.github.skydoves:landscapist-coil3:2.4.7 +com.github.skydoves:landscapist:2.4.7 com.google.android.flexbox:flexbox:3.0.0 com.google.android.material:material:1.12.0 com.google.auto.value:auto-value-annotations:1.6.3 @@ -162,27 +184,27 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0 com.mikepenz:fastadapter-extensions-swipe:5.7.0 com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 -com.squareup.moshi:moshi:1.15.1 +com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.9.1 -com.squareup.okio:okio:3.9.1 +com.squareup.okio:okio-jvm:3.10.2 +com.squareup.okio:okio:3.10.2 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 com.takisoft.preferencex:preferencex-datetimepicker:1.1.0 com.takisoft.preferencex:preferencex:1.1.0 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.18.0 de.cketti.library.changelog:ckchangelog-core:2.0.0-beta02 de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0 de.hdodenhof:circleimageview:3.1.0 -io.coil-kt.coil3:coil-android:3.0.4 -io.coil-kt.coil3:coil-core-android:3.0.4 -io.coil-kt.coil3:coil-core:3.0.4 -io.coil-kt.coil3:coil-network-core-android:3.0.4 -io.coil-kt.coil3:coil-network-core:3.0.4 -io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4 -io.coil-kt.coil3:coil-network-okhttp:3.0.4 -io.coil-kt.coil3:coil:3.0.4 +io.coil-kt.coil3:coil-android:3.1.0 +io.coil-kt.coil3:coil-core-android:3.1.0 +io.coil-kt.coil3:coil-core:3.1.0 +io.coil-kt.coil3:coil-network-core-android:3.1.0 +io.coil-kt.coil3:coil-network-core:3.1.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0 +io.coil-kt.coil3:coil-network-okhttp:3.1.0 +io.coil-kt.coil3:coil:3.1.0 io.insert-koin:koin-android:3.5.6 io.insert-koin:koin-androidx-compose:3.5.6 io.insert-koin:koin-bom:3.5.6 @@ -194,55 +216,56 @@ net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 org.apache.commons:commons-text:1.3 -org.apache.httpcomponents.client5:httpclient5:5.4.1 -org.apache.httpcomponents.core5:httpcore5-h2:5.3.1 -org.apache.httpcomponents.core5:httpcore5:5.3.1 -org.apache.james:apache-mime4j-core:0.8.9 -org.apache.james:apache-mime4j-dom:0.8.9 +org.apache.httpcomponents.client5:httpclient5:5.4.2 +org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 +org.apache.httpcomponents.core5:httpcore5:5.3.3 +org.apache.james:apache-mime4j-core:0.8.12 +org.apache.james:apache-mime4j-dom:0.8.12 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4 -org.jetbrains.compose.animation:animation-core:1.7.1 -org.jetbrains.compose.animation:animation:1.7.1 -org.jetbrains.compose.annotation-internal:annotation:1.7.1 -org.jetbrains.compose.collection-internal:collection:1.7.1 -org.jetbrains.compose.components:components-resources-android:1.7.1 -org.jetbrains.compose.components:components-resources:1.7.1 -org.jetbrains.compose.foundation:foundation-layout:1.7.1 -org.jetbrains.compose.foundation:foundation:1.7.1 -org.jetbrains.compose.runtime:runtime-saveable:1.7.1 -org.jetbrains.compose.runtime:runtime:1.7.1 -org.jetbrains.compose.ui:ui-geometry:1.7.1 -org.jetbrains.compose.ui:ui-graphics:1.7.1 -org.jetbrains.compose.ui:ui-text:1.7.1 -org.jetbrains.compose.ui:ui-unit:1.7.1 -org.jetbrains.compose.ui:ui-util:1.7.1 -org.jetbrains.compose.ui:ui:1.7.1 -org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-bom:2.1.0 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib:2.1.0 +org.jetbrains.compose.animation:animation-core:1.7.3 +org.jetbrains.compose.animation:animation:1.7.3 +org.jetbrains.compose.annotation-internal:annotation:1.7.3 +org.jetbrains.compose.collection-internal:collection:1.7.3 +org.jetbrains.compose.components:components-resources-android:1.7.3 +org.jetbrains.compose.components:components-resources:1.7.3 +org.jetbrains.compose.foundation:foundation-layout:1.7.3 +org.jetbrains.compose.foundation:foundation:1.7.3 +org.jetbrains.compose.runtime:runtime-saveable:1.7.3 +org.jetbrains.compose.runtime:runtime:1.7.3 +org.jetbrains.compose.ui:ui-geometry:1.7.3 +org.jetbrains.compose.ui:ui-graphics:1.7.3 +org.jetbrains.compose.ui:ui-text:1.7.3 +org.jetbrains.compose.ui:ui-unit:1.7.3 +org.jetbrains.compose.ui:ui-util:1.7.3 +org.jetbrains.compose.ui:ui:1.7.3 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-bom:2.1.10 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib:2.1.10 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 -org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -org.jetbrains:annotations:26.0.1 -org.jsoup:jsoup:1.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 +org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 +org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains:annotations:26.0.2 +org.jsoup:jsoup:1.19.1 +org.jspecify:jspecify:1.0.0 org.minidns:minidns-client:1.0.5 org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 diff --git a/app-thunderbird/dependencies/fullBetaRuntimeClasspath.txt b/app-thunderbird/dependencies/fullBetaRuntimeClasspath.txt index 6cd4f4741d9d57a2466a95a0842b6193ae693c53..d197b68cd747c695b96bfc8b413f0f7f6650f9dd 100644 --- a/app-thunderbird/dependencies/fullBetaRuntimeClasspath.txt +++ b/app-thunderbird/dependencies/fullBetaRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 androidx.annotation:annotation-experimental:1.4.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 @@ -11,70 +11,87 @@ androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 androidx.biometric:biometric:1.1.0 androidx.browser:browser:1.3.0 -androidx.camera:camera-camera2:1.4.0 -androidx.camera:camera-core:1.4.0 -androidx.camera:camera-lifecycle:1.4.0 -androidx.camera:camera-video:1.4.0 -androidx.camera:camera-view:1.4.0 +androidx.camera:camera-camera2:1.4.1 +androidx.camera:camera-core:1.4.1 +androidx.camera:camera-lifecycle:1.4.1 +androidx.camera:camera-video:1.4.1 +androidx.camera:camera-view:1.4.1 androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 -androidx.compose.animation:animation-android:1.7.5 -androidx.compose.animation:animation-core-android:1.7.5 -androidx.compose.animation:animation-core:1.7.5 -androidx.compose.animation:animation:1.7.5 -androidx.compose.foundation:foundation-android:1.7.5 -androidx.compose.foundation:foundation-layout-android:1.7.5 -androidx.compose.foundation:foundation-layout:1.7.5 -androidx.compose.foundation:foundation:1.7.5 +androidx.compose.animation:animation-android:1.7.8 +androidx.compose.animation:animation-core-android:1.7.8 +androidx.compose.animation:animation-core:1.7.8 +androidx.compose.animation:animation:1.7.8 +androidx.compose.foundation:foundation-android:1.7.8 +androidx.compose.foundation:foundation-layout-android:1.7.8 +androidx.compose.foundation:foundation-layout:1.7.8 +androidx.compose.foundation:foundation:1.7.8 +androidx.compose.material3.adaptive:adaptive-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation:1.0.0 +androidx.compose.material3.adaptive:adaptive:1.0.0 androidx.compose.material3:material3-android:1.3.1 androidx.compose.material3:material3:1.3.1 -androidx.compose.material:material-icons-core-android:1.7.5 -androidx.compose.material:material-icons-core:1.7.5 -androidx.compose.material:material-icons-extended-android:1.7.5 -androidx.compose.material:material-icons-extended:1.7.5 -androidx.compose.material:material-ripple-android:1.7.5 -androidx.compose.material:material-ripple:1.7.5 -androidx.compose.runtime:runtime-android:1.7.5 -androidx.compose.runtime:runtime-saveable-android:1.7.5 -androidx.compose.runtime:runtime-saveable:1.7.5 -androidx.compose.runtime:runtime:1.7.5 -androidx.compose.ui:ui-android:1.7.5 -androidx.compose.ui:ui-geometry-android:1.7.5 -androidx.compose.ui:ui-geometry:1.7.5 -androidx.compose.ui:ui-graphics-android:1.7.5 -androidx.compose.ui:ui-graphics:1.7.5 -androidx.compose.ui:ui-text-android:1.7.5 -androidx.compose.ui:ui-text:1.7.5 -androidx.compose.ui:ui-tooling-preview-android:1.7.5 -androidx.compose.ui:ui-tooling-preview:1.7.5 -androidx.compose.ui:ui-unit-android:1.7.5 -androidx.compose.ui:ui-unit:1.7.5 -androidx.compose.ui:ui-util-android:1.7.5 -androidx.compose.ui:ui-util:1.7.5 -androidx.compose.ui:ui:1.7.5 -androidx.compose:compose-bom:2024.11.00 +androidx.compose.material:material-icons-core-android:1.7.8 +androidx.compose.material:material-icons-core:1.7.8 +androidx.compose.material:material-icons-extended-android:1.7.8 +androidx.compose.material:material-icons-extended:1.7.8 +androidx.compose.material:material-ripple-android:1.7.8 +androidx.compose.material:material-ripple:1.7.8 +androidx.compose.runtime:runtime-android:1.7.8 +androidx.compose.runtime:runtime-saveable-android:1.7.8 +androidx.compose.runtime:runtime-saveable:1.7.8 +androidx.compose.runtime:runtime:1.7.8 +androidx.compose.ui:ui-android:1.7.8 +androidx.compose.ui:ui-geometry-android:1.7.8 +androidx.compose.ui:ui-geometry:1.7.8 +androidx.compose.ui:ui-graphics-android:1.7.8 +androidx.compose.ui:ui-graphics:1.7.8 +androidx.compose.ui:ui-text-android:1.7.8 +androidx.compose.ui:ui-text:1.7.8 +androidx.compose.ui:ui-tooling-preview-android:1.7.8 +androidx.compose.ui:ui-tooling-preview:1.7.8 +androidx.compose.ui:ui-unit-android:1.7.8 +androidx.compose.ui:ui-unit:1.7.8 +androidx.compose.ui:ui-util-android:1.7.8 +androidx.compose.ui:ui-util:1.7.8 +androidx.compose.ui:ui:1.7.8 +androidx.compose:compose-bom:2025.02.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.constraintlayout:constraintlayout-core:1.1.0 -androidx.constraintlayout:constraintlayout:2.2.0 -androidx.coordinatorlayout:coordinatorlayout:1.2.0 +androidx.constraintlayout:constraintlayout-core:1.1.1 +androidx.constraintlayout:constraintlayout:2.2.1 +androidx.coordinatorlayout:coordinatorlayout:1.3.0 androidx.core:core-ktx:1.15.0 +androidx.core:core-remoteviews:1.1.0 androidx.core:core-splashscreen:1.0.1 +androidx.core:core-viewtree:1.0.0 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 androidx.emoji2:emoji2:1.3.0 androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.5 -androidx.fragment:fragment-ktx:1.8.5 -androidx.fragment:fragment:1.8.5 +androidx.fragment:fragment-compose:1.8.6 +androidx.fragment:fragment-ktx:1.8.6 +androidx.fragment:fragment:1.8.6 +androidx.glance:glance-appwidget-external-protobuf:1.1.1 +androidx.glance:glance-appwidget-proto:1.1.1 +androidx.glance:glance-appwidget:1.1.1 +androidx.glance:glance-material3:1.1.1 +androidx.glance:glance:1.1.1 androidx.graphics:graphics-path:1.0.1 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 @@ -101,17 +118,17 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.4 -androidx.navigation:navigation-common:2.8.4 -androidx.navigation:navigation-compose:2.8.4 -androidx.navigation:navigation-fragment:2.8.4 -androidx.navigation:navigation-runtime-ktx:2.8.4 -androidx.navigation:navigation-runtime:2.8.4 -androidx.navigation:navigation-ui:2.8.4 +androidx.navigation:navigation-common-ktx:2.8.8 +androidx.navigation:navigation-common:2.8.8 +androidx.navigation:navigation-compose:2.8.8 +androidx.navigation:navigation-fragment:2.8.8 +androidx.navigation:navigation-runtime-ktx:2.8.8 +androidx.navigation:navigation-runtime:2.8.8 +androidx.navigation:navigation-ui:2.8.8 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 -androidx.recyclerview:recyclerview:1.3.2 +androidx.recyclerview:recyclerview:1.4.0 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 @@ -131,7 +148,12 @@ androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 -androidx.window:window:1.0.0 +androidx.webkit:webkit:1.13.0 +androidx.window.extensions.core:core:1.0.0 +androidx.window:window-core-android:1.3.0 +androidx.window:window-core:1.3.0 +androidx.window:window:1.3.0 +androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -147,10 +169,10 @@ com.github.bumptech.glide:annotations:4.16.0 com.github.bumptech.glide:disklrucache:4.16.0 com.github.bumptech.glide:gifdecoder:4.16.0 com.github.bumptech.glide:glide:4.16.0 -com.github.skydoves:landscapist-android:2.4.4 -com.github.skydoves:landscapist-coil3-android:2.4.4 -com.github.skydoves:landscapist-coil3:2.4.4 -com.github.skydoves:landscapist:2.4.4 +com.github.skydoves:landscapist-android:2.4.7 +com.github.skydoves:landscapist-coil3-android:2.4.7 +com.github.skydoves:landscapist-coil3:2.4.7 +com.github.skydoves:landscapist:2.4.7 com.google.android.datatransport:transport-api:3.0.0 com.google.android.datatransport:transport-backend-cct:3.1.8 com.google.android.datatransport:transport-runtime:3.1.8 @@ -175,27 +197,27 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0 com.mikepenz:fastadapter-extensions-swipe:5.7.0 com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 -com.squareup.moshi:moshi:1.15.1 +com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.9.1 -com.squareup.okio:okio:3.9.1 +com.squareup.okio:okio-jvm:3.10.2 +com.squareup.okio:okio:3.10.2 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 com.takisoft.preferencex:preferencex-datetimepicker:1.1.0 com.takisoft.preferencex:preferencex:1.1.0 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.18.0 de.cketti.library.changelog:ckchangelog-core:2.0.0-beta02 de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0 de.hdodenhof:circleimageview:3.1.0 -io.coil-kt.coil3:coil-android:3.0.4 -io.coil-kt.coil3:coil-core-android:3.0.4 -io.coil-kt.coil3:coil-core:3.0.4 -io.coil-kt.coil3:coil-network-core-android:3.0.4 -io.coil-kt.coil3:coil-network-core:3.0.4 -io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4 -io.coil-kt.coil3:coil-network-okhttp:3.0.4 -io.coil-kt.coil3:coil:3.0.4 +io.coil-kt.coil3:coil-android:3.1.0 +io.coil-kt.coil3:coil-core-android:3.1.0 +io.coil-kt.coil3:coil-core:3.1.0 +io.coil-kt.coil3:coil-network-core-android:3.1.0 +io.coil-kt.coil3:coil-network-core:3.1.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0 +io.coil-kt.coil3:coil-network-okhttp:3.1.0 +io.coil-kt.coil3:coil:3.1.0 io.insert-koin:koin-android:3.5.6 io.insert-koin:koin-androidx-compose:3.5.6 io.insert-koin:koin-bom:3.5.6 @@ -208,55 +230,56 @@ net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 org.apache.commons:commons-text:1.3 -org.apache.httpcomponents.client5:httpclient5:5.4.1 -org.apache.httpcomponents.core5:httpcore5-h2:5.3.1 -org.apache.httpcomponents.core5:httpcore5:5.3.1 -org.apache.james:apache-mime4j-core:0.8.9 -org.apache.james:apache-mime4j-dom:0.8.9 +org.apache.httpcomponents.client5:httpclient5:5.4.2 +org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 +org.apache.httpcomponents.core5:httpcore5:5.3.3 +org.apache.james:apache-mime4j-core:0.8.12 +org.apache.james:apache-mime4j-dom:0.8.12 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4 -org.jetbrains.compose.animation:animation-core:1.7.1 -org.jetbrains.compose.animation:animation:1.7.1 -org.jetbrains.compose.annotation-internal:annotation:1.7.1 -org.jetbrains.compose.collection-internal:collection:1.7.1 -org.jetbrains.compose.components:components-resources-android:1.7.1 -org.jetbrains.compose.components:components-resources:1.7.1 -org.jetbrains.compose.foundation:foundation-layout:1.7.1 -org.jetbrains.compose.foundation:foundation:1.7.1 -org.jetbrains.compose.runtime:runtime-saveable:1.7.1 -org.jetbrains.compose.runtime:runtime:1.7.1 -org.jetbrains.compose.ui:ui-geometry:1.7.1 -org.jetbrains.compose.ui:ui-graphics:1.7.1 -org.jetbrains.compose.ui:ui-text:1.7.1 -org.jetbrains.compose.ui:ui-unit:1.7.1 -org.jetbrains.compose.ui:ui-util:1.7.1 -org.jetbrains.compose.ui:ui:1.7.1 -org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-bom:2.1.0 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib:2.1.0 +org.jetbrains.compose.animation:animation-core:1.7.3 +org.jetbrains.compose.animation:animation:1.7.3 +org.jetbrains.compose.annotation-internal:annotation:1.7.3 +org.jetbrains.compose.collection-internal:collection:1.7.3 +org.jetbrains.compose.components:components-resources-android:1.7.3 +org.jetbrains.compose.components:components-resources:1.7.3 +org.jetbrains.compose.foundation:foundation-layout:1.7.3 +org.jetbrains.compose.foundation:foundation:1.7.3 +org.jetbrains.compose.runtime:runtime-saveable:1.7.3 +org.jetbrains.compose.runtime:runtime:1.7.3 +org.jetbrains.compose.ui:ui-geometry:1.7.3 +org.jetbrains.compose.ui:ui-graphics:1.7.3 +org.jetbrains.compose.ui:ui-text:1.7.3 +org.jetbrains.compose.ui:ui-unit:1.7.3 +org.jetbrains.compose.ui:ui-util:1.7.3 +org.jetbrains.compose.ui:ui:1.7.3 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-bom:2.1.10 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib:2.1.10 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 -org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -org.jetbrains:annotations:26.0.1 -org.jsoup:jsoup:1.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 +org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 +org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains:annotations:26.0.2 +org.jsoup:jsoup:1.19.1 +org.jspecify:jspecify:1.0.0 org.minidns:minidns-client:1.0.5 org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 diff --git a/app-thunderbird/dependencies/fullDailyRuntimeClasspath.txt b/app-thunderbird/dependencies/fullDailyRuntimeClasspath.txt index 6cd4f4741d9d57a2466a95a0842b6193ae693c53..d197b68cd747c695b96bfc8b413f0f7f6650f9dd 100644 --- a/app-thunderbird/dependencies/fullDailyRuntimeClasspath.txt +++ b/app-thunderbird/dependencies/fullDailyRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 androidx.annotation:annotation-experimental:1.4.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 @@ -11,70 +11,87 @@ androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 androidx.biometric:biometric:1.1.0 androidx.browser:browser:1.3.0 -androidx.camera:camera-camera2:1.4.0 -androidx.camera:camera-core:1.4.0 -androidx.camera:camera-lifecycle:1.4.0 -androidx.camera:camera-video:1.4.0 -androidx.camera:camera-view:1.4.0 +androidx.camera:camera-camera2:1.4.1 +androidx.camera:camera-core:1.4.1 +androidx.camera:camera-lifecycle:1.4.1 +androidx.camera:camera-video:1.4.1 +androidx.camera:camera-view:1.4.1 androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 -androidx.compose.animation:animation-android:1.7.5 -androidx.compose.animation:animation-core-android:1.7.5 -androidx.compose.animation:animation-core:1.7.5 -androidx.compose.animation:animation:1.7.5 -androidx.compose.foundation:foundation-android:1.7.5 -androidx.compose.foundation:foundation-layout-android:1.7.5 -androidx.compose.foundation:foundation-layout:1.7.5 -androidx.compose.foundation:foundation:1.7.5 +androidx.compose.animation:animation-android:1.7.8 +androidx.compose.animation:animation-core-android:1.7.8 +androidx.compose.animation:animation-core:1.7.8 +androidx.compose.animation:animation:1.7.8 +androidx.compose.foundation:foundation-android:1.7.8 +androidx.compose.foundation:foundation-layout-android:1.7.8 +androidx.compose.foundation:foundation-layout:1.7.8 +androidx.compose.foundation:foundation:1.7.8 +androidx.compose.material3.adaptive:adaptive-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation:1.0.0 +androidx.compose.material3.adaptive:adaptive:1.0.0 androidx.compose.material3:material3-android:1.3.1 androidx.compose.material3:material3:1.3.1 -androidx.compose.material:material-icons-core-android:1.7.5 -androidx.compose.material:material-icons-core:1.7.5 -androidx.compose.material:material-icons-extended-android:1.7.5 -androidx.compose.material:material-icons-extended:1.7.5 -androidx.compose.material:material-ripple-android:1.7.5 -androidx.compose.material:material-ripple:1.7.5 -androidx.compose.runtime:runtime-android:1.7.5 -androidx.compose.runtime:runtime-saveable-android:1.7.5 -androidx.compose.runtime:runtime-saveable:1.7.5 -androidx.compose.runtime:runtime:1.7.5 -androidx.compose.ui:ui-android:1.7.5 -androidx.compose.ui:ui-geometry-android:1.7.5 -androidx.compose.ui:ui-geometry:1.7.5 -androidx.compose.ui:ui-graphics-android:1.7.5 -androidx.compose.ui:ui-graphics:1.7.5 -androidx.compose.ui:ui-text-android:1.7.5 -androidx.compose.ui:ui-text:1.7.5 -androidx.compose.ui:ui-tooling-preview-android:1.7.5 -androidx.compose.ui:ui-tooling-preview:1.7.5 -androidx.compose.ui:ui-unit-android:1.7.5 -androidx.compose.ui:ui-unit:1.7.5 -androidx.compose.ui:ui-util-android:1.7.5 -androidx.compose.ui:ui-util:1.7.5 -androidx.compose.ui:ui:1.7.5 -androidx.compose:compose-bom:2024.11.00 +androidx.compose.material:material-icons-core-android:1.7.8 +androidx.compose.material:material-icons-core:1.7.8 +androidx.compose.material:material-icons-extended-android:1.7.8 +androidx.compose.material:material-icons-extended:1.7.8 +androidx.compose.material:material-ripple-android:1.7.8 +androidx.compose.material:material-ripple:1.7.8 +androidx.compose.runtime:runtime-android:1.7.8 +androidx.compose.runtime:runtime-saveable-android:1.7.8 +androidx.compose.runtime:runtime-saveable:1.7.8 +androidx.compose.runtime:runtime:1.7.8 +androidx.compose.ui:ui-android:1.7.8 +androidx.compose.ui:ui-geometry-android:1.7.8 +androidx.compose.ui:ui-geometry:1.7.8 +androidx.compose.ui:ui-graphics-android:1.7.8 +androidx.compose.ui:ui-graphics:1.7.8 +androidx.compose.ui:ui-text-android:1.7.8 +androidx.compose.ui:ui-text:1.7.8 +androidx.compose.ui:ui-tooling-preview-android:1.7.8 +androidx.compose.ui:ui-tooling-preview:1.7.8 +androidx.compose.ui:ui-unit-android:1.7.8 +androidx.compose.ui:ui-unit:1.7.8 +androidx.compose.ui:ui-util-android:1.7.8 +androidx.compose.ui:ui-util:1.7.8 +androidx.compose.ui:ui:1.7.8 +androidx.compose:compose-bom:2025.02.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.constraintlayout:constraintlayout-core:1.1.0 -androidx.constraintlayout:constraintlayout:2.2.0 -androidx.coordinatorlayout:coordinatorlayout:1.2.0 +androidx.constraintlayout:constraintlayout-core:1.1.1 +androidx.constraintlayout:constraintlayout:2.2.1 +androidx.coordinatorlayout:coordinatorlayout:1.3.0 androidx.core:core-ktx:1.15.0 +androidx.core:core-remoteviews:1.1.0 androidx.core:core-splashscreen:1.0.1 +androidx.core:core-viewtree:1.0.0 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 androidx.emoji2:emoji2:1.3.0 androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.5 -androidx.fragment:fragment-ktx:1.8.5 -androidx.fragment:fragment:1.8.5 +androidx.fragment:fragment-compose:1.8.6 +androidx.fragment:fragment-ktx:1.8.6 +androidx.fragment:fragment:1.8.6 +androidx.glance:glance-appwidget-external-protobuf:1.1.1 +androidx.glance:glance-appwidget-proto:1.1.1 +androidx.glance:glance-appwidget:1.1.1 +androidx.glance:glance-material3:1.1.1 +androidx.glance:glance:1.1.1 androidx.graphics:graphics-path:1.0.1 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 @@ -101,17 +118,17 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.4 -androidx.navigation:navigation-common:2.8.4 -androidx.navigation:navigation-compose:2.8.4 -androidx.navigation:navigation-fragment:2.8.4 -androidx.navigation:navigation-runtime-ktx:2.8.4 -androidx.navigation:navigation-runtime:2.8.4 -androidx.navigation:navigation-ui:2.8.4 +androidx.navigation:navigation-common-ktx:2.8.8 +androidx.navigation:navigation-common:2.8.8 +androidx.navigation:navigation-compose:2.8.8 +androidx.navigation:navigation-fragment:2.8.8 +androidx.navigation:navigation-runtime-ktx:2.8.8 +androidx.navigation:navigation-runtime:2.8.8 +androidx.navigation:navigation-ui:2.8.8 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 -androidx.recyclerview:recyclerview:1.3.2 +androidx.recyclerview:recyclerview:1.4.0 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 @@ -131,7 +148,12 @@ androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 -androidx.window:window:1.0.0 +androidx.webkit:webkit:1.13.0 +androidx.window.extensions.core:core:1.0.0 +androidx.window:window-core-android:1.3.0 +androidx.window:window-core:1.3.0 +androidx.window:window:1.3.0 +androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -147,10 +169,10 @@ com.github.bumptech.glide:annotations:4.16.0 com.github.bumptech.glide:disklrucache:4.16.0 com.github.bumptech.glide:gifdecoder:4.16.0 com.github.bumptech.glide:glide:4.16.0 -com.github.skydoves:landscapist-android:2.4.4 -com.github.skydoves:landscapist-coil3-android:2.4.4 -com.github.skydoves:landscapist-coil3:2.4.4 -com.github.skydoves:landscapist:2.4.4 +com.github.skydoves:landscapist-android:2.4.7 +com.github.skydoves:landscapist-coil3-android:2.4.7 +com.github.skydoves:landscapist-coil3:2.4.7 +com.github.skydoves:landscapist:2.4.7 com.google.android.datatransport:transport-api:3.0.0 com.google.android.datatransport:transport-backend-cct:3.1.8 com.google.android.datatransport:transport-runtime:3.1.8 @@ -175,27 +197,27 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0 com.mikepenz:fastadapter-extensions-swipe:5.7.0 com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 -com.squareup.moshi:moshi:1.15.1 +com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.9.1 -com.squareup.okio:okio:3.9.1 +com.squareup.okio:okio-jvm:3.10.2 +com.squareup.okio:okio:3.10.2 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 com.takisoft.preferencex:preferencex-datetimepicker:1.1.0 com.takisoft.preferencex:preferencex:1.1.0 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.18.0 de.cketti.library.changelog:ckchangelog-core:2.0.0-beta02 de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0 de.hdodenhof:circleimageview:3.1.0 -io.coil-kt.coil3:coil-android:3.0.4 -io.coil-kt.coil3:coil-core-android:3.0.4 -io.coil-kt.coil3:coil-core:3.0.4 -io.coil-kt.coil3:coil-network-core-android:3.0.4 -io.coil-kt.coil3:coil-network-core:3.0.4 -io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4 -io.coil-kt.coil3:coil-network-okhttp:3.0.4 -io.coil-kt.coil3:coil:3.0.4 +io.coil-kt.coil3:coil-android:3.1.0 +io.coil-kt.coil3:coil-core-android:3.1.0 +io.coil-kt.coil3:coil-core:3.1.0 +io.coil-kt.coil3:coil-network-core-android:3.1.0 +io.coil-kt.coil3:coil-network-core:3.1.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0 +io.coil-kt.coil3:coil-network-okhttp:3.1.0 +io.coil-kt.coil3:coil:3.1.0 io.insert-koin:koin-android:3.5.6 io.insert-koin:koin-androidx-compose:3.5.6 io.insert-koin:koin-bom:3.5.6 @@ -208,55 +230,56 @@ net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 org.apache.commons:commons-text:1.3 -org.apache.httpcomponents.client5:httpclient5:5.4.1 -org.apache.httpcomponents.core5:httpcore5-h2:5.3.1 -org.apache.httpcomponents.core5:httpcore5:5.3.1 -org.apache.james:apache-mime4j-core:0.8.9 -org.apache.james:apache-mime4j-dom:0.8.9 +org.apache.httpcomponents.client5:httpclient5:5.4.2 +org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 +org.apache.httpcomponents.core5:httpcore5:5.3.3 +org.apache.james:apache-mime4j-core:0.8.12 +org.apache.james:apache-mime4j-dom:0.8.12 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4 -org.jetbrains.compose.animation:animation-core:1.7.1 -org.jetbrains.compose.animation:animation:1.7.1 -org.jetbrains.compose.annotation-internal:annotation:1.7.1 -org.jetbrains.compose.collection-internal:collection:1.7.1 -org.jetbrains.compose.components:components-resources-android:1.7.1 -org.jetbrains.compose.components:components-resources:1.7.1 -org.jetbrains.compose.foundation:foundation-layout:1.7.1 -org.jetbrains.compose.foundation:foundation:1.7.1 -org.jetbrains.compose.runtime:runtime-saveable:1.7.1 -org.jetbrains.compose.runtime:runtime:1.7.1 -org.jetbrains.compose.ui:ui-geometry:1.7.1 -org.jetbrains.compose.ui:ui-graphics:1.7.1 -org.jetbrains.compose.ui:ui-text:1.7.1 -org.jetbrains.compose.ui:ui-unit:1.7.1 -org.jetbrains.compose.ui:ui-util:1.7.1 -org.jetbrains.compose.ui:ui:1.7.1 -org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-bom:2.1.0 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib:2.1.0 +org.jetbrains.compose.animation:animation-core:1.7.3 +org.jetbrains.compose.animation:animation:1.7.3 +org.jetbrains.compose.annotation-internal:annotation:1.7.3 +org.jetbrains.compose.collection-internal:collection:1.7.3 +org.jetbrains.compose.components:components-resources-android:1.7.3 +org.jetbrains.compose.components:components-resources:1.7.3 +org.jetbrains.compose.foundation:foundation-layout:1.7.3 +org.jetbrains.compose.foundation:foundation:1.7.3 +org.jetbrains.compose.runtime:runtime-saveable:1.7.3 +org.jetbrains.compose.runtime:runtime:1.7.3 +org.jetbrains.compose.ui:ui-geometry:1.7.3 +org.jetbrains.compose.ui:ui-graphics:1.7.3 +org.jetbrains.compose.ui:ui-text:1.7.3 +org.jetbrains.compose.ui:ui-unit:1.7.3 +org.jetbrains.compose.ui:ui-util:1.7.3 +org.jetbrains.compose.ui:ui:1.7.3 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-bom:2.1.10 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib:2.1.10 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 -org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -org.jetbrains:annotations:26.0.1 -org.jsoup:jsoup:1.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 +org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 +org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains:annotations:26.0.2 +org.jsoup:jsoup:1.19.1 +org.jspecify:jspecify:1.0.0 org.minidns:minidns-client:1.0.5 org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 diff --git a/app-thunderbird/dependencies/fullReleaseRuntimeClasspath.txt b/app-thunderbird/dependencies/fullReleaseRuntimeClasspath.txt index 6cd4f4741d9d57a2466a95a0842b6193ae693c53..d197b68cd747c695b96bfc8b413f0f7f6650f9dd 100644 --- a/app-thunderbird/dependencies/fullReleaseRuntimeClasspath.txt +++ b/app-thunderbird/dependencies/fullReleaseRuntimeClasspath.txt @@ -1,6 +1,6 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 androidx.annotation:annotation-experimental:1.4.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 @@ -11,70 +11,87 @@ androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 androidx.biometric:biometric:1.1.0 androidx.browser:browser:1.3.0 -androidx.camera:camera-camera2:1.4.0 -androidx.camera:camera-core:1.4.0 -androidx.camera:camera-lifecycle:1.4.0 -androidx.camera:camera-video:1.4.0 -androidx.camera:camera-view:1.4.0 +androidx.camera:camera-camera2:1.4.1 +androidx.camera:camera-core:1.4.1 +androidx.camera:camera-lifecycle:1.4.1 +androidx.camera:camera-video:1.4.1 +androidx.camera:camera-view:1.4.1 androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.4.4 androidx.collection:collection-ktx:1.4.4 androidx.collection:collection:1.4.4 -androidx.compose.animation:animation-android:1.7.5 -androidx.compose.animation:animation-core-android:1.7.5 -androidx.compose.animation:animation-core:1.7.5 -androidx.compose.animation:animation:1.7.5 -androidx.compose.foundation:foundation-android:1.7.5 -androidx.compose.foundation:foundation-layout-android:1.7.5 -androidx.compose.foundation:foundation-layout:1.7.5 -androidx.compose.foundation:foundation:1.7.5 +androidx.compose.animation:animation-android:1.7.8 +androidx.compose.animation:animation-core-android:1.7.8 +androidx.compose.animation:animation-core:1.7.8 +androidx.compose.animation:animation:1.7.8 +androidx.compose.foundation:foundation-android:1.7.8 +androidx.compose.foundation:foundation-layout-android:1.7.8 +androidx.compose.foundation:foundation-layout:1.7.8 +androidx.compose.foundation:foundation:1.7.8 +androidx.compose.material3.adaptive:adaptive-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-layout:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.0.0 +androidx.compose.material3.adaptive:adaptive-navigation:1.0.0 +androidx.compose.material3.adaptive:adaptive:1.0.0 androidx.compose.material3:material3-android:1.3.1 androidx.compose.material3:material3:1.3.1 -androidx.compose.material:material-icons-core-android:1.7.5 -androidx.compose.material:material-icons-core:1.7.5 -androidx.compose.material:material-icons-extended-android:1.7.5 -androidx.compose.material:material-icons-extended:1.7.5 -androidx.compose.material:material-ripple-android:1.7.5 -androidx.compose.material:material-ripple:1.7.5 -androidx.compose.runtime:runtime-android:1.7.5 -androidx.compose.runtime:runtime-saveable-android:1.7.5 -androidx.compose.runtime:runtime-saveable:1.7.5 -androidx.compose.runtime:runtime:1.7.5 -androidx.compose.ui:ui-android:1.7.5 -androidx.compose.ui:ui-geometry-android:1.7.5 -androidx.compose.ui:ui-geometry:1.7.5 -androidx.compose.ui:ui-graphics-android:1.7.5 -androidx.compose.ui:ui-graphics:1.7.5 -androidx.compose.ui:ui-text-android:1.7.5 -androidx.compose.ui:ui-text:1.7.5 -androidx.compose.ui:ui-tooling-preview-android:1.7.5 -androidx.compose.ui:ui-tooling-preview:1.7.5 -androidx.compose.ui:ui-unit-android:1.7.5 -androidx.compose.ui:ui-unit:1.7.5 -androidx.compose.ui:ui-util-android:1.7.5 -androidx.compose.ui:ui-util:1.7.5 -androidx.compose.ui:ui:1.7.5 -androidx.compose:compose-bom:2024.11.00 +androidx.compose.material:material-icons-core-android:1.7.8 +androidx.compose.material:material-icons-core:1.7.8 +androidx.compose.material:material-icons-extended-android:1.7.8 +androidx.compose.material:material-icons-extended:1.7.8 +androidx.compose.material:material-ripple-android:1.7.8 +androidx.compose.material:material-ripple:1.7.8 +androidx.compose.runtime:runtime-android:1.7.8 +androidx.compose.runtime:runtime-saveable-android:1.7.8 +androidx.compose.runtime:runtime-saveable:1.7.8 +androidx.compose.runtime:runtime:1.7.8 +androidx.compose.ui:ui-android:1.7.8 +androidx.compose.ui:ui-geometry-android:1.7.8 +androidx.compose.ui:ui-geometry:1.7.8 +androidx.compose.ui:ui-graphics-android:1.7.8 +androidx.compose.ui:ui-graphics:1.7.8 +androidx.compose.ui:ui-text-android:1.7.8 +androidx.compose.ui:ui-text:1.7.8 +androidx.compose.ui:ui-tooling-preview-android:1.7.8 +androidx.compose.ui:ui-tooling-preview:1.7.8 +androidx.compose.ui:ui-unit-android:1.7.8 +androidx.compose.ui:ui-unit:1.7.8 +androidx.compose.ui:ui-util-android:1.7.8 +androidx.compose.ui:ui-util:1.7.8 +androidx.compose.ui:ui:1.7.8 +androidx.compose:compose-bom:2025.02.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.constraintlayout:constraintlayout-core:1.1.0 -androidx.constraintlayout:constraintlayout:2.2.0 -androidx.coordinatorlayout:coordinatorlayout:1.2.0 +androidx.constraintlayout:constraintlayout-core:1.1.1 +androidx.constraintlayout:constraintlayout:2.2.1 +androidx.coordinatorlayout:coordinatorlayout:1.3.0 androidx.core:core-ktx:1.15.0 +androidx.core:core-remoteviews:1.1.0 androidx.core:core-splashscreen:1.0.1 +androidx.core:core-viewtree:1.0.0 androidx.core:core:1.15.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.1.0 +androidx.datastore:datastore-core:1.0.0 +androidx.datastore:datastore-preferences-core:1.0.0 +androidx.datastore:datastore-preferences:1.0.0 +androidx.datastore:datastore:1.0.0 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.3.0 androidx.emoji2:emoji2:1.3.0 androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.5 -androidx.fragment:fragment-ktx:1.8.5 -androidx.fragment:fragment:1.8.5 +androidx.fragment:fragment-compose:1.8.6 +androidx.fragment:fragment-ktx:1.8.6 +androidx.fragment:fragment:1.8.6 +androidx.glance:glance-appwidget-external-protobuf:1.1.1 +androidx.glance:glance-appwidget-proto:1.1.1 +androidx.glance:glance-appwidget:1.1.1 +androidx.glance:glance-material3:1.1.1 +androidx.glance:glance:1.1.1 androidx.graphics:graphics-path:1.0.1 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 @@ -101,17 +118,17 @@ androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 androidx.lifecycle:lifecycle-viewmodel:2.8.7 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.4 -androidx.navigation:navigation-common:2.8.4 -androidx.navigation:navigation-compose:2.8.4 -androidx.navigation:navigation-fragment:2.8.4 -androidx.navigation:navigation-runtime-ktx:2.8.4 -androidx.navigation:navigation-runtime:2.8.4 -androidx.navigation:navigation-ui:2.8.4 +androidx.navigation:navigation-common-ktx:2.8.8 +androidx.navigation:navigation-common:2.8.8 +androidx.navigation:navigation-compose:2.8.8 +androidx.navigation:navigation-fragment:2.8.8 +androidx.navigation:navigation-runtime-ktx:2.8.8 +androidx.navigation:navigation-runtime:2.8.8 +androidx.navigation:navigation-ui:2.8.8 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 -androidx.recyclerview:recyclerview:1.3.2 +androidx.recyclerview:recyclerview:1.4.0 androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 @@ -131,7 +148,12 @@ androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager2:viewpager2:1.1.0-beta02 androidx.viewpager:viewpager:1.0.0 -androidx.window:window:1.0.0 +androidx.webkit:webkit:1.13.0 +androidx.window.extensions.core:core:1.0.0 +androidx.window:window-core-android:1.3.0 +androidx.window:window-core:1.3.0 +androidx.window:window:1.3.0 +androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 co.touchlab:stately-concurrency-jvm:2.0.6 co.touchlab:stately-concurrency:2.0.6 @@ -147,10 +169,10 @@ com.github.bumptech.glide:annotations:4.16.0 com.github.bumptech.glide:disklrucache:4.16.0 com.github.bumptech.glide:gifdecoder:4.16.0 com.github.bumptech.glide:glide:4.16.0 -com.github.skydoves:landscapist-android:2.4.4 -com.github.skydoves:landscapist-coil3-android:2.4.4 -com.github.skydoves:landscapist-coil3:2.4.4 -com.github.skydoves:landscapist:2.4.4 +com.github.skydoves:landscapist-android:2.4.7 +com.github.skydoves:landscapist-coil3-android:2.4.7 +com.github.skydoves:landscapist-coil3:2.4.7 +com.github.skydoves:landscapist:2.4.7 com.google.android.datatransport:transport-api:3.0.0 com.google.android.datatransport:transport-backend-cct:3.1.8 com.google.android.datatransport:transport-runtime:3.1.8 @@ -175,27 +197,27 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0 com.mikepenz:fastadapter-extensions-swipe:5.7.0 com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 -com.squareup.moshi:moshi:1.15.1 +com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.9.1 -com.squareup.okio:okio:3.9.1 +com.squareup.okio:okio-jvm:3.10.2 +com.squareup.okio:okio:3.10.2 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 com.takisoft.preferencex:preferencex-datetimepicker:1.1.0 com.takisoft.preferencex:preferencex:1.1.0 -commons-io:commons-io:2.16.1 +commons-io:commons-io:2.18.0 de.cketti.library.changelog:ckchangelog-core:2.0.0-beta02 de.cketti.safecontentresolver:safe-content-resolver-v21:1.0.0 de.hdodenhof:circleimageview:3.1.0 -io.coil-kt.coil3:coil-android:3.0.4 -io.coil-kt.coil3:coil-core-android:3.0.4 -io.coil-kt.coil3:coil-core:3.0.4 -io.coil-kt.coil3:coil-network-core-android:3.0.4 -io.coil-kt.coil3:coil-network-core:3.0.4 -io.coil-kt.coil3:coil-network-okhttp-jvm:3.0.4 -io.coil-kt.coil3:coil-network-okhttp:3.0.4 -io.coil-kt.coil3:coil:3.0.4 +io.coil-kt.coil3:coil-android:3.1.0 +io.coil-kt.coil3:coil-core-android:3.1.0 +io.coil-kt.coil3:coil-core:3.1.0 +io.coil-kt.coil3:coil-network-core-android:3.1.0 +io.coil-kt.coil3:coil-network-core:3.1.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.1.0 +io.coil-kt.coil3:coil-network-okhttp:3.1.0 +io.coil-kt.coil3:coil:3.1.0 io.insert-koin:koin-android:3.5.6 io.insert-koin:koin-androidx-compose:3.5.6 io.insert-koin:koin-bom:3.5.6 @@ -208,55 +230,56 @@ net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 org.apache.commons:commons-text:1.3 -org.apache.httpcomponents.client5:httpclient5:5.4.1 -org.apache.httpcomponents.core5:httpcore5-h2:5.3.1 -org.apache.httpcomponents.core5:httpcore5:5.3.1 -org.apache.james:apache-mime4j-core:0.8.9 -org.apache.james:apache-mime4j-dom:0.8.9 +org.apache.httpcomponents.client5:httpclient5:5.4.2 +org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 +org.apache.httpcomponents.core5:httpcore5:5.3.3 +org.apache.james:apache-mime4j-core:0.8.12 +org.apache.james:apache-mime4j-dom:0.8.12 org.jetbrains.androidx.lifecycle:lifecycle-common:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.8.4 org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.8.4 -org.jetbrains.compose.animation:animation-core:1.7.1 -org.jetbrains.compose.animation:animation:1.7.1 -org.jetbrains.compose.annotation-internal:annotation:1.7.1 -org.jetbrains.compose.collection-internal:collection:1.7.1 -org.jetbrains.compose.components:components-resources-android:1.7.1 -org.jetbrains.compose.components:components-resources:1.7.1 -org.jetbrains.compose.foundation:foundation-layout:1.7.1 -org.jetbrains.compose.foundation:foundation:1.7.1 -org.jetbrains.compose.runtime:runtime-saveable:1.7.1 -org.jetbrains.compose.runtime:runtime:1.7.1 -org.jetbrains.compose.ui:ui-geometry:1.7.1 -org.jetbrains.compose.ui:ui-graphics:1.7.1 -org.jetbrains.compose.ui:ui-text:1.7.1 -org.jetbrains.compose.ui:ui-unit:1.7.1 -org.jetbrains.compose.ui:ui-util:1.7.1 -org.jetbrains.compose.ui:ui:1.7.1 -org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-bom:2.1.0 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.0 -org.jetbrains.kotlin:kotlin-stdlib:2.1.0 +org.jetbrains.compose.animation:animation-core:1.7.3 +org.jetbrains.compose.animation:animation:1.7.3 +org.jetbrains.compose.annotation-internal:annotation:1.7.3 +org.jetbrains.compose.collection-internal:collection:1.7.3 +org.jetbrains.compose.components:components-resources-android:1.7.3 +org.jetbrains.compose.components:components-resources:1.7.3 +org.jetbrains.compose.foundation:foundation-layout:1.7.3 +org.jetbrains.compose.foundation:foundation:1.7.3 +org.jetbrains.compose.runtime:runtime-saveable:1.7.3 +org.jetbrains.compose.runtime:runtime:1.7.3 +org.jetbrains.compose.ui:ui-geometry:1.7.3 +org.jetbrains.compose.ui:ui-graphics:1.7.3 +org.jetbrains.compose.ui:ui-text:1.7.3 +org.jetbrains.compose.ui:ui-unit:1.7.3 +org.jetbrains.compose.ui:ui-util:1.7.3 +org.jetbrains.compose.ui:ui:1.7.3 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-bom:2.1.10 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.10 +org.jetbrains.kotlin:kotlin-stdlib:2.1.10 org.jetbrains.kotlinx:atomicfu-jvm:0.23.2 org.jetbrains.kotlinx:atomicfu:0.23.2 org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8 org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8 -org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0 -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 -org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 -org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3 -org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3 -org.jetbrains:annotations:26.0.1 -org.jsoup:jsoup:1.18.1 +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.1 +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1 +org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 +org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.8.0 +org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0 +org.jetbrains:annotations:26.0.2 +org.jsoup:jsoup:1.19.1 +org.jspecify:jspecify:1.0.0 org.minidns:minidns-client:1.0.5 org.minidns:minidns-core:1.0.5 org.minidns:minidns-dnssec:1.0.5 diff --git a/app-thunderbird/src/beta/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt b/app-thunderbird/src/beta/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt index 97b034d6418383229170886a382c440a2302c31b..305db1baf45fd8ae6c858befc6619d02b1ac8895 100644 --- a/app-thunderbird/src/beta/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt +++ b/app-thunderbird/src/beta/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt @@ -65,6 +65,8 @@ class TbOAuthConfigurationFactory : OAuthConfigurationFactory { ) to OAuthConfiguration( clientId = "e6f8716e-299d-4ed9-bbf3-453f192f44e5", scopes = listOf( + "openid", + "email", "https://outlook.office.com/IMAP.AccessAsUser.All", "https://outlook.office.com/SMTP.Send", "offline_access", diff --git a/app-thunderbird/src/beta/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt b/app-thunderbird/src/beta/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt index e5f3455e0a24d91de2eb9f2ff519e67ce198e3cc..80a0ab5ef3e9033a92ca4e1ca1cdf8ef832445da 100644 --- a/app-thunderbird/src/beta/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt +++ b/app-thunderbird/src/beta/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt @@ -11,6 +11,10 @@ class TbFeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List { return listOf( FeatureFlag("archive_marks_as_read".toFeatureFlagKey(), enabled = true), + FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = false), + FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true), + FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true), + FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true), ) } } diff --git a/app-thunderbird/src/daily/AndroidManifest.xml b/app-thunderbird/src/daily/AndroidManifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..689e9c615a44160357f6b334b6d42064f2fe809d --- /dev/null +++ b/app-thunderbird/src/daily/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/app-thunderbird/src/daily/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt b/app-thunderbird/src/daily/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt index 2e582e2587ada3cbcccd7b59e964be40a2b8bf4f..e3f37ff2ec5da3f1fab8f27fb0bb5e7a908ec126 100644 --- a/app-thunderbird/src/daily/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt +++ b/app-thunderbird/src/daily/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt @@ -64,6 +64,8 @@ class TbOAuthConfigurationFactory : OAuthConfigurationFactory { ) to OAuthConfiguration( clientId = "e6f8716e-299d-4ed9-bbf3-453f192f44e5", scopes = listOf( + "openid", + "email", "https://outlook.office.com/IMAP.AccessAsUser.All", "https://outlook.office.com/SMTP.Send", "offline_access", diff --git a/app-thunderbird/src/daily/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt b/app-thunderbird/src/daily/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt index 79052ae7a9b8bdaa4b7700b5d9b9491832eb920c..6be061077e9899f09269ac56481ce68dbff0cbd1 100644 --- a/app-thunderbird/src/daily/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt +++ b/app-thunderbird/src/daily/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt @@ -11,6 +11,10 @@ class TbFeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List { return listOf( FeatureFlag("archive_marks_as_read".toFeatureFlagKey(), enabled = true), + FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = false), + FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true), + FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true), + FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true), ) } } diff --git a/app-thunderbird/src/daily/raw/changelog_master.xml b/app-thunderbird/src/daily/res/raw/changelog_master.xml similarity index 100% rename from app-thunderbird/src/daily/raw/changelog_master.xml rename to app-thunderbird/src/daily/res/raw/changelog_master.xml diff --git a/app-thunderbird/src/debug/AndroidManifest.xml b/app-thunderbird/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..689e9c615a44160357f6b334b6d42064f2fe809d --- /dev/null +++ b/app-thunderbird/src/debug/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/app-thunderbird/src/debug/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt b/app-thunderbird/src/debug/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt index 2e7a79a136fdf4e47dcd07ba499f6255f8cd9aeb..81cb2cc6f0d952d5fde1ca31269ff6166ee6ef33 100644 --- a/app-thunderbird/src/debug/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt +++ b/app-thunderbird/src/debug/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt @@ -64,6 +64,8 @@ class TbOAuthConfigurationFactory : OAuthConfigurationFactory { ) to OAuthConfiguration( clientId = "e6f8716e-299d-4ed9-bbf3-453f192f44e5", scopes = listOf( + "openid", + "email", "https://outlook.office.com/IMAP.AccessAsUser.All", "https://outlook.office.com/SMTP.Send", "offline_access", diff --git a/app-thunderbird/src/debug/kotlin/net/thunderbird/android/dev/DemoBackendFactory.kt b/app-thunderbird/src/debug/kotlin/net/thunderbird/android/dev/DemoBackendFactory.kt index e6b555dc4c63d27382ff4ddd943e74a146bae46e..ab72693c997de1be1495fc2f03212e4b77d9412e 100644 --- a/app-thunderbird/src/debug/kotlin/net/thunderbird/android/dev/DemoBackendFactory.kt +++ b/app-thunderbird/src/debug/kotlin/net/thunderbird/android/dev/DemoBackendFactory.kt @@ -1,13 +1,13 @@ package net.thunderbird.android.dev import app.k9mail.backend.demo.DemoBackend -import app.k9mail.legacy.account.Account +import app.k9mail.legacy.account.LegacyAccount import com.fsck.k9.backend.BackendFactory import com.fsck.k9.backend.api.Backend import com.fsck.k9.mailstore.K9BackendStorageFactory class DemoBackendFactory(private val backendStorageFactory: K9BackendStorageFactory) : BackendFactory { - override fun createBackend(account: Account): Backend { + override fun createBackend(account: LegacyAccount): Backend { val backendStorage = backendStorageFactory.createBackendStorage(account) return DemoBackend(backendStorage) } diff --git a/app-thunderbird/src/debug/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt b/app-thunderbird/src/debug/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt index c5bfe26d8fc21b93f155048cef764452f98635fc..f2dbde9592a2d4a910b81abde048d1232dc34a23 100644 --- a/app-thunderbird/src/debug/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt +++ b/app-thunderbird/src/debug/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt @@ -11,6 +11,10 @@ class TbFeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List { return listOf( FeatureFlag("archive_marks_as_read".toFeatureFlagKey(), enabled = true), + FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = true), + FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true), + FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true), + FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true), ) } } diff --git a/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdKoinModule.kt b/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdKoinModule.kt index 88073416f25cfaea3b32ac8213ba8b84cc63a390..2657efcef5b22719efcea4a70af1707f5c81bcfb 100644 --- a/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdKoinModule.kt +++ b/app-thunderbird/src/main/kotlin/net/thunderbird/android/ThunderbirdKoinModule.kt @@ -20,12 +20,14 @@ import net.thunderbird.android.provider.TbThemeProvider import net.thunderbird.android.widget.appWidgetModule import net.thunderbird.android.widget.provider.MessageListWidgetProvider import net.thunderbird.android.widget.provider.UnreadWidgetProvider +import net.thunderbird.app.common.appCommonModule import org.koin.android.ext.koin.androidContext import org.koin.core.qualifier.named import org.koin.dsl.binds import org.koin.dsl.module val appModule = module { + includes(appCommonModule) includes(appWidgetModule) includes(featureModule) diff --git a/app-thunderbird/src/main/kotlin/net/thunderbird/android/feature/FeatureModule.kt b/app-thunderbird/src/main/kotlin/net/thunderbird/android/feature/FeatureModule.kt index d7708aa383a9733051c0602dee27748403683884..5f21be561101b55056ea0107329887eca86ed3d0 100644 --- a/app-thunderbird/src/main/kotlin/net/thunderbird/android/feature/FeatureModule.kt +++ b/app-thunderbird/src/main/kotlin/net/thunderbird/android/feature/FeatureModule.kt @@ -5,11 +5,14 @@ import app.k9mail.feature.funding.featureFundingModule import app.k9mail.feature.migration.launcher.featureMigrationModule import app.k9mail.feature.onboarding.migration.onboardingMigrationModule import app.k9mail.feature.telemetry.telemetryModule -import com.fsck.k9.feature.featureLauncherModule +import net.thunderbird.app.common.feature.featureLauncherModule +import net.thunderbird.feature.account.settings.featureAccountSettingsModule import org.koin.dsl.module val featureModule = module { includes(featureLauncherModule) + + includes(featureAccountSettingsModule) includes(telemetryModule) includes(featureFundingModule) includes(onboardingMigrationModule) diff --git a/app-thunderbird/src/main/kotlin/net/thunderbird/android/widget/KoinModule.kt b/app-thunderbird/src/main/kotlin/net/thunderbird/android/widget/KoinModule.kt index 0bfd96f44129f4911e31ddb7c2fbc8d40afd66d3..54f36b1825c94f6b4894a665e94c81e4a1ab1e54 100644 --- a/app-thunderbird/src/main/kotlin/net/thunderbird/android/widget/KoinModule.kt +++ b/app-thunderbird/src/main/kotlin/net/thunderbird/android/widget/KoinModule.kt @@ -2,9 +2,12 @@ package net.thunderbird.android.widget import app.k9mail.feature.widget.message.list.MessageListWidgetConfig import app.k9mail.feature.widget.unread.UnreadWidgetConfig +import net.thunderbird.feature.widget.message.list.featureWidgetMessageListModule import org.koin.dsl.module val appWidgetModule = module { + includes(featureWidgetMessageListModule) + single { TbMessageListWidgetConfig() } single { TbUnreadWidgetConfig() } } diff --git a/feature/navigation/drawer/src/main/res/values-az/strings.xml b/app-thunderbird/src/main/res/values-bn/strings.xml similarity index 100% rename from feature/navigation/drawer/src/main/res/values-az/strings.xml rename to app-thunderbird/src/main/res/values-bn/strings.xml diff --git a/app-thunderbird/src/main/res/values/themes.xml b/app-thunderbird/src/main/res/values/themes.xml index a78c5f31d185336e478f04fe63a3eafbcbf3f7f3..5f545c28477a44d2a40ff45884b449c88ac3c2ca 100644 --- a/app-thunderbird/src/main/res/values/themes.xml +++ b/app-thunderbird/src/main/res/values/themes.xml @@ -15,13 +15,6 @@ @android:color/primary_text_light @android:color/secondary_text_light - ?android:attr/windowBackground - #ffd8d8d8 - ?attr/messageListRegularItemBackgroundColor - ?attr/colorSecondaryVariant - 60% - ?attr/colorSurface - @color/material_blue_600 @color/material_blue_600 @color/material_orange_600 @@ -59,13 +52,6 @@ @android:color/primary_text_dark @android:color/secondary_text_dark - ?android:attr/windowBackground - ?attr/messageListRegularItemBackgroundColor - #ff505050 - ?attr/colorSecondaryVariant - 50% - ?attr/colorSurface - @color/material_blue_700 @color/material_blue_700 @color/material_orange_700 diff --git a/app-thunderbird/src/release/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt b/app-thunderbird/src/release/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt index acaaf115bd4953ddc5a59c30c26825363a4e3784..4213b25e4596dae2242b152dc19007cfa9d78c31 100644 --- a/app-thunderbird/src/release/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt +++ b/app-thunderbird/src/release/kotlin/net/thunderbird/android/auth/TbOAuthConfigurationFactory.kt @@ -64,6 +64,8 @@ class TbOAuthConfigurationFactory : OAuthConfigurationFactory { ) to OAuthConfiguration( clientId = "e6f8716e-299d-4ed9-bbf3-453f192f44e5", scopes = listOf( + "openid", + "email", "https://outlook.office.com/IMAP.AccessAsUser.All", "https://outlook.office.com/SMTP.Send", "offline_access", diff --git a/app-thunderbird/src/release/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt b/app-thunderbird/src/release/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt index e0e735d0652c25793a6c71ea6241b3514e16899c..5ba8adba9b1cee789ce4689d7823b5d6eebc3eda 100644 --- a/app-thunderbird/src/release/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt +++ b/app-thunderbird/src/release/kotlin/net/thunderbird/android/featureflag/TbFeatureFlagFactory.kt @@ -11,6 +11,10 @@ class TbFeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List { return listOf( FeatureFlag("archive_marks_as_read".toFeatureFlagKey(), enabled = false), + FeatureFlag("new_account_settings".toFeatureFlagKey(), enabled = false), + FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = false), + FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = false), + FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = false), ) } } diff --git a/app-thunderbird/src/test/kotlin/net/thunderbird/android/DependencyInjectionTest.kt b/app-thunderbird/src/test/kotlin/net/thunderbird/android/DependencyInjectionTest.kt index fce62bdfbb69b4c0f06a85b3a704cf5d0d2b0a9f..41316368273ddd03d21f471e88a7deecc7b8b8cf 100644 --- a/app-thunderbird/src/test/kotlin/net/thunderbird/android/DependencyInjectionTest.kt +++ b/app-thunderbird/src/test/kotlin/net/thunderbird/android/DependencyInjectionTest.kt @@ -3,18 +3,15 @@ package net.thunderbird.android import android.view.ContextThemeWrapper import androidx.lifecycle.LifecycleOwner import androidx.work.WorkerParameters -import app.k9mail.feature.account.server.validation.domain.ServerValidationDomainContract -import app.k9mail.feature.account.server.validation.ui.ServerValidationContract import app.k9mail.legacy.ui.folder.FolderIconProvider import app.k9mail.legacy.ui.folder.FolderNameFormatter -import com.fsck.k9.account.AccountRemoverWorker -import com.fsck.k9.job.MailSyncWorker import com.fsck.k9.mail.oauth.AuthStateStorage import com.fsck.k9.ui.changelog.ChangeLogMode import com.fsck.k9.ui.changelog.ChangelogViewModel import com.fsck.k9.ui.endtoend.AutocryptKeyTransferActivity import com.fsck.k9.ui.endtoend.AutocryptKeyTransferPresenter import com.fsck.k9.ui.helper.SizeFormatter +import net.thunderbird.feature.account.api.AccountId import org.junit.Test import org.junit.runner.RunWith import org.koin.core.annotation.KoinInternalApi @@ -25,7 +22,6 @@ import org.koin.test.AutoCloseKoinTest import org.koin.test.check.checkModules import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock -import org.openintents.openpgp.OpenPgpApiManager import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment import org.robolectric.annotation.Config @@ -45,22 +41,20 @@ class DependencyInjectionTest : AutoCloseKoinTest() { KoinJavaComponent.getKoin().setupLogger(PrintLogger()) getKoin().checkModules { - withParameter { lifecycleOwner } withParameters { parametersOf(lifecycleOwner, autocryptTransferView) } withParameter { RuntimeEnvironment.getApplication() } withParameter { RuntimeEnvironment.getApplication() } withParameter { ChangeLogMode.CHANGE_LOG } - withParameter { mock() } withParameter { ContextThemeWrapper(RuntimeEnvironment.getApplication(), R.style.Theme_Thunderbird_DayNight).theme } withParameters(clazz = Class.forName("com.fsck.k9.view.K9WebViewClient").kotlin) { parametersOf(null, null) } - withParameter { authStateStorage } - withParameter { authStateStorage } - withParameter { authStateStorage } - withParameter { mock() } + withInstance(authStateStorage) + withInstance(lifecycleOwner) + withInstance(mock()) + withInstance(AccountId.create()) } } } diff --git a/app-ui-catalog/build.gradle.kts b/app-ui-catalog/build.gradle.kts index 3729aefff41f9837a87a167f4fe3e0c2ac6e1b2c..027bc3fcd0a44e58d33dacd5a40c32286fda0e17 100644 --- a/app-ui-catalog/build.gradle.kts +++ b/app-ui-catalog/build.gradle.kts @@ -1,12 +1,14 @@ plugins { id(ThunderbirdPlugins.App.androidCompose) + alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.kotlin.parcelize) } android { - namespace = "app.k9mail.ui.catalog" + namespace = "net.thunderbird.ui.catalog" defaultConfig { - applicationId = "app.k9mail.ui.catalog" + applicationId = "net.thunderbird.ui.catalog" versionCode = 1 versionName = "1.0" } @@ -24,6 +26,8 @@ android { } dependencies { + implementation(projects.core.ui.compose.navigation) + implementation(projects.core.ui.compose.designsystem) implementation(projects.core.ui.legacy.designsystem) diff --git a/app-ui-catalog/src/debug/kotlin/app/k9mail/ui/catalog/ui/atom/CatalogAtomContentPreview.kt b/app-ui-catalog/src/debug/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomContentPreview.kt similarity index 87% rename from app-ui-catalog/src/debug/kotlin/app/k9mail/ui/catalog/ui/atom/CatalogAtomContentPreview.kt rename to app-ui-catalog/src/debug/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomContentPreview.kt index b373a50d92ef3eb804e223db3bdb423e2143de33..80da9081364144d9cfdd8b178bd8c0f168e17096 100644 --- a/app-ui-catalog/src/debug/kotlin/app/k9mail/ui/catalog/ui/atom/CatalogAtomContentPreview.kt +++ b/app-ui-catalog/src/debug/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomContentPreview.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom +package net.thunderbird.ui.catalog.ui.page.atom import androidx.compose.runtime.Composable import app.k9mail.core.ui.compose.common.annotation.PreviewDevicesWithBackground @@ -12,6 +12,7 @@ internal fun CatalogContentPreview() { CatalogAtomContent( pages = persistentListOf(CatalogAtomPage.TYPOGRAPHY, CatalogAtomPage.COLOR), initialPage = CatalogAtomPage.TYPOGRAPHY, + onEvent = {}, ) } } diff --git a/app-ui-catalog/src/debug/kotlin/app/k9mail/ui/catalog/ui/atom/view/ColorContentPreview.kt b/app-ui-catalog/src/debug/kotlin/net/thunderbird/ui/catalog/ui/page/atom/view/ColorContentPreview.kt similarity index 91% rename from app-ui-catalog/src/debug/kotlin/app/k9mail/ui/catalog/ui/atom/view/ColorContentPreview.kt rename to app-ui-catalog/src/debug/kotlin/net/thunderbird/ui/catalog/ui/page/atom/view/ColorContentPreview.kt index 2602340379972af76e9029bc3bb5d98591671fe1..ac4a6a196ccd89d6febf3f26b708dd55ae5bcf24 100644 --- a/app-ui-catalog/src/debug/kotlin/app/k9mail/ui/catalog/ui/atom/view/ColorContentPreview.kt +++ b/app-ui-catalog/src/debug/kotlin/net/thunderbird/ui/catalog/ui/page/atom/view/ColorContentPreview.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom.view +package net.thunderbird.ui.catalog.ui.page.atom.view import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview diff --git a/app-ui-catalog/src/debug/res/drawable/ic_app_logo.xml b/app-ui-catalog/src/debug/res/drawable/ic_app_logo.xml new file mode 100644 index 0000000000000000000000000000000000000000..af3f00d6b068ff867bd031a9f37ed663fbdb3ba1 --- /dev/null +++ b/app-ui-catalog/src/debug/res/drawable/ic_app_logo.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-ui-catalog/src/debug/res/drawable/ic_app_logo_monochrome.xml b/app-ui-catalog/src/debug/res/drawable/ic_app_logo_monochrome.xml new file mode 100644 index 0000000000000000000000000000000000000000..52af5acef4991b4252493e7ab48342cde2050f82 --- /dev/null +++ b/app-ui-catalog/src/debug/res/drawable/ic_app_logo_monochrome.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/app-ui-catalog/src/debug/res/mipmap-hdpi/ic_launcher.png b/app-ui-catalog/src/debug/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f122077f6cb68df03fd4e416c8ebda47ceef1794 Binary files /dev/null and b/app-ui-catalog/src/debug/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/debug/res/mipmap-mdpi/ic_launcher.png b/app-ui-catalog/src/debug/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d449f2801d33c785ae0c42951cfe4823ed0e129f Binary files /dev/null and b/app-ui-catalog/src/debug/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/debug/res/mipmap-xhdpi/ic_launcher.png b/app-ui-catalog/src/debug/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17c995c16b1c5c6c34aac477372bb03d38b54fbe Binary files /dev/null and b/app-ui-catalog/src/debug/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/app-ui-catalog/src/debug/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9a92a290689e085ee4c6fe0cb1909fdf1b5271cf Binary files /dev/null and b/app-ui-catalog/src/debug/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/app-ui-catalog/src/debug/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..eda1c5d7e517a14453f6037bfad671962e8fc424 Binary files /dev/null and b/app-ui-catalog/src/debug/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/di/CatalogUiModule.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/di/CatalogUiModule.kt deleted file mode 100644 index e2245c9b6e5775a10037dfda5f93f54cbdca0c13..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/di/CatalogUiModule.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.k9mail.ui.catalog.di - -import app.k9mail.ui.catalog.ui.CatalogViewModel -import org.koin.androidx.viewmodel.dsl.viewModel -import org.koin.core.module.Module -import org.koin.dsl.module - -val catalogUiModule: Module = module { - viewModel { CatalogViewModel() } -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogContent.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogContent.kt deleted file mode 100644 index 90a56e2af38a4c5cf864ab047408ca2512f269f1..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogContent.kt +++ /dev/null @@ -1,63 +0,0 @@ -package app.k9mail.ui.catalog.ui - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.navigation.compose.rememberNavController -import app.k9mail.core.ui.compose.designsystem.organism.drawer.ModalNavigationDrawer -import app.k9mail.core.ui.compose.designsystem.template.Scaffold -import app.k9mail.ui.catalog.ui.CatalogContract.State -import app.k9mail.ui.catalog.ui.atom.navigateToCatalogAtom -import app.k9mail.ui.catalog.ui.common.ThemeTopAppBar -import app.k9mail.ui.catalog.ui.common.drawer.DrawerContent -import app.k9mail.ui.catalog.ui.molecule.navigateToCatalogMolecule -import app.k9mail.ui.catalog.ui.navigation.CatalogNavHost -import app.k9mail.ui.catalog.ui.organism.navigateToCatalogOrganism - -@Composable -fun CatalogContent( - state: State, - onThemeChanged: () -> Unit, - onThemeVariantChanged: () -> Unit, - modifier: Modifier = Modifier, -) { - val navController = rememberNavController() - - ModalNavigationDrawer( - drawerContent = { closeDrawer -> - DrawerContent( - closeDrawer = closeDrawer, - theme = state.theme, - themeVariant = state.themeVariant, - onThemeChanged = onThemeChanged, - onThemeVariantChanged = onThemeVariantChanged, - onNavigateToAtoms = { - navController.navigateToCatalogAtom() - }, - onNavigateToMolecules = { - navController.navigateToCatalogMolecule() - }, - onNavigateToOrganisms = { - navController.navigateToCatalogOrganism() - }, - ) - }, - ) { openDrawer -> - Scaffold( - modifier = modifier, - topBar = { - ThemeTopAppBar( - onMenuClick = openDrawer, - theme = state.theme, - themeVariant = state.themeVariant, - onThemeClick = onThemeChanged, - onThemeVariantClick = onThemeVariantChanged, - ) - }, - ) { paddingValues -> - CatalogNavHost( - navController = navController, - paddingValues = paddingValues, - ) - } - } -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogPage.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogPage.kt deleted file mode 100644 index e7f9a2ac1101af52e524385f77e59d2fc08106b8..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogPage.kt +++ /dev/null @@ -1,6 +0,0 @@ -package app.k9mail.ui.catalog.ui - -interface CatalogPage { - val displayName: String - val isFullScreen: Boolean -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomContent.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomContent.kt deleted file mode 100644 index 4887b76b36b657bb8702de22ec2a4388772c7451..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomContent.kt +++ /dev/null @@ -1,45 +0,0 @@ -package app.k9mail.ui.catalog.ui.atom - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import app.k9mail.ui.catalog.ui.atom.CatalogAtomPage.BUTTON -import app.k9mail.ui.catalog.ui.atom.CatalogAtomPage.COLOR -import app.k9mail.ui.catalog.ui.atom.CatalogAtomPage.ICON -import app.k9mail.ui.catalog.ui.atom.CatalogAtomPage.IMAGE -import app.k9mail.ui.catalog.ui.atom.CatalogAtomPage.SELECTION_CONTROL -import app.k9mail.ui.catalog.ui.atom.CatalogAtomPage.TEXT_FIELD -import app.k9mail.ui.catalog.ui.atom.CatalogAtomPage.TYPOGRAPHY -import app.k9mail.ui.catalog.ui.atom.items.buttonItems -import app.k9mail.ui.catalog.ui.atom.items.colorItems -import app.k9mail.ui.catalog.ui.atom.items.iconItems -import app.k9mail.ui.catalog.ui.atom.items.imageItems -import app.k9mail.ui.catalog.ui.atom.items.selectionControlItems -import app.k9mail.ui.catalog.ui.atom.items.textFieldItems -import app.k9mail.ui.catalog.ui.atom.items.typographyItems -import app.k9mail.ui.catalog.ui.common.PagedContent -import kotlinx.collections.immutable.ImmutableList - -@Composable -fun CatalogAtomContent( - pages: ImmutableList, - initialPage: CatalogAtomPage, - modifier: Modifier = Modifier, -) { - PagedContent( - pages = pages, - initialPage = initialPage, - modifier = modifier, - onRenderPage = { - when (it) { - TYPOGRAPHY -> typographyItems() - COLOR -> colorItems() - BUTTON -> buttonItems() - SELECTION_CONTROL -> selectionControlItems() - TEXT_FIELD -> textFieldItems() - ICON -> iconItems() - IMAGE -> imageItems() - } - }, - onRenderFullScreenPage = {}, - ) -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomNavigation.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomNavigation.kt deleted file mode 100644 index 868724d0c92f502d77d32c07d3f263f7e687c736..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomNavigation.kt +++ /dev/null @@ -1,26 +0,0 @@ -package app.k9mail.ui.catalog.ui.atom - -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding -import androidx.compose.ui.Modifier -import androidx.navigation.NavController -import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavOptions -import androidx.navigation.compose.composable - -const val NAVIGATION_ROUTE_CATALOG_ATOM = "/catalog/atom" - -fun NavController.navigateToCatalogAtom() { - navigate( - route = NAVIGATION_ROUTE_CATALOG_ATOM, - navOptions = NavOptions.Builder() - .setLaunchSingleTop(true) - .build(), - ) -} - -fun NavGraphBuilder.catalogAtomRoute(paddingValues: PaddingValues) { - composable(route = NAVIGATION_ROUTE_CATALOG_ATOM) { - CatalogAtomScreen(Modifier.padding(paddingValues)) - } -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomScreen.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomScreen.kt deleted file mode 100644 index 26f9da1654c22145ccc1077c231527f426795b8a..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomScreen.kt +++ /dev/null @@ -1,15 +0,0 @@ -package app.k9mail.ui.catalog.ui.atom - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - -@Composable -fun CatalogAtomScreen( - modifier: Modifier = Modifier, -) { - CatalogAtomContent( - pages = CatalogAtomPage.all(), - initialPage = CatalogAtomPage.TYPOGRAPHY, - modifier = modifier, - ) -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeNavigation.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeNavigation.kt deleted file mode 100644 index 1a147048661a3ac2271268604ea12398f965b306..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeNavigation.kt +++ /dev/null @@ -1,26 +0,0 @@ -package app.k9mail.ui.catalog.ui.molecule - -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding -import androidx.compose.ui.Modifier -import androidx.navigation.NavController -import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavOptions -import androidx.navigation.compose.composable - -const val NAVIGATION_ROUTE_CATALOG_MOLECULE = "/catalog/molecule" - -fun NavController.navigateToCatalogMolecule() { - navigate( - route = NAVIGATION_ROUTE_CATALOG_MOLECULE, - navOptions = NavOptions.Builder() - .setLaunchSingleTop(true) - .build(), - ) -} - -fun NavGraphBuilder.catalogMoleculeRoute(paddingValues: PaddingValues) { - composable(route = NAVIGATION_ROUTE_CATALOG_MOLECULE) { - CatalogMoleculeScreen(Modifier.padding(paddingValues)) - } -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeScreen.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeScreen.kt deleted file mode 100644 index b51282ae963a59b4be448e96b2f4685beb3c8893..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeScreen.kt +++ /dev/null @@ -1,15 +0,0 @@ -package app.k9mail.ui.catalog.ui.molecule - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - -@Composable -fun CatalogMoleculeScreen( - modifier: Modifier = Modifier, -) { - CatalogMoleculeContent( - pages = CatalogMoleculePage.all(), - initialPage = CatalogMoleculePage.INPUT, - modifier = modifier, - ) -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/navigation/CatalogNavHost.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/navigation/CatalogNavHost.kt deleted file mode 100644 index cb9214636e098d056f151588fbc588fb4cc085c4..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/navigation/CatalogNavHost.kt +++ /dev/null @@ -1,29 +0,0 @@ -package app.k9mail.ui.catalog.ui.navigation - -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.navigation.NavHostController -import androidx.navigation.compose.NavHost -import app.k9mail.ui.catalog.ui.atom.NAVIGATION_ROUTE_CATALOG_ATOM -import app.k9mail.ui.catalog.ui.atom.catalogAtomRoute -import app.k9mail.ui.catalog.ui.molecule.catalogMoleculeRoute -import app.k9mail.ui.catalog.ui.organism.catalogOrganismRoute - -@Composable -fun CatalogNavHost( - navController: NavHostController, - modifier: Modifier = Modifier, - paddingValues: PaddingValues = PaddingValues(), - startDestination: String = NAVIGATION_ROUTE_CATALOG_ATOM, -) { - NavHost( - navController = navController, - startDestination = startDestination, - modifier = modifier, - ) { - catalogAtomRoute(paddingValues) - catalogMoleculeRoute(paddingValues) - catalogOrganismRoute(paddingValues) - } -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogMoleculeContent.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogMoleculeContent.kt deleted file mode 100644 index 99b96703ae1c9f79613980db6f9e9c1770a5b6d6..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogMoleculeContent.kt +++ /dev/null @@ -1,27 +0,0 @@ -package app.k9mail.ui.catalog.ui.organism - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import app.k9mail.ui.catalog.ui.common.PagedContent -import app.k9mail.ui.catalog.ui.organism.CatalogOrganismPage.APP_BAR -import app.k9mail.ui.catalog.ui.organism.items.appBarItems -import kotlinx.collections.immutable.ImmutableList - -@Composable -fun CatalogOrganismContent( - pages: ImmutableList, - initialPage: CatalogOrganismPage, - modifier: Modifier = Modifier, -) { - PagedContent( - pages = pages, - initialPage = initialPage, - modifier = modifier, - onRenderPage = { - when (it) { - APP_BAR -> appBarItems() - } - }, - onRenderFullScreenPage = {}, - ) -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogMoleculeNavigation.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogMoleculeNavigation.kt deleted file mode 100644 index 206bb27646ce3d38be6876d4a3eb41d4b9ecd7af..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogMoleculeNavigation.kt +++ /dev/null @@ -1,26 +0,0 @@ -package app.k9mail.ui.catalog.ui.organism - -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.padding -import androidx.compose.ui.Modifier -import androidx.navigation.NavController -import androidx.navigation.NavGraphBuilder -import androidx.navigation.NavOptions -import androidx.navigation.compose.composable - -const val NAVIGATION_ROUTE_CATALOG_ORGANISM = "/catalog/organism" - -fun NavController.navigateToCatalogOrganism() { - navigate( - route = NAVIGATION_ROUTE_CATALOG_ORGANISM, - navOptions = NavOptions.Builder() - .setLaunchSingleTop(true) - .build(), - ) -} - -fun NavGraphBuilder.catalogOrganismRoute(paddingValues: PaddingValues) { - composable(route = NAVIGATION_ROUTE_CATALOG_ORGANISM) { - CatalogOrganismScreen(Modifier.padding(paddingValues)) - } -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogOrganismScreen.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogOrganismScreen.kt deleted file mode 100644 index 7c6fb5e2e5df7aac7e8352b04188eeb6ed1370a5..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogOrganismScreen.kt +++ /dev/null @@ -1,15 +0,0 @@ -package app.k9mail.ui.catalog.ui.organism - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier - -@Composable -fun CatalogOrganismScreen( - modifier: Modifier = Modifier, -) { - CatalogOrganismContent( - pages = CatalogOrganismPage.all(), - initialPage = CatalogOrganismPage.APP_BAR, - modifier = modifier, - ) -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/items/AppBarItems.kt b/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/items/AppBarItems.kt deleted file mode 100644 index aacf5ddd18bb406d4583778ccd217a19339d286c..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/items/AppBarItems.kt +++ /dev/null @@ -1,73 +0,0 @@ -package app.k9mail.ui.catalog.ui.organism.items - -import androidx.compose.foundation.lazy.grid.LazyGridScope -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonIcon -import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons -import app.k9mail.core.ui.compose.designsystem.organism.TopAppBar -import app.k9mail.core.ui.compose.designsystem.organism.TopAppBarWithBackButton -import app.k9mail.core.ui.compose.designsystem.organism.TopAppBarWithMenuButton -import app.k9mail.ui.catalog.ui.common.list.ItemOutlinedView -import app.k9mail.ui.catalog.ui.common.list.fullSpanItem -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem -import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem - -fun LazyGridScope.appBarItems() { - sectionHeaderItem(text = "TopAppBar") - sectionSubtitleItem(text = "With menu icon") - fullSpanItem { - ItemOutlinedView { - TopAppBarItem( - title = "Title", - actionIcon = Icons.Outlined.Info, - ) - } - } - sectionSubtitleItem(text = "With back menu icon") - fullSpanItem { - ItemOutlinedView { - TopAppBarWithMenuButton( - title = "Title", - onMenuClick = {}, - ) - } - } - sectionSubtitleItem(text = "With back icon") - fullSpanItem { - ItemOutlinedView { - TopAppBarWithBackButton( - title = "Title", - onBackClick = {}, - ) - } - } -} - -@Composable -fun TopAppBarItem( - title: String, - actionIcon: ImageVector, - modifier: Modifier = Modifier, - navIcon: ImageVector? = null, -) { - TopAppBar( - title = title, - navigationIcon = { - navIcon?.let { - ButtonIcon( - onClick = {}, - imageVector = Icons.Outlined.Menu, - ) - } - }, - actions = { - ButtonIcon( - onClick = {}, - imageVector = actionIcon, - ) - }, - modifier = modifier, - ) -} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/CatalogActivity.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/CatalogActivity.kt similarity index 71% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/CatalogActivity.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/CatalogActivity.kt index 41b45a446d1c4dfefbf14c1b2f59a85d3ea7cbfa..eb316755b6b4d6d190bdcb15bc5f62ff59281646 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/CatalogActivity.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/CatalogActivity.kt @@ -1,11 +1,11 @@ -package app.k9mail.ui.catalog +package net.thunderbird.ui.catalog import android.os.Bundle import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import app.k9mail.core.ui.compose.common.activity.setActivityContent -import app.k9mail.ui.catalog.ui.CatalogScreen +import net.thunderbird.ui.catalog.ui.CatalogScreen class CatalogActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -14,7 +14,7 @@ class CatalogActivity : ComponentActivity() { super.onCreate(savedInstanceState) - setActivityContent { + setContent { CatalogScreen() } } diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/CatalogApplication.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/CatalogApplication.kt similarity index 81% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/CatalogApplication.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/CatalogApplication.kt index 4e15b85b51ceca3c975f45d2a1d1a4fff8645f3c..febe6642944a18f24a9008e582513fe737d20b60 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/CatalogApplication.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/CatalogApplication.kt @@ -1,7 +1,7 @@ -package app.k9mail.ui.catalog +package net.thunderbird.ui.catalog import android.app.Application -import app.k9mail.ui.catalog.di.catalogUiModule +import net.thunderbird.ui.catalog.di.catalogUiModule import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/di/CatalogUiModule.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/di/CatalogUiModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..2d7dd6714bbba702214edbede4e4cf7be843e943 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/di/CatalogUiModule.kt @@ -0,0 +1,12 @@ +package net.thunderbird.ui.catalog.di + +import net.thunderbird.ui.catalog.ui.CatalogViewModel +import net.thunderbird.ui.catalog.ui.page.CatalogPageViewModel +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.core.module.Module +import org.koin.dsl.module + +val catalogUiModule: Module = module { + viewModel { CatalogViewModel() } + viewModel { CatalogPageViewModel() } +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogContent.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogContent.kt new file mode 100644 index 0000000000000000000000000000000000000000..a5515ec2105c55842e2e7f505ac2b0c3ff2bdc4d --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogContent.kt @@ -0,0 +1,85 @@ +package net.thunderbird.ui.catalog.ui + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import androidx.navigation.NavOptions +import app.k9mail.core.ui.compose.designsystem.organism.drawer.ModalNavigationDrawer +import app.k9mail.core.ui.compose.designsystem.template.Scaffold +import net.thunderbird.ui.catalog.ui.CatalogContract.State +import net.thunderbird.ui.catalog.ui.common.ThemeTopAppBar +import net.thunderbird.ui.catalog.ui.common.drawer.DrawerContent +import net.thunderbird.ui.catalog.ui.navigation.CatalogNavHost +import net.thunderbird.ui.catalog.ui.navigation.CatalogRoute + +@Suppress("LongMethod") +@Composable +fun CatalogContent( + navController: NavHostController, + state: State, + onThemeChanged: () -> Unit, + onThemeVariantChanged: () -> Unit, + modifier: Modifier = Modifier, +) { + ModalNavigationDrawer( + drawerContent = { closeDrawer -> + DrawerContent( + closeDrawer = closeDrawer, + theme = state.theme, + themeVariant = state.themeVariant, + onThemeChanged = onThemeChanged, + onThemeVariantChanged = onThemeVariantChanged, + onNavigateToAtoms = { + navController.navigate( + route = CatalogRoute.Atom, + navOptions = NavOptions.Builder() + .setLaunchSingleTop(true) + .build(), + ) + }, + onNavigateToMolecules = { + navController.navigate( + route = CatalogRoute.Molecule, + navOptions = NavOptions.Builder() + .setLaunchSingleTop(true) + .build(), + ) + }, + onNavigateToOrganisms = { + navController.navigate( + route = CatalogRoute.Organism, + navOptions = NavOptions.Builder() + .setLaunchSingleTop(true) + .build(), + ) + }, + onNavigateToTemplates = { + navController.navigate( + route = CatalogRoute.Template, + navOptions = NavOptions.Builder() + .setLaunchSingleTop(true) + .build(), + ) + }, + ) + }, + ) { openDrawer -> + Scaffold( + modifier = modifier, + topBar = { + ThemeTopAppBar( + onMenuClick = openDrawer, + theme = state.theme, + themeVariant = state.themeVariant, + onThemeClick = onThemeChanged, + onThemeVariantClick = onThemeVariantChanged, + ) + }, + ) { paddingValues -> + CatalogNavHost( + navController = navController, + paddingValues = paddingValues, + ) + } + } +} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogContract.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogContract.kt similarity index 87% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogContract.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogContract.kt index 250b09f77c2cc3c54f8808a2398c5f9b8b437ebf..4805a13acb1bb4043cf1c211dffc3a2a299a8de0 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogContract.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogContract.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui +package net.thunderbird.ui.catalog.ui import app.k9mail.core.ui.compose.common.mvi.UnidirectionalViewModel @@ -7,8 +7,8 @@ interface CatalogContract { enum class Theme( val displayName: String, ) { - THEME_2_K9("K-9 Theme2"), - THEME_2_THUNDERBIRD("Thunderbird Theme2"), + THEME_2_K9("K-9 UI"), + THEME_2_THUNDERBIRD("Thunderbird UI"), } enum class ThemeVariant( @@ -21,7 +21,7 @@ interface CatalogContract { interface ViewModel : UnidirectionalViewModel data class State( - val theme: Theme = Theme.THEME_2_K9, + val theme: Theme = Theme.THEME_2_THUNDERBIRD, val themeVariant: ThemeVariant = ThemeVariant.LIGHT, ) diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogScreen.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogScreen.kt similarity index 69% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogScreen.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogScreen.kt index 4ff6abe31b873f9b9db4dab08e92fc33e7d5661f..9ba792bd4c9a85e87c57af0301d3f90708e3fcd2 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogScreen.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogScreen.kt @@ -1,15 +1,16 @@ -package app.k9mail.ui.catalog.ui +package net.thunderbird.ui.catalog.ui import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.navigation.compose.rememberNavController import app.k9mail.core.ui.compose.common.mvi.observe import app.k9mail.core.ui.compose.designsystem.atom.Surface -import app.k9mail.ui.catalog.ui.CatalogContract.Event.OnThemeChanged -import app.k9mail.ui.catalog.ui.CatalogContract.Event.OnThemeVariantChanged -import app.k9mail.ui.catalog.ui.CatalogContract.ViewModel -import app.k9mail.ui.catalog.ui.common.theme.ThemeSwitch +import net.thunderbird.ui.catalog.ui.CatalogContract.Event.OnThemeChanged +import net.thunderbird.ui.catalog.ui.CatalogContract.Event.OnThemeVariantChanged +import net.thunderbird.ui.catalog.ui.CatalogContract.ViewModel +import net.thunderbird.ui.catalog.ui.common.theme.ThemeSwitch import org.koin.androidx.compose.koinViewModel @Composable @@ -18,6 +19,7 @@ fun CatalogScreen( viewModel: ViewModel = koinViewModel(), ) { val (state, dispatch) = viewModel.observe(handleEffect = {}) + val navController = rememberNavController() ThemeSwitch( theme = state.value.theme, @@ -30,6 +32,7 @@ fun CatalogScreen( .then(modifier), ) { CatalogContent( + navController = navController, state = state.value, onThemeChanged = { dispatch(OnThemeChanged) }, onThemeVariantChanged = { dispatch(OnThemeVariantChanged) }, diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogViewModel.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogViewModel.kt similarity index 61% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogViewModel.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogViewModel.kt index feb03506a323aff7d8ad6baad08ca4de8383869f..d065427f31ff53aaf7ad15461aedbdbdd0076bac 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/CatalogViewModel.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/CatalogViewModel.kt @@ -1,11 +1,11 @@ -package app.k9mail.ui.catalog.ui +package net.thunderbird.ui.catalog.ui import app.k9mail.core.ui.compose.common.mvi.BaseViewModel -import app.k9mail.ui.catalog.ui.CatalogContract.Event -import app.k9mail.ui.catalog.ui.CatalogContract.Event.OnThemeChanged -import app.k9mail.ui.catalog.ui.CatalogContract.Event.OnThemeVariantChanged -import app.k9mail.ui.catalog.ui.CatalogContract.State -import app.k9mail.ui.catalog.ui.CatalogContract.ViewModel +import net.thunderbird.ui.catalog.ui.CatalogContract.Event +import net.thunderbird.ui.catalog.ui.CatalogContract.Event.OnThemeChanged +import net.thunderbird.ui.catalog.ui.CatalogContract.Event.OnThemeVariantChanged +import net.thunderbird.ui.catalog.ui.CatalogContract.State +import net.thunderbird.ui.catalog.ui.CatalogContract.ViewModel class CatalogViewModel( initialState: State = State(), diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/ThemeTopAppBar.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/ThemeTopAppBar.kt similarity index 89% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/ThemeTopAppBar.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/ThemeTopAppBar.kt index 7fed33b03262e64ee7932e76d4d234632c986c2d..b84f7f2ed85ec756d5096cde5ddc44cf66b5f085 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/ThemeTopAppBar.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/ThemeTopAppBar.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common +package net.thunderbird.ui.catalog.ui.common import androidx.compose.material.icons.filled.DarkMode import androidx.compose.material.icons.filled.LightMode @@ -7,8 +7,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonIcon import app.k9mail.core.ui.compose.designsystem.organism.TopAppBarWithMenuButton -import app.k9mail.ui.catalog.ui.CatalogContract.Theme -import app.k9mail.ui.catalog.ui.CatalogContract.ThemeVariant +import net.thunderbird.ui.catalog.ui.CatalogContract.Theme +import net.thunderbird.ui.catalog.ui.CatalogContract.ThemeVariant import androidx.compose.material.icons.Icons as MaterialIcons @Composable diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/drawer/DrawerContent.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/drawer/DrawerContent.kt similarity index 85% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/drawer/DrawerContent.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/drawer/DrawerContent.kt index 2c28a72f7e27b82194b2b29418737e443bb037d9..be51c97a4c125331ff8b423b119104df2fca4fba 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/drawer/DrawerContent.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/drawer/DrawerContent.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.drawer +package net.thunderbird.ui.catalog.ui.common.drawer import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -10,9 +10,9 @@ import app.k9mail.core.ui.compose.designsystem.organism.drawer.ModalDrawerSheet import app.k9mail.core.ui.compose.designsystem.organism.drawer.NavigationDrawerDivider import app.k9mail.core.ui.compose.designsystem.organism.drawer.NavigationDrawerHeadline import app.k9mail.core.ui.compose.designsystem.organism.drawer.NavigationDrawerItem -import app.k9mail.ui.catalog.ui.CatalogContract.Theme -import app.k9mail.ui.catalog.ui.CatalogContract.ThemeVariant -import app.k9mail.ui.catalog.ui.next +import net.thunderbird.ui.catalog.ui.CatalogContract.Theme +import net.thunderbird.ui.catalog.ui.CatalogContract.ThemeVariant +import net.thunderbird.ui.catalog.ui.next @Suppress("LongParameterList", "LongMethod") @Composable @@ -25,6 +25,7 @@ fun DrawerContent( onNavigateToAtoms: () -> Unit, onNavigateToMolecules: () -> Unit, onNavigateToOrganisms: () -> Unit, + onNavigateToTemplates: () -> Unit, modifier: Modifier = Modifier, ) { ModalDrawerSheet( @@ -57,6 +58,14 @@ fun DrawerContent( onNavigateToOrganisms() }, ) + NavigationDrawerItem( + label = "Templates", + selected = false, + onClick = { + closeDrawer() + onNavigateToTemplates() + }, + ) NavigationDrawerDivider() diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/theme/ThemeSwitch.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/theme/ThemeSwitch.kt similarity index 88% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/theme/ThemeSwitch.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/theme/ThemeSwitch.kt index 909d368d577b30c70e168e3b922ba87c648de843..3b6b63c1454eb4fc58aa1e4d34c2b607af93c891 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/theme/ThemeSwitch.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/common/theme/ThemeSwitch.kt @@ -1,10 +1,10 @@ -package app.k9mail.ui.catalog.ui.common.theme +package net.thunderbird.ui.catalog.ui.common.theme import androidx.compose.runtime.Composable import app.k9mail.core.ui.compose.theme2.k9mail.K9MailTheme2 import app.k9mail.core.ui.compose.theme2.thunderbird.ThunderbirdTheme2 -import app.k9mail.ui.catalog.ui.CatalogContract.Theme -import app.k9mail.ui.catalog.ui.CatalogContract.ThemeVariant +import net.thunderbird.ui.catalog.ui.CatalogContract.Theme +import net.thunderbird.ui.catalog.ui.CatalogContract.ThemeVariant @Composable fun ThemeSwitch( diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogNavHost.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogNavHost.kt new file mode 100644 index 0000000000000000000000000000000000000000..d2f26f911e7eaf72772a58047d5dfa432671c547 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogNavHost.kt @@ -0,0 +1,29 @@ +package net.thunderbird.ui.catalog.ui.navigation + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost + +@Composable +fun CatalogNavHost( + navController: NavHostController, + modifier: Modifier = Modifier, + paddingValues: PaddingValues = PaddingValues(), + startDestination: CatalogRoute = CatalogRoute.Atom, + catalogNavigation: CatalogNavigation = DefaultCatalogNavigation(), +) { + NavHost( + navController = navController, + startDestination = startDestination, + modifier = modifier.padding(paddingValues), + ) { + catalogNavigation.registerRoutes( + navGraphBuilder = this, + onBack = { navController.popBackStack() }, + onFinish = { navController.popBackStack() }, + ) + } +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogNavigation.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogNavigation.kt new file mode 100644 index 0000000000000000000000000000000000000000..ec42e99590d9564fa6ba70caf56bc443582ac162 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogNavigation.kt @@ -0,0 +1,5 @@ +package net.thunderbird.ui.catalog.ui.navigation + +import app.k9mail.core.ui.compose.navigation.Navigation + +interface CatalogNavigation : Navigation diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogRoute.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogRoute.kt new file mode 100644 index 0000000000000000000000000000000000000000..9474d5f9e76dfaa63e7fe717c572f738ad8d6a14 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/CatalogRoute.kt @@ -0,0 +1,47 @@ +package net.thunderbird.ui.catalog.ui.navigation + +import app.k9mail.core.ui.compose.navigation.Route +import kotlinx.serialization.Serializable + +sealed interface CatalogRoute : Route { + + @Serializable + data object Atom : CatalogRoute { + override val basePath: String = BASE_PATH + + override fun route(): String = basePath + + const val BASE_PATH = "$CATALOG_BASE_PATH/atom" + } + + @Serializable + data object Molecule : CatalogRoute { + override val basePath: String = BASE_PATH + + override fun route(): String = basePath + + const val BASE_PATH = "$CATALOG_BASE_PATH/molecule" + } + + @Serializable + data object Organism : CatalogRoute { + override val basePath: String = BASE_PATH + + override fun route(): String = basePath + + const val BASE_PATH = "$CATALOG_BASE_PATH/organism" + } + + @Serializable + data object Template : CatalogRoute { + override val basePath: String = BASE_PATH + + override fun route(): String = basePath + + const val BASE_PATH = "$CATALOG_BASE_PATH/template" + } + + companion object { + const val CATALOG_BASE_PATH = "app://catalog" + } +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/DefaultCatalogNavigation.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/DefaultCatalogNavigation.kt new file mode 100644 index 0000000000000000000000000000000000000000..5d51aaa529ece7f718f35e1852d8c5b2b6654b00 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/navigation/DefaultCatalogNavigation.kt @@ -0,0 +1,43 @@ +package net.thunderbird.ui.catalog.ui.navigation + +import androidx.navigation.NavGraphBuilder +import app.k9mail.core.ui.compose.navigation.deepLinkComposable +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomScreen +import net.thunderbird.ui.catalog.ui.page.molecule.CatalogMoleculeScreen +import net.thunderbird.ui.catalog.ui.page.organism.CatalogOrganismScreen +import net.thunderbird.ui.catalog.ui.page.template.CatalogTemplateScreen + +class DefaultCatalogNavigation : CatalogNavigation { + + override fun registerRoutes( + navGraphBuilder: NavGraphBuilder, + onBack: () -> Unit, + onFinish: (CatalogRoute) -> Unit, + ) { + with(navGraphBuilder) { + deepLinkComposable( + basePath = CatalogRoute.Atom.BASE_PATH, + ) { backStackEntry -> + CatalogAtomScreen() + } + + deepLinkComposable( + basePath = CatalogRoute.Molecule.BASE_PATH, + ) { backStackEntry -> + CatalogMoleculeScreen() + } + + deepLinkComposable( + basePath = CatalogRoute.Organism.BASE_PATH, + ) { backStackEntry -> + CatalogOrganismScreen() + } + + deepLinkComposable( + basePath = CatalogRoute.Template.BASE_PATH, + ) { backStackEntry -> + CatalogTemplateScreen() + } + } + } +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/CatalogPageContract.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/CatalogPageContract.kt new file mode 100644 index 0000000000000000000000000000000000000000..829cd297f9a8eaec3e1dfa18ad9fc56cdde6ca90 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/CatalogPageContract.kt @@ -0,0 +1,24 @@ +package net.thunderbird.ui.catalog.ui.page + +import app.k9mail.core.ui.compose.common.mvi.UnidirectionalViewModel +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomPage + +interface CatalogPageContract { + + interface CatalogPage { + val displayName: String + val isFullScreen: Boolean + } + + interface ViewModel : UnidirectionalViewModel + + data class State( + val page: CatalogPage = CatalogAtomPage.TYPOGRAPHY, + ) + + sealed interface Event { + data class OnPageChanged( + val page: CatalogPage, + ) : Event + } +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/CatalogPageViewModel.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/CatalogPageViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..2682de08f7dafadaef6aa84cd5024ae7b21501d3 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/CatalogPageViewModel.kt @@ -0,0 +1,23 @@ +package net.thunderbird.ui.catalog.ui.page + +import app.k9mail.core.ui.compose.common.mvi.BaseViewModel +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.Event +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.State +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.ViewModel + +class CatalogPageViewModel( + initialState: State = State(), +) : BaseViewModel(initialState), ViewModel { + + override fun event(event: Event) { + when (event) { + is Event.OnPageChanged -> { + updateState { + it.copy( + page = event.page, + ) + } + } + } + } +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomContent.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomContent.kt new file mode 100644 index 0000000000000000000000000000000000000000..e7bb95f1c82cd4f6f6f31087fe84be746e5b419a --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomContent.kt @@ -0,0 +1,48 @@ +package net.thunderbird.ui.catalog.ui.page.atom + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import kotlinx.collections.immutable.ImmutableList +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomPage.BUTTON +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomPage.COLOR +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomPage.ICON +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomPage.IMAGE +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomPage.SELECTION_CONTROL +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomPage.TEXT_FIELD +import net.thunderbird.ui.catalog.ui.page.atom.CatalogAtomPage.TYPOGRAPHY +import net.thunderbird.ui.catalog.ui.page.atom.items.buttonItems +import net.thunderbird.ui.catalog.ui.page.atom.items.colorItems +import net.thunderbird.ui.catalog.ui.page.atom.items.iconItems +import net.thunderbird.ui.catalog.ui.page.atom.items.imageItems +import net.thunderbird.ui.catalog.ui.page.atom.items.selectionControlItems +import net.thunderbird.ui.catalog.ui.page.atom.items.textFieldItems +import net.thunderbird.ui.catalog.ui.page.atom.items.typographyItems +import net.thunderbird.ui.catalog.ui.page.common.PagedContent + +@Composable +fun CatalogAtomContent( + pages: ImmutableList, + initialPage: CatalogAtomPage, + onEvent: (CatalogPageContract.Event) -> Unit, + modifier: Modifier = Modifier, +) { + PagedContent( + pages = pages, + initialPage = initialPage, + modifier = modifier, + onRenderPage = { + when (it) { + TYPOGRAPHY -> typographyItems() + COLOR -> colorItems() + BUTTON -> buttonItems() + SELECTION_CONTROL -> selectionControlItems() + TEXT_FIELD -> textFieldItems() + ICON -> iconItems() + IMAGE -> imageItems() + } + }, + onRenderFullScreenPage = {}, + onEvent = onEvent, + ) +} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomPage.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomPage.kt similarity index 81% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomPage.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomPage.kt index 5e9520cb78ca746095d7cc249cf36192a97ab250..8b498359e014757327e3fb2a3a3e0538d28f456c 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/CatalogAtomPage.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomPage.kt @@ -1,7 +1,7 @@ -package app.k9mail.ui.catalog.ui.atom +package net.thunderbird.ui.catalog.ui.page.atom -import app.k9mail.ui.catalog.ui.CatalogPage import kotlinx.collections.immutable.toImmutableList +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.CatalogPage enum class CatalogAtomPage( override val displayName: String, diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomScreen.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomScreen.kt new file mode 100644 index 0000000000000000000000000000000000000000..a8b6be86a76bd43532e10f95e85d3c5f25c0265b --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/CatalogAtomScreen.kt @@ -0,0 +1,23 @@ +package net.thunderbird.ui.catalog.ui.page.atom + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import app.k9mail.core.ui.compose.common.mvi.observe +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.ViewModel +import net.thunderbird.ui.catalog.ui.page.CatalogPageViewModel +import org.koin.androidx.compose.koinViewModel + +@Composable +fun CatalogAtomScreen( + modifier: Modifier = Modifier, + viewModel: ViewModel = koinViewModel(), +) { + val (state, dispatch) = viewModel.observe { } + + CatalogAtomContent( + pages = CatalogAtomPage.all(), + initialPage = state.value.page as? CatalogAtomPage ?: CatalogAtomPage.TYPOGRAPHY, + onEvent = { dispatch(it) }, + modifier = modifier, + ) +} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ButtonItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ButtonItems.kt similarity index 92% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ButtonItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ButtonItems.kt index ce2c922ce8331bacc715253abb4043603a07b95a..3655970f2e5172188d6c65c34e7424f9756b5387 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ButtonItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ButtonItems.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom.items +package net.thunderbird.ui.catalog.ui.page.atom.items import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.LazyGridScope @@ -10,9 +10,9 @@ import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonIcon import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonOutlined import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonText import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons -import app.k9mail.ui.catalog.ui.common.list.defaultItem -import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItemPadding +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem @Suppress("LongMethod") fun LazyGridScope.buttonItems() { diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ColorItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ColorItems.kt similarity index 97% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ColorItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ColorItems.kt index 00f56dcf35f554c60188c8bce6051489a38e92de..395f4eb832aec8d5b313ca924fbbdc8a06889d62 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ColorItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ColorItems.kt @@ -1,10 +1,10 @@ -package app.k9mail.ui.catalog.ui.atom.items +package net.thunderbird.ui.catalog.ui.page.atom.items import androidx.compose.foundation.lazy.grid.LazyGridScope import app.k9mail.core.ui.compose.theme2.MainTheme -import app.k9mail.ui.catalog.ui.atom.view.ColorContent -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem -import app.k9mail.ui.catalog.ui.common.list.wideItem +import net.thunderbird.ui.catalog.ui.page.atom.view.ColorContent +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.wideItem @Suppress("LongMethod") fun LazyGridScope.colorItems() { diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/IconItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/IconItems.kt similarity index 92% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/IconItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/IconItems.kt index bd508fe6e576a03d7337b31d4d7434c67a7957f8..172d42e30afa5f5f94486830dbca745876b3fe4b 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/IconItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/IconItems.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom.items +package net.thunderbird.ui.catalog.ui.page.atom.items import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -14,10 +14,10 @@ import app.k9mail.core.ui.compose.designsystem.atom.icon.Icon import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall import app.k9mail.core.ui.compose.theme2.MainTheme -import app.k9mail.ui.catalog.ui.common.list.defaultItem -import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem -import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItemPadding +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionSubtitleItem import androidx.compose.material3.Icon as Material3Icon import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons as LegacyIcons diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ImageItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ImageItems.kt similarity index 92% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ImageItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ImageItems.kt index 1005891bd8c06b1650d2327234e73bca8e52105a..861e52d2ad766bf78748f28e45b518d38bec43d3 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/ImageItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/ImageItems.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom.items +package net.thunderbird.ui.catalog.ui.page.atom.items import androidx.compose.foundation.Image import androidx.compose.foundation.border @@ -21,11 +21,11 @@ import app.k9mail.core.ui.compose.designsystem.atom.image.FixedScaleImage import app.k9mail.core.ui.compose.designsystem.atom.image.RemoteImage import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall import app.k9mail.core.ui.compose.theme2.MainTheme -import app.k9mail.ui.catalog.ui.common.list.defaultItem -import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding -import app.k9mail.ui.catalog.ui.common.list.fullSpanItem -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem -import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItemPadding +import net.thunderbird.ui.catalog.ui.page.common.list.fullSpanItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionSubtitleItem fun LazyGridScope.imageItems() { sectionHeaderItem(text = "Images") diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/SelectionControlItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/SelectionControlItems.kt similarity index 87% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/SelectionControlItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/SelectionControlItems.kt index d5f240616f2e6b9bd8fb25c7d5b9911cf951706b..39d72c22d59763e5ff1f14992ac1256ad8e09128 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/SelectionControlItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/SelectionControlItems.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom.items +package net.thunderbird.ui.catalog.ui.page.atom.items import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding @@ -9,9 +9,9 @@ import androidx.compose.ui.Modifier import app.k9mail.core.ui.compose.designsystem.atom.Checkbox import app.k9mail.core.ui.compose.designsystem.atom.Switch import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall -import app.k9mail.ui.catalog.ui.common.list.defaultItem -import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItemPadding +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem fun LazyGridScope.selectionControlItems() { sectionHeaderItem(text = "Checkbox") diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/TextFieldItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/TextFieldItems.kt similarity index 96% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/TextFieldItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/TextFieldItems.kt index 1d6d68dd35fb48fc6119b74a3e02d0c25913f7e0..f0fb4133d1fcb09266a13b2087b005b8fc261ab9 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/TextFieldItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/TextFieldItems.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom.items +package net.thunderbird.ui.catalog.ui.page.atom.items import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -22,13 +22,13 @@ import app.k9mail.core.ui.compose.designsystem.atom.textfield.TextFieldOutlinedP import app.k9mail.core.ui.compose.designsystem.atom.textfield.TextFieldOutlinedSelect import app.k9mail.core.ui.compose.designsystem.molecule.input.CheckboxInput import app.k9mail.core.ui.compose.theme2.MainTheme -import app.k9mail.ui.catalog.ui.common.helper.WithRememberedState -import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding -import app.k9mail.ui.catalog.ui.common.list.fullSpanItem -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem -import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf +import net.thunderbird.ui.catalog.ui.page.common.helper.WithRememberedState +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItemPadding +import net.thunderbird.ui.catalog.ui.page.common.list.fullSpanItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionSubtitleItem fun LazyGridScope.textFieldItems() { sectionHeaderItem(text = "Text field - Outlined") diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/TypographyItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/TypographyItems.kt similarity index 95% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/TypographyItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/TypographyItems.kt index 89505fc14a4eef2294fd57b71f12e66ceaf25a79..709b99334727c24e26a28ab9b30b60664213a810 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/items/TypographyItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/items/TypographyItems.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom.items +package net.thunderbird.ui.catalog.ui.page.atom.items import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.LazyGridScope @@ -23,9 +23,9 @@ import app.k9mail.core.ui.compose.designsystem.atom.text.TextLabelSmall import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleLarge import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleSmall -import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding -import app.k9mail.ui.catalog.ui.common.list.fullSpanItem -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItemPadding +import net.thunderbird.ui.catalog.ui.page.common.list.fullSpanItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem fun LazyGridScope.typographyItems() { sectionHeaderItem(text = "Text styles") diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/view/ColorContent.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/view/ColorContent.kt similarity index 92% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/view/ColorContent.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/view/ColorContent.kt index eab40758df839ff115c5b971f089854f8023cffc..e960f614b59149493eb7d54173247c36ab62937f 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/atom/view/ColorContent.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/atom/view/ColorContent.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.atom.view +package net.thunderbird.ui.catalog.ui.page.atom.view import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -13,7 +13,7 @@ import app.k9mail.core.ui.compose.designsystem.atom.Surface import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyLarge import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall import app.k9mail.core.ui.compose.theme2.MainTheme -import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItemPadding @Composable internal fun ColorContent( diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/PagedContent.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/PagedContent.kt similarity index 84% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/PagedContent.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/PagedContent.kt index 1fc6d744a4ec81026b05a241de24ba9973b7970f..c415b342500d4c92df133828d6dd0fc33ef9cbb3 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/PagedContent.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/PagedContent.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common +package net.thunderbird.ui.catalog.ui.page.common import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -15,22 +15,25 @@ import androidx.compose.material3.ScrollableTabRow import androidx.compose.material3.Tab import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import app.k9mail.core.ui.compose.designsystem.template.ResponsiveContentWithSurface import app.k9mail.core.ui.compose.theme2.MainTheme -import app.k9mail.ui.catalog.ui.CatalogPage -import app.k9mail.ui.catalog.ui.common.list.fullSpanItem import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.launch +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.CatalogPage +import net.thunderbird.ui.catalog.ui.page.common.list.fullSpanItem @Composable fun PagedContent( pages: ImmutableList, initialPage: T, + onRenderPage: LazyGridScope.(T) -> Unit, + onEvent: (CatalogPageContract.Event) -> Unit, modifier: Modifier = Modifier, onRenderFullScreenPage: @Composable (T) -> Unit = {}, - onRenderPage: LazyGridScope.(T) -> Unit, ) { val pagerState = rememberPagerState( initialPage = pages.indexOf(initialPage), @@ -40,6 +43,10 @@ fun PagedContent( } val coroutineScope = rememberCoroutineScope() + LaunchedEffect(pagerState.settledPage) { + onEvent(CatalogPageContract.Event.OnPageChanged(pages[pagerState.settledPage])) + } + Column( modifier = modifier, ) { @@ -52,6 +59,7 @@ fun PagedContent( onClick = { coroutineScope.launch { pagerState.animateScrollToPage(index) + onEvent(CatalogPageContract.Event.OnPageChanged(pages[index])) } }, text = { Text(text = title.toString()) }, diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/helper/WithRememberedState.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/helper/WithRememberedState.kt similarity index 86% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/helper/WithRememberedState.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/helper/WithRememberedState.kt index 3aa78eaf6122870cd6eb3a90c5ad50667435fa06..40f0b68f9e30205d2fce6cca4ff021889a5b6d12 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/helper/WithRememberedState.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/helper/WithRememberedState.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.helper +package net.thunderbird.ui.catalog.ui.page.common.helper import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/DefaultItem.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/DefaultItem.kt similarity index 86% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/DefaultItem.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/DefaultItem.kt index c5eb8e8438d450da083f719b6f795e2eed13cb35..0160a483caa1d2bd8604ea8bad963d67b99596c4 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/DefaultItem.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/DefaultItem.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.list +package net.thunderbird.ui.catalog.ui.page.common.list import androidx.compose.foundation.lazy.grid.LazyGridItemScope import androidx.compose.foundation.lazy.grid.LazyGridScope diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/DefaultItemPadding.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/DefaultItemPadding.kt similarity index 82% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/DefaultItemPadding.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/DefaultItemPadding.kt index 82a8b5b8de212b09877c1a8d7c35120d4bc7b5d4..961bb9ab9643e81f08ebf6c0c734c77ed54ebd70 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/DefaultItemPadding.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/DefaultItemPadding.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.list +package net.thunderbird.ui.catalog.ui.page.common.list import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/FullSpanItem.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/FullSpanItem.kt similarity index 89% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/FullSpanItem.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/FullSpanItem.kt index 31ce00d3280c837e45e315c90776879b5efa47e5..9c20fddc6bc5c83bcf660e617e722841bb19d14a 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/FullSpanItem.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/FullSpanItem.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.list +package net.thunderbird.ui.catalog.ui.page.common.list import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyGridItemScope diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/ItemOutlinedView.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/ItemOutlinedView.kt similarity index 94% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/ItemOutlinedView.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/ItemOutlinedView.kt index 5e5b31d77789b448a25cffbe23f994174dca9733..f3fac5490d99a4b5431cc1b0dbe29ed1904d43b7 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/ItemOutlinedView.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/ItemOutlinedView.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.list +package net.thunderbird.ui.catalog.ui.page.common.list import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionHeaderItem.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionHeaderItem.kt similarity index 94% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionHeaderItem.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionHeaderItem.kt index aebc7f82f18f3be3fcbd7afdf60a114e3eb407fa..e526063dc155f8e37f300062651ac44aae43995d 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionHeaderItem.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionHeaderItem.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.list +package net.thunderbird.ui.catalog.ui.page.common.list import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionInfoItem.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionInfoItem.kt similarity index 94% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionInfoItem.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionInfoItem.kt index 0f9f63d2c62bdefc4c443ff4aab7e0f08edff109..8197ffc6d6f050bea6bf441963eb556c84372ae0 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionInfoItem.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionInfoItem.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.list +package net.thunderbird.ui.catalog.ui.page.common.list import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionSubtitleItem.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionSubtitleItem.kt similarity index 94% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionSubtitleItem.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionSubtitleItem.kt index 75940300fa548e260919a75a6f8557e80c90a8ae..90831c08f47121632fe342e6e2cd04507d84b3eb 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionSubtitleItem.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/SectionSubtitleItem.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.list +package net.thunderbird.ui.catalog.ui.page.common.list import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/WideItem.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/WideItem.kt similarity index 89% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/WideItem.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/WideItem.kt index 3ef33e8982f0d484c36d7c71de48c1b7902ce4d3..a05c1d8fb7243ade3bccb8d08399689d9b39567b 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/WideItem.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/common/list/WideItem.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.common.list +package net.thunderbird.ui.catalog.ui.page.common.list import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyGridItemScope diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeContent.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculeContent.kt similarity index 55% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeContent.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculeContent.kt index 2ecd78957c408cca42971796717aa412139d66f3..c99f0190a14f2382e4187d40251d1e9299f637b1 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculeContent.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculeContent.kt @@ -1,20 +1,22 @@ -package app.k9mail.ui.catalog.ui.molecule +package net.thunderbird.ui.catalog.ui.page.molecule import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import app.k9mail.ui.catalog.ui.common.PagedContent -import app.k9mail.ui.catalog.ui.molecule.CatalogMoleculePage.INPUT -import app.k9mail.ui.catalog.ui.molecule.CatalogMoleculePage.PULL_TO_REFRESH -import app.k9mail.ui.catalog.ui.molecule.CatalogMoleculePage.STATE -import app.k9mail.ui.catalog.ui.molecule.items.PullToRefresh -import app.k9mail.ui.catalog.ui.molecule.items.inputItems -import app.k9mail.ui.catalog.ui.molecule.items.stateItems import kotlinx.collections.immutable.ImmutableList +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract +import net.thunderbird.ui.catalog.ui.page.common.PagedContent +import net.thunderbird.ui.catalog.ui.page.molecule.CatalogMoleculePage.INPUT +import net.thunderbird.ui.catalog.ui.page.molecule.CatalogMoleculePage.PULL_TO_REFRESH +import net.thunderbird.ui.catalog.ui.page.molecule.CatalogMoleculePage.STATE +import net.thunderbird.ui.catalog.ui.page.molecule.items.PullToRefresh +import net.thunderbird.ui.catalog.ui.page.molecule.items.inputItems +import net.thunderbird.ui.catalog.ui.page.molecule.items.stateItems @Composable fun CatalogMoleculeContent( pages: ImmutableList, initialPage: CatalogMoleculePage, + onEvent: (CatalogPageContract.Event) -> Unit, modifier: Modifier = Modifier, ) { PagedContent( @@ -34,5 +36,6 @@ fun CatalogMoleculeContent( else -> throw IllegalArgumentException("Unknown page: $page") } }, + onEvent = onEvent, ) } diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculePage.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculePage.kt similarity index 78% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculePage.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculePage.kt index c8c01aa0437f1a3c1197b702748f89227bc0e897..cb7d9b674938954878e40d193b1536504b38d341 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/CatalogMoleculePage.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculePage.kt @@ -1,7 +1,7 @@ -package app.k9mail.ui.catalog.ui.molecule +package net.thunderbird.ui.catalog.ui.page.molecule -import app.k9mail.ui.catalog.ui.CatalogPage import kotlinx.collections.immutable.toImmutableList +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.CatalogPage enum class CatalogMoleculePage( override val displayName: String, diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculeScreen.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculeScreen.kt new file mode 100644 index 0000000000000000000000000000000000000000..fff70dd9ab1869f40eda8e43f6afa9d9f53ecf06 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/CatalogMoleculeScreen.kt @@ -0,0 +1,23 @@ +package net.thunderbird.ui.catalog.ui.page.molecule + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import app.k9mail.core.ui.compose.common.mvi.observe +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.ViewModel +import net.thunderbird.ui.catalog.ui.page.CatalogPageViewModel +import org.koin.androidx.compose.koinViewModel + +@Composable +fun CatalogMoleculeScreen( + modifier: Modifier = Modifier, + viewModel: ViewModel = koinViewModel(), +) { + val (state, dispatch) = viewModel.observe { } + + CatalogMoleculeContent( + pages = CatalogMoleculePage.all(), + initialPage = state.value.page as? CatalogMoleculePage ?: CatalogMoleculePage.INPUT, + onEvent = { dispatch(it) }, + modifier = modifier, + ) +} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/InputItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/InputItems.kt similarity index 93% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/InputItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/InputItems.kt index d09e7c402648413624111b496f223b644087ce6c..ea2e95628d0a3ca0f9a6cbd752036486cb64cd4b 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/InputItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/InputItems.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.molecule.items +package net.thunderbird.ui.catalog.ui.page.molecule.items import androidx.compose.foundation.lazy.grid.LazyGridScope import app.k9mail.core.ui.compose.designsystem.molecule.input.CheckboxInput @@ -8,12 +8,12 @@ import app.k9mail.core.ui.compose.designsystem.molecule.input.PasswordInput import app.k9mail.core.ui.compose.designsystem.molecule.input.SelectInput import app.k9mail.core.ui.compose.designsystem.molecule.input.SwitchInput import app.k9mail.core.ui.compose.designsystem.molecule.input.TextInput -import app.k9mail.ui.catalog.ui.common.helper.WithRememberedState -import app.k9mail.ui.catalog.ui.common.list.ItemOutlinedView -import app.k9mail.ui.catalog.ui.common.list.fullSpanItem -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem -import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem import kotlinx.collections.immutable.persistentListOf +import net.thunderbird.ui.catalog.ui.page.common.helper.WithRememberedState +import net.thunderbird.ui.catalog.ui.page.common.list.ItemOutlinedView +import net.thunderbird.ui.catalog.ui.page.common.list.fullSpanItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionSubtitleItem @Suppress("LongMethod") fun LazyGridScope.inputItems() { diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/PullToRefreshItem.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/PullToRefreshItem.kt similarity index 96% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/PullToRefreshItem.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/PullToRefreshItem.kt index b6d27f55ee05f733d3e96f5eb70bf69ec8dee325..0b373e97fa09b10dc958136fb1b3661621e38c09 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/PullToRefreshItem.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/PullToRefreshItem.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.molecule.items +package net.thunderbird.ui.catalog.ui.page.molecule.items import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.fillMaxWidth diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/StateItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/StateItems.kt similarity index 91% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/StateItems.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/StateItems.kt index ca76c9485960e98c3f0320bacc5c2fd8f1ccdb88..1eed8057e280af2d72efd91bbbc4b0db6b80beaa 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/StateItems.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/molecule/items/StateItems.kt @@ -1,4 +1,4 @@ -package app.k9mail.ui.catalog.ui.molecule.items +package net.thunderbird.ui.catalog.ui.page.molecule.items import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -17,11 +17,11 @@ import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingState import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingView import app.k9mail.core.ui.compose.designsystem.molecule.ErrorView import app.k9mail.core.ui.compose.designsystem.molecule.LoadingView -import app.k9mail.ui.catalog.ui.common.list.ItemOutlinedView -import app.k9mail.ui.catalog.ui.common.list.fullSpanItem -import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem -import app.k9mail.ui.catalog.ui.common.list.sectionInfoItem -import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem +import net.thunderbird.ui.catalog.ui.page.common.list.ItemOutlinedView +import net.thunderbird.ui.catalog.ui.page.common.list.fullSpanItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionInfoItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionSubtitleItem @Suppress("LongMethod") fun LazyGridScope.stateItems() { diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogMoleculeContent.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogMoleculeContent.kt new file mode 100644 index 0000000000000000000000000000000000000000..f70083a3ac35772c18dd3569600960d89289e7be --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogMoleculeContent.kt @@ -0,0 +1,33 @@ +package net.thunderbird.ui.catalog.ui.page.organism + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import kotlinx.collections.immutable.ImmutableList +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract +import net.thunderbird.ui.catalog.ui.page.common.PagedContent +import net.thunderbird.ui.catalog.ui.page.organism.CatalogOrganismPage.APP_BAR +import net.thunderbird.ui.catalog.ui.page.organism.CatalogOrganismPage.DIALOG +import net.thunderbird.ui.catalog.ui.page.organism.items.appBarItems +import net.thunderbird.ui.catalog.ui.page.organism.items.dialogItems + +@Composable +fun CatalogOrganismContent( + pages: ImmutableList, + initialPage: CatalogOrganismPage, + onEvent: (CatalogPageContract.Event) -> Unit, + modifier: Modifier = Modifier, +) { + PagedContent( + pages = pages, + initialPage = initialPage, + modifier = modifier, + onRenderPage = { + when (it) { + APP_BAR -> appBarItems() + DIALOG -> dialogItems() + } + }, + onRenderFullScreenPage = {}, + onEvent = onEvent, + ) +} diff --git a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogOrganismPage.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogOrganismPage.kt similarity index 71% rename from app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogOrganismPage.kt rename to app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogOrganismPage.kt index cf70c0d91d6534da62dc55a70a5a544ef0a253e6..872a9e194a5405fa984aac83bbd38ea3092beabf 100644 --- a/app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/organism/CatalogOrganismPage.kt +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogOrganismPage.kt @@ -1,13 +1,14 @@ -package app.k9mail.ui.catalog.ui.organism +package net.thunderbird.ui.catalog.ui.page.organism -import app.k9mail.ui.catalog.ui.CatalogPage import kotlinx.collections.immutable.toImmutableList +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.CatalogPage enum class CatalogOrganismPage( override val displayName: String, override val isFullScreen: Boolean = false, ) : CatalogPage { APP_BAR("App Bars"), + DIALOG("Dialogs"), ; override fun toString(): String { diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogOrganismScreen.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogOrganismScreen.kt new file mode 100644 index 0000000000000000000000000000000000000000..ca1bcbdab1a9edf77298fd911a8d93a2e00f4084 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/CatalogOrganismScreen.kt @@ -0,0 +1,23 @@ +package net.thunderbird.ui.catalog.ui.page.organism + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import app.k9mail.core.ui.compose.common.mvi.observe +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.ViewModel +import net.thunderbird.ui.catalog.ui.page.CatalogPageViewModel +import org.koin.androidx.compose.koinViewModel + +@Composable +fun CatalogOrganismScreen( + modifier: Modifier = Modifier, + viewModel: ViewModel = koinViewModel(), +) { + val (state, dispatch) = viewModel.observe { } + + CatalogOrganismContent( + pages = CatalogOrganismPage.all(), + initialPage = state.value.page as? CatalogOrganismPage ?: CatalogOrganismPage.APP_BAR, + onEvent = { dispatch(it) }, + modifier = modifier, + ) +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/AppBarItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/AppBarItems.kt new file mode 100644 index 0000000000000000000000000000000000000000..c30fb2b253fa68b78f21235acbdf15fe1ba93200 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/AppBarItems.kt @@ -0,0 +1,145 @@ +package net.thunderbird.ui.catalog.ui.page.organism.items + +import androidx.compose.foundation.lazy.grid.LazyGridScope +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.vector.ImageVector +import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonIcon +import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons +import app.k9mail.core.ui.compose.designsystem.organism.SubtitleTopAppBar +import app.k9mail.core.ui.compose.designsystem.organism.SubtitleTopAppBarWithBackButton +import app.k9mail.core.ui.compose.designsystem.organism.SubtitleTopAppBarWithMenuButton +import app.k9mail.core.ui.compose.designsystem.organism.TopAppBar +import app.k9mail.core.ui.compose.designsystem.organism.TopAppBarWithBackButton +import app.k9mail.core.ui.compose.designsystem.organism.TopAppBarWithMenuButton +import net.thunderbird.ui.catalog.ui.page.common.list.ItemOutlinedView +import net.thunderbird.ui.catalog.ui.page.common.list.fullSpanItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionSubtitleItem + +fun LazyGridScope.appBarItems() { + topAppBarItems() + subtitleTopAppBarItems() +} + +private fun LazyGridScope.topAppBarItems() { + sectionHeaderItem(text = "TopAppBar") + sectionSubtitleItem(text = "With menu icon") + fullSpanItem { + ItemOutlinedView { + TopAppBar( + title = "Title", + actions = { + ButtonIcon( + onClick = {}, + imageVector = Icons.Outlined.Info, + ) + ButtonIcon( + onClick = {}, + imageVector = Icons.Outlined.Check, + ) + ButtonIcon( + onClick = {}, + imageVector = Icons.Outlined.Visibility, + ) + }, + ) + } + } + sectionSubtitleItem(text = "With back menu icon") + fullSpanItem { + ItemOutlinedView { + TopAppBarWithMenuButton( + title = "Title", + onMenuClick = {}, + ) + } + } + sectionSubtitleItem(text = "With back icon") + fullSpanItem { + ItemOutlinedView { + TopAppBarWithBackButton( + title = "Title", + onBackClick = {}, + ) + } + } +} + +@Suppress("LongMethod") +private fun LazyGridScope.subtitleTopAppBarItems() { + sectionHeaderItem(text = "SubtitleTopAppBar") + sectionSubtitleItem(text = "With menu icon") + fullSpanItem { + ItemOutlinedView { + SubtitleTopAppBar( + title = "Title", + subtitle = "Subtitle", + actions = { + DemoActionButton( + imageVector = Icons.Outlined.Info, + ) + DemoActionButton( + imageVector = Icons.Outlined.Check, + ) + DemoActionButton( + imageVector = Icons.Outlined.Visibility, + ) + }, + ) + } + } + sectionSubtitleItem(text = "With long subtitle") + fullSpanItem { + ItemOutlinedView { + SubtitleTopAppBar( + title = "Title", + subtitle = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + + "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", + actions = { + DemoActionButton( + imageVector = Icons.Outlined.Info, + ) + DemoActionButton( + imageVector = Icons.Outlined.Check, + ) + DemoActionButton( + imageVector = Icons.Outlined.Visibility, + ) + }, + ) + } + } + sectionSubtitleItem(text = "With back menu icon") + fullSpanItem { + ItemOutlinedView { + SubtitleTopAppBarWithMenuButton( + title = "Title", + subtitle = "Subtitle", + onMenuClick = {}, + ) + } + } + sectionSubtitleItem(text = "With back icon") + fullSpanItem { + ItemOutlinedView { + SubtitleTopAppBarWithBackButton( + title = "Title", + subtitle = "Subtitle", + onBackClick = {}, + ) + } + } +} + +/** + * Demo action button that does nothing on click. + */ +@Composable +private fun DemoActionButton( + imageVector: ImageVector, +) { + ButtonIcon( + onClick = {}, + imageVector = imageVector, + ) +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/DialogItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/DialogItems.kt new file mode 100644 index 0000000000000000000000000000000000000000..cb09851cddae296b653b507f4f5b3d250643c7de --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/organism/items/DialogItems.kt @@ -0,0 +1,103 @@ +package net.thunderbird.ui.catalog.ui.page.organism.items + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.LazyGridScope +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.AccountCircle +import androidx.compose.material.icons.outlined.Info +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.Modifier +import androidx.compose.ui.graphics.vector.ImageVector +import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonFilled +import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyLarge +import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium +import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall +import app.k9mail.core.ui.compose.designsystem.organism.AlertDialog +import app.k9mail.core.ui.compose.theme2.MainTheme +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItem +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItemPadding +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionSubtitleItem + +fun LazyGridScope.dialogItems() { + sectionHeaderItem("Alert dialogs") + sectionSubtitleItem("Simple dialog") + dialogItem( + title = "Simple dialog", + text = "This is a simple dialog", + ) + sectionSubtitleItem("Dialog with icon") + dialogItem( + icon = Icons.Outlined.Info, + title = "Dialog with icon", + text = "This is a dialog with icon", + ) + sectionSubtitleItem("Dialog with cancel") + dialogItem( + icon = Icons.Outlined.AccountCircle, + title = "Dialog with cancel", + text = "This is a dialog with cancel", + hasCancel = true, + ) + sectionSubtitleItem("Dialog with custom content") + dialogItem( + title = "Dialog with custom content", + text = "This is a dialog with custom content", + ) { + Column( + verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default), + ) { + TextBodyLarge("Large body") + TextBodyMedium("Medium body") + TextBodySmall("Small body") + } + } +} + +private fun LazyGridScope.dialogItem( + title: String, + text: String, + icon: ImageVector? = null, + hasCancel: Boolean = false, + content: @Composable (() -> Unit)? = null, +) = defaultItem { + var showDialog by remember { mutableStateOf(false) } + + ButtonFilled( + text = "Show dialog", + onClick = { showDialog = true }, + modifier = Modifier.padding(defaultItemPadding()), + ) + + if (showDialog) { + if (content != null) { + AlertDialog( + title = title, + confirmText = "Accept", + onConfirmClick = { showDialog = false }, + dismissText = if (hasCancel) "Cancel" else null, + onDismissClick = { showDialog = false }, + onDismissRequest = { showDialog = false }, + ) { + content() + } + } else { + AlertDialog( + icon = icon, + title = title, + text = text, + confirmText = "Accept", + onConfirmClick = { showDialog = false }, + dismissText = if (hasCancel) "Cancel" else null, + onDismissClick = { showDialog = false }, + onDismissRequest = { showDialog = false }, + ) + } + } +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplateContent.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplateContent.kt new file mode 100644 index 0000000000000000000000000000000000000000..03bc0273bd1e14eda6c2da0ef99c484b1f0bdb60 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplateContent.kt @@ -0,0 +1,30 @@ +package net.thunderbird.ui.catalog.ui.page.template + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import kotlinx.collections.immutable.ImmutableList +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract +import net.thunderbird.ui.catalog.ui.page.common.PagedContent +import net.thunderbird.ui.catalog.ui.page.template.CatalogTemplatePage.LAYOUT +import net.thunderbird.ui.catalog.ui.page.template.items.layoutItems + +@Composable +fun CatalogTemplateContent( + pages: ImmutableList, + initialPage: CatalogTemplatePage, + onEvent: (CatalogPageContract.Event) -> Unit, + modifier: Modifier = Modifier, +) { + PagedContent( + pages = pages, + initialPage = initialPage, + modifier = modifier, + onRenderPage = { + when (it) { + LAYOUT -> layoutItems() + } + }, + onRenderFullScreenPage = {}, + onEvent = onEvent, + ) +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplatePage.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplatePage.kt new file mode 100644 index 0000000000000000000000000000000000000000..3b0f2cd4376ec8ff6bc2f3378413c9909062806f --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplatePage.kt @@ -0,0 +1,20 @@ +package net.thunderbird.ui.catalog.ui.page.template + +import kotlinx.collections.immutable.toImmutableList +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.CatalogPage + +enum class CatalogTemplatePage( + override val displayName: String, + override val isFullScreen: Boolean = false, +) : CatalogPage { + LAYOUT("Layouts"), + ; + + override fun toString(): String { + return displayName + } + + companion object { + fun all() = entries.toImmutableList() + } +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplateScreen.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplateScreen.kt new file mode 100644 index 0000000000000000000000000000000000000000..135fffd03eb41b26622bc8ba1806397f0ea42374 --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/CatalogTemplateScreen.kt @@ -0,0 +1,23 @@ +package net.thunderbird.ui.catalog.ui.page.template + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import app.k9mail.core.ui.compose.common.mvi.observe +import net.thunderbird.ui.catalog.ui.page.CatalogPageContract.ViewModel +import net.thunderbird.ui.catalog.ui.page.CatalogPageViewModel +import org.koin.androidx.compose.koinViewModel + +@Composable +fun CatalogTemplateScreen( + modifier: Modifier = Modifier, + viewModel: ViewModel = koinViewModel(), +) { + val (state, dispatch) = viewModel.observe { } + + CatalogTemplateContent( + pages = CatalogTemplatePage.Companion.all(), + initialPage = state.value.page as? CatalogTemplatePage ?: CatalogTemplatePage.LAYOUT, + onEvent = { dispatch(it) }, + modifier = modifier, + ) +} diff --git a/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/items/LayoutItems.kt b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/items/LayoutItems.kt new file mode 100644 index 0000000000000000000000000000000000000000..4ac3df0440182e2ae149ca63e3425280e7e2203b --- /dev/null +++ b/app-ui-catalog/src/main/kotlin/net/thunderbird/ui/catalog/ui/page/template/items/LayoutItems.kt @@ -0,0 +1,135 @@ +package net.thunderbird.ui.catalog.ui.page.template.items + +import android.os.Parcelable +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.grid.LazyGridScope +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import app.k9mail.core.ui.compose.designsystem.atom.Surface +import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyLarge +import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium +import app.k9mail.core.ui.compose.designsystem.template.ListDetailPane +import app.k9mail.core.ui.compose.designsystem.template.rememberListDetailNavigationController +import app.k9mail.core.ui.compose.theme2.MainTheme +import kotlinx.parcelize.Parcelize +import net.thunderbird.ui.catalog.ui.page.common.list.defaultItem +import net.thunderbird.ui.catalog.ui.page.common.list.sectionHeaderItem + +fun LazyGridScope.layoutItems() { + sectionHeaderItem(text = "ListDetailPane") + defaultItem { + ListDetailPaneItem() + } +} + +@Composable +private fun ListDetailPaneItem() { + val navigationController = rememberListDetailNavigationController() + + Column( + modifier = Modifier + .fillMaxWidth() + .height(MainTheme.sizes.huger) + .padding(MainTheme.spacings.double), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + ListDetailPane( + navigationController = navigationController, + listPane = { + Surface( + color = MainTheme.colors.primaryContainer, + ) { + Column( + verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), + ) { + TextTitleMedium("List pane") + LazyColumn( + verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default), + ) { + itemsIndexed(createItems()) { index, item -> + ListItem( + item = item, + onClick = { + navigationController.value.navigateToDetail(item) + }, + ) + } + } + } + } + }, + detailPane = { item -> + Surface( + color = MainTheme.colors.secondaryContainer, + ) { + ListDetail( + item = item, + onClick = { navigationController.value.navigateBack() }, + ) + } + }, + ) + } +} + +@Composable +private fun ListItem( + item: ListItem, + onClick: () -> Unit, +) { + Column( + modifier = Modifier.clickable(onClick = onClick) + .fillMaxWidth() + .padding(MainTheme.spacings.default), + ) { + TextBodyLarge(item.title) + } +} + +@Composable +private fun ListDetail( + item: ListItem, + onClick: () -> Unit, +) { + Column( + modifier = Modifier.clickable(onClick = onClick) + .fillMaxWidth() + .padding(MainTheme.spacings.default), + ) { + TextTitleMedium("Detail pane") + Spacer(modifier = Modifier.height(MainTheme.spacings.default)) + TextBodyLarge(item.title) + } +} + +@Parcelize +internal data class ListItem( + val id: String, + val title: String, +) : Parcelable + +private fun createItems(): List { + return listOf( + ListItem( + id = "1", + title = "Item 1", + ), + ListItem( + id = "2", + title = "Item 2", + ), + ListItem( + id = "3", + title = "Item 3", + ), + ) +} diff --git a/app-ui-catalog/src/main/res/drawable-v26/ic_launcher_monochrome.xml b/app-ui-catalog/src/main/res/drawable-v26/ic_launcher_monochrome.xml deleted file mode 100644 index f6d70e9d010b5e56fd33f34b8aabf79aadd9bbe8..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/res/drawable-v26/ic_launcher_monochrome.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - diff --git a/app-ui-catalog/src/main/res/drawable/ic_app_logo.xml b/app-ui-catalog/src/main/res/drawable/ic_app_logo.xml new file mode 100644 index 0000000000000000000000000000000000000000..c9c852c6a90c6b3bc5149aeaf97e92c230e105d4 --- /dev/null +++ b/app-ui-catalog/src/main/res/drawable/ic_app_logo.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-ui-catalog/src/main/res/drawable/ic_app_logo_monochrome.xml b/app-ui-catalog/src/main/res/drawable/ic_app_logo_monochrome.xml new file mode 100644 index 0000000000000000000000000000000000000000..ad961b1ce055e67c2012bf3ff82d9b84b3a6a00e --- /dev/null +++ b/app-ui-catalog/src/main/res/drawable/ic_app_logo_monochrome.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app-ui-catalog/src/main/res/drawable/ic_launcher_foreground.xml b/app-ui-catalog/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 502cd25e129ccb4ed2f8a7ffcf5de3b375d4fcaf..0000000000000000000000000000000000000000 --- a/app-ui-catalog/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app-ui-catalog/src/main/res/drawable/ic_startup_logo.xml b/app-ui-catalog/src/main/res/drawable/ic_startup_logo.xml new file mode 100644 index 0000000000000000000000000000000000000000..c56060167de3b9d1a97e1fae7af910a4cdcb6521 --- /dev/null +++ b/app-ui-catalog/src/main/res/drawable/ic_startup_logo.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-ui-catalog/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app-ui-catalog/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index c78bee3b5389a6288c92bbb3c835771012efc2b3..7d53d26f964dc5cab50d4741177f021def418a80 100644 --- a/app-ui-catalog/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app-ui-catalog/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,17 @@ - - - - + + + + + + + + diff --git a/app-ui-catalog/src/main/res/mipmap-hdpi/ic_launcher.png b/app-ui-catalog/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e6de768a85e8e0b35744d27cd4207f264ef0bf5c Binary files /dev/null and b/app-ui-catalog/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/main/res/mipmap-mdpi/ic_launcher.png b/app-ui-catalog/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ee0e55b100f7a1ef35a1ac60de6890d63a1593a5 Binary files /dev/null and b/app-ui-catalog/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/main/res/mipmap-xhdpi/ic_launcher.png b/app-ui-catalog/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c04fa956540930ccaaf5536051ba570f2b943d4f Binary files /dev/null and b/app-ui-catalog/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app-ui-catalog/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e4705d76229a34927f91bfdde463f947108206 Binary files /dev/null and b/app-ui-catalog/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app-ui-catalog/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 7cb78a5a18e66da62b11f2ab81f378424a47bb77..fa999466e5fe901e6de598a48b116d8f053eb1f6 100644 Binary files a/app-ui-catalog/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app-ui-catalog/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app-ui-catalog/src/main/res/values/app_logo_colors.xml b/app-ui-catalog/src/main/res/values/app_logo_colors.xml new file mode 100644 index 0000000000000000000000000000000000000000..250aa602296bc4430206125159fb254bcc3066d9 --- /dev/null +++ b/app-ui-catalog/src/main/res/values/app_logo_colors.xml @@ -0,0 +1,4 @@ + + + #F0F8FF + diff --git a/app-ui-catalog/src/main/res/values/themes.xml b/app-ui-catalog/src/main/res/values/themes.xml index fe8ce823ccc31eafa430bbf2ef8ff68ca2e3e775..cd053e0872242ef7f6c81caf3eff6307a280043d 100644 --- a/app-ui-catalog/src/main/res/values/themes.xml +++ b/app-ui-catalog/src/main/res/values/themes.xml @@ -6,7 +6,7 @@ diff --git a/backend/demo/build.gradle.kts b/backend/demo/build.gradle.kts index f969cb13fc53055c5a634fa01298d17531d8cf7e..4bf0d3beb0b9976e82d445bb4c530e5676b4fd53 100644 --- a/backend/demo/build.gradle.kts +++ b/backend/demo/build.gradle.kts @@ -1,15 +1,13 @@ plugins { id(ThunderbirdPlugins.Library.jvm) - alias(libs.plugins.ksp) alias(libs.plugins.android.lint) + alias(libs.plugins.kotlin.serialization) } dependencies { api(projects.backend.api) - implementation(libs.kotlinx.coroutines.core) - implementation(libs.moshi) - ksp(libs.moshi.kotlin.codegen) + implementation(libs.kotlinx.serialization.json) testImplementation(projects.mail.testing) } diff --git a/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandRefreshFolderList.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandRefreshFolderList.kt new file mode 100644 index 0000000000000000000000000000000000000000..62baee4e01061e0079fa57ba70e5e746f8c99ed9 --- /dev/null +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandRefreshFolderList.kt @@ -0,0 +1,29 @@ +package app.k9mail.backend.demo + +import com.fsck.k9.backend.api.BackendStorage +import com.fsck.k9.backend.api.FolderInfo +import com.fsck.k9.backend.api.updateFolders + +internal class CommandRefreshFolderList( + private val backendStorage: BackendStorage, + private val demoStore: DemoStore, +) { + + fun refreshFolderList() { + val localFolderServerIds = backendStorage.getFolderServerIds().toSet() + + backendStorage.updateFolders { + val remoteFolderServerIds = demoStore.getFolderIds() + val foldersServerIdsToCreate = remoteFolderServerIds - localFolderServerIds + val foldersToCreate = foldersServerIdsToCreate.mapNotNull { folderServerId -> + demoStore.getFolder(folderServerId)?.let { folderData -> + FolderInfo(folderServerId, folderData.name, folderData.type) + } + } + createFolders(foldersToCreate) + + val folderServerIdsToRemove = (localFolderServerIds - remoteFolderServerIds).toList() + deleteFolders(folderServerIdsToRemove) + } + } +} diff --git a/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandSendMessage.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandSendMessage.kt new file mode 100644 index 0000000000000000000000000000000000000000..d678eb544d29c0976380138b6f62220f899444bf --- /dev/null +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandSendMessage.kt @@ -0,0 +1,32 @@ +package app.k9mail.backend.demo + +import app.k9mail.backend.demo.DemoHelper.createNewServerId +import com.fsck.k9.backend.api.BackendStorage +import com.fsck.k9.mail.Message +import com.fsck.k9.mail.MessageDownloadState +import com.fsck.k9.mail.internet.MimeMessage +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream + +internal class CommandSendMessage( + private val backendStorage: BackendStorage, + private val demoStore: DemoStore, +) { + + fun sendMessage(message: Message) { + val inboxServerId = demoStore.getInboxFolderId() + val backendFolder = backendStorage.getFolder(inboxServerId) + + val newMessage = message.copy(uid = createNewServerId()) + backendFolder.saveMessage(newMessage, MessageDownloadState.FULL) + } + + private fun Message.copy(uid: String): MimeMessage { + val outputStream = ByteArrayOutputStream() + writeTo(outputStream) + val inputStream = ByteArrayInputStream(outputStream.toByteArray()) + return MimeMessage.parseMimeMessage(inputStream, false).apply { + this.uid = uid + } + } +} diff --git a/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandSync.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandSync.kt new file mode 100644 index 0000000000000000000000000000000000000000..78d97347ab33cf81e6154e0136c3f47aa62d1bea --- /dev/null +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/CommandSync.kt @@ -0,0 +1,40 @@ +package app.k9mail.backend.demo + +import com.fsck.k9.backend.api.BackendFolder.MoreMessages +import com.fsck.k9.backend.api.BackendStorage +import com.fsck.k9.backend.api.SyncListener +import com.fsck.k9.mail.MessageDownloadState + +internal class CommandSync( + private val backendStorage: BackendStorage, + private val demoStore: DemoStore, +) { + + fun sync(folderServerId: String, listener: SyncListener) { + listener.syncStarted(folderServerId) + + val folder = demoStore.getFolder(folderServerId) + if (folder == null) { + listener.syncFailed(folderServerId, "Folder $folderServerId doesn't exist", null) + return + } + + val backendFolder = backendStorage.getFolder(folderServerId) + + val localMessageServerIds = backendFolder.getMessageServerIds() + if (localMessageServerIds.isNotEmpty()) { + listener.syncFinished(folderServerId) + return + } + + for (messageServerId in folder.messageServerIds) { + val message = demoStore.getMessage(folderServerId, messageServerId) + backendFolder.saveMessage(message, MessageDownloadState.FULL) + listener.syncNewMessage(folderServerId, messageServerId, isOldMessage = false) + } + + backendFolder.setMoreMessages(MoreMessages.FALSE) + + listener.syncFinished(folderServerId) + } +} diff --git a/backend/demo/src/main/java/app/k9mail/backend/demo/DemoBackend.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoBackend.kt similarity index 50% rename from backend/demo/src/main/java/app/k9mail/backend/demo/DemoBackend.kt rename to backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoBackend.kt index ae148141fe53ae554ecafe4de6a2f30326f96807..5e079695d5083f8719697dc5e5a729e42e565e66 100644 --- a/backend/demo/src/main/java/app/k9mail/backend/demo/DemoBackend.kt +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoBackend.kt @@ -1,32 +1,25 @@ package app.k9mail.backend.demo +import app.k9mail.backend.demo.DemoHelper.createNewServerId import com.fsck.k9.backend.api.Backend -import com.fsck.k9.backend.api.BackendFolder.MoreMessages import com.fsck.k9.backend.api.BackendPusher import com.fsck.k9.backend.api.BackendPusherCallback import com.fsck.k9.backend.api.BackendStorage -import com.fsck.k9.backend.api.FolderInfo import com.fsck.k9.backend.api.SyncConfig import com.fsck.k9.backend.api.SyncListener -import com.fsck.k9.backend.api.updateFolders import com.fsck.k9.mail.BodyFactory import com.fsck.k9.mail.Flag -import com.fsck.k9.mail.FolderType import com.fsck.k9.mail.Message -import com.fsck.k9.mail.MessageDownloadState import com.fsck.k9.mail.Part -import com.fsck.k9.mail.internet.MimeMessage -import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream -import java.io.InputStream -import java.util.UUID -import okio.buffer -import okio.source - -class DemoBackend(private val backendStorage: BackendStorage) : Backend { - private val messageStoreInfo by lazy { readMessageStoreInfo() } + +class DemoBackend( + private val backendStorage: BackendStorage, +) : Backend { + private val demoStore by lazy { DemoStore() } + + private val commandSync by lazy { CommandSync(backendStorage, demoStore) } + private val commandRefreshFolderList by lazy { CommandRefreshFolderList(backendStorage, demoStore) } + private val commandSendMessage by lazy { CommandSendMessage(backendStorage, demoStore) } override val supportsFlags: Boolean = true override val supportsExpunge: Boolean = false @@ -39,49 +32,11 @@ class DemoBackend(private val backendStorage: BackendStorage) : Backend { override val isPushCapable: Boolean = false override fun refreshFolderList() { - val localFolderServerIds = backendStorage.getFolderServerIds().toSet() - - backendStorage.updateFolders { - val remoteFolderServerIds = messageStoreInfo.keys - val foldersServerIdsToCreate = remoteFolderServerIds - localFolderServerIds - val foldersToCreate = foldersServerIdsToCreate.mapNotNull { folderServerId -> - messageStoreInfo[folderServerId]?.let { folderData -> - FolderInfo(folderServerId, folderData.name, folderData.type) - } - } - createFolders(foldersToCreate) - - val folderServerIdsToRemove = (localFolderServerIds - remoteFolderServerIds).toList() - deleteFolders(folderServerIdsToRemove) - } + commandRefreshFolderList.refreshFolderList() } override fun sync(folderServerId: String, syncConfig: SyncConfig, listener: SyncListener) { - listener.syncStarted(folderServerId) - - val folderData = messageStoreInfo[folderServerId] - if (folderData == null) { - listener.syncFailed(folderServerId, "Folder $folderServerId doesn't exist", null) - return - } - - val backendFolder = backendStorage.getFolder(folderServerId) - - val localMessageServerIds = backendFolder.getMessageServerIds() - if (localMessageServerIds.isNotEmpty()) { - listener.syncFinished(folderServerId) - return - } - - for (messageServerId in folderData.messageServerIds) { - val message = loadMessage(folderServerId, messageServerId) - backendFolder.saveMessage(message, MessageDownloadState.FULL) - listener.syncNewMessage(folderServerId, messageServerId, isOldMessage = false) - } - - backendFolder.setMoreMessages(MoreMessages.FALSE) - - listener.syncFinished(folderServerId) + commandSync.sync(folderServerId, listener) } override fun downloadMessage(syncConfig: SyncConfig, folderServerId: String, messageServerId: String) { @@ -158,46 +113,10 @@ class DemoBackend(private val backendStorage: BackendStorage) : Backend { } override fun sendMessage(message: Message) { - val inboxServerId = messageStoreInfo.filterValues { it.type == FolderType.INBOX }.keys.first() - val backendFolder = backendStorage.getFolder(inboxServerId) - - val newMessage = message.copy(uid = createNewServerId()) - backendFolder.saveMessage(newMessage, MessageDownloadState.FULL) + commandSendMessage.sendMessage(message) } override fun createPusher(callback: BackendPusherCallback): BackendPusher { throw UnsupportedOperationException("not implemented") } - - private fun createNewServerId() = UUID.randomUUID().toString() - - private fun Message.copy(uid: String): MimeMessage { - val outputStream = ByteArrayOutputStream() - writeTo(outputStream) - val inputStream = ByteArrayInputStream(outputStream.toByteArray()) - return MimeMessage.parseMimeMessage(inputStream, false).apply { - this.uid = uid - } - } - - @OptIn(ExperimentalStdlibApi::class) - private fun readMessageStoreInfo(): MessageStoreInfo { - return getResourceAsStream("/contents.json").source().buffer().use { bufferedSource -> - val moshi = Moshi.Builder().build() - val adapter = moshi.adapter() - adapter.fromJson(bufferedSource) - } ?: error("Couldn't read message store info") - } - - private fun loadMessage(folderServerId: String, messageServerId: String): Message { - return getResourceAsStream("/$folderServerId/$messageServerId.eml").use { inputStream -> - MimeMessage.parseMimeMessage(inputStream, false).apply { - uid = messageServerId - } - } - } - - private fun getResourceAsStream(name: String): InputStream { - return DemoBackend::class.java.getResourceAsStream(name) ?: error("Resource '$name' not found") - } } diff --git a/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoDataLoader.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoDataLoader.kt new file mode 100644 index 0000000000000000000000000000000000000000..32950fa41d2cb081952d681c29a7b4178c55dcf9 --- /dev/null +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoDataLoader.kt @@ -0,0 +1,30 @@ +package app.k9mail.backend.demo + +import com.fsck.k9.mail.Message +import com.fsck.k9.mail.internet.MimeMessage +import java.io.InputStream +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream + +internal class DemoDataLoader { + + @OptIn(ExperimentalSerializationApi::class) + fun loadFolders(): DemoFolders { + return getResourceAsStream("/contents.json").use { inputStream -> + Json.decodeFromStream(inputStream) + } + } + + fun loadMessage(folderServerId: String, messageServerId: String): Message { + return getResourceAsStream("/$folderServerId/$messageServerId.eml").use { inputStream -> + MimeMessage.parseMimeMessage(inputStream, false).apply { + uid = messageServerId + } + } + } + + private fun getResourceAsStream(name: String): InputStream { + return this.javaClass.getResourceAsStream(name) ?: error("Resource '$name' not found") + } +} diff --git a/backend/demo/src/main/java/app/k9mail/backend/demo/MessageStoreInfo.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoFolder.kt similarity index 51% rename from backend/demo/src/main/java/app/k9mail/backend/demo/MessageStoreInfo.kt rename to backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoFolder.kt index 0b77229951466347a7bb555765015022734954b4..6fb1d41175a4faff5be6c849fa90d46beafcf8b3 100644 --- a/backend/demo/src/main/java/app/k9mail/backend/demo/MessageStoreInfo.kt +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoFolder.kt @@ -1,13 +1,12 @@ package app.k9mail.backend.demo import com.fsck.k9.mail.FolderType -import com.squareup.moshi.JsonClass +import kotlinx.serialization.Serializable -typealias MessageStoreInfo = Map - -@JsonClass(generateAdapter = true) -data class FolderData( +@Serializable +internal data class DemoFolder( val name: String, val type: FolderType, val messageServerIds: List, + val subFolders: DemoFolders? = null, ) diff --git a/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoFolders.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoFolders.kt new file mode 100644 index 0000000000000000000000000000000000000000..a18a9408d3921941db78146220758ad395af5ac1 --- /dev/null +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoFolders.kt @@ -0,0 +1,3 @@ +package app.k9mail.backend.demo + +internal typealias DemoFolders = Map diff --git a/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoHelper.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoHelper.kt new file mode 100644 index 0000000000000000000000000000000000000000..98bee237e36623d4a1dbb1b5c7dcc0b1047fdf2f --- /dev/null +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoHelper.kt @@ -0,0 +1,7 @@ +package app.k9mail.backend.demo + +import java.util.UUID + +internal object DemoHelper { + fun createNewServerId() = UUID.randomUUID().toString() +} diff --git a/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoStore.kt b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoStore.kt new file mode 100644 index 0000000000000000000000000000000000000000..07bca3ffd18505d8d68274d62e05a2841bbdd3ff --- /dev/null +++ b/backend/demo/src/main/kotlin/app/k9mail/backend/demo/DemoStore.kt @@ -0,0 +1,54 @@ +package app.k9mail.backend.demo + +import com.fsck.k9.mail.FolderType +import com.fsck.k9.mail.Message + +internal class DemoStore( + private val demoDataLoader: DemoDataLoader = DemoDataLoader(), +) { + private val demoFolders: DemoFolders by lazy { flattenDemoFolders(demoDataLoader.loadFolders()) } + + fun getFolder(folderServerId: String): DemoFolder? { + return demoFolders[folderServerId] + } + + fun getFolderIds(): Set { + return demoFolders.keys + } + + fun getInboxFolderId(): String { + return demoFolders.filterValues { it.type == FolderType.INBOX }.keys.first() + } + + fun getMessage(folderServerId: String, messageServerId: String): Message { + return demoDataLoader.loadMessage(folderServerId, messageServerId) + } + + // This is a workaround for the fact that the backend doesn't support nested folders + private fun flattenDemoFolders( + demoFolders: DemoFolders, + parentName: String = "", + parentServerId: String = "", + ): DemoFolders { + val flatFolders = mutableMapOf() + for ((folderServerId, demoFolder) in demoFolders) { + val fullName = if (parentName.isEmpty()) { + demoFolder.name + } else { + "$parentName/${demoFolder.name}" + } + val fullServerId = if (parentServerId.isEmpty()) { + folderServerId + } else { + "$parentServerId/$folderServerId" + } + flatFolders[fullServerId] = demoFolder.copy(name = fullName) + + val subFolders = demoFolder.subFolders + if (subFolders != null) { + flatFolders.putAll(flattenDemoFolders(demoFolder.subFolders, fullName, fullServerId)) + } + } + return flatFolders + } +} diff --git a/backend/demo/src/main/resources/contents.json b/backend/demo/src/main/resources/contents.json index 137551a3b909c74b6b1fe9e11ca7571a3534bf3f..ba7d8fbbc6f3162fb0151b46f709a3d3f2fcf87c 100644 --- a/backend/demo/src/main/resources/contents.json +++ b/backend/demo/src/main/resources/contents.json @@ -57,5 +57,32 @@ "turing_award_1991", "turing_award_1996" ] + }, + "nested": { + "name": "Nested", + "type": "REGULAR", + "messageServerIds": [ + "nested_1" + ], + "subFolders": { + "nested_level_1": { + "name": "Nested Level 1", + "type": "REGULAR", + "messageServerIds": [ + "nested_level_1_1", + "nested_level_1_2" + ], + "subFolders": { + "nested_level_2": { + "name": "Nested Level 2", + "type": "REGULAR", + "messageServerIds": [ + "nested_level_2_1", + "nested_level_2_2" + ] + } + } + } + } } } diff --git a/backend/demo/src/main/resources/inbox/inline_image_attachment.eml b/backend/demo/src/main/resources/inbox/inline_image_attachment.eml index 6a7ceed12cf15df88c6a6f781553d47ca81a12e7..36782487b8bdff9affcd99e4dd86c559dd8cf9c0 100644 --- a/backend/demo/src/main/resources/inbox/inline_image_attachment.eml +++ b/backend/demo/src/main/resources/inbox/inline_image_attachment.eml @@ -1,9 +1,9 @@ MIME-Version: 1.0 -From: "Test data" +From: "Test data" Date: Tue, 14 Feb 2023 15:00:00 +0100 -Message-ID: +Message-ID: Subject: Inline image attachment -To: User +To: User Content-Type: multipart/related; boundary=BOUNDARY --BOUNDARY @@ -13,236 +13,320 @@ Content-Type: text/html; charset=UTF-8 Inline image using a cid: URI to reference an attached image: - +
Inline image using a cid: URI to reference an attached image: