diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 84a310a49a47f23729c54ded2cd4526c44464aea..a1eddc3db27c73fee7338e3e5b43a95e1ce9b785 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,7 +1,10 @@ # General module owners -* @kewisch @wmontwe @asoucar @rafaeltonholo +* @thunderbird/mobile-android-reviewers # Release Engineering -/.github/ @coreycb @dandarnell -/docs/ci/ @coreycb @dandarnell -/scripts/ci/ @coreycb @dandarnell +/.github/ @thunderbird/build-release +/docs/ci/ @thunderbird/build-release +/scripts/ci/ @thunderbird/build-release + +# CODEOWNERS protection +/.github/CODEOWNERS @kewisch diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index d99b6cab69c82876a0e8cd4a8c482f64b8f1029a..8f22405e016f54606629589091afc06ae40dc60d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,5 @@ name: Bug report -description: Let us know about crashes or existing functionality not working like it should. +description: Let us know about crashes or existing functionality not working like it should labels: [ "type: bug", "unconfirmed" ] body: - type: markdown diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c4c38735b0905bd50dde078388c0b1bd469d3cce..33e472a2f1eda05730c2cb49d53fc00ddb966c9b 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ blank_issues_enabled: false contact_links: - - name: Feature Request + - name: Feature request url: https://connect.mozilla.org/t5/ideas/idb-p/ideas/label-name/thunderbird%20android - about: Submit your ideas to improve Thunderbird for Android. - - name: Mozilla Support Forum (SUMO) + about: Submit your ideas to improve Thunderbird for Android + - name: Mozilla support forum (SUMO) url: https://support.mozilla.org/products/thunderbird-android - about: Most issues are not bugs. Ask the community for help. + about: Many issues are not bugs, ask the community for help diff --git a/.github/ISSUE_TEMPLATE/maintainer.md b/.github/ISSUE_TEMPLATE/maintainer.md new file mode 100644 index 0000000000000000000000000000000000000000..f9b995b90dc1cc908a7d09cab2e74736dd770103 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/maintainer.md @@ -0,0 +1,8 @@ +--- +name: Maintainer issue +about: Please use one of the other issue templates instead +title: '' +labels: [] +assignees: [] +--- + diff --git a/.github/ci-gradle.properties b/.github/ci-gradle.properties index 7de8afc3ae2075890f6383f8a2b57fd17fa1e0f7..4865dffa9f09d1b759da4a38f56402a86d28f0a0 100644 --- a/.github/ci-gradle.properties +++ b/.github/ci-gradle.properties @@ -1,6 +1,7 @@ org.gradle.daemon=false org.gradle.parallel=true -org.gradle.workers.max=2 +org.gradle.workers.max=4 +org.gradle.jvmargs=-Xmx10g -XX:MaxMetaspaceSize=1g -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError kotlin.incremental=false kotlin.compiler.execution.strategy=in-process diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5ace4600a1f26e6892982f3e2f069ebfab108d87..a0ab43926985a38e44af39b511d4c93a3e1f6ee1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,4 +1,9 @@ version: 2 +commit-message: + prefix: chore + include: scope +labels: + - "type: dependency" updates: - package-ecosystem: "github-actions" directory: "/" diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 24c2364f949cd2894afbcdc53f47f16ad25848e8..e80492cf86855d1477051c6b7dbc98c249047a71 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -32,7 +32,7 @@ jobs: java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - name: Quality - Spotless run: ./gradlew spotlessCheck diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1b47a94f2e6de07c7d2a0b78f81130cefc998450..f79ce1eccc7b2b61f5e5244be2e8745c8a0c2f81 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -28,17 +28,17 @@ jobs: java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 with: cache-read-only: true - - uses: github/codeql-action/init@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 + - uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: languages: java - name: Autobuild - uses: github/codeql-action/autobuild@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 + uses: github/codeql-action/autobuild@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 + uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index e406dd6e9eddd2845dad0cc86004813cfedff630..57d8a9f8b77110e4a2c1f98a0d9cf918729ffe6a 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -21,7 +21,7 @@ jobs: environment: botmobile steps: - name: App token generate - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 if: ${{ vars.BOT_CLIENT_ID }} id: app-token with: @@ -34,7 +34,7 @@ jobs: token: ${{ steps.app-token.outputs.token || github.token }} - name: Cargo cache - uses: actions-rust-lang/setup-rust-toolchain@9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9 # v1.12.0 + uses: actions-rust-lang/setup-rust-toolchain@fb51252c7ba57d633bc668f941da052e410add48 # v1.13.0 - name: Install mdbook and extensions run: ./docs/install.sh diff --git a/.github/workflows/fluidscan.yml b/.github/workflows/fluidscan.yml index 256660711c2c9b9990f291d95af07137d7802d77..f25415bc84c5e2a70bd7bf4b492524cbbfba41ca 100644 --- a/.github/workflows/fluidscan.yml +++ b/.github/workflows/fluidscan.yml @@ -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@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 + uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: sarif_file: fluidscan-results.sarif diff --git a/.github/workflows/gradle-cache.yml b/.github/workflows/gradle-cache.yml index 1f99703ed66583061d7f691c4590cfbc7931ac15..2c7378f3269f1e58f6dff2b8414ac6d92d1867c8 100644 --- a/.github/workflows/gradle-cache.yml +++ b/.github/workflows/gradle-cache.yml @@ -29,7 +29,7 @@ jobs: java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - name: Build (run full build and tests) run: ./gradlew build diff --git a/.github/workflows/markdown.yml b/.github/workflows/markdown.yml index 34596206155133f1fbdd13b478cd5f56d735b61b..0913aaa099dc0bde71910d19d99d9ab508588cfa 100644 --- a/.github/workflows/markdown.yml +++ b/.github/workflows/markdown.yml @@ -17,7 +17,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Cargo cache - uses: actions-rust-lang/setup-rust-toolchain@9d7e65c320fdb52dcd45ffaa68deb6c02c8754d9 # v1.12.0 + uses: actions-rust-lang/setup-rust-toolchain@fb51252c7ba57d633bc668f941da052e410add48 # v1.13.0 - name: Install mdbook and extensions run: ./docs/install.sh @@ -31,7 +31,7 @@ jobs: java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - name: Quality - Spotless Markdown Check run: ./gradlew spotlessFlexmarkCheck diff --git a/.github/workflows/needinfo-answered.yml b/.github/workflows/needinfo-answered.yml index a536f7ad69ef4078e94c462f6d72c84134ad0d95..5170b8d533ff2c65eb06d98b499899b6f2dbdebe 100644 --- a/.github/workflows/needinfo-answered.yml +++ b/.github/workflows/needinfo-answered.yml @@ -22,7 +22,7 @@ jobs: pull-requests: write steps: - name: App token generate - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 if: ${{ vars.BOT_CLIENT_ID }} id: app-token with: diff --git a/.github/workflows/needinfo-remove.yml b/.github/workflows/needinfo-remove.yml index 2d302b9a153fb7dd2020268b9185d880c97f49e2..f6d2199f631ae981e3aedaf2ed6f5d2397dad84c 100644 --- a/.github/workflows/needinfo-remove.yml +++ b/.github/workflows/needinfo-remove.yml @@ -24,7 +24,7 @@ jobs: pull-requests: write steps: - name: App token generate - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 if: ${{ vars.BOT_CLIENT_ID }} id: app-token with: diff --git a/.github/workflows/needinfo-stale.yml b/.github/workflows/needinfo-stale.yml index 6b6651ddd3f419e20aacae1cb19c63cafe5fce52..6a1a6a0b5c2650b6cc930a973266d09c536a2e1c 100644 --- a/.github/workflows/needinfo-stale.yml +++ b/.github/workflows/needinfo-stale.yml @@ -19,7 +19,7 @@ jobs: pull-requests: write steps: - name: App token generate - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 if: ${{ vars.BOT_CLIENT_ID }} id: app-token with: diff --git a/.github/workflows/pulls-auto-assign.yml b/.github/workflows/pulls-auto-assign.yml new file mode 100644 index 0000000000000000000000000000000000000000..abd9b57c428b2f00d6767f9edf61903f570f3c2d --- /dev/null +++ b/.github/workflows/pulls-auto-assign.yml @@ -0,0 +1,30 @@ +--- +name: Auto Assign Reviewer + +# 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: + types: [review_requested] + +jobs: + assign-reviewer: + runs-on: ubuntu-latest + environment: botmobile + steps: + - name: App token generate + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 + if: ${{ vars.BOT_CLIENT_ID }} + id: app-token + with: + app-id: ${{ vars.BOT_CLIENT_ID }} + private-key: ${{ secrets.BOT_PRIVATE_KEY }} + + - name: Assign reviewer to PR + if: ${{ github.event.requested_reviewer }} + env: + PR_REVIEWER: ${{ github.event.requested_reviewer.login }} + PR_NUMBER: ${{ github.event.pull_request.number }} + GH_TOKEN: ${{ steps.app-token.outputs.token || github.token }} + run: | + gh pr edit $PR_NUMBER --repo $GITHUB_REPOSITORY --add-assignee "$PR_REVIEWER" diff --git a/.github/workflows/pulls-merged.yml b/.github/workflows/pulls-merged.yml index ccecd1bfe6be50c3b7130f74e82d52179daf790e..49fb014efa92fd86bb9b2d7d41bd08899c8c70ac 100644 --- a/.github/workflows/pulls-merged.yml +++ b/.github/workflows/pulls-merged.yml @@ -19,7 +19,7 @@ jobs: environment: botmobile steps: - name: App token generate - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 if: ${{ vars.BOT_CLIENT_ID }} id: app-token with: diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 7df7561a8cd9844b85e7b9689a887018a6e63436..d41b9edb699d6115d8644a3b619a0254158c4a10 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@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2 with: results_file: results.sarif results_format: 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@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16 + uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3.29.2 with: sarif_file: results.sarif diff --git a/.github/workflows/shippable_builds.yml b/.github/workflows/shippable_builds.yml index 8a1f3f68f9244a110097d04d886a886157ce1533..fa3bdee6a2d8bbf31b364fea389ae7fb67c76e98 100644 --- a/.github/workflows/shippable_builds.yml +++ b/.github/workflows/shippable_builds.yml @@ -206,7 +206,7 @@ jobs: 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 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 if: ${{ vars.BOT_CLIENT_ID }} id: app-token with: @@ -232,7 +232,7 @@ jobs: java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 if: ${{ contains(matrix.releaseTarget, 'github') || needs.dump_config.outputs.releaseType == 'daily' }} with: cache-disabled: "${{ contains(fromJSON('[\"beta\", \"release\"]'), needs.dump_config.outputs.releaseType) }}" @@ -480,7 +480,7 @@ jobs: java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + uses: gradle/actions/setup-gradle@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 with: cache-disabled: "${{ contains(fromJSON('[\"beta\", \"release\"]'), needs.dump_config.outputs.releaseType) }}" add-job-summary: on-failure @@ -765,7 +765,7 @@ jobs: ls -l uploads/${PKG_FILE_PRETTY} - name: App Token Generate - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 if: ${{ contains(matrix.releaseTarget, 'github') && vars.BOT_CLIENT_ID }} id: app-token with: @@ -775,7 +775,7 @@ jobs: - name: Publish to GitHub Releases id: publish_gh if: ${{ contains(matrix.releaseTarget, 'github') }} - uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2.2.2 + uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8 # v2.3.2 with: token: ${{ steps.app-token.outputs.token || github.token }} target_commitish: ${{ steps.shanotes.outputs.app_sha }} diff --git a/.github/workflows/uplift-merges.yml b/.github/workflows/uplift-merges.yml index df981084cf5c8696a0676eff07753913160630bc..8fd4de1412edb22caee6aeabf9c698eca8918a15 100644 --- a/.github/workflows/uplift-merges.yml +++ b/.github/workflows/uplift-merges.yml @@ -20,7 +20,7 @@ jobs: pull-requests: write steps: - name: App token generate - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 if: ${{ !inputs.dryRun && vars.BOT_CLIENT_ID }} id: app-token with: diff --git a/.github/workflows/validate-gradle.yml b/.github/workflows/validate-gradle.yml index 536d40fb837d96a7f773ef5c7f29bebd42e9c92e..ff75f635b349eae6bd3bdbfe78b60f3be7aaeaf0 100644 --- a/.github/workflows/validate-gradle.yml +++ b/.github/workflows/validate-gradle.yml @@ -12,4 +12,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: gradle/actions/wrapper-validation@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 + - uses: gradle/actions/wrapper-validation@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 diff --git a/app-common/build.gradle.kts b/app-common/build.gradle.kts index 8fa9edbaa7025fee5048d16048b184864b2e26d6..e004188de874e48ea2991cf1954a79a6359cd163 100644 --- a/app-common/build.gradle.kts +++ b/app-common/build.gradle.kts @@ -4,29 +4,44 @@ plugins { android { namespace = "net.thunderbird.app.common" + + buildFeatures { + buildConfig = true + } } 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.android.account) - implementation(projects.core.account) + implementation(projects.core.logging.api) + implementation(projects.core.logging.implComposite) + implementation(projects.core.logging.implConsole) + implementation(projects.core.logging.implLegacy) + implementation(projects.core.logging.implFile) - implementation(projects.core.featureflags) + implementation(projects.core.featureflag) implementation(projects.core.ui.legacy.theme2.common) + implementation(projects.feature.account.avatar.api) + implementation(projects.feature.account.avatar.impl) implementation(projects.feature.account.setup) + implementation(projects.feature.mail.account.api) implementation(projects.feature.migration.provider) + implementation(projects.feature.notification.api) + implementation(projects.feature.widget.messageList) implementation(projects.mail.protocols.imap) + + implementation(libs.androidx.work.runtime) + implementation(libs.androidx.lifecycle.process) + + testImplementation(projects.feature.account.fake) } 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 index a6a5259401d07fd8077e19601e7a0ef4e8528367..dcec479b5dcc1fea7f281ee00dc557f0e5dee183 100644 --- a/app-common/src/main/kotlin/net/thunderbird/app/common/AppCommonModule.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/AppCommonModule.kt @@ -1,11 +1,22 @@ package net.thunderbird.app.common +import com.fsck.k9.legacyCommonAppModules +import com.fsck.k9.legacyCoreModules +import com.fsck.k9.legacyUiModules import net.thunderbird.app.common.account.appCommonAccountModule +import net.thunderbird.app.common.core.appCommonCoreModule +import net.thunderbird.app.common.feature.appCommonFeatureModule import org.koin.core.module.Module import org.koin.dsl.module val appCommonModule: Module = module { + includes(legacyCommonAppModules) + includes(legacyCoreModules) + includes(legacyUiModules) + includes( appCommonAccountModule, + appCommonCoreModule, + appCommonFeatureModule, ) } diff --git a/legacy/common/src/main/java/com/fsck/k9/CommonApp.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/BaseApplication.kt similarity index 80% rename from legacy/common/src/main/java/com/fsck/k9/CommonApp.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/BaseApplication.kt index c91045bb881b083755c6c16a32fd447f44f3cce6..1872ec753d49a139e017f1f3d33b92dbceb17ca1 100644 --- a/legacy/common/src/main/java/com/fsck/k9/CommonApp.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/BaseApplication.kt @@ -1,11 +1,15 @@ -package com.fsck.k9 +package net.thunderbird.app.common import android.app.Application import android.content.Context import android.content.res.Configuration import android.content.res.Resources +import androidx.lifecycle.ProcessLifecycleOwner import app.k9mail.feature.widget.message.list.MessageListWidgetManager import app.k9mail.legacy.di.DI +import com.fsck.k9.Core +import com.fsck.k9.K9 +import com.fsck.k9.MessagingListenerProvider import com.fsck.k9.controller.MessagingController import com.fsck.k9.job.WorkManagerConfigurationProvider import com.fsck.k9.notification.NotificationChannelManager @@ -18,13 +22,19 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import net.thunderbird.app.common.feature.LoggerLifecycleObserver +import net.thunderbird.core.common.exception.ExceptionHandler +import net.thunderbird.core.logging.Logger +import net.thunderbird.core.logging.file.FileLogSink +import net.thunderbird.core.logging.legacy.Log import net.thunderbird.core.ui.theme.manager.ThemeManager import org.koin.android.ext.android.inject import org.koin.core.module.Module -import timber.log.Timber +import org.koin.core.qualifier.named import androidx.work.Configuration as WorkManagerConfiguration -abstract class CommonApp : Application(), WorkManagerConfiguration.Provider { +abstract class BaseApplication : Application(), WorkManagerConfiguration.Provider { + private val messagingController: MessagingController by inject() private val messagingListenerProvider: MessagingListenerProvider by inject() private val themeManager: ThemeManager by inject() @@ -32,16 +42,20 @@ abstract class CommonApp : Application(), WorkManagerConfiguration.Provider { private val notificationChannelManager: NotificationChannelManager by inject() private val messageListWidgetManager: MessageListWidgetManager by inject() private val workManagerConfigurationProvider: WorkManagerConfigurationProvider by inject() + private val logger: Logger by inject() + private val syncDebugFileLogSink: FileLogSink by inject(named("syncDebug")) private val appCoroutineScope: CoroutineScope = MainScope() private var appLanguageManagerInitialized = false override fun attachBaseContext(base: Context?) { Core.earlyInit() - super.attachBaseContext(base) // Start Koin early so it is ready by the time content providers are initialized. - DI.start(this, listOf(provideAppModule()) + coreModules + uiModules + commonAppModules) + DI.start(this, listOf(provideAppModule())) + Log.logger = logger + + super.attachBaseContext(base) } override fun onCreate() { @@ -57,6 +71,10 @@ abstract class CommonApp : Application(), WorkManagerConfiguration.Provider { messagingListenerProvider.listeners.forEach { listener -> messagingController.addListener(listener) } + val originalHandler = Thread.getDefaultUncaughtExceptionHandler() + Thread.setDefaultUncaughtExceptionHandler(ExceptionHandler(originalHandler)) + + ProcessLifecycleOwner.get().lifecycle.addObserver(LoggerLifecycleObserver(syncDebugFileLogSink)) } abstract fun provideAppModule(): Module @@ -90,7 +108,7 @@ abstract class CommonApp : Application(), WorkManagerConfiguration.Provider { } private fun updateConfigurationWithLocale(configuration: Configuration, locale: Locale) { - Timber.d("Updating application configuration with locale '$locale'") + Log.d("Updating application configuration with locale '$locale'") val newConfiguration = Configuration(configuration).apply { currentLocale = locale @@ -114,7 +132,7 @@ abstract class CommonApp : Application(), WorkManagerConfiguration.Provider { if (appLanguageManagerInitialized) { appLanguageManager.getOverrideLocale()?.let { overrideLocale -> if (resources.configuration.currentLocale != overrideLocale) { - Timber.w("Resources configuration was reset. Re-applying locale override.") + Log.w("Resources configuration was reset. Re-applying locale override.") appLanguageManager.applyOverrideLocale() applyOverrideLocaleToConfiguration() } diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountColorPicker.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountColorPicker.kt index 47f9c84ff236b1c529638c213e319cf07bfef16e..3d73a285f7ac9cacec6f3cdff362917fde3b51df 100644 --- a/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountColorPicker.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountColorPicker.kt @@ -2,9 +2,9 @@ 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 net.thunderbird.core.android.account.AccountManager -class AccountColorPicker( +internal class AccountColorPicker( private val accountManager: AccountManager, private val resources: Resources, ) { diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountCreator.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountCreator.kt index adddacde92fd1be04bcb85719ea2f951fe405902..0768ffd27147ab9f6449f1e1093b3035e035d067 100644 --- a/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountCreator.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/AccountCreator.kt @@ -1,19 +1,15 @@ package net.thunderbird.app.common.account import android.content.Context -import app.k9mail.core.common.mail.Protocols import app.k9mail.feature.account.common.domain.entity.Account 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.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 import com.fsck.k9.mail.store.imap.ImapStoreSettings.autoDetectNamespace import com.fsck.k9.mail.store.imap.ImapStoreSettings.createExtra @@ -25,17 +21,26 @@ import com.fsck.k9.preferences.UnifiedInboxConfigurator import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import net.thunderbird.core.android.account.LegacyAccount +import net.thunderbird.core.common.mail.Protocols +import net.thunderbird.core.logging.legacy.Log +import net.thunderbird.feature.account.avatar.AvatarMonogramCreator +import net.thunderbird.feature.account.storage.profile.AvatarDto +import net.thunderbird.feature.account.storage.profile.AvatarTypeDto +import net.thunderbird.feature.mail.folder.api.SpecialFolderSelection // TODO Move to feature/account/setup -class AccountCreator( +@Suppress("LongParameterList") +internal class AccountCreator( private val accountColorPicker: AccountColorPicker, private val localFoldersCreator: SpecialLocalFoldersCreator, private val preferences: Preferences, private val context: Context, private val messagingController: MessagingController, private val deletePolicyProvider: DeletePolicyProvider, - private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO, + private val avatarMonogramCreator: AvatarMonogramCreator, private val unifiedInboxConfigurator: UnifiedInboxConfigurator, + private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO, ) : AccountSetupExternalContract.AccountCreator { @Suppress("TooGenericExceptionCaught") @@ -43,7 +48,7 @@ class AccountCreator( return try { withContext(coroutineDispatcher) { AccountCreatorResult.Success(create(account)) } } catch (e: Exception) { - Timber.e(e, "Error while creating new account") + Log.e(e, "Error while creating new account") AccountCreatorResult.Error(e.message ?: "Unknown create account error") } @@ -54,6 +59,13 @@ class AccountCreator( newAccount.email = account.emailAddress + newAccount.avatar = AvatarDto( + avatarType = AvatarTypeDto.MONOGRAM, + avatarMonogram = avatarMonogramCreator.create(account.options.accountName, account.emailAddress), + avatarImageUri = null, + avatarIconName = null, + ) + newAccount.setIncomingServerSettings(account.incomingServerSettings) newAccount.outgoingServerSettings = account.outgoingServerSettings 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 index 2d0044b63e83a77e84e292ecdb0615e50b5bb87b..125b31cab16152a7121d7b7caaa33e1d51b7e279 100644 --- 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 @@ -1,34 +1,40 @@ 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.app.common.account.data.DefaultAccountProfileLocalDataSource +import net.thunderbird.app.common.account.data.DefaultLegacyAccountWrapperManager +import net.thunderbird.core.android.account.AccountDefaultsProvider +import net.thunderbird.core.android.account.LegacyAccountWrapperManager +import net.thunderbird.feature.account.avatar.AvatarMonogramCreator +import net.thunderbird.feature.account.avatar.DefaultAvatarMonogramCreator import net.thunderbird.feature.account.core.AccountCoreExternalContract.AccountProfileLocalDataSource import net.thunderbird.feature.account.core.featureAccountCoreModule +import net.thunderbird.feature.account.storage.legacy.featureAccountStorageLegacyModule import org.koin.android.ext.koin.androidApplication import org.koin.dsl.module internal val appCommonAccountModule = module { includes( featureAccountCoreModule, + featureAccountStorageLegacyModule, ) single { - CommonLegacyAccountWrapperManager( + DefaultLegacyAccountWrapperManager( accountManager = get(), + accountDataMapper = get(), ) } single { - CommonAccountProfileLocalDataSource( + DefaultAccountProfileLocalDataSource( accountManager = get(), + dataMapper = get(), ) } single { - CommonAccountDefaultsProvider( + DefaultAccountDefaultsProvider( resourceProvider = get(), featureFlagProvider = get(), ) @@ -41,6 +47,10 @@ internal val appCommonAccountModule = module { ) } + factory { + DefaultAvatarMonogramCreator() + } + factory { AccountCreator( accountColorPicker = get(), @@ -49,6 +59,7 @@ internal val appCommonAccountModule = module { context = androidApplication(), deletePolicyProvider = get(), messagingController = get(), + avatarMonogramCreator = 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/DefaultAccountDefaultsProvider.kt similarity index 64% rename from app-common/src/main/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProvider.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/account/DefaultAccountDefaultsProvider.kt index 37b48e51b0b65d4827f7cc9a50358e4fd036fe81..5cc4944d2daa596d134d75e62d06ead67fb8de67 100644 --- a/app-common/src/main/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProvider.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/DefaultAccountDefaultsProvider.kt @@ -1,39 +1,39 @@ 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.core.preferences.Storage +import net.thunderbird.core.android.account.AccountDefaultsProvider +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_MAXIMUM_AUTO_DOWNLOAD_MESSAGE_SIZE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_FORMAT +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_FORMAT_AUTO +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_READ_RECEIPT +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTED_TEXT_SHOWN +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTE_PREFIX +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTE_STYLE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_REMOTE_SEARCH_NUM_RESULTS +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_REPLY_AFTER_QUOTE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_RINGTONE_URI +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_SORT_ASCENDING +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_SORT_TYPE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_STRIP_SIGNATURE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_SYNC_INTERVAL +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_VISIBLE_LIMIT +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.NO_OPENPGP_KEY +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.UNASSIGNED_ACCOUNT_NUMBER +import net.thunderbird.core.android.account.Expunge +import net.thunderbird.core.android.account.FolderMode +import net.thunderbird.core.android.account.Identity +import net.thunderbird.core.android.account.LegacyAccount +import net.thunderbird.core.android.account.ShowPictures +import net.thunderbird.core.featureflag.FeatureFlagProvider +import net.thunderbird.core.featureflag.toFeatureFlagKey +import net.thunderbird.core.preference.storage.Storage +import net.thunderbird.feature.mail.folder.api.SpecialFolderSelection import net.thunderbird.feature.notification.NotificationLight import net.thunderbird.feature.notification.NotificationSettings import net.thunderbird.feature.notification.NotificationVibration @Suppress("MagicNumber") -class CommonAccountDefaultsProvider( +internal class DefaultAccountDefaultsProvider( private val resourceProvider: CoreResourceProvider, private val featureFlagProvider: FeatureFlagProvider, ) : AccountDefaultsProvider { @@ -67,7 +67,7 @@ class CommonAccountDefaultsProvider( private fun LegacyAccount.applyLegacyDefaults() { automaticCheckIntervalMinutes = DEFAULT_SYNC_INTERVAL idleRefreshMinutes = 24 - displayCount = K9.DEFAULT_VISIBLE_LIMIT + displayCount = DEFAULT_VISIBLE_LIMIT accountNumber = UNASSIGNED_ACCOUNT_NUMBER isNotifyNewMail = true folderNotifyNewMailMode = FolderMode.ALL 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 deleted file mode 100644 index c49343282b82adb9451792fb7414a054291ad61a..0000000000000000000000000000000000000000 --- a/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/CommonLegacyAccountWrapperManager.kt +++ /dev/null @@ -1,31 +0,0 @@ -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/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/DefaultAccountProfileLocalDataSource.kt similarity index 54% rename from app-common/src/main/kotlin/net/thunderbird/app/common/account/data/CommonAccountProfileLocalDataSource.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/account/data/DefaultAccountProfileLocalDataSource.kt index a73caf741ef5038c883cb9db4c5050bfc8645d99..8c4d57a6e41198d572b7960cfd9ad7ec1af56979 100644 --- 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/DefaultAccountProfileLocalDataSource.kt @@ -1,37 +1,36 @@ 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.core.android.account.LegacyAccountWrapperManager +import net.thunderbird.feature.account.AccountId import net.thunderbird.feature.account.core.AccountCoreExternalContract.AccountProfileLocalDataSource +import net.thunderbird.feature.account.profile.AccountProfile +import net.thunderbird.feature.account.storage.mapper.AccountProfileDataMapper -class CommonAccountProfileLocalDataSource( +internal class DefaultAccountProfileLocalDataSource( private val accountManager: LegacyAccountWrapperManager, + private val dataMapper: AccountProfileDataMapper, ) : AccountProfileLocalDataSource { override fun getById(accountId: AccountId): Flow { - return accountManager.getById(accountId.value) + return accountManager.getById(accountId) .map { account -> - account?.let { - AccountProfile( - accountId = AccountId.from(account.uuid), - name = account.displayName, - color = account.chipColor, - ) + account?.let { dto -> + dataMapper.toDomain(dto.profile) } } } override suspend fun update(accountProfile: AccountProfile) { - val currentAccount = accountManager.getById(accountProfile.accountId.value) + val currentAccount = accountManager.getById(accountProfile.id) .firstOrNull() ?: return + val accountProfile = dataMapper.toDto(accountProfile) + val updatedAccount = currentAccount.copy( - displayName = accountProfile.name, - chipColor = accountProfile.color, + profile = accountProfile, ) accountManager.update(updatedAccount) diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/DefaultLegacyAccountWrapperManager.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/DefaultLegacyAccountWrapperManager.kt new file mode 100644 index 0000000000000000000000000000000000000000..f8d7f96bd0a4061d0e006afe7362a18cb4a6956c --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/account/data/DefaultLegacyAccountWrapperManager.kt @@ -0,0 +1,38 @@ +package net.thunderbird.app.common.account.data + +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import net.thunderbird.core.android.account.AccountManager +import net.thunderbird.core.android.account.LegacyAccountWrapper +import net.thunderbird.core.android.account.LegacyAccountWrapperManager +import net.thunderbird.feature.account.AccountId +import net.thunderbird.feature.account.storage.legacy.mapper.DefaultLegacyAccountWrapperDataMapper + +internal class DefaultLegacyAccountWrapperManager( + private val accountManager: AccountManager, + private val accountDataMapper: DefaultLegacyAccountWrapperDataMapper, +) : LegacyAccountWrapperManager { + + override fun getAll(): Flow> { + return accountManager.getAccountsFlow() + .map { list -> + list.map { account -> + accountDataMapper.toDomain(account) + } + } + } + + override fun getById(id: AccountId): Flow { + return accountManager.getAccountFlow(id.asRaw()).map { account -> + account?.let { + accountDataMapper.toDomain(it) + } + } + } + + override suspend fun update(account: LegacyAccountWrapper) { + accountManager.saveAccount( + accountDataMapper.toDto(account), + ) + } +} diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/core/AppCommonCoreModule.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/core/AppCommonCoreModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..f53aa9a97770eac5693857a6c21c3d754ea4a9b9 --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/core/AppCommonCoreModule.kt @@ -0,0 +1,66 @@ +package net.thunderbird.app.common.core + +import android.content.Context +import net.thunderbird.app.common.BuildConfig +import net.thunderbird.core.logging.DefaultLogger +import net.thunderbird.core.logging.LogLevel +import net.thunderbird.core.logging.LogSink +import net.thunderbird.core.logging.Logger +import net.thunderbird.core.logging.composite.CompositeLogSink +import net.thunderbird.core.logging.console.ConsoleLogSink +import net.thunderbird.core.logging.file.AndroidFileSystemManager +import net.thunderbird.core.logging.file.FileLogSink +import org.koin.core.module.Module +import org.koin.core.qualifier.named +import org.koin.dsl.module + +val appCommonCoreModule: Module = module { + single { + if (BuildConfig.DEBUG) LogLevel.VERBOSE else LogLevel.INFO + } + + single> { + listOf( + ConsoleLogSink( + level = get(), + ), + ) + } + + single { + CompositeLogSink( + level = get(), + sinks = get(), + ) + } + + single { + DefaultLogger( + sink = get(), + ) + } + + single(named(SYNC_DEBUG_LOG)) { + CompositeLogSink( + level = get(), + sinks = get(), + ) + } + + single(named(SYNC_DEBUG_LOG)) { + FileLogSink( + level = LogLevel.DEBUG, + fileName = "thunderbird-sync-debug", + fileLocation = get().filesDir.path, + fileSystemManager = AndroidFileSystemManager(get().contentResolver), + ) + } + + single (named(SYNC_DEBUG_LOG)) { + DefaultLogger( + sink = get(named(SYNC_DEBUG_LOG)), + ) + } +} + +internal const val SYNC_DEBUG_LOG = "syncDebug" diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/feature/AccountSetupFinishedLauncher.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/AccountSetupFinishedLauncher.kt index 9324615fb20737135ce8f621ef9ee92fec3be3db..ebcca41f121e64e235d2d5fc2047728818babca2 100644 --- a/app-common/src/main/kotlin/net/thunderbird/app/common/feature/AccountSetupFinishedLauncher.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/AccountSetupFinishedLauncher.kt @@ -4,7 +4,7 @@ import android.content.Context import app.k9mail.feature.launcher.FeatureLauncherExternalContract import com.fsck.k9.activity.MessageList -class AccountSetupFinishedLauncher( +internal class AccountSetupFinishedLauncher( private val context: Context, ) : FeatureLauncherExternalContract.AccountSetupFinishedLauncher { override fun launch(accountUuid: String?) { diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/feature/FeatureModule.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/AppCommonFeatureModule.kt similarity index 82% rename from app-common/src/main/kotlin/net/thunderbird/app/common/feature/FeatureModule.kt rename to app-common/src/main/kotlin/net/thunderbird/app/common/feature/AppCommonFeatureModule.kt index c03304c44e6b67e6bf413d9d74692851b49221e3..d68b7d286ee007a40178acf7f9524efbf8534228 100644 --- a/app-common/src/main/kotlin/net/thunderbird/app/common/feature/FeatureModule.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/AppCommonFeatureModule.kt @@ -1,11 +1,14 @@ package net.thunderbird.app.common.feature import app.k9mail.feature.launcher.FeatureLauncherExternalContract +import app.k9mail.feature.launcher.di.featureLauncherModule import net.thunderbird.feature.navigation.drawer.api.NavigationDrawerExternalContract import org.koin.android.ext.koin.androidContext import org.koin.dsl.module -val featureLauncherModule = module { +internal val appCommonFeatureModule = module { + includes(featureLauncherModule) + factory { AccountSetupFinishedLauncher( context = androidContext(), diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/feature/LoggerLifecycleObserver.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/LoggerLifecycleObserver.kt new file mode 100644 index 0000000000000000000000000000000000000000..d79d8567525c789ce9950f23fc0578a817613c1b --- /dev/null +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/LoggerLifecycleObserver.kt @@ -0,0 +1,22 @@ +package net.thunderbird.app.common.feature + +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import net.thunderbird.core.logging.file.FileLogSink + +class LoggerLifecycleObserver(val fileLogSink: FileLogSink?) : DefaultLifecycleObserver { + override fun onStop(owner: LifecycleOwner) { + super.onStop(owner) + fileLogSink?.let { + owner.lifecycleScope.launch { + withContext(Dispatchers.IO) { + it.flushAndCloseBuffer() + } + } + } + } +} 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 index a0a232c6c20631ceb80066a2263e96235a95b636..4aef5790bf6ac8e9230ad319b5e1f2f859da1620 100644 --- 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 @@ -4,7 +4,7 @@ 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) : +internal class NavigationDrawerConfigLoader(private val drawerConfigManager: DrawerConfigManager) : NavigationDrawerExternalContract.DrawerConfigLoader { override fun loadDrawerConfigFlow(): Flow { return drawerConfigManager.getConfigFlow() diff --git a/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigWriter.kt b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigWriter.kt index d0f2c0eda54c67d65c700ac4653a2bcc002508c3..aae40c240fb62a14b22f5d7fda495bde5f915bbc 100644 --- a/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigWriter.kt +++ b/app-common/src/main/kotlin/net/thunderbird/app/common/feature/NavigationDrawerConfigWriter.kt @@ -4,7 +4,7 @@ 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( +internal class NavigationDrawerConfigWriter( private val drawerConfigManager: DrawerConfigManager, ) : NavigationDrawerExternalContract.DrawerConfigWriter { override fun writeDrawerConfig(drawerConfig: DrawerConfig) { 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/DefaultAccountDefaultsProviderTest.kt similarity index 77% rename from app-common/src/test/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProviderTest.kt rename to app-common/src/test/kotlin/net/thunderbird/app/common/account/DefaultAccountDefaultsProviderTest.kt index 790b7e347635f6f0842d7317a0020929e90bd396..20c2bda49c0e0a791f01a36ae63af167e32ffa94 100644 --- a/app-common/src/test/kotlin/net/thunderbird/app/common/account/CommonAccountDefaultsProviderTest.kt +++ b/app-common/src/test/kotlin/net/thunderbird/app/common/account/DefaultAccountDefaultsProviderTest.kt @@ -1,36 +1,36 @@ 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.core.preferences.Storage +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_MAXIMUM_AUTO_DOWNLOAD_MESSAGE_SIZE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_FORMAT +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_FORMAT_AUTO +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_MESSAGE_READ_RECEIPT +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTED_TEXT_SHOWN +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTE_PREFIX +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_QUOTE_STYLE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_REMOTE_SEARCH_NUM_RESULTS +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_REPLY_AFTER_QUOTE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_RINGTONE_URI +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_SORT_ASCENDING +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_SORT_TYPE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_STRIP_SIGNATURE +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_SYNC_INTERVAL +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.DEFAULT_VISIBLE_LIMIT +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.NO_OPENPGP_KEY +import net.thunderbird.core.android.account.AccountDefaultsProvider.Companion.UNASSIGNED_ACCOUNT_NUMBER +import net.thunderbird.core.android.account.Expunge +import net.thunderbird.core.android.account.FolderMode +import net.thunderbird.core.android.account.Identity +import net.thunderbird.core.android.account.LegacyAccount +import net.thunderbird.core.android.account.ShowPictures +import net.thunderbird.core.featureflag.FeatureFlagResult +import net.thunderbird.core.preference.storage.Storage +import net.thunderbird.feature.mail.folder.api.SpecialFolderSelection import net.thunderbird.feature.notification.NotificationLight import net.thunderbird.feature.notification.NotificationSettings import net.thunderbird.feature.notification.NotificationVibration @@ -38,7 +38,7 @@ import org.junit.Test import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock -class CommonAccountDefaultsProviderTest { +class DefaultAccountDefaultsProviderTest { @Suppress("LongMethod") @Test @@ -48,7 +48,7 @@ class CommonAccountDefaultsProviderTest { on { defaultIdentityDescription() } doReturn "Default Identity" } val account = LegacyAccount( - uuid = "test-uuid", + uuid = "cf728064-077d-4369-a0c7-7c2b21693d9b", isSensitiveDebugLoggingEnabled = { false }, ) val identities = listOf( @@ -64,7 +64,7 @@ class CommonAccountDefaultsProviderTest { light = NotificationLight.Disabled, vibration = NotificationVibration.DEFAULT, ) - val testSubject = CommonAccountDefaultsProvider( + val testSubject = DefaultAccountDefaultsProvider( resourceProvider = resourceProvider, featureFlagProvider = { FeatureFlagResult.Disabled @@ -77,7 +77,7 @@ class CommonAccountDefaultsProviderTest { // assert assertThat(account.automaticCheckIntervalMinutes).isEqualTo(DEFAULT_SYNC_INTERVAL) assertThat(account.idleRefreshMinutes).isEqualTo(24) - assertThat(account.displayCount).isEqualTo(K9.DEFAULT_VISIBLE_LIMIT) + assertThat(account.displayCount).isEqualTo(DEFAULT_VISIBLE_LIMIT) assertThat(account.accountNumber).isEqualTo(UNASSIGNED_ACCOUNT_NUMBER) assertThat(account.isNotifyNewMail).isTrue() assertThat(account.folderNotifyNewMailMode).isEqualTo(FolderMode.ALL) @@ -145,7 +145,7 @@ class CommonAccountDefaultsProviderTest { on { defaultIdentityDescription() } doReturn "Default Identity" } val account = LegacyAccount( - uuid = "test-uuid", + uuid = "cf728064-077d-4369-a0c7-7c2b21693d9b", isSensitiveDebugLoggingEnabled = { false }, ) val storage = mock { @@ -153,7 +153,7 @@ class CommonAccountDefaultsProviderTest { on { getBoolean("${account.uuid}.notifyNewMail", false) } doReturn false on { getBoolean("${account.uuid}.notifySelfNewMail", false) } doReturn false } - val testSubject = CommonAccountDefaultsProvider( + val testSubject = DefaultAccountDefaultsProvider( resourceProvider = resourceProvider, featureFlagProvider = { FeatureFlagResult.Disabled @@ -175,7 +175,7 @@ class CommonAccountDefaultsProviderTest { on { defaultIdentityDescription() } doReturn "Default Identity" } val account = LegacyAccount( - uuid = "test-uuid", + uuid = "cf728064-077d-4369-a0c7-7c2b21693d9b", isSensitiveDebugLoggingEnabled = { false }, ) val storage = mock { @@ -183,7 +183,7 @@ class CommonAccountDefaultsProviderTest { on { getBoolean("${account.uuid}.notifyNewMail", false) } doReturn false on { getBoolean("${account.uuid}.notifySelfNewMail", false) } doReturn false } - val testSubject = CommonAccountDefaultsProvider( + val testSubject = DefaultAccountDefaultsProvider( resourceProvider = resourceProvider, featureFlagProvider = { FeatureFlagResult.Enabled @@ -206,7 +206,7 @@ class CommonAccountDefaultsProviderTest { on { defaultIdentityDescription() } doReturn "Default Identity" } val account = LegacyAccount( - uuid = "test-uuid", + uuid = "cf728064-077d-4369-a0c7-7c2b21693d9b", isSensitiveDebugLoggingEnabled = { false }, ) val storage = mock { @@ -214,7 +214,7 @@ class CommonAccountDefaultsProviderTest { on { getBoolean("${account.uuid}.notifyNewMail", false) } doReturn false on { getBoolean("${account.uuid}.notifySelfNewMail", false) } doReturn false } - val testSubject = CommonAccountDefaultsProvider( + val testSubject = DefaultAccountDefaultsProvider( resourceProvider = resourceProvider, featureFlagProvider = { FeatureFlagResult.Enabled @@ -237,7 +237,7 @@ class CommonAccountDefaultsProviderTest { on { defaultIdentityDescription() } doReturn "Default Identity" } val account = LegacyAccount( - uuid = "test-uuid", + uuid = "cf728064-077d-4369-a0c7-7c2b21693d9b", isSensitiveDebugLoggingEnabled = { false }, ) val storage = mock { @@ -245,7 +245,7 @@ class CommonAccountDefaultsProviderTest { on { getBoolean("${account.uuid}.notifyNewMail", false) } doReturn false on { getBoolean("${account.uuid}.notifySelfNewMail", false) } doReturn false } - val testSubject = CommonAccountDefaultsProvider( + val testSubject = DefaultAccountDefaultsProvider( resourceProvider = resourceProvider, featureFlagProvider = { FeatureFlagResult.Enabled diff --git a/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/DefaultAccountProfileLocalDataSourceTest.kt b/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/DefaultAccountProfileLocalDataSourceTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..0ccad85f3f14b1feac16ab07b866b6d3bd7918ac --- /dev/null +++ b/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/DefaultAccountProfileLocalDataSourceTest.kt @@ -0,0 +1,158 @@ +package net.thunderbird.app.common.account.data + +import app.cash.turbine.test +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.account.fake.FakeAccountProfileData.PROFILE_COLOR +import net.thunderbird.account.fake.FakeAccountProfileData.PROFILE_NAME +import net.thunderbird.core.android.account.Identity +import net.thunderbird.core.android.account.LegacyAccountWrapper +import net.thunderbird.feature.account.AccountId +import net.thunderbird.feature.account.AccountIdFactory +import net.thunderbird.feature.account.profile.AccountAvatar +import net.thunderbird.feature.account.profile.AccountProfile +import net.thunderbird.feature.account.storage.legacy.mapper.DefaultAccountAvatarDataMapper +import net.thunderbird.feature.account.storage.legacy.mapper.DefaultAccountProfileDataMapper +import net.thunderbird.feature.account.storage.profile.AvatarDto +import net.thunderbird.feature.account.storage.profile.AvatarTypeDto +import net.thunderbird.feature.account.storage.profile.ProfileDto +import org.junit.Test + +class DefaultAccountProfileLocalDataSourceTest { + + @Test + fun `getById should return account profile`() = runTest { + // arrange + val accountId = AccountIdFactory.create() + val legacyAccount = createLegacyAccount(accountId) + val accountProfile = createAccountProfile(accountId) + val testSubject = createTestSubject(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 = AccountIdFactory.create() + val testSubject = createTestSubject(null) + + // act & assert + testSubject.getById(accountId).test { + assertThat(awaitItem()).isEqualTo(null) + } + } + + @Test + fun `update should save account profile`() = runTest { + // arrange + val accountId = AccountIdFactory.create() + val legacyAccount = createLegacyAccount(accountId) + val accountProfile = createAccountProfile(accountId) + + val updatedName = "updatedName" + val updatedAccountProfile = accountProfile.copy(name = updatedName) + + val testSubject = createTestSubject(legacyAccount) + + // act & assert + testSubject.getById(accountId).test { + assertThat(awaitItem()).isEqualTo(accountProfile) + + testSubject.update(updatedAccountProfile) + + assertThat(awaitItem()).isEqualTo(updatedAccountProfile) + } + } + + private companion object Companion { + fun createLegacyAccount( + id: AccountId, + displayName: String = PROFILE_NAME, + color: Int = PROFILE_COLOR, + ): LegacyAccountWrapper { + return LegacyAccountWrapper( + isSensitiveDebugLoggingEnabled = { true }, + id = id, + name = displayName, + email = "demo@example.com", + profile = ProfileDto( + id = id, + name = displayName, + color = color, + avatar = AvatarDto( + avatarType = AvatarTypeDto.ICON, + avatarMonogram = null, + avatarImageUri = null, + avatarIconName = "star", + ), + ), + identities = listOf( + Identity( + signatureUse = false, + description = "Demo User", + ), + ), + 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, + ), + ) + } + + private fun createAccountProfile( + accountId: AccountId, + name: String = PROFILE_NAME, + color: Int = PROFILE_COLOR, + ): AccountProfile { + return AccountProfile( + id = accountId, + name = name, + color = color, + avatar = AccountAvatar.Icon( + name = "star", + ), + ) + } + + private fun createTestSubject( + legacyAccount: LegacyAccountWrapper?, + ): DefaultAccountProfileLocalDataSource { + return DefaultAccountProfileLocalDataSource( + accountManager = FakeLegacyAccountWrapperManager( + initialAccounts = if (legacyAccount != null) { + listOf(legacyAccount) + } else { + emptyList() + }, + ), + dataMapper = DefaultAccountProfileDataMapper( + avatarMapper = DefaultAccountAvatarDataMapper(), + ), + ) + } + } +} 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 index 0aea0502b43ec87b333019ad6771008f83d92d47..98c4aa809399f0fb5847db274822d57b8cad7e86 100644 --- 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 @@ -1,27 +1,28 @@ 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 +import net.thunderbird.core.android.account.LegacyAccountWrapper +import net.thunderbird.core.android.account.LegacyAccountWrapperManager +import net.thunderbird.feature.account.AccountId internal class FakeLegacyAccountWrapperManager( initialAccounts: List = emptyList(), ) : LegacyAccountWrapperManager { - private val accountsState = MutableStateFlow>( + private val accountsState = MutableStateFlow( initialAccounts, ) private val accounts: StateFlow> = accountsState override fun getAll(): Flow> = accounts - override fun getById(id: String): Flow = accounts + override fun getById(id: AccountId): Flow = accounts .map { list -> - list.find { it.uuid == id } + list.find { it.id == id } } override suspend fun update(account: LegacyAccountWrapper) { 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 deleted file mode 100644 index 53acd663797402b7d6048b735fc511a73ecc90df..0000000000000000000000000000000000000000 --- a/app-common/src/test/kotlin/net/thunderbird/app/common/account/data/LegacyAccountProfileLocalDataSourceTest.kt +++ /dev/null @@ -1,147 +0,0 @@ -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 a2f2128f7b71a4631834d1e1494d6cb1b4c113ac..7f890f98dce1a709fe711922623d3150dd1f0a67 100644 --- a/app-k9mail/badging/fossRelease-badging.txt +++ b/app-k9mail/badging/fossRelease-badging.txt @@ -1,24 +1,10 @@ -package: name='com.fsck.k9' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15' -install-location:'auto' -sdkVersion:'21' -targetSdkVersion:'34' -uses-permission: name='android.permission.READ_CONTACTS' -uses-permission: name='android.permission.POST_NOTIFICATIONS' -uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' -uses-permission: name='android.permission.READ_SYNC_SETTINGS' -uses-permission: name='android.permission.ACCESS_NETWORK_STATE' -uses-permission: name='android.permission.INTERNET' -uses-permission: name='android.permission.VIBRATE' -uses-permission: name='android.permission.WAKE_LOCK' -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' -application-label:'K-9 Mail' +application-icon-120:'res/drawable-v26/ic_launcher.xml' +application-icon-160:'res/drawable-v26/ic_launcher.xml' +application-icon-240:'res/drawable-v26/ic_launcher.xml' +application-icon-320:'res/drawable-v26/ic_launcher.xml' +application-icon-480:'res/drawable-v26/ic_launcher.xml' +application-icon-640:'res/drawable-v26/ic_launcher.xml' +application-icon-65534:'res/drawable-v26/ic_launcher.xml' application-label-ar:'بريد K-9' application-label-be:'Пошта K-9' application-label-bg:'K-9 Mail' @@ -29,8 +15,8 @@ application-label-cy:'K-9 Mail' application-label-da:'K-9 Mail' application-label-de:'K-9 Mail' application-label-el:'K-9 Mail' -application-label-en:'K-9 Mail' application-label-en-GB:'K-9 Mail' +application-label-en:'K-9 Mail' application-label-eo:'K-9 Retpoŝtilo' application-label-es:'K-9 Mail' application-label-et:'K-9 Mail' @@ -51,13 +37,13 @@ application-label-ja:'K-9 Mail' application-label-ko:'K-9 메일' application-label-lt:'K-9 paštas' application-label-lv:'K-9 pasts' -application-label-nb:'K-9 e-post' +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:'Email K-9' application-label-pt-BR:'K-9 Mail' application-label-pt-PT:'K-9 Mail' +application-label-pt:'Email K-9' application-label-ro:'K-9 Mail' application-label-ru:'Почта K-9' application-label-sk:'K-9 Mail' @@ -68,32 +54,46 @@ application-label-sv:'K-9 Mail' application-label-tr:'K-9 Posta' application-label-uk:'K-9 Mail' application-label-vi:'Thư K-9' -application-label-zh:'K-9 Mail' application-label-zh-CN:'K-9 Mail' application-label-zh-TW:'K-9 Mail' -application-icon-120:'res/drawable-v26/ic_launcher.xml' -application-icon-160:'res/drawable-v26/ic_launcher.xml' -application-icon-240:'res/drawable-v26/ic_launcher.xml' -application-icon-320:'res/drawable-v26/ic_launcher.xml' -application-icon-480:'res/drawable-v26/ic_launcher.xml' -application-icon-640:'res/drawable-v26/ic_launcher.xml' -application-icon-65534:'res/drawable-v26/ic_launcher.xml' +application-label-zh:'K-9 Mail' +application-label:'K-9 Mail' application: label='K-9 Mail' icon='res/drawable-v26/ic_launcher.xml' -uses-library-not-required:'com.sec.android.app.multiwindow' -launchable-activity: name='com.fsck.k9.activity.MessageList' label='' icon='' -property: name='android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE' value='This service is used to maintain a continuous connection to an IMAP server to be able to provide instant notifications to the user when a new email arrives. Firebase Cloud Messaging is not suitable for this task, neither are mechanisms like AndroidX WorkManager. Other foreground service types aren't a good fit for this use case.' -uses-library-not-required:'androidx.window.extensions' -uses-library-not-required:'androidx.window.sidecar' +densities: '120' '160' '240' '320' '480' '640' '65534' feature-group: label='' - uses-feature-not-required: name='android.hardware.camera' - uses-feature-not-required: name='android.hardware.touchscreen' -provides-component:'app-widget' +install-location:'auto' +launchable-activity: name='com.fsck.k9.activity.MessageList' label='' icon='' +locales: '--_--' 'ar' 'be' 'bg' 'ca' 'co' 'cs' 'cy' 'da' 'de' 'el' 'en' 'en-GB' 'eo' 'es' 'et' 'eu' 'fa' 'fi' 'fr' 'fy' 'ga' 'gl' 'hr' 'hu' 'in' 'is' 'it' 'iw' 'ja' 'ko' 'lt' 'lv' 'nb' 'nl' 'nn' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'sk' 'sl' 'sq' 'sr' 'sv' 'tr' 'uk' 'vi' 'zh' 'zh-CN' 'zh-TW' main +minSdkVersion:'21' +native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' other-activities other-receivers other-services -supports-screens: 'small' 'normal' 'large' 'xlarge' +package: name='com.fsck.k9' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15' +property: name='android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE' value='This service is used to maintain a continuous connection to an IMAP server to be able to provide instant notifications to the user when a new email arrives. Firebase Cloud Messaging is not suitable for this task, neither are mechanisms like AndroidX WorkManager. Other foreground service types aren't a good fit for this use case.' +provides-component:'app-widget' supports-any-density: 'true' -locales: '--_--' 'ar' 'be' 'bg' 'ca' 'co' 'cs' 'cy' 'da' 'de' 'el' 'en' 'en-GB' 'eo' 'es' 'et' 'eu' 'fa' 'fi' 'fr' 'fy' 'ga' 'gl' 'hr' 'hu' 'in' 'is' 'it' 'iw' 'ja' 'ko' 'lt' 'lv' 'nb' 'nl' 'nn' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'sk' 'sl' 'sq' 'sr' 'sv' 'tr' 'uk' 'vi' 'zh' 'zh-CN' 'zh-TW' -densities: '120' '160' '240' '320' '480' '640' '65534' -native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' +supports-screens: 'small' 'normal' 'large' 'xlarge' +targetSdkVersion:'35' +uses-feature-not-required: name='android.hardware.camera' +uses-feature-not-required: name='android.hardware.touchscreen' +uses-library-not-required:'androidx.window.extensions' +uses-library-not-required:'androidx.window.sidecar' +uses-library-not-required:'com.sec.android.app.multiwindow' +uses-permission: name='android.permission.ACCESS_NETWORK_STATE' +uses-permission: name='android.permission.CAMERA' +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.INTERNET' +uses-permission: name='android.permission.POST_NOTIFICATIONS' +uses-permission: name='android.permission.READ_CONTACTS' +uses-permission: name='android.permission.READ_SYNC_SETTINGS' +uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' +uses-permission: name='android.permission.SCHEDULE_EXACT_ALARM' +uses-permission: name='android.permission.USE_BIOMETRIC' +uses-permission: name='android.permission.USE_FINGERPRINT' +uses-permission: name='android.permission.VIBRATE' +uses-permission: name='android.permission.WAKE_LOCK' +uses-permission: name='com.fsck.k9.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' diff --git a/app-k9mail/badging/fullRelease-badging.txt b/app-k9mail/badging/fullRelease-badging.txt index 8d12d4f38de0b6f8ff47a5b8037bdf7b7a4476fc..14cb60e730bcaff500c88ab9384dd0528e840377 100644 --- a/app-k9mail/badging/fullRelease-badging.txt +++ b/app-k9mail/badging/fullRelease-badging.txt @@ -1,25 +1,10 @@ -package: name='com.fsck.k9' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15' -install-location:'auto' -sdkVersion:'21' -targetSdkVersion:'34' -uses-permission: name='android.permission.READ_CONTACTS' -uses-permission: name='android.permission.POST_NOTIFICATIONS' -uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' -uses-permission: name='android.permission.READ_SYNC_SETTINGS' -uses-permission: name='android.permission.ACCESS_NETWORK_STATE' -uses-permission: name='android.permission.INTERNET' -uses-permission: name='android.permission.VIBRATE' -uses-permission: name='android.permission.WAKE_LOCK' -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' -uses-permission: name='com.fsck.k9.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' -application-label:'K-9 Mail' +application-icon-120:'res/drawable-v26/ic_launcher.xml' +application-icon-160:'res/drawable-v26/ic_launcher.xml' +application-icon-240:'res/drawable-v26/ic_launcher.xml' +application-icon-320:'res/drawable-v26/ic_launcher.xml' +application-icon-480:'res/drawable-v26/ic_launcher.xml' +application-icon-640:'res/drawable-v26/ic_launcher.xml' +application-icon-65534:'res/drawable-v26/ic_launcher.xml' application-label-ar:'بريد K-9' application-label-be:'Пошта K-9' application-label-bg:'K-9 Mail' @@ -30,8 +15,8 @@ application-label-cy:'K-9 Mail' application-label-da:'K-9 Mail' application-label-de:'K-9 Mail' application-label-el:'K-9 Mail' -application-label-en:'K-9 Mail' application-label-en-GB:'K-9 Mail' +application-label-en:'K-9 Mail' application-label-eo:'K-9 Retpoŝtilo' application-label-es:'K-9 Mail' application-label-et:'K-9 Mail' @@ -52,13 +37,13 @@ application-label-ja:'K-9 Mail' application-label-ko:'K-9 메일' application-label-lt:'K-9 paštas' application-label-lv:'K-9 pasts' -application-label-nb:'K-9 e-post' +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:'Email K-9' application-label-pt-BR:'K-9 Mail' application-label-pt-PT:'K-9 Mail' +application-label-pt:'Email K-9' application-label-ro:'K-9 Mail' application-label-ru:'Почта K-9' application-label-sk:'K-9 Mail' @@ -69,32 +54,47 @@ application-label-sv:'K-9 Mail' application-label-tr:'K-9 Posta' application-label-uk:'K-9 Mail' application-label-vi:'Thư K-9' -application-label-zh:'K-9 Mail' application-label-zh-CN:'K-9 Mail' application-label-zh-TW:'K-9 Mail' -application-icon-120:'res/drawable-v26/ic_launcher.xml' -application-icon-160:'res/drawable-v26/ic_launcher.xml' -application-icon-240:'res/drawable-v26/ic_launcher.xml' -application-icon-320:'res/drawable-v26/ic_launcher.xml' -application-icon-480:'res/drawable-v26/ic_launcher.xml' -application-icon-640:'res/drawable-v26/ic_launcher.xml' -application-icon-65534:'res/drawable-v26/ic_launcher.xml' +application-label-zh:'K-9 Mail' +application-label:'K-9 Mail' application: label='K-9 Mail' icon='res/drawable-v26/ic_launcher.xml' -uses-library-not-required:'com.sec.android.app.multiwindow' -launchable-activity: name='com.fsck.k9.activity.MessageList' label='' icon='' -property: name='android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE' value='This service is used to maintain a continuous connection to an IMAP server to be able to provide instant notifications to the user when a new email arrives. Firebase Cloud Messaging is not suitable for this task, neither are mechanisms like AndroidX WorkManager. Other foreground service types aren't a good fit for this use case.' -uses-library-not-required:'androidx.window.extensions' -uses-library-not-required:'androidx.window.sidecar' +densities: '120' '160' '240' '320' '480' '640' '65534' feature-group: label='' - uses-feature-not-required: name='android.hardware.camera' - uses-feature-not-required: name='android.hardware.touchscreen' -provides-component:'app-widget' +install-location:'auto' +launchable-activity: name='com.fsck.k9.activity.MessageList' label='' icon='' +locales: '--_--' 'ar' 'be' 'bg' 'ca' 'co' 'cs' 'cy' 'da' 'de' 'el' 'en' 'en-GB' 'eo' 'es' 'et' 'eu' 'fa' 'fi' 'fr' 'fy' 'ga' 'gl' 'hr' 'hu' 'in' 'is' 'it' 'iw' 'ja' 'ko' 'lt' 'lv' 'nb' 'nl' 'nn' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'sk' 'sl' 'sq' 'sr' 'sv' 'tr' 'uk' 'vi' 'zh' 'zh-CN' 'zh-TW' main +minSdkVersion:'21' +native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' other-activities other-receivers other-services -supports-screens: 'small' 'normal' 'large' 'xlarge' +package: name='com.fsck.k9' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15' +property: name='android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE' value='This service is used to maintain a continuous connection to an IMAP server to be able to provide instant notifications to the user when a new email arrives. Firebase Cloud Messaging is not suitable for this task, neither are mechanisms like AndroidX WorkManager. Other foreground service types aren't a good fit for this use case.' +provides-component:'app-widget' supports-any-density: 'true' -locales: '--_--' 'ar' 'be' 'bg' 'ca' 'co' 'cs' 'cy' 'da' 'de' 'el' 'en' 'en-GB' 'eo' 'es' 'et' 'eu' 'fa' 'fi' 'fr' 'fy' 'ga' 'gl' 'hr' 'hu' 'in' 'is' 'it' 'iw' 'ja' 'ko' 'lt' 'lv' 'nb' 'nl' 'nn' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'sk' 'sl' 'sq' 'sr' 'sv' 'tr' 'uk' 'vi' 'zh' 'zh-CN' 'zh-TW' -densities: '120' '160' '240' '320' '480' '640' '65534' -native-code: 'arm64-v8a' 'armeabi-v7a' 'x86' 'x86_64' +supports-screens: 'small' 'normal' 'large' 'xlarge' +targetSdkVersion:'35' +uses-feature-not-required: name='android.hardware.camera' +uses-feature-not-required: name='android.hardware.touchscreen' +uses-library-not-required:'androidx.window.extensions' +uses-library-not-required:'androidx.window.sidecar' +uses-library-not-required:'com.sec.android.app.multiwindow' +uses-permission: name='android.permission.ACCESS_NETWORK_STATE' +uses-permission: name='android.permission.CAMERA' +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.INTERNET' +uses-permission: name='android.permission.POST_NOTIFICATIONS' +uses-permission: name='android.permission.READ_CONTACTS' +uses-permission: name='android.permission.READ_SYNC_SETTINGS' +uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED' +uses-permission: name='android.permission.SCHEDULE_EXACT_ALARM' +uses-permission: name='android.permission.USE_BIOMETRIC' +uses-permission: name='android.permission.USE_FINGERPRINT' +uses-permission: name='android.permission.VIBRATE' +uses-permission: name='android.permission.WAKE_LOCK' +uses-permission: name='com.android.vending.BILLING' +uses-permission: name='com.fsck.k9.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION' diff --git a/app-k9mail/build.gradle.kts b/app-k9mail/build.gradle.kts index 0ae3d383da0080d49803d1bfc04c59837bbfe945..34915cd98ff21c8c18716e383314d975df4de28a 100644 --- a/app-k9mail/build.gradle.kts +++ b/app-k9mail/build.gradle.kts @@ -18,65 +18,65 @@ android { testApplicationId = "com.fsck.k9.tests" versionCode = 39026 - versionName = "11.1" + versionName = "12.0" + buildConfigField("String", "CLIENT_INFO_APP_NAME", "\"K-9 Mail\"") + } + + androidResources { // Keep in sync with the resource string array "supported_languages" - resourceConfigurations.addAll( - listOf( - "ar", - "be", - "bg", - "ca", - "co", - "cs", - "cy", - "da", - "de", - "el", - "en", - "en_GB", - "eo", - "es", - "et", - "eu", - "fa", - "fi", - "fr", - "fy", - "ga", - "gl", - "hr", - "hu", - "in", - "is", - "it", - "iw", - "ja", - "ko", - "lt", - "lv", - "nb", - "nl", - "nn", - "pl", - "pt_BR", - "pt_PT", - "ro", - "ru", - "sk", - "sl", - "sq", - "sr", - "sv", - "tr", - "uk", - "vi", - "zh_CN", - "zh_TW", - ), + localeFilters += listOf( + "ar", + "be", + "bg", + "ca", + "co", + "cs", + "cy", + "da", + "de", + "el", + "en", + "en-rGB", + "eo", + "es", + "et", + "eu", + "fa", + "fi", + "fr", + "fy", + "ga", + "gl", + "hr", + "hu", + "in", + "is", + "it", + "iw", + "ja", + "ko", + "lt", + "lv", + "nb", + "nl", + "nn", + "pl", + "pt-rBR", + "pt-rPT", + "ro", + "ru", + "sk", + "sl", + "sq", + "sr", + "sv", + "tr", + "uk", + "vi", + "zh-rCN", + "zh-rTW", ) - - buildConfigField("String", "CLIENT_INFO_APP_NAME", "\"K-9 Mail\"") } signingConfigs { @@ -137,11 +137,12 @@ dependencies { implementation(projects.core.ui.compose.theme2.k9mail) implementation(projects.core.ui.legacy.theme2.k9mail) implementation(projects.feature.launcher) + implementation(projects.feature.mail.message.list) implementation(projects.legacy.core) implementation(projects.legacy.ui.legacy) - implementation(projects.core.featureflags) + implementation(projects.core.featureflag) implementation(projects.feature.account.settings.impl) @@ -161,7 +162,11 @@ dependencies { debugImplementation(projects.backend.demo) debugImplementation(projects.feature.autodiscovery.demo) - testImplementation(libs.robolectric) + // Required for DependencyInjectionTest + testImplementation(projects.feature.account.api) + testImplementation(projects.feature.account.common) + testImplementation(projects.plugins.openpgpApiLib.openpgpApi) + testImplementation(libs.appauth) } dependencyGuard { diff --git a/app-k9mail/dependencies/fossReleaseRuntimeClasspath.txt b/app-k9mail/dependencies/fossReleaseRuntimeClasspath.txt index fd0f4648ec5e9411e1c4034006ecacce72ef43a6..06576d9ae5927e9584e09f63681f7058998db2b1 100644 --- a/app-k9mail/dependencies/fossReleaseRuntimeClasspath.txt +++ b/app-k9mail/dependencies/fossReleaseRuntimeClasspath.txt @@ -4,25 +4,25 @@ 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 -androidx.appcompat:appcompat-resources:1.7.0 -androidx.appcompat:appcompat:1.7.0 +androidx.appcompat:appcompat-resources:1.7.1 +androidx.appcompat:appcompat:1.7.1 androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 -androidx.autofill:autofill:1.0.0 +androidx.autofill:autofill:1.3.0 androidx.biometric:biometric:1.1.0 androidx.browser:browser:1.3.0 androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.5.0 androidx.collection:collection-ktx:1.5.0 androidx.collection:collection:1.5.0 -androidx.compose.animation:animation-android:1.8.0 -androidx.compose.animation:animation-core-android:1.8.0 -androidx.compose.animation:animation-core:1.8.0 -androidx.compose.animation:animation:1.8.0 -androidx.compose.foundation:foundation-android:1.8.0 -androidx.compose.foundation:foundation-layout-android:1.8.0 -androidx.compose.foundation:foundation-layout:1.8.0 -androidx.compose.foundation:foundation:1.8.0 +androidx.compose.animation:animation-android:1.8.2 +androidx.compose.animation:animation-core-android:1.8.2 +androidx.compose.animation:animation-core:1.8.2 +androidx.compose.animation:animation:1.8.2 +androidx.compose.foundation:foundation-android:1.8.2 +androidx.compose.foundation:foundation-layout-android:1.8.2 +androidx.compose.foundation:foundation-layout:1.8.2 +androidx.compose.foundation:foundation:1.8.2 androidx.compose.material3.adaptive:adaptive-android:1.1.0 androidx.compose.material3.adaptive:adaptive-layout-android:1.1.0 androidx.compose.material3.adaptive:adaptive-layout:1.1.0 @@ -35,27 +35,27 @@ 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.8.0 -androidx.compose.material:material-ripple:1.8.0 -androidx.compose.runtime:runtime-android:1.8.0 -androidx.compose.runtime:runtime-saveable-android:1.8.0 -androidx.compose.runtime:runtime-saveable:1.8.0 -androidx.compose.runtime:runtime:1.8.0 -androidx.compose.ui:ui-android:1.8.0 -androidx.compose.ui:ui-geometry-android:1.8.0 -androidx.compose.ui:ui-geometry:1.8.0 -androidx.compose.ui:ui-graphics-android:1.8.0 -androidx.compose.ui:ui-graphics:1.8.0 -androidx.compose.ui:ui-text-android:1.8.0 -androidx.compose.ui:ui-text:1.8.0 -androidx.compose.ui:ui-tooling-preview-android:1.8.0 -androidx.compose.ui:ui-tooling-preview:1.8.0 -androidx.compose.ui:ui-unit-android:1.8.0 -androidx.compose.ui:ui-unit:1.8.0 -androidx.compose.ui:ui-util-android:1.8.0 -androidx.compose.ui:ui-util:1.8.0 -androidx.compose.ui:ui:1.8.0 -androidx.compose:compose-bom:2025.04.01 +androidx.compose.material:material-ripple-android:1.8.2 +androidx.compose.material:material-ripple:1.8.2 +androidx.compose.runtime:runtime-android:1.8.2 +androidx.compose.runtime:runtime-saveable-android:1.8.2 +androidx.compose.runtime:runtime-saveable:1.8.2 +androidx.compose.runtime:runtime:1.8.2 +androidx.compose.ui:ui-android:1.8.2 +androidx.compose.ui:ui-geometry-android:1.8.2 +androidx.compose.ui:ui-geometry:1.8.2 +androidx.compose.ui:ui-graphics-android:1.8.2 +androidx.compose.ui:ui-graphics:1.8.2 +androidx.compose.ui:ui-text-android:1.8.2 +androidx.compose.ui:ui-text:1.8.2 +androidx.compose.ui:ui-tooling-preview-android:1.8.2 +androidx.compose.ui:ui-tooling-preview:1.8.2 +androidx.compose.ui:ui-unit-android:1.8.2 +androidx.compose.ui:ui-unit:1.8.2 +androidx.compose.ui:ui-util-android:1.8.2 +androidx.compose.ui:ui-util:1.8.2 +androidx.compose.ui:ui:1.8.2 +androidx.compose:compose-bom:2025.06.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 androidx.constraintlayout:constraintlayout-core:1.1.1 @@ -78,10 +78,10 @@ androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.4.0 androidx.emoji2:emoji2:1.4.0 -androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.6 -androidx.fragment:fragment-ktx:1.8.6 -androidx.fragment:fragment:1.8.6 +androidx.exifinterface:exifinterface:1.4.1 +androidx.fragment:fragment-compose:1.8.8 +androidx.fragment:fragment-ktx:1.8.8 +androidx.fragment:fragment:1.8.8 androidx.glance:glance-appwidget-external-protobuf:1.1.1 androidx.glance:glance-appwidget-proto:1.1.1 androidx.glance:glance-appwidget:1.1.1 @@ -90,36 +90,38 @@ 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 -androidx.lifecycle:lifecycle-common-java8:2.8.7 -androidx.lifecycle:lifecycle-common-jvm:2.8.7 -androidx.lifecycle:lifecycle-common:2.8.7 -androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 -androidx.lifecycle:lifecycle-livedata-core:2.8.7 -androidx.lifecycle:lifecycle-livedata-ktx:2.8.7 -androidx.lifecycle:lifecycle-livedata:2.8.7 -androidx.lifecycle:lifecycle-process:2.8.7 -androidx.lifecycle:lifecycle-runtime-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-compose-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-compose:2.8.7 -androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 -androidx.lifecycle:lifecycle-runtime:2.8.7 -androidx.lifecycle:lifecycle-service:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 -androidx.lifecycle:lifecycle-viewmodel:2.8.7 +androidx.lifecycle:lifecycle-common-java8:2.9.1 +androidx.lifecycle:lifecycle-common-jvm:2.9.1 +androidx.lifecycle:lifecycle-common:2.9.1 +androidx.lifecycle:lifecycle-livedata-core-ktx:2.9.1 +androidx.lifecycle:lifecycle-livedata-core:2.9.1 +androidx.lifecycle:lifecycle-livedata-ktx:2.9.1 +androidx.lifecycle:lifecycle-livedata:2.9.1 +androidx.lifecycle:lifecycle-process:2.9.1 +androidx.lifecycle:lifecycle-runtime-android:2.9.1 +androidx.lifecycle:lifecycle-runtime-compose-android:2.9.1 +androidx.lifecycle:lifecycle-runtime-compose:2.9.1 +androidx.lifecycle:lifecycle-runtime-ktx-android:2.9.1 +androidx.lifecycle:lifecycle-runtime-ktx:2.9.1 +androidx.lifecycle:lifecycle-runtime:2.9.1 +androidx.lifecycle:lifecycle-service:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-android:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-compose-android:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-compose:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-savedstate-android:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.1 +androidx.lifecycle:lifecycle-viewmodel:2.9.1 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.9 -androidx.navigation:navigation-common:2.8.9 -androidx.navigation:navigation-compose:2.8.9 -androidx.navigation:navigation-fragment:2.8.9 -androidx.navigation:navigation-runtime-ktx:2.8.9 -androidx.navigation:navigation-runtime:2.8.9 -androidx.navigation:navigation-ui:2.8.9 +androidx.navigation:navigation-common-android:2.9.0 +androidx.navigation:navigation-common:2.9.0 +androidx.navigation:navigation-compose-android:2.9.0 +androidx.navigation:navigation-compose:2.9.0 +androidx.navigation:navigation-fragment:2.9.0 +androidx.navigation:navigation-runtime-android:2.9.0 +androidx.navigation:navigation-runtime:2.9.0 +androidx.navigation:navigation-ui:2.9.0 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 @@ -128,8 +130,11 @@ androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 androidx.room:room-runtime:2.6.1 -androidx.savedstate:savedstate-ktx:1.2.1 -androidx.savedstate:savedstate:1.2.1 +androidx.savedstate:savedstate-android:1.3.0 +androidx.savedstate:savedstate-compose-android:1.3.0 +androidx.savedstate:savedstate-compose:1.3.0 +androidx.savedstate:savedstate-ktx:1.3.0 +androidx.savedstate:savedstate:1.3.0 androidx.slidingpanelayout:slidingpanelayout:1.2.0 androidx.sqlite:sqlite-framework:2.4.0 androidx.sqlite:sqlite:2.4.0 @@ -143,29 +148,29 @@ 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.webkit:webkit:1.13.0 +androidx.webkit:webkit:1.14.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.1 androidx.work:work-runtime:2.10.1 -co.touchlab:stately-concurrency-jvm:2.0.6 -co.touchlab:stately-concurrency:2.0.6 -co.touchlab:stately-concurrent-collections-jvm:2.0.6 -co.touchlab:stately-concurrent-collections:2.0.6 -co.touchlab:stately-strict-jvm:2.0.6 -co.touchlab:stately-strict:2.0.6 +co.touchlab:stately-concurrency-jvm:2.1.0 +co.touchlab:stately-concurrency:2.1.0 +co.touchlab:stately-concurrent-collections-jvm:2.1.0 +co.touchlab:stately-concurrent-collections:2.1.0 +co.touchlab:stately-strict-jvm:2.1.0 +co.touchlab:stately-strict:2.1.0 com.beetstra.jutf7:jutf7:1.0.0 com.github.ByteHamster:SearchPreference:v2.3.0 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.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.github.skydoves:landscapist-android:2.5.0 +com.github.skydoves:landscapist-coil3-android:2.5.0 +com.github.skydoves:landscapist-coil3:2.5.0 +com.github.skydoves:landscapist:2.5.0 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 @@ -179,8 +184,8 @@ com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.10.2 -com.squareup.okio:okio:3.10.2 +com.squareup.okio:okio-jvm:3.12.0 +com.squareup.okio:okio:3.12.0 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 @@ -190,21 +195,25 @@ commons-io:commons-io:2.19.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.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 -io.insert-koin:koin-compose-jvm:1.1.5 -io.insert-koin:koin-compose:1.1.5 -io.insert-koin:koin-core-jvm:3.5.6 -io.insert-koin:koin-core:3.5.6 +io.coil-kt.coil3:coil-android:3.2.0 +io.coil-kt.coil3:coil-core-android:3.2.0 +io.coil-kt.coil3:coil-core:3.2.0 +io.coil-kt.coil3:coil-network-core-android:3.2.0 +io.coil-kt.coil3:coil-network-core:3.2.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.2.0 +io.coil-kt.coil3:coil-network-okhttp:3.2.0 +io.coil-kt.coil3:coil:3.2.0 +io.insert-koin:koin-android:4.1.0 +io.insert-koin:koin-androidx-compose:4.1.0 +io.insert-koin:koin-bom:4.1.0 +io.insert-koin:koin-compose-android:4.1.0 +io.insert-koin:koin-compose-viewmodel-android:4.1.0 +io.insert-koin:koin-compose-viewmodel:4.1.0 +io.insert-koin:koin-compose:4.1.0 +io.insert-koin:koin-core-jvm:4.1.0 +io.insert-koin:koin-core-viewmodel-android:4.1.0 +io.insert-koin:koin-core-viewmodel:4.1.0 +io.insert-koin:koin-core:4.1.0 net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 org.apache.commons:commons-lang3:3.7 @@ -214,43 +223,51 @@ org.apache.httpcomponents.core5:httpcore5-h2:5.3.4 org.apache.httpcomponents.core5:httpcore5:5.3.4 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.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.20 -org.jetbrains.kotlin:kotlin-bom:2.1.20 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.20 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.20 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.20 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.20 -org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -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.androidx.lifecycle:lifecycle-common:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.9.0 +org.jetbrains.androidx.savedstate:savedstate:1.3.0 +org.jetbrains.compose.animation:animation-core:1.8.1 +org.jetbrains.compose.animation:animation:1.8.1 +org.jetbrains.compose.annotation-internal:annotation:1.8.1 +org.jetbrains.compose.collection-internal:collection:1.8.1 +org.jetbrains.compose.components:components-resources-android:1.8.1 +org.jetbrains.compose.components:components-resources:1.8.1 +org.jetbrains.compose.components:components-ui-tooling-preview-android:1.8.1 +org.jetbrains.compose.components:components-ui-tooling-preview:1.8.1 +org.jetbrains.compose.foundation:foundation-layout:1.8.1 +org.jetbrains.compose.foundation:foundation:1.8.1 +org.jetbrains.compose.runtime:runtime-saveable:1.8.1 +org.jetbrains.compose.runtime:runtime:1.8.1 +org.jetbrains.compose.ui:ui-geometry:1.8.1 +org.jetbrains.compose.ui:ui-graphics:1.8.1 +org.jetbrains.compose.ui:ui-text:1.8.1 +org.jetbrains.compose.ui:ui-tooling-preview:1.8.1 +org.jetbrains.compose.ui:ui-unit:1.8.1 +org.jetbrains.compose.ui:ui-util:1.8.1 +org.jetbrains.compose.ui:ui:1.8.1 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.21 +org.jetbrains.kotlin:kotlin-bom:2.1.21 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.21 +org.jetbrains.kotlin:kotlin-stdlib:2.1.21 +org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.4.0 +org.jetbrains.kotlinx:kotlinx-collections-immutable:0.4.0 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-io-bytestring-jvm:0.7.0 +org.jetbrains.kotlinx:kotlinx-io-bytestring:0.7.0 +org.jetbrains.kotlinx:kotlinx-io-core-jvm:0.7.0 +org.jetbrains.kotlinx:kotlinx-io-core:0.7.0 org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.1 org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.1 org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1 diff --git a/app-k9mail/dependencies/fullReleaseRuntimeClasspath.txt b/app-k9mail/dependencies/fullReleaseRuntimeClasspath.txt index 91bb3987fbd49cd8f45a07f0cb51f2cacecdd995..8ce56ac10a6247ec9cb73fcdfc97ef5d7e425ca8 100644 --- a/app-k9mail/dependencies/fullReleaseRuntimeClasspath.txt +++ b/app-k9mail/dependencies/fullReleaseRuntimeClasspath.txt @@ -4,25 +4,25 @@ 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 -androidx.appcompat:appcompat-resources:1.7.0 -androidx.appcompat:appcompat:1.7.0 +androidx.appcompat:appcompat-resources:1.7.1 +androidx.appcompat:appcompat:1.7.1 androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 -androidx.autofill:autofill:1.0.0 +androidx.autofill:autofill:1.3.0 androidx.biometric:biometric:1.1.0 androidx.browser:browser:1.3.0 androidx.cardview:cardview:1.0.0 androidx.collection:collection-jvm:1.5.0 androidx.collection:collection-ktx:1.5.0 androidx.collection:collection:1.5.0 -androidx.compose.animation:animation-android:1.8.0 -androidx.compose.animation:animation-core-android:1.8.0 -androidx.compose.animation:animation-core:1.8.0 -androidx.compose.animation:animation:1.8.0 -androidx.compose.foundation:foundation-android:1.8.0 -androidx.compose.foundation:foundation-layout-android:1.8.0 -androidx.compose.foundation:foundation-layout:1.8.0 -androidx.compose.foundation:foundation:1.8.0 +androidx.compose.animation:animation-android:1.8.2 +androidx.compose.animation:animation-core-android:1.8.2 +androidx.compose.animation:animation-core:1.8.2 +androidx.compose.animation:animation:1.8.2 +androidx.compose.foundation:foundation-android:1.8.2 +androidx.compose.foundation:foundation-layout-android:1.8.2 +androidx.compose.foundation:foundation-layout:1.8.2 +androidx.compose.foundation:foundation:1.8.2 androidx.compose.material3.adaptive:adaptive-android:1.1.0 androidx.compose.material3.adaptive:adaptive-layout-android:1.1.0 androidx.compose.material3.adaptive:adaptive-layout:1.1.0 @@ -35,27 +35,27 @@ 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.8.0 -androidx.compose.material:material-ripple:1.8.0 -androidx.compose.runtime:runtime-android:1.8.0 -androidx.compose.runtime:runtime-saveable-android:1.8.0 -androidx.compose.runtime:runtime-saveable:1.8.0 -androidx.compose.runtime:runtime:1.8.0 -androidx.compose.ui:ui-android:1.8.0 -androidx.compose.ui:ui-geometry-android:1.8.0 -androidx.compose.ui:ui-geometry:1.8.0 -androidx.compose.ui:ui-graphics-android:1.8.0 -androidx.compose.ui:ui-graphics:1.8.0 -androidx.compose.ui:ui-text-android:1.8.0 -androidx.compose.ui:ui-text:1.8.0 -androidx.compose.ui:ui-tooling-preview-android:1.8.0 -androidx.compose.ui:ui-tooling-preview:1.8.0 -androidx.compose.ui:ui-unit-android:1.8.0 -androidx.compose.ui:ui-unit:1.8.0 -androidx.compose.ui:ui-util-android:1.8.0 -androidx.compose.ui:ui-util:1.8.0 -androidx.compose.ui:ui:1.8.0 -androidx.compose:compose-bom:2025.04.01 +androidx.compose.material:material-ripple-android:1.8.2 +androidx.compose.material:material-ripple:1.8.2 +androidx.compose.runtime:runtime-android:1.8.2 +androidx.compose.runtime:runtime-saveable-android:1.8.2 +androidx.compose.runtime:runtime-saveable:1.8.2 +androidx.compose.runtime:runtime:1.8.2 +androidx.compose.ui:ui-android:1.8.2 +androidx.compose.ui:ui-geometry-android:1.8.2 +androidx.compose.ui:ui-geometry:1.8.2 +androidx.compose.ui:ui-graphics-android:1.8.2 +androidx.compose.ui:ui-graphics:1.8.2 +androidx.compose.ui:ui-text-android:1.8.2 +androidx.compose.ui:ui-text:1.8.2 +androidx.compose.ui:ui-tooling-preview-android:1.8.2 +androidx.compose.ui:ui-tooling-preview:1.8.2 +androidx.compose.ui:ui-unit-android:1.8.2 +androidx.compose.ui:ui-unit:1.8.2 +androidx.compose.ui:ui-util-android:1.8.2 +androidx.compose.ui:ui-util:1.8.2 +androidx.compose.ui:ui:1.8.2 +androidx.compose:compose-bom:2025.06.00 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 androidx.constraintlayout:constraintlayout-core:1.1.1 @@ -78,10 +78,10 @@ androidx.drawerlayout:drawerlayout:1.1.1 androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.4.0 androidx.emoji2:emoji2:1.4.0 -androidx.exifinterface:exifinterface:1.3.7 -androidx.fragment:fragment-compose:1.8.6 -androidx.fragment:fragment-ktx:1.8.6 -androidx.fragment:fragment:1.8.6 +androidx.exifinterface:exifinterface:1.4.1 +androidx.fragment:fragment-compose:1.8.8 +androidx.fragment:fragment-ktx:1.8.8 +androidx.fragment:fragment:1.8.8 androidx.glance:glance-appwidget-external-protobuf:1.1.1 androidx.glance:glance-appwidget-proto:1.1.1 androidx.glance:glance-appwidget:1.1.1 @@ -90,36 +90,38 @@ 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 -androidx.lifecycle:lifecycle-common-java8:2.8.7 -androidx.lifecycle:lifecycle-common-jvm:2.8.7 -androidx.lifecycle:lifecycle-common:2.8.7 -androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 -androidx.lifecycle:lifecycle-livedata-core:2.8.7 -androidx.lifecycle:lifecycle-livedata-ktx:2.8.7 -androidx.lifecycle:lifecycle-livedata:2.8.7 -androidx.lifecycle:lifecycle-process:2.8.7 -androidx.lifecycle:lifecycle-runtime-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-compose-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-compose:2.8.7 -androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 -androidx.lifecycle:lifecycle-runtime:2.8.7 -androidx.lifecycle:lifecycle-service:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 -androidx.lifecycle:lifecycle-viewmodel:2.8.7 +androidx.lifecycle:lifecycle-common-java8:2.9.1 +androidx.lifecycle:lifecycle-common-jvm:2.9.1 +androidx.lifecycle:lifecycle-common:2.9.1 +androidx.lifecycle:lifecycle-livedata-core-ktx:2.9.1 +androidx.lifecycle:lifecycle-livedata-core:2.9.1 +androidx.lifecycle:lifecycle-livedata-ktx:2.9.1 +androidx.lifecycle:lifecycle-livedata:2.9.1 +androidx.lifecycle:lifecycle-process:2.9.1 +androidx.lifecycle:lifecycle-runtime-android:2.9.1 +androidx.lifecycle:lifecycle-runtime-compose-android:2.9.1 +androidx.lifecycle:lifecycle-runtime-compose:2.9.1 +androidx.lifecycle:lifecycle-runtime-ktx-android:2.9.1 +androidx.lifecycle:lifecycle-runtime-ktx:2.9.1 +androidx.lifecycle:lifecycle-runtime:2.9.1 +androidx.lifecycle:lifecycle-service:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-android:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-compose-android:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-compose:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-savedstate-android:2.9.1 +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.1 +androidx.lifecycle:lifecycle-viewmodel:2.9.1 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.1.0 -androidx.navigation:navigation-common-ktx:2.8.9 -androidx.navigation:navigation-common:2.8.9 -androidx.navigation:navigation-compose:2.8.9 -androidx.navigation:navigation-fragment:2.8.9 -androidx.navigation:navigation-runtime-ktx:2.8.9 -androidx.navigation:navigation-runtime:2.8.9 -androidx.navigation:navigation-ui:2.8.9 +androidx.navigation:navigation-common-android:2.9.0 +androidx.navigation:navigation-common:2.9.0 +androidx.navigation:navigation-compose-android:2.9.0 +androidx.navigation:navigation-compose:2.9.0 +androidx.navigation:navigation-fragment:2.9.0 +androidx.navigation:navigation-runtime-android:2.9.0 +androidx.navigation:navigation-runtime:2.9.0 +androidx.navigation:navigation-ui:2.9.0 androidx.preference:preference:1.2.1 androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.1 @@ -128,8 +130,11 @@ androidx.resourceinspection:resourceinspection-annotation:1.0.1 androidx.room:room-common:2.6.1 androidx.room:room-ktx:2.6.1 androidx.room:room-runtime:2.6.1 -androidx.savedstate:savedstate-ktx:1.2.1 -androidx.savedstate:savedstate:1.2.1 +androidx.savedstate:savedstate-android:1.3.0 +androidx.savedstate:savedstate-compose-android:1.3.0 +androidx.savedstate:savedstate-compose:1.3.0 +androidx.savedstate:savedstate-ktx:1.3.0 +androidx.savedstate:savedstate:1.3.0 androidx.slidingpanelayout:slidingpanelayout:1.2.0 androidx.sqlite:sqlite-framework:2.4.0 androidx.sqlite:sqlite:2.4.0 @@ -143,19 +148,19 @@ 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.webkit:webkit:1.13.0 +androidx.webkit:webkit:1.14.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.1 androidx.work:work-runtime:2.10.1 -co.touchlab:stately-concurrency-jvm:2.0.6 -co.touchlab:stately-concurrency:2.0.6 -co.touchlab:stately-concurrent-collections-jvm:2.0.6 -co.touchlab:stately-concurrent-collections:2.0.6 -co.touchlab:stately-strict-jvm:2.0.6 -co.touchlab:stately-strict:2.0.6 +co.touchlab:stately-concurrency-jvm:2.1.0 +co.touchlab:stately-concurrency:2.1.0 +co.touchlab:stately-concurrent-collections-jvm:2.1.0 +co.touchlab:stately-concurrent-collections:2.1.0 +co.touchlab:stately-strict-jvm:2.1.0 +co.touchlab:stately-strict:2.1.0 com.android.billingclient:billing-ktx:7.1.1 com.android.billingclient:billing:7.1.1 com.beetstra.jutf7:jutf7:1.0.0 @@ -164,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.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.github.skydoves:landscapist-android:2.5.0 +com.github.skydoves:landscapist-coil3-android:2.5.0 +com.github.skydoves:landscapist-coil3:2.5.0 +com.github.skydoves:landscapist:2.5.0 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 @@ -192,8 +197,8 @@ com.mikepenz:fastadapter-extensions-utils:5.7.0 com.mikepenz:fastadapter:5.7.0 com.squareup.moshi:moshi:1.15.2 com.squareup.okhttp3:okhttp:4.12.0 -com.squareup.okio:okio-jvm:3.10.2 -com.squareup.okio:okio:3.10.2 +com.squareup.okio:okio-jvm:3.12.0 +com.squareup.okio:okio:3.12.0 com.takisoft.colorpicker:colorpicker:1.0.0 com.takisoft.datetimepicker:datetimepicker:1.0.2 com.takisoft.preferencex:preferencex-colorpicker:1.1.0 @@ -203,21 +208,25 @@ commons-io:commons-io:2.19.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.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 -io.insert-koin:koin-compose-jvm:1.1.5 -io.insert-koin:koin-compose:1.1.5 -io.insert-koin:koin-core-jvm:3.5.6 -io.insert-koin:koin-core:3.5.6 +io.coil-kt.coil3:coil-android:3.2.0 +io.coil-kt.coil3:coil-core-android:3.2.0 +io.coil-kt.coil3:coil-core:3.2.0 +io.coil-kt.coil3:coil-network-core-android:3.2.0 +io.coil-kt.coil3:coil-network-core:3.2.0 +io.coil-kt.coil3:coil-network-okhttp-jvm:3.2.0 +io.coil-kt.coil3:coil-network-okhttp:3.2.0 +io.coil-kt.coil3:coil:3.2.0 +io.insert-koin:koin-android:4.1.0 +io.insert-koin:koin-androidx-compose:4.1.0 +io.insert-koin:koin-bom:4.1.0 +io.insert-koin:koin-compose-android:4.1.0 +io.insert-koin:koin-compose-viewmodel-android:4.1.0 +io.insert-koin:koin-compose-viewmodel:4.1.0 +io.insert-koin:koin-compose:4.1.0 +io.insert-koin:koin-core-jvm:4.1.0 +io.insert-koin:koin-core-viewmodel-android:4.1.0 +io.insert-koin:koin-core-viewmodel:4.1.0 +io.insert-koin:koin-core:4.1.0 javax.inject:javax.inject:1 net.jcip:jcip-annotations:1.0 net.openid:appauth:0.11.1 @@ -228,43 +237,51 @@ org.apache.httpcomponents.core5:httpcore5-h2:5.3.4 org.apache.httpcomponents.core5:httpcore5:5.3.4 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.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.20 -org.jetbrains.kotlin:kotlin-bom:2.1.20 -org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.20 -org.jetbrains.kotlin:kotlin-stdlib-common:2.1.20 -org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.20 -org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.20 -org.jetbrains.kotlin:kotlin-stdlib:2.1.20 -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.androidx.lifecycle:lifecycle-common:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-runtime:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-savedstate:2.9.0 +org.jetbrains.androidx.lifecycle:lifecycle-viewmodel:2.9.0 +org.jetbrains.androidx.savedstate:savedstate:1.3.0 +org.jetbrains.compose.animation:animation-core:1.8.1 +org.jetbrains.compose.animation:animation:1.8.1 +org.jetbrains.compose.annotation-internal:annotation:1.8.1 +org.jetbrains.compose.collection-internal:collection:1.8.1 +org.jetbrains.compose.components:components-resources-android:1.8.1 +org.jetbrains.compose.components:components-resources:1.8.1 +org.jetbrains.compose.components:components-ui-tooling-preview-android:1.8.1 +org.jetbrains.compose.components:components-ui-tooling-preview:1.8.1 +org.jetbrains.compose.foundation:foundation-layout:1.8.1 +org.jetbrains.compose.foundation:foundation:1.8.1 +org.jetbrains.compose.runtime:runtime-saveable:1.8.1 +org.jetbrains.compose.runtime:runtime:1.8.1 +org.jetbrains.compose.ui:ui-geometry:1.8.1 +org.jetbrains.compose.ui:ui-graphics:1.8.1 +org.jetbrains.compose.ui:ui-text:1.8.1 +org.jetbrains.compose.ui:ui-tooling-preview:1.8.1 +org.jetbrains.compose.ui:ui-unit:1.8.1 +org.jetbrains.compose.ui:ui-util:1.8.1 +org.jetbrains.compose.ui:ui:1.8.1 +org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.21 +org.jetbrains.kotlin:kotlin-bom:2.1.21 +org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.21 +org.jetbrains.kotlin:kotlin-stdlib-common:2.1.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.21 +org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.1.21 +org.jetbrains.kotlin:kotlin-stdlib:2.1.21 +org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.4.0 +org.jetbrains.kotlinx:kotlinx-collections-immutable:0.4.0 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2 org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.2 org.jetbrains.kotlinx:kotlinx-datetime:0.6.2 +org.jetbrains.kotlinx:kotlinx-io-bytestring-jvm:0.7.0 +org.jetbrains.kotlinx:kotlinx-io-bytestring:0.7.0 +org.jetbrains.kotlinx:kotlinx-io-core-jvm:0.7.0 +org.jetbrains.kotlinx:kotlinx-io-core:0.7.0 org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.1 org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.1 org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1 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 f19f3db1baac2d4bf156208adf50da021573d2cf..97a72f2061b3965d21073251b391d223f2c82435 100644 --- a/app-k9mail/src/debug/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt +++ b/app-k9mail/src/debug/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt @@ -1,8 +1,8 @@ package app.k9mail.auth -import app.k9mail.core.common.oauth.OAuthConfiguration -import app.k9mail.core.common.oauth.OAuthConfigurationFactory import com.fsck.k9.BuildConfig +import net.thunderbird.core.common.oauth.OAuthConfiguration +import net.thunderbird.core.common.oauth.OAuthConfigurationFactory @Suppress("ktlint:standard:max-line-length") class K9OAuthConfigurationFactory : OAuthConfigurationFactory { 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 9a12c3eab0612b27e127c798b4528338994d3bdc..e0e5cec09a690e781a6320168bec592bbdeaf609 100644 --- a/app-k9mail/src/debug/kotlin/app/k9mail/dev/DemoBackendFactory.kt +++ b/app-k9mail/src/debug/kotlin/app/k9mail/dev/DemoBackendFactory.kt @@ -1,10 +1,10 @@ package app.k9mail.dev import app.k9mail.backend.demo.DemoBackend -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 +import net.thunderbird.core.android.account.LegacyAccount class DemoBackendFactory(private val backendStorageFactory: K9BackendStorageFactory) : BackendFactory { override fun createBackend(account: LegacyAccount): Backend { diff --git a/app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt b/app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt index 83180e4aaad5e679605f1e6a77a0814041d0688f..c7d99ec832e76820c249bc223d9b14e61f3124c0 100644 --- a/app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt +++ b/app-k9mail/src/debug/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt @@ -1,8 +1,8 @@ package app.k9mail.featureflag -import app.k9mail.core.featureflag.FeatureFlag -import app.k9mail.core.featureflag.FeatureFlagFactory -import app.k9mail.core.featureflag.toFeatureFlagKey +import net.thunderbird.core.featureflag.FeatureFlag +import net.thunderbird.core.featureflag.FeatureFlagFactory +import net.thunderbird.core.featureflag.toFeatureFlagKey class K9FeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List { @@ -12,6 +12,7 @@ class K9FeatureFlagFactory : FeatureFlagFactory { FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = true), FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = true), FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = true), + FeatureFlag("enable_dropdown_drawer_ui".toFeatureFlagKey(), enabled = true), ) } } diff --git a/app-k9mail/src/main/kotlin/app/k9mail/K9App.kt b/app-k9mail/src/main/kotlin/app/k9mail/K9App.kt index 69576243853b7afb74a2fd7c947e3468ac4d37d3..a2ab33c84e01e5c16bc937ba11ea293235fea71d 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/K9App.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/K9App.kt @@ -1,8 +1,8 @@ package app.k9mail -import com.fsck.k9.CommonApp +import net.thunderbird.app.common.BaseApplication import org.koin.core.module.Module -class K9App : CommonApp() { +class K9App : BaseApplication() { override fun provideAppModule(): Module = appModule } diff --git a/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt b/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt index 5eff8918815692226aee72c4c5e8fb70ee7190be..958ae2a8a32323ee0f02ee9a3005282dada697bd 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt @@ -1,52 +1,41 @@ package app.k9mail import app.k9mail.auth.K9OAuthConfigurationFactory -import app.k9mail.core.common.oauth.OAuthConfigurationFactory -import app.k9mail.core.common.provider.AppNameProvider -import app.k9mail.core.common.provider.BrandNameProvider -import app.k9mail.core.featureflag.FeatureFlagFactory -import app.k9mail.core.ui.theme.api.FeatureThemeProvider -import app.k9mail.core.ui.theme.api.ThemeProvider import app.k9mail.dev.developmentModuleAdditions import app.k9mail.feature.featureModule import app.k9mail.feature.widget.shortcut.LauncherShortcutActivity import app.k9mail.featureflag.K9FeatureFlagFactory -import app.k9mail.provider.K9AppNameProvider -import app.k9mail.provider.K9FeatureThemeProvider -import app.k9mail.widget.appWidgetModule +import app.k9mail.provider.providerModule +import app.k9mail.widget.widgetModule import com.fsck.k9.AppConfig import com.fsck.k9.BuildConfig +import com.fsck.k9.DefaultAppConfig import com.fsck.k9.activity.MessageCompose -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 net.thunderbird.core.common.oauth.OAuthConfigurationFactory +import net.thunderbird.core.featureflag.FeatureFlagFactory import org.koin.core.qualifier.named -import org.koin.dsl.binds import org.koin.dsl.module val appModule = module { includes(appCommonModule) - includes(appWidgetModule) + + includes(widgetModule) includes(featureModule) + includes(providerModule) single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME } single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME } single { appConfig } single { K9OAuthConfigurationFactory() } - single { - K9AppNameProvider(androidContext()) - } binds arrayOf(AppNameProvider::class, BrandNameProvider::class, FilePrefixProvider::class) - single { K9ThemeProvider() } - single { K9FeatureThemeProvider() } single { K9FeatureFlagFactory() } developmentModuleAdditions() } -val appConfig = AppConfig( +val appConfig = DefaultAppConfig( componentsToDisable = listOf( MessageCompose::class.java, LauncherShortcutActivity::class.java, 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 d9558ee3c4c0fd72949cabb294b8afa497058e59..5fd16ed15e1366aa405eba24cecac9c32c2dd64c 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/feature/FeatureModule.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/feature/FeatureModule.kt @@ -5,18 +5,17 @@ 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 net.thunderbird.app.common.feature.featureLauncherModule import net.thunderbird.feature.account.settings.featureAccountSettingsModule +import net.thunderbird.feature.mail.message.list.featureMessageListModule import org.koin.dsl.module val featureModule = module { - includes(featureLauncherModule) - includes(featureAccountSettingsModule) includes(telemetryModule) includes(featureFundingModule) includes(onboardingMigrationModule) includes(featureMigrationModule) + includes(featureMessageListModule) single { K9FundingSettings() } } diff --git a/app-k9mail/src/main/kotlin/app/k9mail/feature/K9FundingSettings.kt b/app-k9mail/src/main/kotlin/app/k9mail/feature/K9FundingSettings.kt index 552d093df5318a566cc310e3e035f7a4059bbf65..f539816fc18fd1ba662a564086e2cc43b42d4a97 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/feature/K9FundingSettings.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/feature/K9FundingSettings.kt @@ -3,7 +3,7 @@ package app.k9mail.feature import app.k9mail.feature.funding.api.FundingSettings import com.fsck.k9.K9 -class K9FundingSettings : FundingSettings { +internal class K9FundingSettings : FundingSettings { override fun getReminderReferenceTimestamp(): Long = K9.fundingReminderReferenceTimestamp override fun setReminderReferenceTimestamp(timestamp: Long) { diff --git a/app-k9mail/src/main/kotlin/app/k9mail/provider/K9AppNameProvider.kt b/app-k9mail/src/main/kotlin/app/k9mail/provider/K9AppNameProvider.kt index 18e1584b85cfa0928aeeb3f166b17082b00066a5..382eb20c8a6b35e63fa30a6882368184cb2b3fb6 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/provider/K9AppNameProvider.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/provider/K9AppNameProvider.kt @@ -1,12 +1,12 @@ package app.k9mail.provider import android.content.Context -import app.k9mail.core.common.provider.AppNameProvider -import app.k9mail.core.common.provider.BrandNameProvider import com.fsck.k9.R import com.fsck.k9.preferences.FilePrefixProvider +import net.thunderbird.core.common.provider.AppNameProvider +import net.thunderbird.core.common.provider.BrandNameProvider -class K9AppNameProvider( +internal class K9AppNameProvider( context: Context, ) : AppNameProvider, BrandNameProvider, FilePrefixProvider { override val appName: String by lazy { diff --git a/app-k9mail/src/main/kotlin/app/k9mail/provider/K9FeatureThemeProvider.kt b/app-k9mail/src/main/kotlin/app/k9mail/provider/K9FeatureThemeProvider.kt index 9363feff8d3f442e9681b7d8055625eda10cf250..8e0b3afa31123bcf913bb4a3ff71676c7f42de3a 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/provider/K9FeatureThemeProvider.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/provider/K9FeatureThemeProvider.kt @@ -2,9 +2,9 @@ package app.k9mail.provider import androidx.compose.runtime.Composable import app.k9mail.core.ui.compose.theme2.k9mail.K9MailTheme2 -import app.k9mail.core.ui.theme.api.FeatureThemeProvider +import net.thunderbird.core.ui.theme.api.FeatureThemeProvider -class K9FeatureThemeProvider : FeatureThemeProvider { +internal class K9FeatureThemeProvider : FeatureThemeProvider { @Composable override fun WithTheme(content: @Composable () -> Unit) { K9MailTheme2 { diff --git a/app-k9mail/src/main/kotlin/com/fsck/k9/provider/K9ThemeProvider.kt b/app-k9mail/src/main/kotlin/app/k9mail/provider/K9ThemeProvider.kt similarity index 74% rename from app-k9mail/src/main/kotlin/com/fsck/k9/provider/K9ThemeProvider.kt rename to app-k9mail/src/main/kotlin/app/k9mail/provider/K9ThemeProvider.kt index 5cd6e536acc78404d9b9191170c74b0b594c00a3..50b6c3564e4dcdc6694f65e1202e014463fee7ac 100644 --- a/app-k9mail/src/main/kotlin/com/fsck/k9/provider/K9ThemeProvider.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/provider/K9ThemeProvider.kt @@ -1,9 +1,9 @@ -package com.fsck.k9.provider +package app.k9mail.provider -import app.k9mail.core.ui.theme.api.ThemeProvider import com.fsck.k9.R +import net.thunderbird.core.ui.theme.api.ThemeProvider -class K9ThemeProvider : ThemeProvider { +internal class K9ThemeProvider : ThemeProvider { override val appThemeResourceId = R.style.Theme_K9_DayNight override val appLightThemeResourceId = R.style.Theme_K9_Light override val appDarkThemeResourceId = R.style.Theme_K9_Dark diff --git a/app-k9mail/src/main/kotlin/app/k9mail/provider/ProviderModule.kt b/app-k9mail/src/main/kotlin/app/k9mail/provider/ProviderModule.kt new file mode 100644 index 0000000000000000000000000000000000000000..07e236989f7277b1ae5782f49445621d1c174da6 --- /dev/null +++ b/app-k9mail/src/main/kotlin/app/k9mail/provider/ProviderModule.kt @@ -0,0 +1,20 @@ +package app.k9mail.provider + +import com.fsck.k9.preferences.FilePrefixProvider +import net.thunderbird.core.common.provider.AppNameProvider +import net.thunderbird.core.common.provider.BrandNameProvider +import net.thunderbird.core.ui.theme.api.FeatureThemeProvider +import net.thunderbird.core.ui.theme.api.ThemeProvider +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.binds +import org.koin.dsl.module + +internal val providerModule = module { + single { + K9AppNameProvider(androidContext()) + } binds arrayOf(AppNameProvider::class, BrandNameProvider::class, FilePrefixProvider::class) + + single { K9ThemeProvider() } + + single { K9FeatureThemeProvider() } +} diff --git a/app-k9mail/src/main/kotlin/app/k9mail/widget/KoinModule.kt b/app-k9mail/src/main/kotlin/app/k9mail/widget/WidgetModule.kt similarity index 92% rename from app-k9mail/src/main/kotlin/app/k9mail/widget/KoinModule.kt rename to app-k9mail/src/main/kotlin/app/k9mail/widget/WidgetModule.kt index b2e70a6f05a67e372cdc5550a7e4cb05369ddb34..0ea79d1e6b37323f2e8ffd44ccc1b1fdd8a530b2 100644 --- a/app-k9mail/src/main/kotlin/app/k9mail/widget/KoinModule.kt +++ b/app-k9mail/src/main/kotlin/app/k9mail/widget/WidgetModule.kt @@ -5,7 +5,7 @@ import app.k9mail.feature.widget.unread.UnreadWidgetConfig import net.thunderbird.feature.widget.message.list.featureWidgetMessageListModule import org.koin.dsl.module -val appWidgetModule = module { +internal val widgetModule = module { includes(featureWidgetMessageListModule) single { K9MessageListWidgetConfig() } diff --git a/app-k9mail/src/main/res/values-am/strings.xml b/app-k9mail/src/main/res/values-am/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6b3daec9354f9ae75cdf8d94a67446c6227dd96 --- /dev/null +++ b/app-k9mail/src/main/res/values-am/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app-k9mail/src/main/res/values-ast/strings.xml b/app-k9mail/src/main/res/values-ast/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6b3daec9354f9ae75cdf8d94a67446c6227dd96 --- /dev/null +++ b/app-k9mail/src/main/res/values-ast/strings.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app-k9mail/src/main/res/values-br/strings.xml b/app-k9mail/src/main/res/values-br/strings.xml index f115016e412bd22bb930db821e334696707a4c69..e84481defd36a04dfa5286711f1705ebad35d58e 100644 --- a/app-k9mail/src/main/res/values-br/strings.xml +++ b/app-k9mail/src/main/res/values-br/strings.xml @@ -1,4 +1,3 @@ - + - K-9 Mail - + diff --git a/app-k9mail/src/main/res/values-gu/strings.xml b/app-k9mail/src/main/res/values-gu/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..311567dd24d764286252df5b887e363dce8c969f --- /dev/null +++ b/app-k9mail/src/main/res/values-gu/strings.xml @@ -0,0 +1,4 @@ + + + કે-૯ મેલ + diff --git a/app-k9mail/src/main/res/values-nb/strings.xml b/app-k9mail/src/main/res/values-nb/strings.xml index 06d8c9805ec5b8b68d591e03f38af8dac331714d..cc62bdca7db27515ad00d1c62b397394bc09b5a3 100644 --- a/app-k9mail/src/main/res/values-nb/strings.xml +++ b/app-k9mail/src/main/res/values-nb/strings.xml @@ -1,4 +1,4 @@ - + - K-9 e-post + K-9 E-post diff --git a/app-k9mail/src/main/res/values-th/strings.xml b/app-k9mail/src/main/res/values-th/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..55344e51920f3dcbb968d32ee2281e029d1571bf --- /dev/null +++ b/app-k9mail/src/main/res/values-th/strings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file 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 f787afc21d014b4fec61e1474ae41e41d04e1b7a..a7100df7d229c721acc88bb63cff7e95d8305566 100644 --- a/app-k9mail/src/release/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt +++ b/app-k9mail/src/release/kotlin/app/k9mail/auth/K9OAuthConfigurationFactory.kt @@ -1,8 +1,8 @@ package app.k9mail.auth -import app.k9mail.core.common.oauth.OAuthConfiguration -import app.k9mail.core.common.oauth.OAuthConfigurationFactory import com.fsck.k9.BuildConfig +import net.thunderbird.core.common.oauth.OAuthConfiguration +import net.thunderbird.core.common.oauth.OAuthConfigurationFactory @Suppress("ktlint:standard:max-line-length") class K9OAuthConfigurationFactory : OAuthConfigurationFactory { diff --git a/app-k9mail/src/release/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt b/app-k9mail/src/release/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt index 76553011596815274c5089576b2022580e7d4e37..645b976414252e5aaf2eab30dd52da9b8d6c18f2 100644 --- a/app-k9mail/src/release/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt +++ b/app-k9mail/src/release/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt @@ -1,8 +1,8 @@ package app.k9mail.featureflag -import app.k9mail.core.featureflag.FeatureFlag -import app.k9mail.core.featureflag.FeatureFlagFactory -import app.k9mail.core.featureflag.toFeatureFlagKey +import net.thunderbird.core.featureflag.FeatureFlag +import net.thunderbird.core.featureflag.FeatureFlagFactory +import net.thunderbird.core.featureflag.toFeatureFlagKey class K9FeatureFlagFactory : FeatureFlagFactory { override fun createFeatureCatalog(): List { @@ -12,6 +12,7 @@ class K9FeatureFlagFactory : FeatureFlagFactory { FeatureFlag("disable_font_size_config".toFeatureFlagKey(), enabled = false), FeatureFlag("email_notification_default".toFeatureFlagKey(), enabled = false), FeatureFlag("enable_dropdown_drawer".toFeatureFlagKey(), enabled = false), + FeatureFlag("enable_dropdown_drawer_ui".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 1d7197f291e10e382d54e90ab5402151b6e42602..ea2bc73753c1bfe8bac491e7c3ce58b09f0acfc0 100644 --- a/app-k9mail/src/test/kotlin/app/k9mail/DependencyInjectionTest.kt +++ b/app-k9mail/src/test/kotlin/app/k9mail/DependencyInjectionTest.kt @@ -1,59 +1,63 @@ package app.k9mail -import android.view.ContextThemeWrapper +import android.app.Application +import android.app.NotificationManager +import android.content.Context +import android.content.res.AssetManager +import android.content.res.Configuration +import android.content.res.Resources +import android.util.DisplayMetrics import androidx.lifecycle.LifecycleOwner import androidx.work.WorkerParameters -import app.k9mail.legacy.ui.folder.FolderIconProvider -import app.k9mail.legacy.ui.folder.FolderNameFormatter -import com.fsck.k9.R -import com.fsck.k9.mail.oauth.AuthStateStorage +import app.k9mail.feature.account.common.domain.entity.InteractionMode +import com.fsck.k9.account.AccountRemoverWorker +import com.fsck.k9.job.MailSyncWorker +import com.fsck.k9.mailstore.AttachmentResolver +import com.fsck.k9.message.html.DisplayHtml +import com.fsck.k9.message.html.HtmlSettings 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 com.fsck.k9.view.K9WebViewClient +import com.fsck.k9.view.MessageWebView +import net.openid.appauth.AppAuthConfiguration +import net.thunderbird.core.preference.storage.Storage +import net.thunderbird.feature.account.AccountId +import net.thunderbird.feature.mail.message.list.ui.dialog.SetupArchiveFolderDialogContract import org.junit.Test -import org.junit.runner.RunWith -import org.koin.core.annotation.KoinInternalApi -import org.koin.core.logger.PrintLogger -import org.koin.core.parameter.parametersOf -import org.koin.java.KoinJavaComponent -import org.koin.test.AutoCloseKoinTest -import org.koin.test.check.checkModules -import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock -import org.robolectric.RobolectricTestRunner -import org.robolectric.RuntimeEnvironment +import org.koin.core.annotation.KoinExperimentalAPI +import org.koin.test.verify.definition +import org.koin.test.verify.injectedParameters +import org.koin.test.verify.verify +import org.openintents.openpgp.OpenPgpApiManager -@RunWith(RobolectricTestRunner::class) -class DependencyInjectionTest : AutoCloseKoinTest() { - private val lifecycleOwner = mock { - on { lifecycle } doReturn mock() - } - private val autocryptTransferView = mock() - private val authStateStorage = mock() +class DependencyInjectionTest { - @KoinInternalApi + @OptIn(KoinExperimentalAPI::class) @Test fun testDependencyTree() { - KoinJavaComponent.getKoin().setupLogger(PrintLogger()) - - getKoin().checkModules { - withParameters { parametersOf(lifecycleOwner, autocryptTransferView) } - withParameter { RuntimeEnvironment.getApplication() } - withParameter { RuntimeEnvironment.getApplication() } - withParameter { ChangeLogMode.CHANGE_LOG } - withParameter { - ContextThemeWrapper(RuntimeEnvironment.getApplication(), R.style.Theme_K9_DayNight).theme - } - withParameters(clazz = Class.forName("com.fsck.k9.view.K9WebViewClient").kotlin) { - parametersOf(null, null) - } - withInstance(authStateStorage) - withInstance(lifecycleOwner) - withInstance(mock()) - withInstance(AccountId.create()) - } + appModule.verify( + extraTypes = listOf( + AccountId::class, + AppAuthConfiguration::class, + Application::class, + AssetManager::class, + Configuration::class, + Context::class, + DisplayMetrics::class, + InteractionMode::class, + NotificationManager::class, + Resources::class, + Storage::class, + ), + injections = injectedParameters( + definition(WorkerParameters::class), + definition(ChangeLogMode::class), + definition(HtmlSettings::class), + definition(AttachmentResolver::class, MessageWebView.OnPageFinishedListener::class), + definition(WorkerParameters::class), + definition(LifecycleOwner::class), + definition(SetupArchiveFolderDialogContract.State::class), + ), + ) } } diff --git a/app-metadata/com.fsck.k9/ca/full_description.txt b/app-metadata/com.fsck.k9/ca/full_description.txt index 42350a3fd52b5d2b1fc6e961d2d70a98152699c9..d5f8792e3b3135457e37b59c5a9825db27c9bc00 100644 --- a/app-metadata/com.fsck.k9/ca/full_description.txt +++ b/app-metadata/com.fsck.k9/ca/full_description.txt @@ -4,7 +4,7 @@ El K-9 Mail és un client de correu electrònic de codi obert que funciona bàsi * Admet diversos comptes * Safata d'entrada unificada -* Respecte de la privadesa (sense seguiment de cap mena, només es connecta al vostre proveïdor de correu electrònic) +* Respecta la privadesa (sense seguiment de cap mena, només es connecta al vostre proveïdor de correu electrònic) * Sincronització automàtica de fons o notificacions «push» * Cerca local i del costat del servidor * Xifratge de correu electrònic OpenPGP (PGP/MIME) @@ -20,5 +20,5 @@ Si teniu problemes amb el K-9 Mail, demaneu ajuda al nostre https://github.com/thunderbird/thunderbird-android . +Podeu trobar el nostre rastrejador d'errors, el codi font i la wiki a https://github.com/thunderbird/thunderbird-android. Sempre estem encantats de donar la benvinguda a nous desenvolupadors, dissenyadors, documentalistes, traductors, triadors d'errors i amics. diff --git a/app-metadata/com.fsck.k9/el-GR/full_description.txt b/app-metadata/com.fsck.k9/el-GR/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..f0d23bad6affd70fc87a9f1dd54c3f7b0101c5ba --- /dev/null +++ b/app-metadata/com.fsck.k9/el-GR/full_description.txt @@ -0,0 +1,24 @@ +Το K-9 Mail είναι μια εφαρμογή email ανοικτού κώδικα που λειτουργεί με σχεδόν οποιονδήποτε πάροχο ηλεκτρονικού ταχυδρομείου. + +Λειτουργίες + +* Υποστήριξη για πολλαπλούς λογαριασμούς +* Ενοποιημένος φάκελος εισερχομένων +* Έμφαση στο απόρρητο (καμία καταγραφή, συνδέεται μόνο με τον πάροχο ηλεκτρονικού ταχυδρομείου σας) +* Αυτόματος συγχρονισμός στο παρασκήνιο ή ειδοποιήσεις push +* Τοπική αναζήτηση και αναζήτηση στον διακομιστή +* Κρυπτογράφηση των email με το πρότυπο OpenPGP (PGP/MIME) + +Εγκαταστήστε την εφαρμογή OpenKeychain: Easy PGP για να (απο)κρυπτογραφείτε τα email σας με το πρότυπο OpenPGP. + + +Υποστήριξη + +Εάν αντιμετωπίζετε προβλήματα με το K-9 Mail, ζητήστε βοήθεια στο φόρουμ υποστήριξής μας. + + +Θέλετε να βοηθήσετε; + +Το K-9 Mail είναι ένα έργο που αναπτύσσεται με τη βοήθεια της κοινότητας. Εάν σας ενδιαφέρει να συμβάλετε στη βελτίωση της εφαρμογής, γίνετε μέλος της κοινότητάς μας! +Μπορείτε να βρείτε την πλατφόρμα παρακολούθησης σφαλμάτων, τον πηγαίο κώδικα και το wiki στο https://github.com/thunderbird/thunderbird-android. +Καλωσορίζουμε με χαρά νέους προγραμματιστές, σχεδιαστές, συντάκτες τεκμηρίωσης, μεταφραστές, εντοπιστές σφαλμάτων και φίλους. diff --git a/app-metadata/com.fsck.k9/el-GR/short_description.txt b/app-metadata/com.fsck.k9/el-GR/short_description.txt index 56b5465be19afcb222925dae936ab714e5ba3872..789017b2f3d9d5403744acd1572364506979fa8d 100644 --- a/app-metadata/com.fsck.k9/el-GR/short_description.txt +++ b/app-metadata/com.fsck.k9/el-GR/short_description.txt @@ -1 +1 @@ -Πλήρως εξοπλισμένη εφαρμογή ηλ. ταχυδρομείου +Πλήρως εξοπλισμένη εφαρμογή email diff --git a/app-metadata/com.fsck.k9/el-GR/title.txt b/app-metadata/com.fsck.k9/el-GR/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..f6c47543be4367b5aa849449e61784bf11c06892 --- /dev/null +++ b/app-metadata/com.fsck.k9/el-GR/title.txt @@ -0,0 +1 @@ +K-9 Mail diff --git a/app-metadata/com.fsck.k9/en-GB/full_description.txt b/app-metadata/com.fsck.k9/en-GB/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..e0b6a0294b10ea4826b13128928b749296461e2e --- /dev/null +++ b/app-metadata/com.fsck.k9/en-GB/full_description.txt @@ -0,0 +1,24 @@ +K-9 Mail is an Open Source email client that works with basically every email provider. + +Features + +* Supports multiple accounts +* Unified Inbox +* Privacy-friendly (no tracking whatsoever, only connects to your email provider) +* Automatic background synchronisation or push notifications +* Local and server-side search +* OpenPGP email encryption (PGP/MIME) + +Install the app OpenKeychain: Easy PGP to encrypt/decrypt your emails using OpenPGP. + + +Support + +If you're having trouble with K-9 Mail, ask for help in our support forum. + + +Want to help? + +K-9 Mail is a community-developed project. If you're interested in helping to improve the app, please join us! +You can find our bug tracker, source code, and wiki at https://github.com/thunderbird/thunderbird-android. +We're always happy to welcome new developers, designers, documenters, translators, bug triagers and friends. diff --git a/app-metadata/com.fsck.k9/en-GB/short_description.txt b/app-metadata/com.fsck.k9/en-GB/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..23a8a72ca71515e9f8980052370f8be913db052e --- /dev/null +++ b/app-metadata/com.fsck.k9/en-GB/short_description.txt @@ -0,0 +1 @@ +Full-featured email client diff --git a/app-metadata/com.fsck.k9/en-GB/title.txt b/app-metadata/com.fsck.k9/en-GB/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..f6c47543be4367b5aa849449e61784bf11c06892 --- /dev/null +++ b/app-metadata/com.fsck.k9/en-GB/title.txt @@ -0,0 +1 @@ +K-9 Mail diff --git a/app-metadata/com.fsck.k9/es/full_description.txt b/app-metadata/com.fsck.k9/es/full_description.txt index b3753f978152782fdb7e628ef56350693a6b2050..a01a878e970e1afc3e0b7c0e36431199a4a44d12 100644 --- a/app-metadata/com.fsck.k9/es/full_description.txt +++ b/app-metadata/com.fsck.k9/es/full_description.txt @@ -1,24 +1,24 @@ -K-9 Mail es un cliente de correo electrónico de código abierto que funciona básicamente con todos los proveedores de correo electrónico. +K-9 Mail es un cliente de correo electrónico libre y de código abierto que funciona con casi todos los proveedores de correo del mundo. Funciones * Soporta múltiples cuentas * Bandeja de entrada unificada -* Privacidad amigable (sin seguimiento en absoluto, sólo se conecta a su proveedor de correo electrónico) -* Sincronización automática de fondo o notificaciones push -* Búsqueda local y del lado del servidor -* Cifrado de correo electrónico OpenPGP (PGP/MIME) +* Nos importa tu privacidad (no hay seguimiento, sólo nos conectamos a tu proveedor de correo electrónico) +* Sincroniza tu bandeja de entrada al instante, a intervalos regulares o de forma manual +* Búsqueda local y remota en el servidor +* Cifrado de correo electrónico OpenPG (PGP/MIME) Instala la aplicación OpenKeychain: Easy PGP para cifrar/descifrar tus correos electrónicos usando OpenPGP. -apoyo +Apóyanos -Si tienes problemas con K-9 Mail, pide ayuda en nuestro foro soporte. +Si tienes problemas con K-9 Mail pide ayuda en nuestro foro de soporte. ¿Quieres ayudar? K-9 Mail es un proyecto desarrollado por la comunidad. Si estás interesado en ayudar a mejorar la aplicación, ¡únete a nosotros! -Puedes encontrar nuestro rastreador de errores, código fuente y wiki en https://github.com/thunderbird/thunderbird-android. -Siempre estamos encantados de dar la bienvenida a nuevos desarrolladores, diseñadores, documentadores, traductores, evaluadores de errores y amigos. +Puedes informar de errores, ver el código fuente y la wiki en https://github.com/thunderbird/thunderbird-android. +Siempre estamos encantados de dar la bienvenida a nuevos desarrolladores, diseñadores, gente que mejore la documentación, traductores, probadores y amigos. diff --git a/app-metadata/com.fsck.k9/gd/full_description.txt b/app-metadata/com.fsck.k9/gd/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..1919e3e79f3ef5c716e560471ebefb9d0ffcbf8c --- /dev/null +++ b/app-metadata/com.fsck.k9/gd/full_description.txt @@ -0,0 +1,24 @@ +Tha K-9 Mail na chlian puist-d le còd fosgailte a dh’obraicheas cha mhòr le solaraiche puist sam bith. + +Gleusan + +* Taic ri iomadh cunntas +* Bogsa a-steach co-aonaichte +* Math a thaobh prìobhaideachd (gun tracadh sam bith, cha dèan e ach do cheangal ris an t-solaraiche phuist agad) +* Sioncronachadh fèin-obrachail sa chùlaibh no brathan push +* Lorg ionadail no air taobh an fhrithealaiche +* Crioptachadh puist-d OpenPGP (PGP/MIME) + +Stàlaich aplacaid OpenKeychain: Easy PGP airson am post-d agad a chrioptachadh/dhì-chrioptachadh le OpenPGP. + + +Taic + +Ma tha duilgheadas agad le K-9 Mail, buail air fòram na taice againn. + + +Airson taic a chumail ris a’ phròiseact? + +’S e pròiseact coimhearsnachd a th’ ann an K-9 Mail. Ma tha thu airson làmh-chuideachaidh a chumail rinn, siuthad! +Chì thu tracaiche nam buga, an còd is an uici aig https://github.com/thunderbird/thunderbird-android. +Tha fàilte ro luchd-leasachaidh ’s dealbhaidh, daoine a nì docamaideadh no triaghais air bugaichean, eadar-theangadairean agus caraidean an-còmhnaidh. diff --git a/app-metadata/com.fsck.k9/nb/title.txt b/app-metadata/com.fsck.k9/nb/title.txt index f6c47543be4367b5aa849449e61784bf11c06892..9a89e025c9fdb52e8940c33f1f0921160a7ea21c 100644 --- a/app-metadata/com.fsck.k9/nb/title.txt +++ b/app-metadata/com.fsck.k9/nb/title.txt @@ -1 +1 @@ -K-9 Mail +K-9 E-post diff --git a/app-metadata/com.fsck.k9/pl/full_description.txt b/app-metadata/com.fsck.k9/pl/full_description.txt index 4103c11490b851e720d06cce9a5bcb0fb0cf3bd2..9858631fa1a3d3701d7edefab187bd42637bb29d 100644 --- a/app-metadata/com.fsck.k9/pl/full_description.txt +++ b/app-metadata/com.fsck.k9/pl/full_description.txt @@ -1,24 +1,24 @@ -K-9 Mail to klient poczty elektronicznej o otwartym kodzie źródłowym, który działa zasadniczo z każdym dostawcą poczty. +K-9 Mail to klient poczty elektronicznej o otwartym kodzie źródłowym, który zasadniczo działa z każdym dostawcą poczty. Funkcje * Obsługa wielu kont * Ujednolicona skrzynka odbiorcza -* Poszanowanie prywatności (bez jakiegokolwiek śledzenia, łączy się tylko z Twoim dostawcą poczty) -* Automatyczna synchronizacja w tle lub powiadomienia push -* Wyszukiwanie lokalne i na serwerze -* Szyfrowanie poczty w standardzie OpenPGP (PGP/MIME) +* Poszanowanie prywatności (bez jakiegokolwiek śledzenia, łączy się tylko z Twoim dostawcą poczty) +* Automatyczna synchronizacja w tle lub powiadomienia push +* Wyszukiwanie lokalne i na serwerze +* Szyfrowanie poczty w standardzie OpenPGP (PGP/MIME) -Zainstaluj aplikację OpenKeychain: Easy PGP aby szyfrować i odszyfrowywać swoje wiadomości za pomocą OpenPGP. +Zainstaluj aplikację OpenKeychain: Easy PGP aby szyfrować i odszyfrowywać swoje wiadomości za pomocą OpenPGP. Wsparcie -Jeśli masz problemy z K-9 Mail, poproś o pomoc na naszym forum wsparcia. +Jeśli masz problemy z K-9 Mail, poproś  pomoc na naszym forum wsparcia. Chcesz pomóc? -K-9 Mail to projekt rozwijany przez społeczność. Jeśli chcesz pomóc w ulepszaniu aplikacji, dołącz do nas! +K-9 Mail to projekt rozwijany przez społeczność. Jeśli chcesz pomóc w ulepszaniu aplikacji, dołącz do nas! Nasz system zgłaszania błędów, kod źródłowy i wiki możesz znaleźć na stronie https://github.com/thunderbird/thunderbird-android. -Zawsze chętnie witamy nowych programistów, projektantów, dokumentarzystów, tłumaczy, łowców błędów i innych. +Zawsze chętnie witamy nowych programistów, projektantów, dokumentarzystów, tłumaczy, łowców błędów i przyjaciół. diff --git a/app-metadata/com.fsck.k9/pt-PT/title.txt b/app-metadata/com.fsck.k9/pt-PT/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..f6c47543be4367b5aa849449e61784bf11c06892 --- /dev/null +++ b/app-metadata/com.fsck.k9/pt-PT/title.txt @@ -0,0 +1 @@ +K-9 Mail diff --git a/app-metadata/com.fsck.k9/sl/full_description.txt b/app-metadata/com.fsck.k9/sl/full_description.txt index 46592dcf0615a004f06fe6ba3a514423776eda12..f80bf0a5ba386d91766e50789811fd06e71ced7c 100644 --- a/app-metadata/com.fsck.k9/sl/full_description.txt +++ b/app-metadata/com.fsck.k9/sl/full_description.txt @@ -19,6 +19,6 @@ Za šifriranje pošte z OpenPGP-jem namestite https://github.com/thunderbird/thunderbird-android. Novi razvijalci, oblikovalci, pisalci dokumentov, prevajalci, sledilci hroščev in prijatelji so vedno dobrodošli. diff --git a/app-metadata/com.fsck.k9/sr/full_description.txt b/app-metadata/com.fsck.k9/sr/full_description.txt index 7fdf417d0b5778be8f3b227adf0ffb9d9b89840d..a9e9a6487c3e76620579bf8040fd23d52a66889f 100644 --- a/app-metadata/com.fsck.k9/sr/full_description.txt +++ b/app-metadata/com.fsck.k9/sr/full_description.txt @@ -1,9 +1,9 @@ -K-9 Mail је отворени имејл клијент који ради са скоро свим провајдерима. +K-9 Mail је отворени имејл клијент који ради са скоро свим пружаоцима. Карактеристике * Подржава више налога -* Јединствена пријемна пошта +* Обједињено сандуче * Безбедност (без праћења, само повезивање са вашим пружаоцем) * Аутоматска синхронизација или обавештења * Локална и серверска претрага @@ -18,5 +18,5 @@ K-9 Mail је отворени имејл клијент који ради са Желите да помогнете? K-9 Mail је пројекат развијен у заједници. Ако желите да помогнете у побољшању апликације, придружите нам се! -Наш трагач за грешке, изворни код и вики можете наћи на https://github.com/thunderbird/thunderbird-android. +Наш трагач за грешке, изворни кôд и вики можете наћи на 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 index c088c78cd1c434caaef366858d0d4cf3acf7b41a..020e1963e29997ca6c61e2d6269a89afef132630 100644 --- a/app-metadata/com.fsck.k9/ta-IN/full_description.txt +++ b/app-metadata/com.fsck.k9/ta-IN/full_description.txt @@ -4,21 +4,21 @@ * பல கணக்குகளை ஆதரிக்கிறது * ஒருங்கிணைந்த இன்பாக்ச் - * தனியுரிமை நட்பு (எந்த கண்காணிப்பும் இல்லை, உங்கள் மின்னஞ்சல் வழங்குநருடன் மட்டுமே இணைகிறது) + * தனியுரிமை நட்பு (எந்தக் கண்காணிப்பும் இல்லை, உங்கள் மின்னஞ்சல் வழங்குநருடன் மட்டுமே இணைகிறது) * தானியங்கி பின்னணி ஒத்திசைவு அல்லது புச் அறிவிப்புகள் * உள்ளக மற்றும் சேவையக பக்க தேடல் * OpenPGP மின்னஞ்சல் குறியாக்கம் (PGP/MIME) - OpenPGP ஐப் பயன்படுத்தி உங்கள் மின்னஞ்சல்களை குறியாக்கம்/மறைகுறியாக்க ESPENCEKECHAIN: EUSIONCEKECHAIN: EUSIONKECHAIN "> OpenKechain" என்ற பயன்பாட்டை OpenKechain என்ற பயன்பாட்டை நிறுவவும். உதவி - K-9 அஞ்சலில் உங்களுக்கு சிக்கல் இருந்தால், எங்கள் உதவி மன்றம் இல் உதவி கேளுங்கள். + K-9 அஞ்சலில் உங்களுக்குச் சிக்கல் இருந்தால், எங்கள் உதவி மன்றம் இல் உதவி கேளுங்கள். உதவ வேண்டுமா? கே -9 மெயில் என்பது ஒரு சமூக வளர்ந்த திட்டமாகும். பயன்பாட்டை மேம்படுத்த உதவ நீங்கள் ஆர்வமாக இருந்தால், தயவுசெய்து எங்களுடன் சேருங்கள்! - எங்கள் பிழை டிராக்கர், மூலக் குறியீடு மற்றும் விக்கியை https://github.com/thunderbird/thunderbird-android இல் காணலாம். + எங்கள் பிழை டிராக்கர், மூலக் குறியீடு மற்றும் விக்கியை 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 index 8091a6e8b0b456e759f2106ef0d55d814727caa2..828ab2cb783a213ac1902a4e79d2040abcc7a930 100644 --- a/app-metadata/com.fsck.k9/ta-IN/short_description.txt +++ b/app-metadata/com.fsck.k9/ta-IN/short_description.txt @@ -1 +1 @@ -முழு அம்சமான மின்னஞ்சல் வாங்கி +முழு-நற்பண்புகள் மின்னஞ்சல் வாங்கி diff --git a/app-metadata/com.fsck.k9/ta-IN/title.txt b/app-metadata/com.fsck.k9/ta-IN/title.txt index deb7248228ba92cbd746973d0168002735b3b515..c1522745bcc01b259d8440c1b3474eb178c37a7c 100644 --- a/app-metadata/com.fsck.k9/ta-IN/title.txt +++ b/app-metadata/com.fsck.k9/ta-IN/title.txt @@ -1 +1 @@ -கே -9 மே மாதம் +கே-9 அஞ்சல் diff --git a/app-metadata/net.thunderbird.android.beta/be/short_description.txt b/app-metadata/net.thunderbird.android.beta/be/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..51ef4520a5c74faca527208de1d96eae996ec7e0 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/be/short_description.txt @@ -0,0 +1 @@ +Thunderbird — электронная пошта з 100% адкрытым зыходным кодам, арыентаваная на прыватнасць. diff --git a/app-metadata/net.thunderbird.android.beta/be/title.txt b/app-metadata/net.thunderbird.android.beta/be/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..1e27eedfd9a52b2c5f25f00c7af6182e72e1ef05 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/be/title.txt @@ -0,0 +1 @@ +Thunderbird Beta для тэсціроўшчыкаў diff --git a/app-metadata/net.thunderbird.android.beta/el-GR/full_description.txt b/app-metadata/net.thunderbird.android.beta/el-GR/full_description.txt index 69c97f1b17a09fc07994c01f637e92cfa7d82385..d7e3c49e9cb6563a293ab824a2f146578d64493b 100644 --- a/app-metadata/net.thunderbird.android.beta/el-GR/full_description.txt +++ b/app-metadata/net.thunderbird.android.beta/el-GR/full_description.txt @@ -1,3 +1,37 @@ -Βοήθα να γίνει η επόμενη έκδοση του thunderbird όσο πιο απίθανη γίνεται κατεβάζοντας το thunderbird Beta και λαμβάνοντας πρώϊμη πρόσβαση στα τελευταία χαρακτηριστικά και σε διορθώσεις σφαλμάτων πριν ακόμη εκδοθούν επίσημα.Η δοκιμή του προγράμματος και η ανατροφοδότηση είναι σημαντικές, οπότε παρακαλούμε να αναφέρεις σφάλματα ,δυσλειτουργίες και να μοιράζεσαι τις σκέψεις σου μαζί μας! +Βοηθήστε μας να κάνουμε την επόμενη έκδοση του Thunderbird όσο το δυνατόν καλύτερη, κάνοντας λήψη του Thunderbird Beta και αποκτώντας πρώιμη πρόσβαση στις νέες λειτουργίες και διορθώσεις σφαλμάτων πριν από την επίσημη κυκλοφορία. Οι δοκιμές και τα σχόλιά σας είναι σημαντικά, οπότε αναφέρετε τυχόν σφάλματα και ατέλειες και πείτε μας τη γνώμη σας! -Βρες τον ανιχνευτή σφαλμάτων, τον κώδικα και το wiki στο https://github.com/thunderbird/thunderbird-android. +Βρείτε την πλατφόρμα παρακολούθησης σφαλμάτων, τον πηγαίο κώδικα και το wiki στο https://github.com/thunderbird/thunderbird-android. + +Καλωσορίζουμε με χαρά νέους προγραμματιστές, σχεδιαστές, συντάκτες τεκμηρίωσης, μεταφραστές, εντοπιστές σφαλμάτων και φίλους. Επισκεφτείτε το https://thunderbird.net/participate για να ξεκινήσετε. + +Το Thunderbird είναι μια ισχυρή εφαρμογή email με έμφαση στο απόρρητο. Διαχειριστείτε με ευκολία πολλαπλούς λογαριασμούς email από μία εφαρμογή, με επιλογή ενοποιημένων εισερχομένων για μέγιστη παραγωγικότητα. Έχοντας αναπτυχθεί με βάση τεχνολογίες ανοικτού κώδικα και λαμβάνοντας υποστήριξη από μια αφοσιωμένη ομάδα προγραμματιστών και μια παγκόσμια κοινότητα εθελοντών, το Thunderbird δεν θα μεταχειριστεί ποτέ τα προσωπικά δεδομένα σας ως το προϊόν. Το έργο χρηματοδοτείται αποκλειστικά από τις δωρεές των χρηστών μας, επομένως δεν πρόκειται να δείτε ποτέ ξανά διαφημίσεις μέσα στα email σας. + +Δυνατότητες +
    +
  • Αφήστε τις πολλαπλές εφαρμογές και ιστοτόπους email. Χρησιμοποιήστε μία εφαρμογη, με την προαιρετική επιλογή ενοποιημένων εισερχομένων, για κάθε ανάγκη σας.
  • +
  • Απολαύστε μια εφαρμογή email που έχει ως προτεραιότητα το απόρρητό σας και δεν συλλέγει ούτε πωλεί τα προσωπικά σας δεδομένα. Σας συνδέουμε απευθείας με τον πάροχο ηλεκτρονικού ταχυδρομείου σας. Αυτό και τίποτα άλλο!
  • +
  • Αναβαθμίστε την ιδιωτικότητά σας χρησιμοποιώντας την κρυπτογράφηση OpenPGP (PGP/MIME) με την εφαρμογή «OpenKeychain», για την (απο)κρυπτογράφηση των μηνυμάτων σας.
  • +
  • Επιλέξτε εάν θα γίνεται άμεσα συγχρονισμός, ανά ορισμένα χρονικά διαστήματα ή κατ' απαίτηση. Εσείς καθορίζετε τον τρόπο με τον οποίο θα ελέγχετε τα email σας!
  • +
  • Βρείτε τα σημαντικά μηνύματά σας με τη χρήση τόσο της τοπικής αναζήτησης όσο και της αναζήτησης στον διακομιστή.
  • +
+ +Συμβατότητα +
    +
  • Το Thunderbird λειτουργεί με τα πρωτόκολλα IMAP και POP3, ενώ υποστηρίζει μια ευρεία γκάμα παρόχων ηλεκτρονικού ταχυδρομείου, συμπεριλαμβανομένων των Gmail, Outlook, Yahoo Mail, iCloud και άλλων.
  • +
+ +Γιατί να χρησιμοποιήσετε το Thunderbird +
    +
  • Μια αξιόπιστη επωνυμία στον τομέα του ηλεκτρονικού ταχυδρομείου για πάνω από 20 έτη, τώρα και στο Android.
  • +
  • Το Thunderbird χρηματοδοτείται πλήρως από δωρεές των χρηστών μας. Δεν «εξορύσσουμε» τα προσωπικά δεδομένα σας. Δεν είστε ποτέ το προϊόν.
  • +
  • Είναι φτιαγμένο από μια ομάδα που έχει ως στόχο την αποδοτικότητα. Θέλουμε να χρησιμοποιείτε για ελάχιστο χρόνο την εφαρμογή, αλλά τα οφέλη να είναι τα μέγιστα.
  • +
  • Με εθελοντές από όλο τον κόσμο, το Thunderbird για Android έχει μεταφραστεί σε περισσότερες από 20 γλώσσες.
  • +
  • Υποστηρίζεται από τη MZLA Technologies Corporation, μιας θυγατρικής εταιρείας που ανήκει εξ ολοκλήρου στο Mozilla Foundation.
  • +
+ +Ανοικτός κώδικας και κοινότητα +
    +
  • Το Thunderbird είναι δωρεάν και ανοικτού κώδικα, δηλαδή ο κώδικάς του είναι διαθέσιμος προς προβολή, τροποποίηση, χρήση και κοινοποίηση. Επιπλέον, η άδεια χρήσης του διασφαλίζει ότι αυτό θα ισχύει για πάντα. Μπορείτε να θεωρήσετε το Thunderbird ως ένα δώρο από χιλιάδες εθελοντές προς εσάς.
  • +
  • Παρέχουμε τακτικές και διαφανείς ενημερώσεις σχετικά με την ανάπτυξη της εφαρμογής στο blog και τις λίστες αλληλογραφίας μας.
  • +
  • Η υποστήριξη χρηστών παρέχεται από την παγκόσμια κοινότητά μας. Βρείτε απαντήσεις ή γίνετε εθελοντής, απαντώντας σε ερωτήσεις, μεταφράζοντας την εφαρμογή ή μιλώντας στους φίλους και τους συγγενείς σας για το Thunderbird.
  • +
diff --git a/app-metadata/net.thunderbird.android.beta/el-GR/short_description.txt b/app-metadata/net.thunderbird.android.beta/el-GR/short_description.txt index 3196ab80c3bd9afe2db5d78985086fe6414fbb4a..477e8c78b8b8d7912017f7e951a08be47a516422 100644 --- a/app-metadata/net.thunderbird.android.beta/el-GR/short_description.txt +++ b/app-metadata/net.thunderbird.android.beta/el-GR/short_description.txt @@ -1 +1 @@ -Το Thunderbird είναι ένα 100% ανοιχτού κώδικα, με έμφαση στην ιδιωτικότητα εφαρμογή ηλ. ταχυδρομείου. +Το Thunderbird είναι μια ιδιωτική εφαρμογή email με 100% ανοικτό κώδικα. diff --git a/app-metadata/net.thunderbird.android.beta/el-GR/title.txt b/app-metadata/net.thunderbird.android.beta/el-GR/title.txt index d492f972e4323cac539c45ab867b8627bb953271..caa523a11752a82af0d62faa1c848194c2569e58 100644 --- a/app-metadata/net.thunderbird.android.beta/el-GR/title.txt +++ b/app-metadata/net.thunderbird.android.beta/el-GR/title.txt @@ -1 +1 @@ -Thunderbird Έκδοση για Testers +Thunderbird Beta για δοκιμές diff --git a/app-metadata/net.thunderbird.android.beta/en-GB/full_description.txt b/app-metadata/net.thunderbird.android.beta/en-GB/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..e8485753b66d61768c33d32d518b6b576205bd63 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-GB/full_description.txt @@ -0,0 +1,37 @@ +Help make the next Thunderbird release as awesome as possible by downloading Thunderbird Beta and getting early access to the latest features and bug fixes before they're officially released. Your testing and feedback are important, so please report bugs, rough edges, and share your thoughts with us! + +Find our bug tracker, source code, and wiki at https://github.com/thunderbird/thunderbird-android. + +We’re always happy to welcome new developers, designers, documenters, translators, bug triagers and friends. Visit us at https://thunderbird.net/participate to get started. + +Thunderbird is a powerful, privacy-focused email app. Effortlessly manage multiple email accounts from one app, with a Unified Inbox option for maximum productivity. Built on Open Source technology and supported by a dedicated team of developers alongside a global community of volunteers, Thunderbird never treats your private data as a product. Supported solely by financial contributions from our users, so you never have to see ads mixed in with your emails again. + +What you can do +
    +
  • Ditch multiple apps and webmail. Use one app, with an optional Unified Inbox, to power through your day.
  • +
  • Enjoy a privacy-friendly email client that never collects or sells your personal data. We directly connect you to your email provider. That’s it!
  • +
  • Take your privacy to the next level by using OpenPGP email encryption (PGP/MIME) with the “OpenKeychain” app, to encrypt and decrypt your messages.
  • +
  • Choose to sync your email instantly, at set intervals, or on-demand. However you want to check your email, it’s up to you!
  • +
  • Find your important messages using both local and server-side search.
  • +
+ +Compatibility +
    +
  • Thunderbird works with IMAP and POP3 protocols, supporting a wide range of email providers, including Gmail, Outlook, Yahoo Mail, iCloud, and more.
  • +
+ +Why use Thunderbird +
    +
  • The trusted name in email for over 20 years - now on Android.
  • +
  • Thunderbird is fully funded by voluntary contributions from our users. We don’t mine your personal data. You are never the product.
  • +
  • Made by a team that is as efficiency-minded as you are. We want you to spend minimal time using the app while getting maximum in return.
  • +
  • With contributors from all over the world, Thunderbird for Android has been translated into more than 20 languages.
  • +
  • Supported by MZLA Technologies Corporation, a wholly owned subsidiary of the Mozilla Foundation.
  • +
+ +Open Source and Community +
    +
  • Thunderbird is free and open source, which means its code is available to see, modify, use and share freely. Its license also ensures that it will be free forever. You can think of Thunderbird as a gift from thousands of contributors to you.
  • +
  • We develop in the open with regular, transparent updates on our blog and mailing lists.
  • +
  • Our user support is powered by our global community. Find the answers you need, or step into the role of a contributor - whether it’s answering questions, translating the app, or telling your friends and family about Thunderbird.
  • +
diff --git a/app-metadata/net.thunderbird.android.beta/en-GB/short_description.txt b/app-metadata/net.thunderbird.android.beta/en-GB/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..e077783c326acca79cd68c2422ea9e3ef7272f48 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-GB/short_description.txt @@ -0,0 +1 @@ +Thunderbird is a 100% Open Source, privacy-focused email app. diff --git a/app-metadata/net.thunderbird.android.beta/en-GB/title.txt b/app-metadata/net.thunderbird.android.beta/en-GB/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..0d4f6c71fd5f9d479a4d2475b81345ffea68d0f1 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-GB/title.txt @@ -0,0 +1 @@ +Thunderbird Beta for Testers diff --git a/app-metadata/net.thunderbird.android.beta/en-US/changelogs/19.txt b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/19.txt new file mode 100644 index 0000000000000000000000000000000000000000..59b5cac86672dbffb4fc7d892d452ea18efdd96a --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/19.txt @@ -0,0 +1,7 @@ +Thunderbird for Android version 12.0b1, based on K-9 Mail. Changes include: +- Support Android IME autofill for password managers +- Add support for avatars in account settings +- Long words and links in email messages did not wrap properly +- Swipe right to archive failed if archive folder did not exist +- In Unified Inbox, tapping non-main account email redirected to main inbox +- Crash could occur when adding Gmail account after removing primary Gmail account \ No newline at end of file diff --git a/app-metadata/net.thunderbird.android.beta/en-US/changelogs/20.txt b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/20.txt new file mode 100644 index 0000000000000000000000000000000000000000..5b37725d0d07247e617f1658b954642740e2eb0e --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/20.txt @@ -0,0 +1,2 @@ +Thunderbird for Android version 12.0b2, based on K-9 Mail. Changes include: +- Application crashed on startup if left or right swipe gesture was set to "None" \ No newline at end of file diff --git a/app-metadata/net.thunderbird.android.beta/en-US/changelogs/21.txt b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/21.txt new file mode 100644 index 0000000000000000000000000000000000000000..4c3398ef9320a826813dd6eb53e0a8fdff5cfd5b --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/21.txt @@ -0,0 +1,2 @@ +Thunderbird for Android version 12.0b3, based on K-9 Mail. Changes include: +- Application crashed on startup if left or right swipe gesture was set to 'None' \ No newline at end of file diff --git a/app-metadata/net.thunderbird.android.beta/en-US/changelogs/22.txt b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/22.txt new file mode 100644 index 0000000000000000000000000000000000000000..c63cd5914fa9508d9f3c4d2306eda4d0c406e2e7 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/22.txt @@ -0,0 +1,5 @@ +Thunderbird for Android version 12.0b4, based on K-9 Mail. Changes include: +- Testing drawer UI improvements +- Testing new account settings page +- Crash could occur when clicking on a message thread +- Unicode folder names were malformed when using server supporting UTF-8 \ No newline at end of file diff --git a/app-metadata/net.thunderbird.android.beta/en-US/changelogs/23.txt b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/23.txt new file mode 100644 index 0000000000000000000000000000000000000000..285e2bbf184b77f9f1d7c81c1ec54eaf84b357d5 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/23.txt @@ -0,0 +1,2 @@ +Thunderbird for Android version 12.0b5, based on K-9 Mail. Changes include: +- Crash occurred when attempting to access account general settings \ No newline at end of file diff --git a/app-metadata/net.thunderbird.android.beta/en-US/changelogs/24.txt b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/24.txt new file mode 100644 index 0000000000000000000000000000000000000000..e0f2c94d52243a7f8420e3af6d2f34db5680484b --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/24.txt @@ -0,0 +1,4 @@ +Thunderbird for Android version 12.0b6, based on K-9 Mail. Changes include: +- Enable edge-to-edge support on beta +- Selected/read/unread message states were hard to distinguish visually +- Crash occurred when attempting to access account general settings \ No newline at end of file diff --git a/app-metadata/net.thunderbird.android.beta/en-US/changelogs/25.txt b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/25.txt new file mode 100644 index 0000000000000000000000000000000000000000..86272579308cff3e2ebafb1b1ee6e3e0d4055db2 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/en-US/changelogs/25.txt @@ -0,0 +1,2 @@ +Thunderbird for Android version 12.0b7, based on K-9 Mail. Changes include: +- Edge-to-edge support regressed various screens when using 3-button navigation \ No newline at end of file diff --git a/app-metadata/net.thunderbird.android.beta/es-ES/full_description.txt b/app-metadata/net.thunderbird.android.beta/es-ES/full_description.txt index f9817bed7aaca4c46e639c29515a21874d0d81f3..0b81c21c9a8c0748fac9606e1cc0e328f1a58a69 100644 --- a/app-metadata/net.thunderbird.android.beta/es-ES/full_description.txt +++ b/app-metadata/net.thunderbird.android.beta/es-ES/full_description.txt @@ -1,37 +1,37 @@ -Ayude a que la próxima versión de Thunderbird sea lo mejor posible descargando la versión beta de Thunderbird y obteniendo acceso anticipado a las últimas funciones y correcciones de errores antes de que se publiquen oficialmente. Sus pruebas y comentarios son importantes, así que informe errores, problemas y comparta sus opiniones con nosotros. +Ayuda a que la próxima versión de Thunderbird sea lo mejor posible descargando la versión beta de Thunderbird y obteniendo acceso anticipado a las últimas funciones y correcciones de errores antes de que se publiquen oficialmente. Tus pruebas y comentarios ayudan mucho, así que infórmanos de errores, problemas y opiniones. -Encuentre nuestro rastreador de errores, código fuente y wiki en https://github.com/thunderbird/thunderbird-android . +Puedes informar de errores y ver el código fuente y la wiki en https://github.com/thunderbird/thunderbird-android . -Siempre nos complace dar la bienvenida a nuevos desarrolladores, diseñadores, traductores, evaluadores de errores y amigos. Visítenos en https://thunderbird.net/participate para comenzar. +Siempre buscamos nuevos desarrolladores, diseñadores, traductores, evaluadores de errores y amigos que aporten en general. Visita https://thunderbird.net/participate para empezar. -Thunderbird es una potente aplicación de correo electrónico centrada en la privacidad. Administra fácilmente varias cuentas de correo electrónico desde una sola aplicación, con una opción de Bandeja de entrada unificada para una máxima productividad. Desarrollada con tecnología de código abierto y respaldada por un equipo dedicado de desarrolladores junto con una comunidad global de voluntarios, Thunderbird nunca trata tus datos privados como un producto. Se sustenta únicamente con contribuciones financieras de nuestros usuarios, por lo que nunca volverás a ver anuncios mezclados con tus correos electrónicos. +Thunderbird es una completa aplicación de correo electrónico que respeta tu privacidad. Puedes gestionar varias cuentas de correo a la vez desde su vista unificada, mejorando tu productividad. Al ser enteramente de código abierto y creada por un equipo de desarrollo junto a una comunidad global de voluntarios, con Thunderbird tus datos no están en venta. Nos financiamos con el apoyo económico de usuarios como tú, por lo que nunca verás publicidad en tu bandeja de entrada. - ¿Qué puedes hacer? +Ventajas
    -
  • Olvídate de las múltiples aplicaciones y del correo web. Utiliza una sola aplicación, con una bandeja de entrada unificada opcional, para afrontar tu día.
  • -
  • Disfruta de un cliente de correo electrónico que respeta la privacidad y que nunca recopila ni vende tus datos personales. Te conectamos directamente con tu proveedor de correo electrónico. ¡Eso es todo!
  • -
  • Lleve su privacidad al siguiente nivel utilizando el cifrado de correo electrónico OpenPGP (PGP/MIME) con la aplicación “OpenKeychain”, para cifrar y descifrar sus mensajes.
  • -
  • Elige sincronizar tu correo electrónico al instante, a intervalos establecidos o cuando lo necesites. ¡Tú decides cómo quieres consultar tu correo electrónico!
  • -
  • Encuentre sus mensajes importantes utilizando la búsqueda local y del lado del servidor.
  • +
  • Olvídate de tener que utilizar múltiples clientes de correo o webs, con una sola aplicación y (si lo prefieres) su vista unificada tendrás todo lo que necesites en tu día a día.
  • +
  • Ni recabamos ni vendemos tus datos, solo nos conectamos a tu proveedor de correo para darte servicio, sin más.
  • +
  • Mejora tu privacidad aún más con el cifrado de correo OpenPGP (PGP/MIME) y la aplicación «OpenKeychain», que te permiten cifrar y descifrar tus mensajes.
  • +
  • Sincroniza tu bandeja de entrada al instante, a intervalos regulares o de forma manual. Tú eliges.
  • +
  • Encuentra los correos que más te importan con su búsqueda local y remota en el servidor de tu proveedor.
- Compatibilidad +Compatibilidad
    -
  • Thunderbird funciona con los protocolos IMAP y POP3 y es compatible con una amplia gama de proveedores de correo electrónico, incluidos Gmail, Outlook, Yahoo Mail, iCloud y más.
  • +
  • Thunderbird entiende los protocolos IMAP y POP3, por lo que funciona con una larga lista de proveedores de correo como Gmail, Outlook, Yahoo Mail, iCloud, entre otros.
-¿ Por qué utilizar Thunderbird ? +¿Por qué usar Thunderbird?
    -
  • El nombre de confianza en correo electrónico durante más de 20 años: ahora en Android.
  • -
  • Thunderbird se financia en su totalidad con contribuciones voluntarias de nuestros usuarios. No extraemos sus datos personales. Usted nunca es el producto.
  • -
  • Hecho por un equipo que se preocupa tanto por la eficiencia como tú. Queremos que utilices la aplicación lo menos posible y obtengas el máximo beneficio.
  • -
  • Con colaboradores de todo el mundo, Thunderbird para Android ha sido traducido a más de 20 idiomas.
  • -
  • Con el apoyo de MZLA Technologies Corporation, una subsidiaria de propiedad absoluta de la Fundación Mozilla.
  • +
  • Tras más de veinte años de servicio, ahora está disponible para Android.
  • +
  • Thunderbird se financia a base de donativos de gente como tú. Ni nos interesan tus datos personales ni tú eres, ni serás nunca, el producto.
  • +
  • Creado por un equipo que valora la eficiencia tanto como tú; queremos que pases el menor tiempo posible en la aplicación y que mientras la usas le saques todo el jugo posible.
  • +
  • Un equipo internacional de voluntarios ha traducido Thunderbird para Android a más de 20 idiomas.
  • +
  • Apoyado por MZLA Technologies Corporation, una empresa que depende de la Fundación Mozilla.
-Código abierto y comunidad +Una comunidad de software libre
    -
  • Thunderbird es gratuito y de código abierto, lo que significa que su código está disponible para verlo, modificarlo, usarlo y compartirlo libremente. Su licencia también garantiza que será gratuito para siempre. Puedes pensar en Thunderbird como un regalo de miles de colaboradores para ti.
  • -
  • Nos desarrollamos de forma abierta con actualizaciones periódicas y transparentes en nuestro blog y listas de correo.
  • -
  • Nuestro servicio de asistencia al usuario está a cargo de nuestra comunidad global. Encuentra las respuestas que necesitas o asume el rol de colaborador, ya sea respondiendo preguntas, traduciendo la aplicación o contándoles a tus amigos y familiares sobre Thunderbird.
  • +
  • Thunderbird es un programa libre y de código abierto, lo que significa que cualquiera puede ver cómo funciona, cambiarlo y crear versiones derivadas. El acuerdo de licencia hará que siga siendo así. Es como si te beneficiaras del trabajo acumulado y desinteresado de miles de voluntarios que quieren lo mejor para ti.
  • +
  • Lo desarrollamos de forma pública y transparente, se puede seguir desde nuestro blog y las listas de correo.
  • +
  • Nuestros usuarios se ayudan entre ellos. Busca las respuestas a tus preguntas o ayuda a otros respondiendo dudas, traduciendo la aplicación o dándola a conocer en tu círculo más cercano.
diff --git a/app-metadata/net.thunderbird.android.beta/es-ES/title.txt b/app-metadata/net.thunderbird.android.beta/es-ES/title.txt index 76732d62dabf589c987d8ca049033e58acd6ae17..87fe52c5bacb4294187ca3ee716ece15f049d4be 100644 --- a/app-metadata/net.thunderbird.android.beta/es-ES/title.txt +++ b/app-metadata/net.thunderbird.android.beta/es-ES/title.txt @@ -1 +1 @@ -Thunderbird Beta para pruebas +Thunderbird; beta para pruebas diff --git a/app-metadata/net.thunderbird.android.beta/fa-IR/short_description.txt b/app-metadata/net.thunderbird.android.beta/fa-IR/short_description.txt index 30d97ce48fcc8e95e761eae13d69d8a8d837f108..8de6ebc9446f9bfb376123bdfd0da2e51407bded 100644 --- a/app-metadata/net.thunderbird.android.beta/fa-IR/short_description.txt +++ b/app-metadata/net.thunderbird.android.beta/fa-IR/short_description.txt @@ -1 +1 @@ -تاندربرد کارهٔ رایانامه‌ای ۱۰۰٪ نرم‌افزار آزاد و با تمرکز بر محرمانگی است. +تاندربرد برنامهٔ رایانامه‌ای ۱۰۰٪ متن‌باز و با تمرکز بر محرمانگی است. diff --git a/app-metadata/net.thunderbird.android.beta/hu-HU/short_description.txt b/app-metadata/net.thunderbird.android.beta/hu-HU/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..b6f88051c4848ada5e21389e5398bf3e868193e6 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/hu-HU/short_description.txt @@ -0,0 +1 @@ +A Thunderbird 100%-ban nyílt forráskódú, adatvédelem-központú levelezőalkalmazás 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 index 13669599c69ac259ae423c9820a408297a2df821..47796e5519d504dd01d0bf3d1959a353f1bf47be 100644 --- a/app-metadata/net.thunderbird.android.beta/no-NO/short_description.txt +++ b/app-metadata/net.thunderbird.android.beta/no-NO/short_description.txt @@ -1 +1 @@ -Thunderbird er en 100% åpenkildekodet og privatlivsfokusert e-postapp. +Thunderbird er en 100% personvernsfokusert e-postapp, basert på åpen kildekode. diff --git a/app-metadata/net.thunderbird.android.beta/pt-PT/short_description.txt b/app-metadata/net.thunderbird.android.beta/pt-PT/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..27550fbff33a578b9e814c54b3c4b70d57fbd3fc --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/pt-PT/short_description.txt @@ -0,0 +1 @@ +O Thunderbird é uma app de e-mail focado na privacidade de 100% código aberto. diff --git a/app-metadata/net.thunderbird.android.beta/pt-PT/title.txt b/app-metadata/net.thunderbird.android.beta/pt-PT/title.txt new file mode 100644 index 0000000000000000000000000000000000000000..86df425cba1f7a3a706d41bd2e17367fd8b7fe08 --- /dev/null +++ b/app-metadata/net.thunderbird.android.beta/pt-PT/title.txt @@ -0,0 +1 @@ +Thunderbird Beta p/ testadores diff --git a/app-metadata/net.thunderbird.android.beta/ro/short_description.txt b/app-metadata/net.thunderbird.android.beta/ro/short_description.txt index c063feec586e814ee65edf0281e8697e177e3157..c67118e4acf0094027c284f6b27dbed672bf0042 100644 --- a/app-metadata/net.thunderbird.android.beta/ro/short_description.txt +++ b/app-metadata/net.thunderbird.android.beta/ro/short_description.txt @@ -1 +1 @@ -Thunderbird este o aplicație de email cu 100% cod-sursă deschis, axată pe confidențialitate. +Thunderbird: aplicație de poștă cu cod-sursă deschis, axată pe confidențialitate diff --git a/app-metadata/net.thunderbird.android.beta/ro/title.txt b/app-metadata/net.thunderbird.android.beta/ro/title.txt index ffe302ca2939da95bc4ab380ce640ddf08dec8d2..aa5d453820befbc245035a80fcd83f98e24703ee 100644 --- a/app-metadata/net.thunderbird.android.beta/ro/title.txt +++ b/app-metadata/net.thunderbird.android.beta/ro/title.txt @@ -1 +1 @@ -Thunderbird Beta pt. cei care vor să testeze +Thunderbird beta pt. testare diff --git a/app-metadata/net.thunderbird.android.beta/sq/full_description.txt b/app-metadata/net.thunderbird.android.beta/sq/full_description.txt index efd481c55f6ab794bbab2ebb87bef96fd5565946..ef0beb30c939c909bf7e6af6936ccc1ce97fde7b 100644 --- a/app-metadata/net.thunderbird.android.beta/sq/full_description.txt +++ b/app-metadata/net.thunderbird.android.beta/sq/full_description.txt @@ -11,7 +11,7 @@ Thunderbird-i është një aplikacion email-esh i fuqishëm, i përqendruar te p
  • Të hidhni tej aplikacione të shumta dhe “webmail”. Përdorni një aplikacion, me një “Të marrë të Njësuar” opsional, përgjatë ditës.
  • Të shijoni një klient email dashamirës ndaj privatësisë, që nuk mbledh, apo shet kurrë të dhënat tuaja personale. Ju lidhim drejtpërdrejt me shërbimin tuaj email. Kaq!
  • Shpjereni privatësinë tuaj një shkallë më lart, duke përdorur fshehtëzim OpenPGP email-esh (PGP/MIME) me aplikacionin “OpenKeychain”, për të fshehtëzuar dhe shfshehtëzuar mesazhet tuaj.
  • -
  • Zgjidhni njëkohësimin në çast të email-it tuaj, në intervale të caktuar, ose sipas dëshirës. Si dëshironi të shihni për email-e, e keni ju në dorë!
  • +
  • Zgjidhni njëkohësimin në çast të email-it tuaj, në intervale të caktuar, ose sipas dëshirës. Se si dëshironi të shihni për email-e, e keni ju në dorë!
  • Gjeni mesazhe të rëndësishëm, duke përdorur si kërkim vendor, ashtu edhe më anë shërbyesi.
  • diff --git a/app-metadata/net.thunderbird.android.beta/sq/short_description.txt b/app-metadata/net.thunderbird.android.beta/sq/short_description.txt index 3182ac53f636421f0b57065b3932cc788fd5ec2e..a66807beb3908a93faae00a273add18f27487d9c 100644 --- a/app-metadata/net.thunderbird.android.beta/sq/short_description.txt +++ b/app-metadata/net.thunderbird.android.beta/sq/short_description.txt @@ -1 +1 @@ -Thunderbird-i është një aplikacion për email-e, 100% me burim të hapët, i përqendruar te privatësia. +Aplikacion email-esh, 100% me burim të hapët, i përqendruar te privatësia. diff --git a/app-metadata/net.thunderbird.android.beta/sr/full_description.txt b/app-metadata/net.thunderbird.android.beta/sr/full_description.txt index 7d981fbb0307ac2b1c32fec97f39915078b23782..28f811ca4a24e5fa12e8cbe7297ef017d0acaf5e 100644 --- a/app-metadata/net.thunderbird.android.beta/sr/full_description.txt +++ b/app-metadata/net.thunderbird.android.beta/sr/full_description.txt @@ -17,10 +17,10 @@ Thunderbird је моћна имејл апликација фокусирана Компатибилност
      -
    • Thunderbird ради са IMAP и POP3 протоколима, подржавајући широк спектар добављача е-поште, укључујући Gmail, Outlook, Yahoo Mail, iCloud и још много тога.
    • +
    • Thunderbird ради са IMAP и POP3 протоколима, подржавајући широк спектар пружаоца имејла, укључујући Gmail, Outlook, Yahoo Mail, iCloud и још много тога.
    -Зашто користити Thunerbird +Зашто користити Thunderbird