diff --git a/.github/workflows/shippable_builds.yml b/.github/workflows/shippable_builds.yml
index 2e258565e1a..b31f958f7ae 100644
--- a/.github/workflows/shippable_builds.yml
+++ b/.github/workflows/shippable_builds.yml
@@ -10,7 +10,15 @@ on:
skipK9Mail:
type: boolean
description: Skip building K-9 Mail
-
+ skipBetaBump:
+ type: boolean
+ description: Skip version bump (beta)
+ skipGooglePlay:
+ type: boolean
+ description: Skip Google Play publish
+ draftGooglePlay:
+ type: boolean
+ description: Leave Play Store version in draft state
jobs:
get_environment:
@@ -44,7 +52,6 @@ jobs:
environment: ${{ needs.get_environment.outputs.releaseEnv }}
outputs:
matrixInclude: ${{ steps.dump.outputs.matrixInclude }}
- matrixIncludeApk: ${{ steps.dump.outputs.matrixIncludeApk }}
releaseType: ${{ vars.RELEASE_TYPE }}
steps:
- name: Show Environment
@@ -53,14 +60,18 @@ jobs:
env:
matrixInclude: ${{ vars.MATRIX_INCLUDE }}
releaseType: ${{ vars.RELEASE_TYPE }}
- skipThunderbird: ${{ github.event.inputs.skipThunderbird }}
- skipK9Mail: ${{ github.event.inputs.skipK9Mail }}
+ skipThunderbird: ${{ inputs.skipThunderbird }}
+ skipK9Mail: ${{ inputs.skipK9Mail }}
with:
script: |
let matrix = JSON.parse(process.env.matrixInclude);
let skipThunderbird = process.env.skipThunderbird == "true";
let skipK9Mail = process.env.skipK9Mail == "true";
+ if (!matrix.every(item => !!item.appName && !!item.packageFormat)) {
+ core.setFailed("MATRIX_INCLUDE is missing appName or packageFormat");
+ }
+
let matrixFull = matrix.filter(item => {
return !((item.appName == "k9mail" && skipK9Mail) ||
(item.appName == "thunderbird" && skipThunderbird));
@@ -71,22 +82,24 @@ jobs:
return;
}
- const matrixApk = matrixFull.filter(item => item.packageFormat == "apk");
- core.setOutput("matrixIncludeApk", matrixApk);
core.setOutput("matrixInclude", matrixFull);
await core.summary
- .addRaw(`Beginning a ${process.env.releaseType} build with the following configurations:`, true)
+ .addRaw(`Beginning a ${process.env.releaseType} build with the following configurations:`, true)
.addTable([
[
{ data: "App Name", header: true },
{ data: "Flavor", header: true },
{ data: "Format", header: true },
+ { data: "Release Target", header: true },
+ { data: "Play Store Track", header: true },
],
...matrixFull.map(item => [
{ data: item.appName },
{ data: item.packageFlavor || "default" },
{ data: item.packageFormat },
+ { data: item.releaseTarget?.replace(/\|/g, ", ") || "artifact only" },
+ { data: item.playTargetTrack || "none" },
])
])
.write();
@@ -99,17 +112,219 @@ jobs:
await core.summary.addList(["K-9 Mail is being skipped in this build"]).write();
}
+ release_commit:
+ name: Release Bumps
+ runs-on: ubuntu-latest
+ needs: [dump_config, get_environment]
+ if: ${{ needs.dump_config.outputs.releaseType == 'beta' || needs.dump_config.outputs.releaseType == 'release' }}
+ environment: ${{ needs.get_environment.outputs.releaseEnv }}
+ strategy:
+ matrix:
+ include: "${{ fromJSON(needs.dump_config.outputs.matrixInclude) }}"
+ permissions:
+ contents: write
+ outputs:
+ k9mail_sha: ${{ steps.commit.outputs.k9mail_sha }}
+ thunderbird_sha: ${{ steps.commit.outputs.thunderbird_sha }}
+ steps:
+ - name: Checkout repository
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Copy CI gradle.properties
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ shell: bash
+ run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties
+
+ - uses: actions/setup-java@v4
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ with:
+ distribution: temurin
+ java-version: 17
+
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v4
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ with:
+ cache-disabled: ${{ needs.dump_config.outputs.releaseType == 'beta' || needs.dump_config.outputs.releaseType == 'release' }}
+ add-job-summary: never
+
+ - name: Get application info
+ id: appinfo
+ shell: bash
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ env:
+ RELEASE_TYPE: ${{ vars.RELEASE_TYPE }}
+ PACKAGE_FLAVOR: ${{ matrix.packageFlavor }}
+ APP_NAME: ${{ matrix.appName }}
+ run: |
+ if [[ "${APP_NAME}" == "k9mail" && "${RELEASE_TYPE}" == "beta" ]]; then
+ # k9mail uses release for betas as well. Later on we should align the structures and
+ # remove this hack
+ RELEASE_TYPE=release
+ fi
+
+ ./gradlew :app-${APP_NAME}:printVersionInfo -PbuildType=${RELEASE_TYPE} -PflavorName=${PACKAGE_FLAVOR} --configure-on-demand
+
+ - name: Bump version code
+ id: bump_version_code
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ shell: bash
+ env:
+ APP_NAME: ${{ matrix.appName }}
+ OLD_VERSION_CODE: ${{ steps.appinfo.outputs.VERSION_CODE }}
+ run: |
+ NEW_VERSION_CODE=$(($OLD_VERSION_CODE + 1))
+ sed "s/versionCode = $OLD_VERSION_CODE/versionCode = $NEW_VERSION_CODE/" app-${APP_NAME}/build.gradle.kts > tmp_gradle_kts
+
+ ! diff -u app-${APP_NAME}/build.gradle.kts tmp_gradle_kts # flip return value to force error if no bump
+ mv tmp_gradle_kts app-${APP_NAME}/build.gradle.kts
+
+ echo "CODE=${NEW_VERSION_CODE}" | tee $GITHUB_OUTPUT
+
+ - name: Bump version suffix
+ id: bump_version_suffix
+ if: ${{ !inputs.skipBetaBump && contains(matrix.releaseTarget, 'github') && vars.RELEASE_TYPE == 'beta' }}
+ shell: bash
+ env:
+ APP_NAME: ${{ matrix.appName }}
+ OLD_VERSION_SUFFIX: ${{ steps.appinfo.outputs.VERSION_NAME_SUFFIX }}
+ run: |
+ NEW_VERSION_SUFFIX=b$((${OLD_VERSION_SUFFIX:1} + 1))
+ sed "s/versionNameSuffix = \"$OLD_VERSION_SUFFIX\"/versionNameSuffix = \"$NEW_VERSION_SUFFIX\"/" app-${APP_NAME}/build.gradle.kts > tmp_gradle_kts
+
+ ! diff -u app-${APP_NAME}/build.gradle.kts tmp_gradle_kts # flip return value to force error if no bump
+ mv tmp_gradle_kts app-${APP_NAME}/build.gradle.kts
+
+ echo "SUFFIX=${NEW_VERSION_SUFFIX}" >> $GITHUB_OUTPUT
+
+ cat $GITHUB_OUTPUT
+
+ - name: Render Release Notes
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ shell: bash
+ env:
+ APPLICATION_ID: ${{ steps.appinfo.outputs.APPLICATION_ID }}
+ APPLICATION_LABEL: ${{ steps.appinfo.outputs.APPLICATION_LABEL }}
+ VERSION_CODE: ${{ steps.bump_version_code.outputs.CODE }}
+ FULL_VERSION_NAME: ${{ steps.appinfo.outputs.VERSION_NAME }}${{ steps.bump_version_suffix.outputs.SUFFIX || steps.appinfo.outputs.VERSION_NAME_SUFFIX }}
+ run: |
+ echo "
${APPLICATION_LABEL} ${FULL_VERSION_NAME} Release Notes (${VERSION_CODE})
" | tee -a $GITHUB_STEP_SUMMARY
+ mkdir -p ./app-metadata/${APPLICATION_ID}/en-US/changelogs
+ python ./scripts/render-notes.py ${APPLICATION_ID} ${FULL_VERSION_NAME} ${VERSION_CODE} | tee -a $GITHUB_STEP_SUMMARY
+ echo "
" | tee -a $GITHUB_STEP_SUMMARY
+
+ - name: Validate Release Notes Length
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ shell: bash
+ env:
+ APPLICATION_ID: ${{ steps.appinfo.outputs.APPLICATION_ID }}
+ VERSION_CODE: ${{ steps.bump_version_code.outputs.CODE }}
+ run: |
+ wc -c ./app-metadata/${APPLICATION_ID}/en-US/changelogs/${VERSION_CODE}.txt
+ RELNOTES_LENGTH=$(wc -c ./app-metadata/${APPLICATION_ID}/en-US/changelogs/${VERSION_CODE}.txt | awk '{print $1}')
+
+ if [[ "${RELNOTES_LENGTH}" -gt 500 ]]; then
+ echo "Release Notes are too long. Found ${RELNOTES_LENGTH} characters, need a maximum of 500"
+ exit 1
+ fi
+
+ - name: Release Commits
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ id: commit
+ shell: bash
+ env:
+ APPLICATION_LABEL: ${{ steps.appinfo.outputs.APPLICATION_LABEL }}
+ APPLICATION_ID: ${{ steps.appinfo.outputs.APPLICATION_ID }}
+ APP_NAME: ${{ matrix.appName }}
+ FULL_VERSION_NAME: ${{ steps.appinfo.outputs.VERSION_NAME }}${{ steps.bump_version_suffix.outputs.SUFFIX || steps.appinfo.outputs.VERSION_NAME_SUFFIX }}
+ run: |
+ git config --global user.name "GitHub Actions Bot"
+ git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
+
+ # We need the metadata to point to the right application for the release commit
+ rm metadata
+ ln -sf app-metadata/${APPLICATION_ID} metadata
+
+ # Add changelogs, build version changes and metadata symlink
+ git add ./app-metadata/${APPLICATION_ID}/en-US/changelogs/*
+ git add ./app-${APP_NAME}/src/main/res/raw/changelog_master.xml
+ git add ./app-${APP_NAME}/build.gradle.kts
+ git add metadata
+
+ # Ready to commit. Make sure to pull again to reduce likelihood of race conditions
+ git status
+ git pull
+ git commit -m "Release: ${APPLICATION_LABEL} ${FULL_VERSION_NAME}"
+ git log -n 5
+
+ set +e
+ git push
+ GIT_RESULT=$?
+ set -e
+
+ if [ $GIT_RESULT -gt 0 ]; then
+ echo "Push rejected, trying again once in 5 seconds"
+ sleep 5
+ git pull --rebase -X ours
+ git push
+ fi
+
+ echo "${APP_NAME}_sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
+ echo "sha=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
+
+ - name: Summary
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
+ uses: actions/github-script@v7
+ env:
+ bump_sha: ${{ steps.commit.outputs.sha }}
+ applicationId: ${{ steps.appinfo.outputs.APPLICATION_ID }}
+ oldFullVersion: ${{ steps.appinfo.outputs.VERSION_NAME }}${{ steps.appinfo.outputs.VERSION_NAME_SUFFIX }}
+ oldVersionCode: ${{ steps.appinfo.outputs.VERSION_CODE }}
+ newFullVersion: ${{ steps.appinfo.outputs.VERSION_NAME }}${{ steps.bump_version_suffix.outputs.SUFFIX || steps.appinfo.outputs.VERSION_NAME_SUFFIX }}
+ newVersionCode: ${{ steps.bump_version_code.outputs.CODE }}
+ with:
+ script: |
+ let env = process.env;
+ console.log(env);
+ await core.summary
+ .addRaw(`Version for ${env.applicationId} bumped from ${env.oldFullVersion} (${env.oldVersionCode}) to ${env.newFullVersion} (${env.newVersionCode}) in `)
+ .addLink(process.env.bump_sha, `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/commit/${env.bump_sha}`)
+ .addEOL()
+ .write();
+
build_unsigned:
name: Build Unsigned
runs-on: ubuntu-latest
timeout-minutes: 90
- needs: [dump_config, get_environment]
+ needs: [dump_config, get_environment, release_commit]
strategy:
matrix:
include: "${{ fromJSON(needs.dump_config.outputs.matrixInclude) }}"
environment: ${{ needs.get_environment.outputs.releaseEnv }}
steps:
- - uses: actions/checkout@v4
+ - name: Get release sha
+ id: sha
+ shell: bash
+ env:
+ THUNDERBIRD_SHA: ${{ needs.release_commit.outputs.thunderbird_sha }}
+ K9MAIL_SHA: ${{ needs.release_commit.outputs.k9mail_sha }}
+ APP_NAME: ${{ matrix.appName }}
+ run: |
+ case "${APP_NAME}" in
+ thunderbird) APP_SHA=$THUNDERBIRD_SHA ;;
+ k9mail) APP_SHA=$K9MAIL_SHA ;;
+ esac
+
+ echo "app_sha=$APP_SHA" >> $GITHUB_OUTPUT
+ cat $GITHUB_OUTPUT
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ steps.sha.outputs.app_sha }}
- name: Copy CI gradle.properties
shell: bash
@@ -124,6 +339,7 @@ jobs:
uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: ${{ needs.dump_config.outputs.releaseType == 'beta' || needs.dump_config.outputs.releaseType == 'release' }}
+ add-job-summary: on-failure
- name: Build It
shell: bash
@@ -135,7 +351,7 @@ jobs:
run: |
if [[ "$APP_NAME" = "thunderbird" && "$PACKAGE_FORMAT" = "apk" ]]; then
BUILD_COMMAND="assemble${PACKAGE_FLAVOR^}${RELEASE_TYPE^}"
- elif [[ "$APP_NAME" = "thunderbird" && "${PACKAGE_FORMAT}" = "bundle" ]]; then
+ elif [[ "$APP_NAME" = "thunderbird" && "${PACKAGE_FORMAT}" = "aab" ]]; then
BUILD_COMMAND="bundle${PACKAGE_FLAVOR^}${RELEASE_TYPE^}"
elif [[ "$APP_NAME" = "k9mail" ]]; then
BUILD_COMMAND="assembleRelease"
@@ -154,18 +370,18 @@ jobs:
RELEASE_TYPE: ${{ vars.RELEASE_TYPE }}
UPLOAD_PATH: "uploads"
run: |
- OUT_BASE=app-${APP_NAME}/build/outputs/${PACKAGE_FORMAT}
+ OUT_BASE=app-${APP_NAME}/build/outputs/
if [[ "$APP_NAME" = "thunderbird" && "$PACKAGE_FORMAT" = "apk" ]]; then
- OUT_PATH="${OUT_BASE}/${PACKAGE_FLAVOR}/${RELEASE_TYPE}"
+ OUT_PATH="${OUT_BASE}/apk/${PACKAGE_FLAVOR}/${RELEASE_TYPE}"
OUT_FILE="app-${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-unsigned.apk"
UPLOAD_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.apk"
- elif [[ "$APP_NAME" = "thunderbird" && "${PACKAGE_FORMAT}" = "bundle" ]]; then
- OUT_PATH="${OUT_BASE}/${PACKAGE_FLAVOR}${RELEASE_TYPE^}"
+ elif [[ "$APP_NAME" = "thunderbird" && "${PACKAGE_FORMAT}" = "aab" ]]; then
+ OUT_PATH="${OUT_BASE}/bundle/${PACKAGE_FLAVOR}${RELEASE_TYPE^}"
OUT_FILE="app-${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.aab"
UPLOAD_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.aab"
elif [[ "$APP_NAME" = "k9mail" ]]; then
- OUT_PATH="${OUT_BASE}/release"
+ OUT_PATH="${OUT_BASE}/apk/release"
OUT_FILE="app-${APP_NAME}-release-unsigned.apk"
UPLOAD_FILE="${APP_NAME}-default-${RELEASE_TYPE}.apk"
else
@@ -219,6 +435,15 @@ jobs:
keyPassword: ${{ secrets.KEY_PASSWORD }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
+ - name: Rename assets
+ if: ${{ matrix.packageFormat == 'apk' }}
+ env:
+ APP_NAME: ${{ matrix.appName }}
+ PACKAGE_FLAVOR: ${{ matrix.packageFlavor || 'default' }}
+ run: |
+ mv uploads/${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-signed.apk uploads/${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.apk
+ rm uploads/*-aligned.apk
+
- name: Remove JKS file
shell: bash
run: |
@@ -230,7 +455,7 @@ jobs:
name: signed-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor || 'default' }}
if-no-files-found: error
path: |
- uploads/*-signed.apk
+ uploads/*.apk
uploads/*.aab
pre_publish:
@@ -248,39 +473,65 @@ jobs:
run: |
true
- github_release:
- name: GitHub Release
- needs: [pre_publish, dump_config]
- if: ${{ needs.dump_config.outputs.releaseType == 'beta' || needs.dump_config.outputs.releaseType == 'release' }}
+ publish_release:
+ name: Publish Release
+ needs: [pre_publish, dump_config, release_commit]
+ if: ${{ !failure() && !cancelled() }} # Run if previous step is skipped
runs-on: ubuntu-latest
strategy:
matrix:
- include: "${{ fromJSON(needs.dump_config.outputs.matrixIncludeApk) }}"
- environment: gh-releases
+ include: "${{ fromJSON(needs.dump_config.outputs.matrixInclude) }}"
+ environment: publish_release
env:
RELEASE_TYPE: ${{ needs.dump_config.outputs.releaseType }}
APP_NAME: ${{ matrix.appName }}
PACKAGE_FLAVOR: ${{ matrix.packageFlavor || 'default' }}
+ PACKAGE_FORMAT: ${{ matrix.packageFormat }}
steps:
- uses: actions/download-artifact@v4
with:
name: signed-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor || 'default' }}
path: "uploads/"
- - name: Get APK Info
- id: apkinfo
+ - name: Get Package Info
+ id: pkginfo
shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
run: |
- APK_FILE="uploads/${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-signed.apk"
- LATEST_BUILD_TOOLS=$(ls -d ${ANDROID_SDK_ROOT}/build-tools/* | sort -V | tail -n1)
- AAPT=${LATEST_BUILD_TOOLS}/aapt
-
- NAME=$(${AAPT} dump badging $APK_FILE | sed -n "s/.*application-label:'\([^']*\)'.*/\1/p")
- VERSION=$(${AAPT} dump badging $APK_FILE | sed -n "s/.*versionName='\([^']*\)'.*/\1/p")
+ PKG_FILE="uploads/${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.${PACKAGE_FORMAT}"
+ if [[ "${PACKAGE_FORMAT}" == "apk" ]]; then
+ LATEST_BUILD_TOOLS=$(ls -d ${ANDROID_SDK_ROOT}/build-tools/* | sort -V | tail -n1)
+ AAPT=${LATEST_BUILD_TOOLS}/aapt
+
+ VERSION_NAME=$(${AAPT} dump badging $PKG_FILE | sed -n "s/^package:.*versionName='\([^']*\)'.*$/\1/p")
+ VERSION_CODE=$(${AAPT} dump badging $PKG_FILE | sed -n "s/^package:.*versionCode='\([^']*\)'.*$/\1/p")
+ APPLICATION_ID=$(${AAPT} dump badging $PKG_FILE | sed -n "s/^package: name='\([^']*\)'.*$/\1/p")
+ APPLICATION_LABEL=$(${AAPT} dump badging $PKG_FILE | sed -n "s/^application-label:'\([^']*\)'.*$/\1/p")
+ elif [[ "${PACKAGE_FORMAT}" == "aab" ]]; then
+ if [ ! -f bundletool.jar ]; then
+ gh release download -R google/bundletool -p 'bundletool-all-*.jar' -O bundletool.jar
+ fi
+ BUNDLETOOL="java -jar bundletool.jar"
+
+ VERSION_NAME=$(${BUNDLETOOL} dump manifest --bundle ${PKG_FILE} --xpath '/manifest/@android:versionName')
+ VERSION_CODE=$(${BUNDLETOOL} dump manifest --bundle ${PKG_FILE} --xpath '/manifest/@android:versionCode')
+ APPLICATION_ID=$(${BUNDLETOOL} dump manifest --bundle ${PKG_FILE} --xpath '/manifest/@package')
+
+ # Unfortunately no application label in the bundle
+ case "$APPLICATION_ID" in
+ net.thunderbird.android) APPLICATION_LABEL="Thunderbird" ;;
+ net.thunderbird.android.beta) APPLICATION_LABEL="Thunderbird Beta" ;;
+ net.thunderbird.android.daily) APPLICATION_LABEL="Thunderbird Daily" ;;
+ com.fsck.k9) APPLICATION_LABEL="K-9 Mail" ;;
+ esac
+ fi
- echo "TAG_NAME=${APP_NAME^^}_${VERSION//./_}" >> $GITHUB_OUTPUT
- echo "FULL_VERSION_NAME=${NAME} ${VERSION}" >> $GITHUB_OUTPUT
- echo "VERSION_NAME=${VERSION}" >> $GITHUB_OUTPUT
+ echo "TAG_NAME=${APP_NAME^^}_${VERSION_NAME//./_}" >> $GITHUB_OUTPUT
+ echo "FULL_VERSION_NAME=${APPLICATION_LABEL} ${VERSION_NAME}" >> $GITHUB_OUTPUT
+ echo "VERSION_NAME=${VERSION_NAME}" >> $GITHUB_OUTPUT
+ echo "VERSION_CODE=${VERSION_CODE}" >> $GITHUB_OUTPUT
+ echo "APPLICATION_ID=${APPLICATION_ID}" >> $GITHUB_OUTPUT
cat $GITHUB_OUTPUT
@@ -288,49 +539,108 @@ jobs:
id: rename
shell: bash
env:
- VERSION_NAME: ${{ steps.apkinfo.outputs.VERSION_NAME }}
+ VERSION_NAME: ${{ steps.pkginfo.outputs.VERSION_NAME }}
run: |
- APK_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-signed.apk"
- APK_FILE_PRETTY="${APP_NAME}-${VERSION_NAME}.apk"
- mv uploads/${APK_FILE} uploads/${APK_FILE_PRETTY}
+ PKG_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.${PACKAGE_FORMAT}"
+ PKG_FILE_PRETTY="${APP_NAME}-${VERSION_NAME}.${PACKAGE_FORMAT}"
+ mv uploads/${PKG_FILE} uploads/${PKG_FILE_PRETTY}
- echo "APK_FILE=${APK_FILE_PRETTY}" >> $GITHUB_OUTPUT
- ls -l uploads/${APK_FILE_PRETTY}
+ echo "PKG_FILE=${PKG_FILE_PRETTY}" >> $GITHUB_OUTPUT
+ ls -l uploads/${PKG_FILE_PRETTY}
- name: App Token Generate
uses: actions/create-github-app-token@v1
+ if: ${{ contains(matrix.releaseTarget, 'github') && vars.RELEASER_APP_CLIENT_ID }}
id: app-token
with:
app-id: ${{ vars.RELEASER_APP_CLIENT_ID }}
private-key: ${{ secrets.RELEASER_APP_PRIVATE_KEY }}
- - name: Publish
- id: publish
+ - name: Get release sha
+ id: sha
+ shell: bash
+ env:
+ THUNDERBIRD_SHA: ${{ needs.release_commit.outputs.thunderbird_sha }}
+ K9MAIL_SHA: ${{ needs.release_commit.outputs.k9mail_sha }}
+ APP_NAME: ${{ matrix.appName }}
+ run: |
+ case "${APP_NAME}" in
+ thunderbird) APP_SHA=$THUNDERBIRD_SHA ;;
+ k9mail) APP_SHA=$K9MAIL_SHA ;;
+ esac
+
+ echo "app_sha=$APP_SHA" >> $GITHUB_OUTPUT
+ cat $GITHUB_OUTPUT
+
+ - name: Publish to GitHub Releases
+ id: publish_gh
+ if: ${{ contains(matrix.releaseTarget, 'github') }}
uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8
with:
- token: ${{ steps.app-token.outputs.token }}
- target_commitish: ${{ github.sha }}
- tag_name: ${{ steps.apkinfo.outputs.TAG_NAME }}
- name: ${{ steps.apkinfo.outputs.FULL_VERSION_NAME }}
+ token: ${{ steps.app-token.outputs.token || github.token }}
+ target_commitish: ${{ steps.sha.outputs.app_sha }}
+ tag_name: ${{ steps.pkginfo.outputs.TAG_NAME }}
+ name: ${{ steps.pkginfo.outputs.FULL_VERSION_NAME }}
prerelease: ${{ env.RELEASE_TYPE != 'release' }}
fail_on_unmatched_files: true
files: |
- uploads/${{ steps.rename.outputs.APK_FILE }}
+ uploads/${{ steps.rename.outputs.PKG_FILE }}
+
+ - name: Adjust release notes for play store upload
+ if: ${{ !inputs.skipGooglePlay && contains(matrix.releaseTarget, 'play') && matrix.playTargetTrack }}
+ shell: bash
+ env:
+ VERSION_CODE: ${{ steps.pkginfo.outputs.VERSION_CODE }}
+ APPLICATION_ID: ${{ steps.pkginfo.outputs.APPLICATION_ID }}
+ REPO: ${{ github.repository }}
+ APP_SHA: ${{ steps.sha.outputs.app_sha }}
+ run: |
+ # r0adkll/upload-google-play expects the release notes in a different structure
+ FILEPATH=app-metadata/${APPLICATION_ID}/en-US/changelogs/${VERSION_CODE}.txt
+ mkdir whatsnew
+ wget -O whatsnew/whatsnew-en-US https://raw.githubusercontent.com/${REPO}/${APP_SHA}/${FILEPATH}
+
+ - name: Publish to Google Play
+ id: publish_play
+ uses: r0adkll/upload-google-play@v1
+ if: ${{ !inputs.skipGooglePlay && contains(matrix.releaseTarget, 'play') && matrix.playTargetTrack }}
+ with:
+ serviceAccountJsonPlainText: ${{ secrets.PLAY_STORE_ACCOUNT }}
+ packageName: ${{ steps.pkginfo.outputs.APPLICATION_ID }}
+ track: ${{ matrix.playTargetTrack }}
+ releaseName: ${{ steps.pkginfo.outputs.VERSION_NAME }}
+ status: completed
+ changesNotSentForReview: ${{ inputs.draftGooglePlay }}
+ whatsNewDirectory: whatsnew
+ releaseFiles: |
+ uploads/${{ steps.rename.outputs.PKG_FILE }}
- name: Summary
uses: actions/github-script@v7
env:
- tagName: ${{ steps.apkinfo.outputs.TAG_NAME }}
- fullVersionName: ${{ steps.apkinfo.outputs.FULL_VERSION_NAME }}
- releaseUrl: ${{ steps.publish.outputs.url }}
- assets: ${{ steps.publish.outputs.assets }}
+ tagName: ${{ steps.pkginfo.outputs.TAG_NAME }}
+ fullVersionName: ${{ steps.pkginfo.outputs.FULL_VERSION_NAME }}
+ ghReleaseUrl: ${{ steps.publish_gh.outputs.url }}
+ playTargetTrack: ${{ matrix.playTargetTrack }}
+ applicationId: ${{ steps.pkginfo.outputs.APPLICATION_ID }}
+ app_sha: ${{ steps.sha.outputs.app_sha }}
with:
script: |
- let assets = JSON.parse(process.env.assets);
-
await core.summary
- .addRaw(`Release `)
- .addLink(process.env.fullVersionName, process.env.releaseUrl)
+ .addHeading(`${process.env.fullVersionName} (${process.env.applicationId})`, 2)
.addRaw(`Tag ${process.env.tagName} at `)
- .addLink(context.sha, `${context.server_url}/${context.repository}/commit/${context.sha}`)
+ .addLink(process.env.app_sha, `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/commit/${process.env.app_sha}`)
+ .addEOL()
.write();
+
+ if (process.env.ghReleaseUrl) {
+ await core.summary
+ .addRaw(`Released to Github at `)
+ .addLink(process.env.ghReleaseUrl, process.env.ghReleaseUrl)
+ .addEOL()
+ .write();
+ }
+
+ if (process.env.playTargetTrack) {
+ await core.summary.addRaw(`Released to the ${process.env.playTargetTrack} track on Google Play`, true).write();
+ }
diff --git a/app-k9mail/badging/release-badging.txt b/app-k9mail/badging/release-badging.txt
index ea7a9e5f7a0..425388ffd8e 100644
--- a/app-k9mail/badging/release-badging.txt
+++ b/app-k9mail/badging/release-badging.txt
@@ -54,6 +54,7 @@ application-label-lv:'K-9 pasts'
application-label-ml:'K-9 Mail'
application-label-nb:'K-9 e-post'
application-label-nl:'K-9 Mail'
+application-label-nn:'K-9 e-post'
application-label-pl:'K-9 Mail'
application-label-pt:'K-9 Mail'
application-label-pt-BR:'K-9 Mail'
@@ -68,8 +69,8 @@ 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 邮件'
-application-label-zh-CN:'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'
@@ -93,6 +94,6 @@ other-receivers
other-services
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
-locales: '--_--' 'ar' 'be' 'bg' 'br' 'ca' 'co' 'cs' 'cy' 'da' 'de' 'el' 'en' 'en-GB' 'eo' 'es' 'et' 'eu' 'fa' 'fi' 'fr' 'fy' 'gd' 'gl' 'hr' 'hu' 'in' 'is' 'it' 'iw' 'ja' 'ko' 'lt' 'lv' 'ml' 'nb' 'nl' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'sk' 'sl' 'sq' 'sr' 'sv' 'tr' 'uk' 'vi' 'zh' 'zh-CN' 'zh-TW'
+locales: '--_--' 'ar' 'be' 'bg' 'br' 'ca' 'co' 'cs' 'cy' 'da' 'de' 'el' 'en' 'en-GB' 'eo' 'es' 'et' 'eu' 'fa' 'fi' 'fr' 'fy' 'gd' 'gl' 'hr' 'hu' 'in' 'is' 'it' 'iw' 'ja' 'ko' 'lt' 'lv' 'ml' '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'
diff --git a/app-k9mail/build.gradle.kts b/app-k9mail/build.gradle.kts
index 7f6904b6f08..63d3968993e 100644
--- a/app-k9mail/build.gradle.kts
+++ b/app-k9mail/build.gradle.kts
@@ -1,3 +1,7 @@
+import javax.xml.parsers.DocumentBuilderFactory
+import javax.xml.xpath.XPathConstants
+import javax.xml.xpath.XPathFactory
+
plugins {
id(ThunderbirdPlugins.App.androidCompose)
alias(libs.plugins.dependency.guard)
@@ -25,6 +29,7 @@ dependencies {
implementation(projects.feature.widget.unread)
implementation(projects.feature.telemetry.noop)
implementation(projects.feature.funding.noop)
+ implementation(projects.feature.onboarding.migration.noop)
implementation(libs.androidx.work.runtime)
@@ -47,7 +52,8 @@ android {
testApplicationId = "com.fsck.k9.tests"
versionCode = 39004
- versionName = "6.905-SNAPSHOT"
+ versionName = "9.0"
+ versionNameSuffix = "-SNAPSHOT"
// Keep in sync with the resource string array "supported_languages"
resourceConfigurations.addAll(
@@ -88,6 +94,7 @@ android {
"ml",
"nb",
"nl",
+ "nn",
"pl",
"pt_BR",
"pt_PT",
@@ -152,3 +159,44 @@ android {
dependencyGuard {
configuration("releaseRuntimeClasspath")
}
+
+tasks.create("printVersionInfo") {
+ val targetBuildType = project.findProperty("buildType") ?: "debug"
+
+ doLast {
+ android.applicationVariants.all { variant ->
+ if (variant.buildType.name == targetBuildType) {
+ val flavor = variant.mergedFlavor
+
+ var buildTypeSource = android.sourceSets.getByName(targetBuildType).res.srcDirs.first()
+ var stringsXmlFile = File(buildTypeSource, "values/strings.xml")
+ if (!stringsXmlFile.exists()) {
+ buildTypeSource = android.sourceSets.getByName("main").res.srcDirs.first()
+ stringsXmlFile = File(buildTypeSource, "values/strings.xml")
+ }
+
+ val xmlDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stringsXmlFile)
+ val xPath = XPathFactory.newInstance().newXPath()
+ val expression = "/resources/string[@name='app_name']/text()"
+ val appName = xPath.evaluate(expression, xmlDocument, XPathConstants.STRING) as String
+
+ val output = """
+ APPLICATION_ID=${variant.applicationId}
+ APPLICATION_LABEL=$appName
+ VERSION_CODE=${flavor.versionCode}
+ VERSION_NAME=${flavor.versionName}
+ VERSION_NAME_SUFFIX=${flavor.versionNameSuffix ?: ""}
+ FULL_VERSION_NAME=${flavor.versionName}${flavor.versionNameSuffix ?: ""}
+ """.trimIndent()
+
+ println(output)
+ val githubOutput = System.getenv("GITHUB_OUTPUT")
+ if (githubOutput != null) {
+ val outputFile = File(githubOutput)
+ outputFile.writeText(output + "\n")
+ }
+ }
+ true
+ }
+ }
+}
diff --git a/app-k9mail/dependencies/releaseRuntimeClasspath.txt b/app-k9mail/dependencies/releaseRuntimeClasspath.txt
index c49f3b7192a..68832eb68a7 100644
--- a/app-k9mail/dependencies/releaseRuntimeClasspath.txt
+++ b/app-k9mail/dependencies/releaseRuntimeClasspath.txt
@@ -1,9 +1,9 @@
-androidx.activity:activity-compose:1.9.2
-androidx.activity:activity-ktx:1.9.2
-androidx.activity:activity:1.9.2
+androidx.activity:activity-compose:1.9.3
+androidx.activity:activity-ktx:1.9.3
+androidx.activity:activity:1.9.3
androidx.annotation:annotation-experimental:1.4.1
-androidx.annotation:annotation-jvm:1.8.2
-androidx.annotation:annotation:1.8.2
+androidx.annotation:annotation-jvm:1.9.0
+androidx.annotation:annotation:1.9.0
androidx.appcompat:appcompat-resources:1.7.0
androidx.appcompat:appcompat:1.7.0
androidx.arch.core:core-common:2.2.0
@@ -11,50 +11,50 @@ androidx.arch.core:core-runtime:2.2.0
androidx.autofill:autofill:1.0.0
androidx.biometric:biometric:1.1.0
androidx.browser:browser:1.3.0
-androidx.camera:camera-camera2:1.3.1
-androidx.camera:camera-core:1.3.1
-androidx.camera:camera-lifecycle:1.3.1
-androidx.camera:camera-video:1.3.1
-androidx.camera:camera-view:1.3.1
+androidx.camera:camera-camera2:1.3.4
+androidx.camera:camera-core:1.3.4
+androidx.camera:camera-lifecycle:1.3.4
+androidx.camera:camera-video:1.3.4
+androidx.camera:camera-view:1.3.4
androidx.cardview:cardview:1.0.0
-androidx.collection:collection-jvm:1.4.2
-androidx.collection:collection-ktx:1.4.2
-androidx.collection:collection:1.4.2
-androidx.compose.animation:animation-android:1.7.0
-androidx.compose.animation:animation-core-android:1.7.0
-androidx.compose.animation:animation-core:1.7.0
-androidx.compose.animation:animation:1.7.0
-androidx.compose.foundation:foundation-android:1.7.0
-androidx.compose.foundation:foundation-layout-android:1.7.0
-androidx.compose.foundation:foundation-layout:1.7.0
-androidx.compose.foundation:foundation:1.7.0
+androidx.collection:collection-jvm:1.4.4
+androidx.collection:collection-ktx:1.4.4
+androidx.collection:collection:1.4.4
+androidx.compose.animation:animation-android:1.7.4
+androidx.compose.animation:animation-core-android:1.7.4
+androidx.compose.animation:animation-core:1.7.4
+androidx.compose.animation:animation:1.7.4
+androidx.compose.foundation:foundation-android:1.7.4
+androidx.compose.foundation:foundation-layout-android:1.7.4
+androidx.compose.foundation:foundation-layout:1.7.4
+androidx.compose.foundation:foundation:1.7.4
androidx.compose.material3:material3-android:1.3.0
androidx.compose.material3:material3:1.3.0
-androidx.compose.material:material-icons-core-android:1.7.0
-androidx.compose.material:material-icons-core:1.7.0
-androidx.compose.material:material-icons-extended-android:1.7.0
-androidx.compose.material:material-icons-extended:1.7.0
-androidx.compose.material:material-ripple-android:1.7.0
-androidx.compose.material:material-ripple:1.7.0
-androidx.compose.runtime:runtime-android:1.7.0
-androidx.compose.runtime:runtime-saveable-android:1.7.0
-androidx.compose.runtime:runtime-saveable:1.7.0
-androidx.compose.runtime:runtime:1.7.0
-androidx.compose.ui:ui-android:1.7.0
-androidx.compose.ui:ui-geometry-android:1.7.0
-androidx.compose.ui:ui-geometry:1.7.0
-androidx.compose.ui:ui-graphics-android:1.7.0
-androidx.compose.ui:ui-graphics:1.7.0
-androidx.compose.ui:ui-text-android:1.7.0
-androidx.compose.ui:ui-text:1.7.0
-androidx.compose.ui:ui-tooling-preview-android:1.7.0
-androidx.compose.ui:ui-tooling-preview:1.7.0
-androidx.compose.ui:ui-unit-android:1.7.0
-androidx.compose.ui:ui-unit:1.7.0
-androidx.compose.ui:ui-util-android:1.7.0
-androidx.compose.ui:ui-util:1.7.0
-androidx.compose.ui:ui:1.7.0
-androidx.compose:compose-bom:2024.09.00
+androidx.compose.material:material-icons-core-android:1.7.4
+androidx.compose.material:material-icons-core:1.7.4
+androidx.compose.material:material-icons-extended-android:1.7.4
+androidx.compose.material:material-icons-extended:1.7.4
+androidx.compose.material:material-ripple-android:1.7.4
+androidx.compose.material:material-ripple:1.7.4
+androidx.compose.runtime:runtime-android:1.7.4
+androidx.compose.runtime:runtime-saveable-android:1.7.4
+androidx.compose.runtime:runtime-saveable:1.7.4
+androidx.compose.runtime:runtime:1.7.4
+androidx.compose.ui:ui-android:1.7.4
+androidx.compose.ui:ui-geometry-android:1.7.4
+androidx.compose.ui:ui-geometry:1.7.4
+androidx.compose.ui:ui-graphics-android:1.7.4
+androidx.compose.ui:ui-graphics:1.7.4
+androidx.compose.ui:ui-text-android:1.7.4
+androidx.compose.ui:ui-text:1.7.4
+androidx.compose.ui:ui-tooling-preview-android:1.7.4
+androidx.compose.ui:ui-tooling-preview:1.7.4
+androidx.compose.ui:ui-unit-android:1.7.4
+androidx.compose.ui:ui-unit:1.7.4
+androidx.compose.ui:ui-util-android:1.7.4
+androidx.compose.ui:ui-util:1.7.4
+androidx.compose.ui:ui:1.7.4
+androidx.compose:compose-bom:2024.10.00
androidx.concurrent:concurrent-futures:1.1.0
androidx.constraintlayout:constraintlayout-core:1.0.4
androidx.constraintlayout:constraintlayout:2.1.4
@@ -71,42 +71,42 @@ androidx.dynamicanimation:dynamicanimation:1.0.0
androidx.emoji2:emoji2-views-helper:1.3.0
androidx.emoji2:emoji2:1.3.0
androidx.exifinterface:exifinterface:1.3.6
-androidx.fragment:fragment-compose:1.8.3
-androidx.fragment:fragment-ktx:1.8.3
-androidx.fragment:fragment:1.8.3
+androidx.fragment:fragment-compose:1.8.4
+androidx.fragment:fragment-ktx:1.8.4
+androidx.fragment:fragment:1.8.4
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.5
-androidx.lifecycle:lifecycle-common-jvm:2.8.5
-androidx.lifecycle:lifecycle-common:2.8.5
-androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.5
-androidx.lifecycle:lifecycle-livedata-core:2.8.5
-androidx.lifecycle:lifecycle-livedata-ktx:2.8.5
-androidx.lifecycle:lifecycle-livedata:2.8.5
-androidx.lifecycle:lifecycle-process:2.8.5
-androidx.lifecycle:lifecycle-runtime-android:2.8.5
-androidx.lifecycle:lifecycle-runtime-compose-android:2.8.5
-androidx.lifecycle:lifecycle-runtime-compose:2.8.5
-androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.5
-androidx.lifecycle:lifecycle-runtime-ktx:2.8.5
-androidx.lifecycle:lifecycle-runtime:2.8.5
-androidx.lifecycle:lifecycle-service:2.8.5
-androidx.lifecycle:lifecycle-viewmodel-android:2.8.5
-androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.5
-androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5
-androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.5
-androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.5
-androidx.lifecycle:lifecycle-viewmodel:2.8.5
+androidx.lifecycle:lifecycle-common-java8:2.8.6
+androidx.lifecycle:lifecycle-common-jvm:2.8.6
+androidx.lifecycle:lifecycle-common:2.8.6
+androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.6
+androidx.lifecycle:lifecycle-livedata-core:2.8.6
+androidx.lifecycle:lifecycle-livedata-ktx:2.8.6
+androidx.lifecycle:lifecycle-livedata:2.8.6
+androidx.lifecycle:lifecycle-process:2.8.6
+androidx.lifecycle:lifecycle-runtime-android:2.8.6
+androidx.lifecycle:lifecycle-runtime-compose-android:2.8.6
+androidx.lifecycle:lifecycle-runtime-compose:2.8.6
+androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.6
+androidx.lifecycle:lifecycle-runtime-ktx:2.8.6
+androidx.lifecycle:lifecycle-runtime:2.8.6
+androidx.lifecycle:lifecycle-service:2.8.6
+androidx.lifecycle:lifecycle-viewmodel-android:2.8.6
+androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.6
+androidx.lifecycle:lifecycle-viewmodel-compose:2.8.6
+androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6
+androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.6
+androidx.lifecycle:lifecycle-viewmodel:2.8.6
androidx.loader:loader:1.0.0
androidx.localbroadcastmanager:localbroadcastmanager:1.1.0
-androidx.navigation:navigation-common-ktx:2.8.0
-androidx.navigation:navigation-common:2.8.0
-androidx.navigation:navigation-compose:2.8.0
-androidx.navigation:navigation-fragment:2.8.0
-androidx.navigation:navigation-runtime-ktx:2.8.0
-androidx.navigation:navigation-runtime:2.8.0
-androidx.navigation:navigation-ui:2.8.0
+androidx.navigation:navigation-common-ktx:2.8.3
+androidx.navigation:navigation-common:2.8.3
+androidx.navigation:navigation-compose:2.8.3
+androidx.navigation:navigation-fragment:2.8.3
+androidx.navigation:navigation-runtime-ktx:2.8.3
+androidx.navigation:navigation-runtime:2.8.3
+androidx.navigation:navigation-ui:2.8.3
androidx.preference:preference:1.2.1
androidx.print:print:1.0.0
androidx.profileinstaller:profileinstaller:1.3.1
@@ -156,7 +156,6 @@ com.mikepenz:fastadapter-extensions-expandable:5.7.0
com.mikepenz:fastadapter-extensions-swipe:5.7.0
com.mikepenz:fastadapter-extensions-utils:5.7.0
com.mikepenz:fastadapter:5.7.0
-com.mikepenz:materialdrawer:9.0.2
com.squareup.moshi:moshi:1.15.1
com.squareup.okhttp3:okhttp:4.12.0
com.squareup.okio:okio-jvm:3.9.0
@@ -188,19 +187,19 @@ org.apache.httpcomponents.core5:httpcore5:5.2.4
org.apache.james:apache-mime4j-core:0.8.9
org.apache.james:apache-mime4j-dom:0.8.9
org.jetbrains.compose.runtime:runtime:1.5.12
-org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.0.20
-org.jetbrains.kotlin:kotlin-bom:2.0.20
-org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.20
-org.jetbrains.kotlin:kotlin-stdlib-common:2.0.20
-org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.20
-org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.20
-org.jetbrains.kotlin:kotlin-stdlib:2.0.20
+org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.0.21
+org.jetbrains.kotlin:kotlin-bom:2.0.21
+org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.21
+org.jetbrains.kotlin:kotlin-stdlib-common:2.0.21
+org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21
+org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21
+org.jetbrains.kotlin:kotlin-stdlib:2.0.21
org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.8
org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.8
-org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1
-org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1
-org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1
-org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1
+org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0
+org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.9.0
+org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.9.0
+org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0
org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1
org.jetbrains.kotlinx:kotlinx-datetime:0.6.1
org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3
@@ -208,7 +207,7 @@ org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3
org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3
org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3
org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3
-org.jetbrains:annotations:24.1.0
+org.jetbrains:annotations:26.0.1
org.jsoup:jsoup:1.17.2
org.minidns:minidns-client:1.0.5
org.minidns:minidns-core:1.0.5
diff --git a/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt b/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt
index 941d77ca8df..8fbde70c231 100644
--- a/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt
+++ b/app-k9mail/src/main/kotlin/app/k9mail/K9KoinModule.kt
@@ -3,11 +3,13 @@ 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.funding.featureFundingModule
+import app.k9mail.feature.onboarding.migration.onboardingMigrationModule
import app.k9mail.feature.telemetry.telemetryModule
import app.k9mail.feature.widget.shortcut.LauncherShortcutActivity
import app.k9mail.featureflag.K9FeatureFlagFactory
@@ -22,18 +24,20 @@ import com.fsck.k9.provider.UnreadWidgetProvider
import com.fsck.k9.widget.list.MessageListWidgetProvider
import org.koin.android.ext.koin.androidContext
import org.koin.core.qualifier.named
+import org.koin.dsl.binds
import org.koin.dsl.module
val appModule = module {
includes(appWidgetModule)
includes(telemetryModule)
includes(featureFundingModule)
+ includes(onboardingMigrationModule)
single(named("ClientInfoAppName")) { BuildConfig.CLIENT_INFO_APP_NAME }
single(named("ClientInfoAppVersion")) { BuildConfig.VERSION_NAME }
single { appConfig }
single { K9OAuthConfigurationFactory() }
- single { K9AppNameProvider(androidContext()) }
+ single { K9AppNameProvider(androidContext()) } binds arrayOf(AppNameProvider::class, BrandNameProvider::class)
single { K9ThemeProvider() }
single { K9FeatureThemeProvider() }
single { K9FeatureFlagFactory() }
diff --git a/app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt b/app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt
index 6ce0002e09b..bf3b6ad3eeb 100644
--- a/app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt
+++ b/app-k9mail/src/main/kotlin/app/k9mail/featureflag/K9FeatureFlagFactory.kt
@@ -2,12 +2,9 @@ package app.k9mail.featureflag
import app.k9mail.core.featureflag.FeatureFlag
import app.k9mail.core.featureflag.FeatureFlagFactory
-import app.k9mail.core.featureflag.FeatureFlagKey
class K9FeatureFlagFactory : FeatureFlagFactory {
override fun createFeatureCatalog(): List {
- return listOf(
- FeatureFlag(FeatureFlagKey("material3_navigation_drawer"), false),
- )
+ return listOf()
}
}
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 7e4d095d979..ebbf468f3df 100644
--- a/app-k9mail/src/main/kotlin/app/k9mail/provider/K9AppNameProvider.kt
+++ b/app-k9mail/src/main/kotlin/app/k9mail/provider/K9AppNameProvider.kt
@@ -2,12 +2,17 @@ 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
class K9AppNameProvider(
context: Context,
-) : AppNameProvider {
+) : AppNameProvider, BrandNameProvider {
override val appName: String by lazy {
context.getString(R.string.app_name)
}
+
+ override val brandName: String by lazy {
+ context.getString(R.string.app_name)
+ }
}
diff --git a/app-k9mail/src/main/res/values-enm/strings.xml b/app-k9mail/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/app-k9mail/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app-k9mail/src/main/res/values-kab/strings.xml b/app-k9mail/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..5f57a58706e
--- /dev/null
+++ b/app-k9mail/src/main/res/values-kab/strings.xml
@@ -0,0 +1,4 @@
+
+
+ Imayl K-9
+
\ No newline at end of file
diff --git a/app-k9mail/src/main/res/values-kk/strings.xml b/app-k9mail/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/app-k9mail/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app-k9mail/src/main/res/values-pt/strings.xml b/app-k9mail/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/app-k9mail/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/app-k9mail/src/main/res/values-zh-rCN/strings.xml b/app-k9mail/src/main/res/values-zh-rCN/strings.xml
index 58052439ded..f7944fb85d2 100644
--- a/app-k9mail/src/main/res/values-zh-rCN/strings.xml
+++ b/app-k9mail/src/main/res/values-zh-rCN/strings.xml
@@ -1,4 +1,4 @@
- K-9 邮件
+ K-9 Mail
\ No newline at end of file
diff --git a/app-k9mail/src/main/res/values/themes.xml b/app-k9mail/src/main/res/values/themes.xml
index 4ba92509fdf..dcb8bc77f85 100644
--- a/app-k9mail/src/main/res/values/themes.xml
+++ b/app-k9mail/src/main/res/values/themes.xml
@@ -46,9 +46,6 @@
- #336699
- #bbb
- #888
-
- - @style/Widget.MaterialDrawerStyle.K9.Light
- - @style/Widget.MaterialDrawerHeaderStyle.K9.Light
diff --git a/build-plugin/src/main/kotlin/SigningExtensions.kt b/build-plugin/src/main/kotlin/SigningExtensions.kt
index 98dda8297de..bb90c548730 100644
--- a/build-plugin/src/main/kotlin/SigningExtensions.kt
+++ b/build-plugin/src/main/kotlin/SigningExtensions.kt
@@ -44,7 +44,7 @@ fun NamedDomainObjectContainer.createSigningConfig(
keyPassword = properties.getSigningProperty(signingType, PROPERTY_KEY_PASSWORD)
}
} else {
- println("Signing config not created for ${signingType.type}")
+ project.logger.warn("Signing config not created for ${signingType.type}")
}
}
@@ -69,7 +69,7 @@ private fun Project.readSigningProperties(signingType: SigningType, isUpload: Bo
load(inputStream)
}
} else {
- println("Signing properties file not found: $signingPropertiesFile")
+ logger.warn("Signing properties file not found: $signingPropertiesFile")
}
}
diff --git a/core/common/src/main/kotlin/app/k9mail/core/common/provider/BrandNameProvider.kt b/core/common/src/main/kotlin/app/k9mail/core/common/provider/BrandNameProvider.kt
new file mode 100644
index 00000000000..d1326cf83dd
--- /dev/null
+++ b/core/common/src/main/kotlin/app/k9mail/core/common/provider/BrandNameProvider.kt
@@ -0,0 +1,8 @@
+package app.k9mail.core.common.provider
+
+/**
+ * Provides the brand name, e.g. Thunderbird.
+ */
+interface BrandNameProvider {
+ val brandName: String
+}
diff --git a/core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/atom/card/CardFilledPreview.kt b/core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/atom/card/CardFilledPreview.kt
new file mode 100644
index 00000000000..e17a9d25b75
--- /dev/null
+++ b/core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/atom/card/CardFilledPreview.kt
@@ -0,0 +1,22 @@
+package app.k9mail.core.ui.compose.designsystem.atom.card
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import app.k9mail.core.ui.compose.designsystem.PreviewWithThemes
+import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium
+import app.k9mail.core.ui.compose.theme2.MainTheme
+
+@Composable
+@Preview(showBackground = true)
+internal fun CardFilledPreview() {
+ PreviewWithThemes {
+ CardFilled {
+ Box(modifier = Modifier.padding(MainTheme.spacings.double)) {
+ TextBodyMedium("Text in card")
+ }
+ }
+ }
+}
diff --git a/core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/atom/card/CardFilled.kt b/core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/atom/card/CardFilled.kt
new file mode 100644
index 00000000000..70802a44547
--- /dev/null
+++ b/core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/atom/card/CardFilled.kt
@@ -0,0 +1,17 @@
+package app.k9mail.core.ui.compose.designsystem.atom.card
+
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.material3.Card as Material3Card
+
+@Composable
+fun CardFilled(
+ modifier: Modifier = Modifier,
+ content: @Composable ColumnScope.() -> Unit,
+) {
+ Material3Card(
+ modifier = modifier,
+ content = content,
+ )
+}
diff --git a/core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/atom/text/TextBodyMedium.kt b/core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/atom/text/TextBodyMedium.kt
index 105c68bc0fd..129b8fdaab9 100644
--- a/core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/atom/text/TextBodyMedium.kt
+++ b/core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/atom/text/TextBodyMedium.kt
@@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.style.LineHeightStyle
import androidx.compose.ui.text.style.TextAlign
import app.k9mail.core.ui.compose.theme2.MainTheme
import androidx.compose.material3.Text as Material3Text
@@ -39,3 +40,20 @@ fun TextBodyMedium(
style = MainTheme.typography.bodyMedium,
)
}
+
+@Composable
+fun TextBodyMedium(
+ text: String,
+ lineHeightStyle: LineHeightStyle,
+ modifier: Modifier = Modifier,
+ color: Color = Color.Unspecified,
+ textAlign: TextAlign? = null,
+) {
+ Material3Text(
+ text = text,
+ modifier = modifier,
+ color = color,
+ textAlign = textAlign,
+ style = MainTheme.typography.bodyMedium.copy(lineHeightStyle = lineHeightStyle),
+ )
+}
diff --git a/core/ui/compose/designsystem/src/main/res/values-enm/strings.xml b/core/ui/compose/designsystem/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/core/ui/compose/designsystem/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/core/ui/compose/designsystem/src/main/res/values-hr/strings.xml b/core/ui/compose/designsystem/src/main/res/values-hr/strings.xml
index a6b3daec935..671c04d2587 100644
--- a/core/ui/compose/designsystem/src/main/res/values-hr/strings.xml
+++ b/core/ui/compose/designsystem/src/main/res/values-hr/strings.xml
@@ -1,2 +1,8 @@
-
\ No newline at end of file
+
+ Sakrij lozinku
+ Prikaži lozinku
+ Adresa e-pošte
+ Lozinka
+ Pokušaj ponovo
+
\ No newline at end of file
diff --git a/core/ui/compose/designsystem/src/main/res/values-kab/strings.xml b/core/ui/compose/designsystem/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/core/ui/compose/designsystem/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/core/ui/compose/designsystem/src/main/res/values-kk/strings.xml b/core/ui/compose/designsystem/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/core/ui/compose/designsystem/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/core/ui/compose/designsystem/src/main/res/values-pt/strings.xml b/core/ui/compose/designsystem/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/core/ui/compose/designsystem/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/core/ui/compose/designsystem/src/main/res/values-sv/strings.xml b/core/ui/compose/designsystem/src/main/res/values-sv/strings.xml
index 993739e3c68..42b31541762 100644
--- a/core/ui/compose/designsystem/src/main/res/values-sv/strings.xml
+++ b/core/ui/compose/designsystem/src/main/res/values-sv/strings.xml
@@ -1,7 +1,7 @@
Dölj lösenord
- E-post adress
+ E-postadress
Visa lösenord
Lösenord
Försök igen
diff --git a/core/ui/compose/designsystem/src/main/res/values-uk/strings.xml b/core/ui/compose/designsystem/src/main/res/values-uk/strings.xml
index a6b3daec935..2e798fb0c78 100644
--- a/core/ui/compose/designsystem/src/main/res/values-uk/strings.xml
+++ b/core/ui/compose/designsystem/src/main/res/values-uk/strings.xml
@@ -1,2 +1,8 @@
-
\ No newline at end of file
+
+ Показати пароль
+ Сховати пароль
+ Адреса е-пошти
+ Пароль
+ Повторити спробу
+
\ No newline at end of file
diff --git a/core/ui/compose/theme2/common/src/main/kotlin/app/k9mail/core/ui/compose/theme2/SelectThemeColorScheme.kt b/core/ui/compose/theme2/common/src/main/kotlin/app/k9mail/core/ui/compose/theme2/SelectThemeColorScheme.kt
index d1f44da6d8a..08e460cbae8 100644
--- a/core/ui/compose/theme2/common/src/main/kotlin/app/k9mail/core/ui/compose/theme2/SelectThemeColorScheme.kt
+++ b/core/ui/compose/theme2/common/src/main/kotlin/app/k9mail/core/ui/compose/theme2/SelectThemeColorScheme.kt
@@ -1,5 +1,6 @@
package app.k9mail.core.ui.compose.theme2
+import android.content.Context
import androidx.compose.material3.ColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
@@ -113,4 +114,21 @@ private fun ColorScheme.toDynamicThemeColorScheme(
)
}
+data class ColorRoles(
+ val accent: Color,
+ val onAccent: Color,
+ val accentContainer: Color,
+ val onAccentContainer: Color,
+)
+
fun Color.toHarmonizedColor(target: Color) = Color(MaterialColors.harmonize(toArgb(), target.toArgb()))
+
+fun Color.toColorRoles(context: Context): ColorRoles {
+ val colorRoles = MaterialColors.getColorRoles(context, this.toArgb())
+ return ColorRoles(
+ accent = Color(colorRoles.accent),
+ onAccent = Color(colorRoles.onAccent),
+ accentContainer = Color(colorRoles.accentContainer),
+ onAccentContainer = Color(colorRoles.onAccentContainer),
+ )
+}
diff --git a/core/ui/legacy/designsystem/src/main/kotlin/app/k9mail/core/ui/legacy/designsystem/atom/icon/Icons.kt b/core/ui/legacy/designsystem/src/main/kotlin/app/k9mail/core/ui/legacy/designsystem/atom/icon/Icons.kt
index ece6cfd9fa1..f08b2d82cb2 100644
--- a/core/ui/legacy/designsystem/src/main/kotlin/app/k9mail/core/ui/legacy/designsystem/atom/icon/Icons.kt
+++ b/core/ui/legacy/designsystem/src/main/kotlin/app/k9mail/core/ui/legacy/designsystem/atom/icon/Icons.kt
@@ -20,7 +20,6 @@ object Icons {
val Add = R.drawable.ic_add
val AddCircle = R.drawable.ic_add_circle
val Adjust = R.drawable.ic_adjust
- val AllInbox = R.drawable.ic_all_inbox
val Archive = R.drawable.ic_archive
val ArrowBack = R.drawable.ic_arrow_back
val Attachment = R.drawable.ic_attachment
diff --git a/core/ui/legacy/designsystem/src/main/res/drawable/ic_all_inbox.xml b/core/ui/legacy/designsystem/src/main/res/drawable/ic_all_inbox.xml
deleted file mode 100644
index 116d8951c2f..00000000000
--- a/core/ui/legacy/designsystem/src/main/res/drawable/ic_all_inbox.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
diff --git a/feature/account/common/src/main/res/values-az/strings.xml b/feature/account/common/src/main/res/values-az/strings.xml
index 44cdd477624..ebf0c07def9 100644
--- a/feature/account/common/src/main/res/values-az/strings.xml
+++ b/feature/account/common/src/main/res/values-az/strings.xml
@@ -2,4 +2,5 @@
Növbəti
Geri
+ Server aşağıdakı məlumatı verdi: \n%s
\ No newline at end of file
diff --git a/feature/account/common/src/main/res/values-bg/strings.xml b/feature/account/common/src/main/res/values-bg/strings.xml
index aa5ac627558..16cdb5a13ba 100644
--- a/feature/account/common/src/main/res/values-bg/strings.xml
+++ b/feature/account/common/src/main/res/values-bg/strings.xml
@@ -2,4 +2,5 @@
Напред
Назад
+ Сървърът връща следното съобщение\n%s
\ No newline at end of file
diff --git a/feature/account/common/src/main/res/values-br/strings.xml b/feature/account/common/src/main/res/values-br/strings.xml
index a6b3daec935..b1055386c1c 100644
--- a/feature/account/common/src/main/res/values-br/strings.xml
+++ b/feature/account/common/src/main/res/values-br/strings.xml
@@ -1,2 +1,4 @@
-
\ No newline at end of file
+
+ Da heul
+
\ No newline at end of file
diff --git a/feature/account/common/src/main/res/values-enm/strings.xml b/feature/account/common/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/common/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/common/src/main/res/values-hr/strings.xml b/feature/account/common/src/main/res/values-hr/strings.xml
index a6b3daec935..cd080210fcb 100644
--- a/feature/account/common/src/main/res/values-hr/strings.xml
+++ b/feature/account/common/src/main/res/values-hr/strings.xml
@@ -1,2 +1,6 @@
-
\ No newline at end of file
+
+ Sljedeće
+ Natrag
+ Poslužitelj je vratio sljedeću poruku:\n%s
+
\ No newline at end of file
diff --git a/feature/account/common/src/main/res/values-kab/strings.xml b/feature/account/common/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..56d176801fd
--- /dev/null
+++ b/feature/account/common/src/main/res/values-kab/strings.xml
@@ -0,0 +1,5 @@
+
+
+ Uḍfir
+ Uɣal
+
\ No newline at end of file
diff --git a/feature/account/common/src/main/res/values-kk/strings.xml b/feature/account/common/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/common/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/common/src/main/res/values-pt/strings.xml b/feature/account/common/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/common/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/common/src/main/res/values-uk/strings.xml b/feature/account/common/src/main/res/values-uk/strings.xml
index a6b3daec935..eec6b48fe2a 100644
--- a/feature/account/common/src/main/res/values-uk/strings.xml
+++ b/feature/account/common/src/main/res/values-uk/strings.xml
@@ -1,2 +1,6 @@
-
\ No newline at end of file
+
+ Далі
+ Назад
+ Сервер повернув таке повідомлення:\n%s
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditIncomingServerSettingsNavHost.kt b/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditIncomingServerSettingsNavHost.kt
index c0edc58810d..13cfa0323bc 100644
--- a/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditIncomingServerSettingsNavHost.kt
+++ b/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditIncomingServerSettingsNavHost.kt
@@ -58,7 +58,7 @@ fun EditIncomingServerSettingsNavHost(
viewModel = koinViewModel {
parametersOf(accountUuid)
},
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
composable(route = NESTED_NAVIGATION_ROUTE_SAVE) {
diff --git a/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditOutgoingServerSettingsNavHost.kt b/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditOutgoingServerSettingsNavHost.kt
index 6e14b2c76f5..5794cbb9b37 100644
--- a/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditOutgoingServerSettingsNavHost.kt
+++ b/feature/account/edit/src/main/kotlin/app/k9mail/feature/account/edit/ui/server/settings/EditOutgoingServerSettingsNavHost.kt
@@ -58,7 +58,7 @@ fun EditOutgoingServerSettingsNavHost(
viewModel = koinViewModel {
parametersOf(accountUuid)
},
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
composable(route = NESTED_NAVIGATION_ROUTE_SAVE) {
diff --git a/feature/account/edit/src/main/res/values-ar/strings.xml b/feature/account/edit/src/main/res/values-ar/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ar/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-az/strings.xml b/feature/account/edit/src/main/res/values-az/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-az/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-be/strings.xml b/feature/account/edit/src/main/res/values-be/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-be/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-bg/strings.xml b/feature/account/edit/src/main/res/values-bg/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-bg/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-br/strings.xml b/feature/account/edit/src/main/res/values-br/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-br/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-bs/strings.xml b/feature/account/edit/src/main/res/values-bs/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-bs/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-ca/strings.xml b/feature/account/edit/src/main/res/values-ca/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ca/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-co/strings.xml b/feature/account/edit/src/main/res/values-co/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-co/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-cs/strings.xml b/feature/account/edit/src/main/res/values-cs/strings.xml
new file mode 100644
index 00000000000..497e4ea8232
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-cs/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Nepodařilo se uložit nastavení serveru
+ Ukládání nastavení serveru…
+ Nastavení serveru uložena
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-cy/strings.xml b/feature/account/edit/src/main/res/values-cy/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-cy/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-da/strings.xml b/feature/account/edit/src/main/res/values-da/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-da/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-de/strings.xml b/feature/account/edit/src/main/res/values-de/strings.xml
new file mode 100644
index 00000000000..e257ccfb216
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-de/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Servereinstellungen werden gespeichert…
+ Servereinstellungen gespeichert
+ Servereinstellungen konnten nicht gespeichert werden
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-el/strings.xml b/feature/account/edit/src/main/res/values-el/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-el/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-en-rGB/strings.xml b/feature/account/edit/src/main/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-en-rGB/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-enm/strings.xml b/feature/account/edit/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-eo/strings.xml b/feature/account/edit/src/main/res/values-eo/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-eo/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-es/strings.xml b/feature/account/edit/src/main/res/values-es/strings.xml
new file mode 100644
index 00000000000..a4fab4e445c
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-es/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Guardando los ajustes del servidor…
+ Error al guardar la configuración del servidor
+ Configuración del servidor guardada
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-et/strings.xml b/feature/account/edit/src/main/res/values-et/strings.xml
new file mode 100644
index 00000000000..628a16750cc
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-et/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Serveri seadistuste salvestamine ei õnnestunud
+ Salvestame serveri seadistusi…
+ Serveri seadistused on salvestatud
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-eu/strings.xml b/feature/account/edit/src/main/res/values-eu/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-eu/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-fa/strings.xml b/feature/account/edit/src/main/res/values-fa/strings.xml
new file mode 100644
index 00000000000..3e2fa75db07
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-fa/strings.xml
@@ -0,0 +1,6 @@
+
+
+ ذخیره کردن تنظیمات کارساز…
+ شکست در ذخیرهٔ تنظیمات کارساز
+ تنظیمات کارساز ذخیره شد
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-fi/strings.xml b/feature/account/edit/src/main/res/values-fi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-fi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-fr/strings.xml b/feature/account/edit/src/main/res/values-fr/strings.xml
new file mode 100644
index 00000000000..04e5e00693f
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-fr/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Enregistrement des paramètres du serveur…
+ Échec à l’enregistrement des paramètres serveur
+ Paramètres du serveur enregistrés
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-fy/strings.xml b/feature/account/edit/src/main/res/values-fy/strings.xml
new file mode 100644
index 00000000000..feb66cceda3
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-fy/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Serverynstellingen bewarje…
+ Serverynstellingen net bewarre
+ Serverynstellingen bewarre
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-gd/strings.xml b/feature/account/edit/src/main/res/values-gd/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-gd/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-gl/strings.xml b/feature/account/edit/src/main/res/values-gl/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-gl/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-hi/strings.xml b/feature/account/edit/src/main/res/values-hi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-hi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-hr/strings.xml b/feature/account/edit/src/main/res/values-hr/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-hr/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-hu/strings.xml b/feature/account/edit/src/main/res/values-hu/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-hu/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-hy/strings.xml b/feature/account/edit/src/main/res/values-hy/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-hy/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-in/strings.xml b/feature/account/edit/src/main/res/values-in/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-in/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-is/strings.xml b/feature/account/edit/src/main/res/values-is/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-is/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-it/strings.xml b/feature/account/edit/src/main/res/values-it/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-it/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-iw/strings.xml b/feature/account/edit/src/main/res/values-iw/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-iw/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-ja/strings.xml b/feature/account/edit/src/main/res/values-ja/strings.xml
new file mode 100644
index 00000000000..02e62449475
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ja/strings.xml
@@ -0,0 +1,6 @@
+
+
+ サーバー設定の保存中…
+ サーバー設定を保存できませんでした
+ サーバー設定を保存しました
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-ka/strings.xml b/feature/account/edit/src/main/res/values-ka/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ka/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-kab/strings.xml b/feature/account/edit/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..bd8e66fc234
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-kab/strings.xml
@@ -0,0 +1,4 @@
+
+
+ Asekles n iɣewwaṛen n useqdac…
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-kk/strings.xml b/feature/account/edit/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-ko/strings.xml b/feature/account/edit/src/main/res/values-ko/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ko/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-lt/strings.xml b/feature/account/edit/src/main/res/values-lt/strings.xml
new file mode 100644
index 00000000000..e7f4f620180
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-lt/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Įrašyti serverio nustatymai
+ Įrašoma serverio nustatymai…
+ Nepavyko įrašyti serverio nustatymų.
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-lv/strings.xml b/feature/account/edit/src/main/res/values-lv/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-lv/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-ml/strings.xml b/feature/account/edit/src/main/res/values-ml/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ml/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-nb-rNO/strings.xml b/feature/account/edit/src/main/res/values-nb-rNO/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-nb-rNO/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-nl/strings.xml b/feature/account/edit/src/main/res/values-nl/strings.xml
new file mode 100644
index 00000000000..0710aa873a9
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-nl/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Serverinstellingen opslaan…
+ Serverinstellingen niet opgeslagen
+ Serverinstellingen opgeslagen
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-nn/strings.xml b/feature/account/edit/src/main/res/values-nn/strings.xml
new file mode 100644
index 00000000000..44b7f923a8f
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-nn/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Lagrar tenar-innstillingar…
+ Klarte ikkje lagre tenar-innstillingar
+ Tenar-innstillingar lagra
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-pl/strings.xml b/feature/account/edit/src/main/res/values-pl/strings.xml
new file mode 100644
index 00000000000..5bb668a2246
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-pl/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Zapisywanie ustawień serwera…
+ Nie udało się zapisać ustawień serwera
+ Zapisano ustawienia serwera
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-pt-rBR/strings.xml b/feature/account/edit/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 00000000000..e6746199517
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Salvando configurações do servidor…
+ Falhou ao salvar configurações do servidor
+ Configurações do servidor salvas
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-pt-rPT/strings.xml b/feature/account/edit/src/main/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-pt-rPT/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-pt/strings.xml b/feature/account/edit/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-ro/strings.xml b/feature/account/edit/src/main/res/values-ro/strings.xml
new file mode 100644
index 00000000000..74ec32193a7
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ro/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Salvarea configurației serverului a eșuat
+ Se salvează configurației serverului…
+ Configurația serverului a fost salvată
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-ru/strings.xml b/feature/account/edit/src/main/res/values-ru/strings.xml
new file mode 100644
index 00000000000..6b1eab1d43e
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ru/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Сохранение настроек сервера…
+ Невозможно сохранить настройки сервера
+ Настройки сервера сохранены
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-sk/strings.xml b/feature/account/edit/src/main/res/values-sk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-sk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-sl/strings.xml b/feature/account/edit/src/main/res/values-sl/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-sl/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-sq/strings.xml b/feature/account/edit/src/main/res/values-sq/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-sq/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-sr/strings.xml b/feature/account/edit/src/main/res/values-sr/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-sr/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-sv/strings.xml b/feature/account/edit/src/main/res/values-sv/strings.xml
new file mode 100644
index 00000000000..b8086521424
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-sv/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Sparar serverinställningar…
+ Det gick inte att spara serverinställningarna
+ Serverinställningar sparade
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-ta/strings.xml b/feature/account/edit/src/main/res/values-ta/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-ta/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-tr/strings.xml b/feature/account/edit/src/main/res/values-tr/strings.xml
new file mode 100644
index 00000000000..0c976edbe15
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-tr/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Sunucu ayarları kaydediliyor…
+ Sunucu ayarları kaydedilemedi
+ Sunucu ayarları kaydedildi
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-uk/strings.xml b/feature/account/edit/src/main/res/values-uk/strings.xml
new file mode 100644
index 00000000000..12f27ee0c9a
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-uk/strings.xml
@@ -0,0 +1,6 @@
+
+
+ Збереження налаштувань сервера…
+ Не вдалося зберегти налаштування сервера
+ Налаштування сервера збережено
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-vi/strings.xml b/feature/account/edit/src/main/res/values-vi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-vi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-zh-rCN/strings.xml b/feature/account/edit/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000000..863bb3f7d3c
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,6 @@
+
+
+ 正在保存服务器设置…
+ 保存服务器设置失败
+ 服务器设置已保存
+
\ No newline at end of file
diff --git a/feature/account/edit/src/main/res/values-zh-rTW/strings.xml b/feature/account/edit/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/edit/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/oauth/src/main/res/values-enm/strings.xml b/feature/account/oauth/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/oauth/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/oauth/src/main/res/values-hr/strings.xml b/feature/account/oauth/src/main/res/values-hr/strings.xml
index a6b3daec935..724d6baef8a 100644
--- a/feature/account/oauth/src/main/res/values-hr/strings.xml
+++ b/feature/account/oauth/src/main/res/values-hr/strings.xml
@@ -1,2 +1,12 @@
-
\ No newline at end of file
+
+ Preusmjerit ćemo Vas vašem davatelju usluga e-pošte da se prijavite. Morate aplikaciji odobriti pristup vašem računu e-pošte.
+ Prijavite se
+ Prijavite se s Googleom
+ Prijavite se koristeći OAuth
+ OAuth prijava nije uspjela
+ Autorizacija poništena
+ OAuth 2.0 trenutačno nije podržan kod ovog pružatelja usluga e-pošte.
+ Aplikacija nije mogla pronaći preglednik za davanje pristupa vašem računu.
+ Autorizacija nije uspjela sa sljedećom pogreškom: %s
+
\ No newline at end of file
diff --git a/feature/account/oauth/src/main/res/values-kab/strings.xml b/feature/account/oauth/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/oauth/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/oauth/src/main/res/values-kk/strings.xml b/feature/account/oauth/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/oauth/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/oauth/src/main/res/values-nn/strings.xml b/feature/account/oauth/src/main/res/values-nn/strings.xml
index 1005daad9f8..3231ab2f0b5 100644
--- a/feature/account/oauth/src/main/res/values-nn/strings.xml
+++ b/feature/account/oauth/src/main/res/values-nn/strings.xml
@@ -1,7 +1,12 @@
-
+
Logg inn
Logg in med Google
Du vil bli sendt til e-posttilbydaren din for innlogging. Du må gje programmet tilgang til e-postkontoen din.
Loggar inn med OAuth
+ Mislykka innlogging med OAuth
+ Godkjenning avbroten
+ Mislykka godkjenning med følgjande feil: %s
+ OAuth 2.0 er ikkje støtta med denne tilbydaren.
+ Appen klarte ikkje å finne nokon nettlesar å bruke for å innvilge tilgang til kontoen din.
\ No newline at end of file
diff --git a/feature/account/oauth/src/main/res/values-pl/strings.xml b/feature/account/oauth/src/main/res/values-pl/strings.xml
index 4e0db22e4bc..41a1b02b21d 100644
--- a/feature/account/oauth/src/main/res/values-pl/strings.xml
+++ b/feature/account/oauth/src/main/res/values-pl/strings.xml
@@ -2,7 +2,7 @@
Zaloguj się przez Google
Logowanie OAuth nie powiodło się
- Autoryzacja nie powiodła się z powodu następującego błędu: %s
+ Autoryzacja nie powiodła się z powodu następującego błędu: %s
Aplikacja nie mogła znaleźć przeglądarki, za pomocą której można uzyskać dostęp do Twojego konta.
Ten dostawca nie obsługuje obecnie protokołu OAuth 2.0.
Autoryzacja anulowana
diff --git a/feature/account/oauth/src/main/res/values-pt/strings.xml b/feature/account/oauth/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/oauth/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/oauth/src/main/res/values-uk/strings.xml b/feature/account/oauth/src/main/res/values-uk/strings.xml
index a6b3daec935..265ed3a9be8 100644
--- a/feature/account/oauth/src/main/res/values-uk/strings.xml
+++ b/feature/account/oauth/src/main/res/values-uk/strings.xml
@@ -1,2 +1,12 @@
-
\ No newline at end of file
+
+ Ми переадресуємо вас до вашого постачальника послуг електронної пошти для входу. Вам потрібно надати застосунку доступ до вашого облікового запису електронної пошти.
+ Увійти
+ Увійти за допомогою Google
+ Увійти використовуючи OAuth
+ Не вдалося ввійти за допомогою OAuth
+ Авторизація скасована
+ Не вдалося авторизувати через цю помилку: %s
+ Цей постачальник наразі не підтримує OAuth 2.0.
+ Застосунок не може знайти браузер для надання доступу до вашого облікового запису.
+
\ No newline at end of file
diff --git a/feature/account/server/certificate/src/main/res/values-enm/strings.xml b/feature/account/server/certificate/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/certificate/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/certificate/src/main/res/values-hr/strings.xml b/feature/account/server/certificate/src/main/res/values-hr/strings.xml
index a6b3daec935..9ef1a1fb5a0 100644
--- a/feature/account/server/certificate/src/main/res/values-hr/strings.xml
+++ b/feature/account/server/certificate/src/main/res/values-hr/strings.xml
@@ -1,2 +1,13 @@
-
\ No newline at end of file
+
+ Upozorenje
+ Greška certifikata
+ Aplikacija je otkrila potencijalnu sigurnosnu prijetnju i nije nastavila s povezivanjem na %s.\nAko nastavite, napadači bi mogli ukrasti vaše osobne podatke poput lozinke ili e-mailove.
+ Vrati se (preporučeno)
+ Potvrdi rizik i nastavi
+ Certifikat servera
+ Nije valjano prije
+ Nije valjano nakon
+ Napredno
+ Izdavatelj
+
\ No newline at end of file
diff --git a/feature/account/server/certificate/src/main/res/values-kab/strings.xml b/feature/account/server/certificate/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/certificate/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/certificate/src/main/res/values-kk/strings.xml b/feature/account/server/certificate/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/certificate/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/certificate/src/main/res/values-pl/strings.xml b/feature/account/server/certificate/src/main/res/values-pl/strings.xml
index c32bba3a6b3..cb3869014e0 100644
--- a/feature/account/server/certificate/src/main/res/values-pl/strings.xml
+++ b/feature/account/server/certificate/src/main/res/values-pl/strings.xml
@@ -2,7 +2,7 @@
Wróć (zalecane)
Zaawansowane
- Zaakceptuj ryzyko i kontynuuj
+ Zaakceptuj ryzyko i kontynuuj
Certyfikat serwera
Alternatywne nazwy podmiotu
Nieważny przed
@@ -12,6 +12,5 @@
Ostrzeżenie
Błąd certyfikatu
Podmiot
- Aplikacja wykryła potencjalne zagrożenie bezpieczeństwa i nie nawiązała dalszego połączenia z %s.
-\nJeśli będziesz kontynuować, osoby atakujące mogą spróbować ukraść informacje, takie jak Twoje hasło lub adresy e-mail.
+ Aplikacja wykryła potencjalne zagrożenie bezpieczeństwa i nie nawiązała dalszego połączenia z %s. \nJeśli będziesz kontynuować, osoby atakujące mogą spróbować ukraść informacje, takie jak Twoje hasło lub adresy e-mail.
\ No newline at end of file
diff --git a/feature/account/server/certificate/src/main/res/values-pt/strings.xml b/feature/account/server/certificate/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/certificate/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/certificate/src/main/res/values-uk/strings.xml b/feature/account/server/certificate/src/main/res/values-uk/strings.xml
index a6b3daec935..011afe3467c 100644
--- a/feature/account/server/certificate/src/main/res/values-uk/strings.xml
+++ b/feature/account/server/certificate/src/main/res/values-uk/strings.xml
@@ -1,2 +1,16 @@
-
\ No newline at end of file
+
+ Попередження
+ Помилка сертифіката
+ Додатково
+ Погодитися на ризик і продовжити
+ Альтернативні імена суб\'єктів
+ Недійсний до
+ Недійсний після
+ Суб\'єкт
+ Цифрові відбитки
+ Застосунок виявив потенційну загрозу безпеці та припинив з\'єднання з %s.\nЯкщо ви продовжите, зловмисники можуть спробувати викрасти вашу інформацію, наприклад, пароль або електронну пошту.
+ Повернутися (рекомендовано)
+ Сертифікат сервера
+ Видавець
+
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-bg/strings.xml b/feature/account/server/settings/src/main/res/values-bg/strings.xml
index a5e011e2fe0..36587a10dfb 100644
--- a/feature/account/server/settings/src/main/res/values-bg/strings.xml
+++ b/feature/account/server/settings/src/main/res/values-bg/strings.xml
@@ -6,7 +6,7 @@
Паролата е задължителна.
OAuth 2.0
Никаква
- Криптирана парола
+ Шифрована парола
Автоматично намиране на IMAP пространство
Настройки на входящ сървър
Обикновена парола
@@ -30,4 +30,6 @@
Сигурност
Потвърдете самоличността си
За да видите паролата си тук, включете заключването на екрана на това устройство.
+ Изпращане на информация до клиента
+ Невалиден IP адрес или име на хост
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-enm/strings.xml b/feature/account/server/settings/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/settings/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-kab/strings.xml b/feature/account/server/settings/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/settings/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-kk/strings.xml b/feature/account/server/settings/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/settings/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-nn/strings.xml b/feature/account/server/settings/src/main/res/values-nn/strings.xml
index f6cf08c25db..9d1de924d49 100644
--- a/feature/account/server/settings/src/main/res/values-nn/strings.xml
+++ b/feature/account/server/settings/src/main/res/values-nn/strings.xml
@@ -28,4 +28,8 @@
Ugyldig IP eller vertsnamn
Brukarnamn påkravd.
For å sjå passordet ditt her, aktiver skjermlås på denne eininga.
+ Verifiser din identitet
+ IMAP prefiks kan ikkje vere tom.
+ Autentisering
+ IMAP-sti prefiks
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-pl/strings.xml b/feature/account/server/settings/src/main/res/values-pl/strings.xml
index 4466afd8521..03f1af15462 100644
--- a/feature/account/server/settings/src/main/res/values-pl/strings.xml
+++ b/feature/account/server/settings/src/main/res/values-pl/strings.xml
@@ -31,5 +31,5 @@
Odblokuj, aby zobaczyć swoje hasło
Aby zobaczyć tutaj swoje hasło, ustaw blokadę ekranu na tym urządzeniu.
Nieprawidłowy adres IP lub nazwa hosta
- Wyślij informacje o kliencie
+ Wyślij informacje o kliencie
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-pt/strings.xml b/feature/account/server/settings/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/settings/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-sv/strings.xml b/feature/account/server/settings/src/main/res/values-sv/strings.xml
index fcc7c9b0fca..2e22c0f7f12 100644
--- a/feature/account/server/settings/src/main/res/values-sv/strings.xml
+++ b/feature/account/server/settings/src/main/res/values-sv/strings.xml
@@ -13,15 +13,15 @@
Verifiera din identitet
Använd kompression
Port krävs.
- Klient certifikat
- IMAP sökväg prefix
+ Klientcertifikat
+ IMAP-sökvägsprefix
SSL/TLS
Protokoll
Lås upp för att visa ditt lösenord
Port är ogiltig (måste vara 1-65535).
StartTLS
- Klient certifikat
- IMAP prefix får inte vara tomt.
+ Klientcertifikat
+ IMAP-prefixet får inte vara tomt.
Ingen
För att se ditt lösenord här, aktivera skärmlås på den här enheten.
Server
@@ -31,5 +31,5 @@
Port
Användarnamn
Ogiltig IP eller värdnamn
- Skicka klient information
+ Skicka klientinformation
\ No newline at end of file
diff --git a/feature/account/server/settings/src/main/res/values-uk/strings.xml b/feature/account/server/settings/src/main/res/values-uk/strings.xml
index 4409e9ea142..cbae6d0d74b 100644
--- a/feature/account/server/settings/src/main/res/values-uk/strings.xml
+++ b/feature/account/server/settings/src/main/res/values-uk/strings.xml
@@ -5,18 +5,31 @@
Сервер
Безпека
Порт
- Аутентифікація
- Ім’я користувача
- Жодна
- Жодна
+ Автентифікація
+ Ім\'я користувача
+ Немає
+ Немає
Звичайний пароль
Зашифрований пароль
Сертифікат клієнта
- Жоден
+ Немає
Сертифікат клієнта
Налаштування вхідного сервера
Автовизначення області назв IMAP
Префікс шляху IMAP
- Стиснення
+ Використовувати стиснення
Налаштування вихідного сервера
+ Недійсний IP або ім\'я хосту
+ StartTLS
+ SSL/TLS
+ OAuth 2.0
+ Порт недійсний (має бути 1-65535).
+ Ім\'я користувача обов\'язкове.
+ Ім\'я сервера обов\'язкове.
+ Порт обов\'язковий.
+ Пароль обов\'язковий.
+ Префікс IMAP не може бути порожнім.
+ Щоб переглянути тут свій пароль, увімкніть блокування екрана на цьому пристрої.
+ Підтвердьте свою особистість
+ Розблокуйте, щоб переглянути пароль
\ No newline at end of file
diff --git a/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreenPreview.kt b/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreenPreview.kt
index 15b290c1b8d..8ed54ccd32b 100644
--- a/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreenPreview.kt
+++ b/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreenPreview.kt
@@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.server.validation.ui.fake.FakeAccountOAuthViewModel
-import app.k9mail.feature.account.server.validation.ui.fake.FakeAppNameProvider
+import app.k9mail.feature.account.server.validation.ui.fake.FakeBrandNameProvider
import app.k9mail.feature.account.server.validation.ui.fake.FakeIncomingServerValidationViewModel
import app.k9mail.feature.account.server.validation.ui.fake.FakeOutgoingServerValidationViewModel
@@ -16,7 +16,7 @@ internal fun IncomingServerValidationMainScreenPreview() {
viewModel = FakeIncomingServerValidationViewModel(
oAuthViewModel = FakeAccountOAuthViewModel(),
),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
@@ -29,7 +29,7 @@ internal fun OutgoingServerValidationMainScreenPreview() {
viewModel = FakeOutgoingServerValidationViewModel(
oAuthViewModel = FakeAccountOAuthViewModel(),
),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
diff --git a/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenPreview.kt b/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenPreview.kt
index 1c3c84bdada..2edc5a8f117 100644
--- a/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenPreview.kt
+++ b/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenPreview.kt
@@ -6,7 +6,7 @@ import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.common.ui.fake.FakeAccountStateRepository
import app.k9mail.feature.account.server.certificate.data.InMemoryServerCertificateErrorRepository
import app.k9mail.feature.account.server.validation.ui.fake.FakeAccountOAuthViewModel
-import app.k9mail.feature.account.server.validation.ui.fake.FakeAppNameProvider
+import app.k9mail.feature.account.server.validation.ui.fake.FakeBrandNameProvider
import com.fsck.k9.mail.server.ServerSettingsValidationResult
@Composable
@@ -23,7 +23,7 @@ internal fun IncomingServerValidationScreenPreview() {
certificateErrorRepository = InMemoryServerCertificateErrorRepository(),
oAuthViewModel = FakeAccountOAuthViewModel(),
),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
@@ -42,7 +42,7 @@ internal fun OutgoingServerValidationScreenPreview() {
certificateErrorRepository = InMemoryServerCertificateErrorRepository(),
oAuthViewModel = FakeAccountOAuthViewModel(),
),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
diff --git a/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/fake/FakeAppNameProvider.kt b/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/fake/FakeAppNameProvider.kt
deleted file mode 100644
index f72de059591..00000000000
--- a/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/fake/FakeAppNameProvider.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package app.k9mail.feature.account.server.validation.ui.fake
-
-import app.k9mail.core.common.provider.AppNameProvider
-
-internal object FakeAppNameProvider : AppNameProvider {
- override val appName: String = "Fake App Name"
-}
diff --git a/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/fake/FakeBrandNameProvider.kt b/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/fake/FakeBrandNameProvider.kt
new file mode 100644
index 00000000000..7db47172f36
--- /dev/null
+++ b/feature/account/server/validation/src/debug/kotlin/app/k9mail/feature/account/server/validation/ui/fake/FakeBrandNameProvider.kt
@@ -0,0 +1,7 @@
+package app.k9mail.feature.account.server.validation.ui.fake
+
+import app.k9mail.core.common.provider.BrandNameProvider
+
+internal object FakeBrandNameProvider : BrandNameProvider {
+ override val brandName: String = "Fake Brand Name"
+}
diff --git a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreen.kt b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreen.kt
index 6e5ac592bde..1af45820995 100644
--- a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreen.kt
+++ b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationMainScreen.kt
@@ -2,7 +2,7 @@ package app.k9mail.feature.account.server.validation.ui
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.mvi.observeWithoutEffect
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.feature.account.common.ui.AppTitleTopHeader
@@ -14,7 +14,7 @@ import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.
@Composable
internal fun ServerValidationMainScreen(
viewModel: ViewModel,
- appNameProvider: AppNameProvider,
+ brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
) {
val (state, dispatch) = viewModel.observeWithoutEffect()
@@ -22,7 +22,7 @@ internal fun ServerValidationMainScreen(
Scaffold(
topBar = {
AppTitleTopHeader(
- title = appNameProvider.appName,
+ title = brandNameProvider.brandName,
)
},
bottomBar = {
diff --git a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreen.kt b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreen.kt
index 12fa4352a50..d413bef2528 100644
--- a/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreen.kt
+++ b/feature/account/server/validation/src/main/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreen.kt
@@ -4,7 +4,7 @@ import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.feature.account.server.certificate.ui.ServerCertificateErrorScreen
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
@@ -17,7 +17,7 @@ fun ServerValidationScreen(
onNext: () -> Unit,
onBack: () -> Unit,
viewModel: ViewModel,
- appNameProvider: AppNameProvider,
+ brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
title: String? = null,
) {
@@ -52,7 +52,7 @@ fun ServerValidationScreen(
} else {
ServerValidationMainScreen(
viewModel = viewModel,
- appNameProvider = appNameProvider,
+ brandNameProvider = brandNameProvider,
modifier = modifier,
)
}
diff --git a/feature/account/server/validation/src/main/res/values-enm/strings.xml b/feature/account/server/validation/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/validation/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/validation/src/main/res/values-kab/strings.xml b/feature/account/server/validation/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/validation/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/validation/src/main/res/values-kk/strings.xml b/feature/account/server/validation/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/validation/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/validation/src/main/res/values-nn/strings.xml b/feature/account/server/validation/src/main/res/values-nn/strings.xml
index a65aa8e5705..8f9e35211bf 100644
--- a/feature/account/server/validation/src/main/res/values-nn/strings.xml
+++ b/feature/account/server/validation/src/main/res/values-nn/strings.xml
@@ -9,4 +9,11 @@
Nettverksfeil
Tenarfeil
Detaljar:\n%s
+ Autentiseringsfeil
+ Sjekker innkommande tenar-innstillingar…
+ Sjekking av innkommande tenar-innstillingar feila
+ Sjekking av utgåande tenar-innstillingar feila
+ Utgåande tenar-innstillingar verifisert
+ Innkommande tenar-innstillingar verifisert
+ Sjekkar utgåande tenar-innstillingar…
\ No newline at end of file
diff --git a/feature/account/server/validation/src/main/res/values-pt/strings.xml b/feature/account/server/validation/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/server/validation/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/server/validation/src/main/res/values-sv/strings.xml b/feature/account/server/validation/src/main/res/values-sv/strings.xml
index 21a0d829e9e..4216ee6b2dd 100644
--- a/feature/account/server/validation/src/main/res/values-sv/strings.xml
+++ b/feature/account/server/validation/src/main/res/values-sv/strings.xml
@@ -11,10 +11,9 @@
Var god logga in
Misslyckades att kontrollera inställningarna för utgående server
Inkommande serverinställningar verifierade
- Saknar serverkapabilitet
+ Serverkapacitet saknas
Klientcertifikatet kunde inte nås
- Servern saknar denna kapabilitet:
-\n%s
+ Servern saknar denna kapacitet:\n%s
Klientcertifikatet är inte längre giltigt
Detaljer:
\n%s
diff --git a/feature/account/server/validation/src/main/res/values-uk/strings.xml b/feature/account/server/validation/src/main/res/values-uk/strings.xml
index a6b3daec935..9b3ff78a196 100644
--- a/feature/account/server/validation/src/main/res/values-uk/strings.xml
+++ b/feature/account/server/validation/src/main/res/values-uk/strings.xml
@@ -1,2 +1,19 @@
-
\ No newline at end of file
+
+ Сертифікат клієнта більше недійсний
+ Подробиці:\n%s
+ Перевірка налаштувань вхідного сервера…
+ Не вдалося перевірити вхідні налаштування сервера
+ Налаштування вхідного сервера підтверджено
+ Перевірка налаштувань вихідного сервера…
+ Налаштування вихідного сервера підтверджено
+ Будь ласка, увійдіть
+ Не вдалося перевірити налаштування вихідного сервера
+ Помилка автентифікації
+ Помилка мережі
+ Помилка сервера
+ Невідома помилка
+ Відсутня можливість сервера
+ Не вдалося отримати доступ до сертифіката клієнта
+ На сервері відсутня ця можливість:\n%s
+
\ No newline at end of file
diff --git a/feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenKtTest.kt b/feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenKtTest.kt
index 5ace8d74f32..4c5e36e0d76 100644
--- a/feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenKtTest.kt
+++ b/feature/account/server/validation/src/test/kotlin/app/k9mail/feature/account/server/validation/ui/ServerValidationScreenKtTest.kt
@@ -1,6 +1,6 @@
package app.k9mail.feature.account.server.validation.ui
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.testing.ComposeTest
import app.k9mail.core.ui.compose.testing.setContentWithTheme
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract.Effect
@@ -24,7 +24,7 @@ class ServerValidationScreenKtTest : ComposeTest() {
onNext = { onNextCounter++ },
onBack = { onBackCounter++ },
viewModel = viewModel,
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
@@ -42,7 +42,7 @@ class ServerValidationScreenKtTest : ComposeTest() {
assertThat(onBackCounter).isEqualTo(1)
}
- private object FakeAppNameProvider : AppNameProvider {
- override val appName: String = "K-9 Mail"
+ private object FakeBrandNameProvider : BrandNameProvider {
+ override val brandName: String = "K-9 Mail"
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryContentPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryContentPreview.kt
index adce9822907..5983df11180 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryContentPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryContentPreview.kt
@@ -15,7 +15,7 @@ internal fun AccountAutoDiscoveryContentPreview() {
state = AccountAutoDiscoveryContract.State(),
onEvent = {},
oAuthViewModel = FakeAccountOAuthViewModel(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
@@ -30,7 +30,7 @@ internal fun AccountAutoDiscoveryContentEmailPreview() {
),
onEvent = {},
oAuthViewModel = FakeAccountOAuthViewModel(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
@@ -47,7 +47,7 @@ internal fun AccountAutoDiscoveryContentPasswordPreview() {
),
onEvent = {},
oAuthViewModel = FakeAccountOAuthViewModel(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
@@ -64,7 +64,7 @@ internal fun AccountAutoDiscoveryContentPasswordUntrustedSettingsPreview() {
),
onEvent = {},
oAuthViewModel = FakeAccountOAuthViewModel(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
@@ -80,7 +80,7 @@ internal fun AccountAutoDiscoveryContentPasswordNoSettingsPreview() {
),
onEvent = {},
oAuthViewModel = FakeAccountOAuthViewModel(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
@@ -97,7 +97,7 @@ internal fun AccountAutoDiscoveryContentOAuthPreview() {
),
onEvent = {},
oAuthViewModel = FakeAccountOAuthViewModel(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreenPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreenPreview.kt
index 475248a70aa..79512a42521 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreenPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreenPreview.kt
@@ -6,7 +6,7 @@ import app.k9mail.core.ui.compose.common.annotation.PreviewDevicesWithBackground
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.common.ui.fake.FakeAccountStateRepository
import app.k9mail.feature.account.server.validation.ui.fake.FakeAccountOAuthViewModel
-import app.k9mail.feature.account.setup.ui.fake.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.fake.FakeBrandNameProvider
@Composable
@PreviewDevicesWithBackground
@@ -21,7 +21,7 @@ internal fun AccountAutoDiscoveryScreenPreview() {
accountStateRepository = FakeAccountStateRepository(),
oAuthViewModel = FakeAccountOAuthViewModel(),
),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreenPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreenPreview.kt
index 8fc19716636..c3a3eaa3a9a 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreenPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreenPreview.kt
@@ -5,7 +5,7 @@ import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.common.data.InMemoryAccountStateRepository
import app.k9mail.feature.account.setup.AccountSetupExternalContract.AccountCreator.AccountCreatorResult
-import app.k9mail.feature.account.setup.ui.fake.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.fake.FakeBrandNameProvider
@Composable
@PreviewDevices
@@ -18,7 +18,7 @@ internal fun AccountOptionsScreenK9Preview() {
createAccount = { AccountCreatorResult.Success("irrelevant") },
accountStateRepository = InMemoryAccountStateRepository(),
),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/fake/FakeAppNameProvider.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/fake/FakeAppNameProvider.kt
deleted file mode 100644
index 0e1e4274e7e..00000000000
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/fake/FakeAppNameProvider.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package app.k9mail.feature.account.setup.ui.fake
-
-import app.k9mail.core.common.provider.AppNameProvider
-
-internal object FakeAppNameProvider : AppNameProvider {
- override val appName: String = "Fake App Name"
-}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/fake/FakeBrandNameProvider.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/fake/FakeBrandNameProvider.kt
new file mode 100644
index 00000000000..68c6557ff84
--- /dev/null
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/fake/FakeBrandNameProvider.kt
@@ -0,0 +1,7 @@
+package app.k9mail.feature.account.setup.ui.fake
+
+import app.k9mail.core.common.provider.BrandNameProvider
+
+internal object FakeBrandNameProvider : BrandNameProvider {
+ override val brandName: String = "Fake Brand Name"
+}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsContentPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsContentPreview.kt
index ee41ec2a734..1f331e3a404 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsContentPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsContentPreview.kt
@@ -13,7 +13,7 @@ internal fun DisplayOptionsContentPreview() {
state = DisplayOptionsContract.State(),
onEvent = {},
contentPadding = PaddingValues(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreenPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreenPreview.kt
index d1889f927f4..0199c7d1d4a 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreenPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreenPreview.kt
@@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.common.ui.fake.FakeAccountStateRepository
-import app.k9mail.feature.account.setup.ui.fake.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.fake.FakeBrandNameProvider
@Composable
@Preview(showBackground = true)
@@ -18,7 +18,7 @@ internal fun DisplayOptionsScreenPreview() {
accountStateRepository = FakeAccountStateRepository(),
accountOwnerNameProvider = { null },
),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsContentPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsContentPreview.kt
index 049c76f6912..5d0df81f221 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsContentPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsContentPreview.kt
@@ -13,7 +13,7 @@ internal fun SyncOptionsContentPreview() {
state = SyncOptionsContract.State(),
onEvent = {},
contentPadding = PaddingValues(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreenPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreenPreview.kt
index 93b612afb4a..6e9b8225ef7 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreenPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreenPreview.kt
@@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.account.common.ui.fake.FakeAccountStateRepository
-import app.k9mail.feature.account.setup.ui.fake.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.fake.FakeBrandNameProvider
@Composable
@Preview(showBackground = true)
@@ -16,7 +16,7 @@ internal fun SyncOptionsScreenPreview() {
viewModel = SyncOptionsViewModel(
accountStateRepository = FakeAccountStateRepository(),
),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersContentPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersContentPreview.kt
index cc98abd51e7..46722aea019 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersContentPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersContentPreview.kt
@@ -15,7 +15,7 @@ internal fun SpecialFoldersContentLoadingPreview() {
),
onEvent = {},
contentPadding = PaddingValues(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
@@ -30,7 +30,7 @@ internal fun SpecialFoldersContentFormPreview() {
),
onEvent = {},
contentPadding = PaddingValues(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
@@ -46,7 +46,7 @@ internal fun SpecialFoldersContentSuccessPreview() {
),
onEvent = {},
contentPadding = PaddingValues(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
@@ -62,7 +62,7 @@ internal fun SpecialFoldersContentErrorPreview() {
),
onEvent = {},
contentPadding = PaddingValues(),
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
diff --git a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreenPreview.kt b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreenPreview.kt
index cd599b241d7..2c490cb8044 100644
--- a/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreenPreview.kt
+++ b/feature/account/setup/src/debug/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreenPreview.kt
@@ -3,7 +3,7 @@ package app.k9mail.feature.account.setup.ui.specialfolders
import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
-import app.k9mail.feature.account.setup.ui.fake.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.fake.FakeBrandNameProvider
import app.k9mail.feature.account.setup.ui.specialfolders.fake.FakeSpecialFoldersViewModel
@Composable
@@ -14,7 +14,7 @@ internal fun SpecialFoldersScreenPreview() {
onNext = {},
onBack = {},
viewModel = FakeSpecialFoldersViewModel(),
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
}
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavHost.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavHost.kt
index cad2d5bd9f6..15de4b11f21 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavHost.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavHost.kt
@@ -66,7 +66,7 @@ fun AccountSetupNavHost(
},
onBack = onBack,
viewModel = koinViewModel(),
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
@@ -96,7 +96,7 @@ fun AccountSetupNavHost(
},
onBack = { navController.popBackStack() },
viewModel = koinViewModel(),
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
@@ -127,7 +127,7 @@ fun AccountSetupNavHost(
},
onBack = { navController.popBackStack() },
viewModel = koinViewModel(),
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
@@ -148,7 +148,7 @@ fun AccountSetupNavHost(
},
onBack = { navController.popBackStack() },
viewModel = koinViewModel(),
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
@@ -157,7 +157,7 @@ fun AccountSetupNavHost(
onNext = { navController.navigate(NESTED_NAVIGATION_SYNC_OPTIONS) },
onBack = { navController.popBackStack() },
viewModel = koinViewModel(),
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
@@ -166,7 +166,7 @@ fun AccountSetupNavHost(
onNext = { navController.navigate(NESTED_NAVIGATION_CREATE_ACCOUNT) },
onBack = { navController.popBackStack() },
viewModel = koinViewModel(),
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
@@ -175,7 +175,7 @@ fun AccountSetupNavHost(
onNext = { accountUuid -> onFinish(accountUuid.value) },
onBack = { navController.popBackStack() },
viewModel = koinViewModel(),
- appNameProvider = koinInject(),
+ brandNameProvider = koinInject(),
)
}
}
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryContent.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryContent.kt
index 59263192591..5f09c95b978 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryContent.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryContent.kt
@@ -39,7 +39,7 @@ internal fun AccountAutoDiscoveryContent(
state: State,
onEvent: (Event) -> Unit,
oAuthViewModel: AccountOAuthContract.ViewModel,
- appName: String,
+ brandName: String,
modifier: Modifier = Modifier,
) {
val scrollState = rememberScrollState()
@@ -60,7 +60,7 @@ internal fun AccountAutoDiscoveryContent(
.imePadding(),
) {
AppTitleTopHeader(
- title = appName,
+ title = brandName,
)
Spacer(modifier = Modifier.weight(1f))
AutoDiscoveryContent(
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreen.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreen.kt
index 4ee2f0d579e..c897b694556 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreen.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreen.kt
@@ -3,7 +3,7 @@ package app.k9mail.feature.account.setup.ui.autodiscovery
import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.AutoDiscoveryUiResult
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.Effect
@@ -15,7 +15,7 @@ internal fun AccountAutoDiscoveryScreen(
onNext: (AutoDiscoveryUiResult) -> Unit,
onBack: () -> Unit,
viewModel: ViewModel,
- appNameProvider: AppNameProvider,
+ brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
) {
val (state, dispatch) = viewModel.observe { effect ->
@@ -33,7 +33,7 @@ internal fun AccountAutoDiscoveryScreen(
state = state.value,
onEvent = { dispatch(it) },
oAuthViewModel = viewModel.oAuthViewModel,
- appName = appNameProvider.appName,
+ brandName = brandNameProvider.brandName,
modifier = modifier,
)
}
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreen.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreen.kt
index 10e44644cf4..2d3ade24dc4 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreen.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreen.kt
@@ -4,7 +4,7 @@ import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.feature.account.common.ui.AppTitleTopHeader
@@ -20,7 +20,7 @@ internal fun CreateAccountScreen(
onNext: (AccountUuid) -> Unit,
onBack: () -> Unit,
viewModel: ViewModel,
- appNameProvider: AppNameProvider,
+ brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
) {
val (state, dispatch) = viewModel.observe { effect ->
@@ -41,7 +41,7 @@ internal fun CreateAccountScreen(
Scaffold(
topBar = {
AppTitleTopHeader(
- title = appNameProvider.appName,
+ title = brandNameProvider.brandName,
)
},
bottomBar = {
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsContent.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsContent.kt
index fdb5d303415..0c6b1a18520 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsContent.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsContent.kt
@@ -33,7 +33,7 @@ internal fun DisplayOptionsContent(
state: State,
onEvent: (Event) -> Unit,
contentPadding: PaddingValues,
- appName: String,
+ brandName: String,
modifier: Modifier = Modifier,
) {
val resources = LocalContext.current.resources
@@ -54,7 +54,7 @@ internal fun DisplayOptionsContent(
) {
item {
AppTitleTopHeader(
- title = appName,
+ title = brandName,
)
}
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreen.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreen.kt
index 3afc4db5623..e2c00bd506f 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreen.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreen.kt
@@ -4,7 +4,7 @@ import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.feature.account.common.ui.WizardNavigationBar
@@ -17,7 +17,7 @@ internal fun DisplayOptionsScreen(
onNext: () -> Unit,
onBack: () -> Unit,
viewModel: ViewModel,
- appNameProvider: AppNameProvider,
+ brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
) {
val (state, dispatch) = viewModel.observe { effect ->
@@ -48,7 +48,7 @@ internal fun DisplayOptionsScreen(
state = state.value,
onEvent = { dispatch(it) },
contentPadding = innerPadding,
- appName = appNameProvider.appName,
+ brandName = brandNameProvider.brandName,
)
}
}
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsContent.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsContent.kt
index 211806164fe..c466797ab7b 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsContent.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsContent.kt
@@ -36,7 +36,7 @@ internal fun SyncOptionsContent(
state: State,
onEvent: (Event) -> Unit,
contentPadding: PaddingValues,
- appName: String,
+ brandName: String,
modifier: Modifier = Modifier,
) {
val resources = LocalContext.current.resources
@@ -57,7 +57,7 @@ internal fun SyncOptionsContent(
) {
item {
AppTitleTopHeader(
- title = appName,
+ title = brandName,
)
}
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreen.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreen.kt
index a0855f9e13a..fd8e88a126c 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreen.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreen.kt
@@ -4,7 +4,7 @@ import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.feature.account.common.ui.WizardNavigationBar
@@ -17,7 +17,7 @@ internal fun SyncOptionsScreen(
onNext: () -> Unit,
onBack: () -> Unit,
viewModel: ViewModel,
- appNameProvider: AppNameProvider,
+ brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
) {
val (state, dispatch) = viewModel.observe { effect ->
@@ -48,7 +48,7 @@ internal fun SyncOptionsScreen(
state = state.value,
onEvent = { dispatch(it) },
contentPadding = innerPadding,
- appName = appNameProvider.appName,
+ brandName = brandNameProvider.brandName,
)
}
}
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersContent.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersContent.kt
index 593fdcc080b..611806f6fc4 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersContent.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersContent.kt
@@ -26,7 +26,7 @@ fun SpecialFoldersContent(
state: State,
onEvent: (Event) -> Unit,
contentPadding: PaddingValues,
- appName: String,
+ brandName: String,
modifier: Modifier = Modifier,
) {
ResponsiveWidthContainer(
@@ -37,7 +37,7 @@ fun SpecialFoldersContent(
) {
Column {
AppTitleTopHeader(
- title = appName,
+ title = brandName,
)
ContentLoadingErrorView(
diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreen.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreen.kt
index d4fa7a6edfc..40bdfd26719 100644
--- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreen.kt
+++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreen.kt
@@ -4,7 +4,7 @@ import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.core.ui.compose.designsystem.template.Scaffold
import app.k9mail.feature.account.common.ui.WizardNavigationBar
@@ -18,7 +18,7 @@ fun SpecialFoldersScreen(
onNext: (isManualSetup: Boolean) -> Unit,
onBack: () -> Unit,
viewModel: ViewModel,
- appNameProvider: AppNameProvider,
+ brandNameProvider: BrandNameProvider,
modifier: Modifier = Modifier,
) {
val (state, dispatch) = viewModel.observe { effect ->
@@ -52,7 +52,7 @@ fun SpecialFoldersScreen(
state = state.value,
onEvent = { dispatch(it) },
contentPadding = innerPadding,
- appName = appNameProvider.appName,
+ brandName = brandNameProvider.brandName,
)
}
}
diff --git a/feature/account/setup/src/main/res/values-bg/strings.xml b/feature/account/setup/src/main/res/values-bg/strings.xml
index 1982ae29ce2..05254f0775b 100644
--- a/feature/account/setup/src/main/res/values-bg/strings.xml
+++ b/feature/account/setup/src/main/res/values-bg/strings.xml
@@ -14,7 +14,7 @@
Имейл адресът е задължителен.
Неуспешно зареждане на имейл настройки
Одобрявам тези настройки
- Мрежа
+ Мрежова грешка. Моля проверете връзката си и опитайте отново.
Имейл адресът не беше разпознат като валиден.
Намиране на данни за имейла
Името на акаунта не може да бъде празно.
@@ -27,7 +27,7 @@
Този имейл адрес не се поддържа.
Създаване на акаунт…
Име на акаунта
- Име, което да се показва
+ Вашето име
Името за визуализация е задължително.
Възникна грешка при създаването на акаунта
Никога
diff --git a/feature/account/setup/src/main/res/values-enm/strings.xml b/feature/account/setup/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/setup/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/setup/src/main/res/values-kab/strings.xml b/feature/account/setup/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/setup/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/setup/src/main/res/values-kk/strings.xml b/feature/account/setup/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/setup/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/setup/src/main/res/values-nb-rNO/strings.xml b/feature/account/setup/src/main/res/values-nb-rNO/strings.xml
index 12795721cda..83415ac5fc3 100644
--- a/feature/account/setup/src/main/res/values-nb-rNO/strings.xml
+++ b/feature/account/setup/src/main/res/values-nb-rNO/strings.xml
@@ -22,7 +22,7 @@
Klarte ikke å laste inn e-postoppsett
Jeg stoler på dette oppsettet
Navnet ditt kreves.
- Nettverk
+ Nettverksfeil. Vennligst sjekk tilkoblingen din og prøv på nytt.
Dette er ikke gjenkjent som en gyldig e-postadresse.
Aldri
Finner oppsett …
diff --git a/feature/account/setup/src/main/res/values-nn/strings.xml b/feature/account/setup/src/main/res/values-nn/strings.xml
index c0aacf6a5ea..a37892c3998 100644
--- a/feature/account/setup/src/main/res/values-nn/strings.xml
+++ b/feature/account/setup/src/main/res/values-nn/strings.xml
@@ -51,4 +51,12 @@
- 1 melding
- %d meldingar
+ Nettverksfeil. Ver vennleg og sjekk nettverkstatus, og prøv igjen.
+ Spesifiser spesialmapper for kontoen din.
+ Hentar liste over mapper…
+ Kunne ikkje hente liste over mapper frå tenaren
+ Alle spesialmapper har vorte konfigurert automatisk av tenaren.
+ Sjekk frekvens
+ \"Automatisk\"-oppføringa vil følgje endringar frå tenaren automatisk. Den gjeldande tenar-verdien er vist i parantes.
+ Me mottok konfigurasjonen for e-post-tenaren din over ein tilkopling som ikkje var så sikker som med hadde likt. Det betyr at det er ein liten sjanse nokon kan ha tukla med den. Kan du dobbelsjekke at den mottekne konfigurasjonen er rett?
\ No newline at end of file
diff --git a/feature/account/setup/src/main/res/values-pl/strings.xml b/feature/account/setup/src/main/res/values-pl/strings.xml
index fefb2fe0840..5b4461cb0b0 100644
--- a/feature/account/setup/src/main/res/values-pl/strings.xml
+++ b/feature/account/setup/src/main/res/values-pl/strings.xml
@@ -18,11 +18,11 @@
Nazwa konta
Znaleziono konfigurację
Adres e-mail jest wymagany.
- Twoje imię i nazwisko
+ Twoje imię i nazwisko
Nie udało się wczytać konfiguracji poczty e-mail
Ufam tej konfiguracji
- Twoje imię i nazwisko jest wymagane.
- Błąd sieci. Sprawdź stan połączenia i spróbuj ponownie.
+ Twoje imię i nazwisko jest wymagane.
+ Błąd sieci. Sprawdź stan połączenia i spróbuj ponownie.
Nie jest rozpoznawany jako prawidłowy adres e-mail.
Nigdy
Sprawdzanie konfiguracji…
@@ -37,7 +37,7 @@
Wszystkie foldery specjalne zostały skonfigurowane automatycznie przez serwer.
Automatyczny (%s)
Folder wersji roboczych
- Nie udało się pobrać listy folderów z serwera
+ Nie udało się pobrać listy folderów z serwera
Pobieranie listy folderów…
Określ foldery specjalne dla swojego konta.
Folder wysłanych
@@ -45,7 +45,7 @@
Folder kosza
Folder archiwum
Folder spamu
- Pozycja „Automatyczny” będzie podążać automatycznie za zmianami wprowadzonymi przez serwer. Bieżąca wartość serwera jest wyświetlana w nawiasach.
+ Pozycja „Automatyczny” będzie podążać automatycznie za zmianami wprowadzonymi przez serwer. Bieżąca wartość serwera jest wyświetlana w nawiasach.
Hasło jest wymagane.
- Co minutę
diff --git a/feature/account/setup/src/main/res/values-pt/strings.xml b/feature/account/setup/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/account/setup/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/account/setup/src/main/res/values-sv/strings.xml b/feature/account/setup/src/main/res/values-sv/strings.xml
index 11a3669df52..57efa1acf8a 100644
--- a/feature/account/setup/src/main/res/values-sv/strings.xml
+++ b/feature/account/setup/src/main/res/values-sv/strings.xml
@@ -1,7 +1,7 @@
Kontonamn kan inte vara tomt.
- Kolla efter ny e-post frekvens
+ Frekvenskontroll
Konfigurera automatiskt
Denna konfiguration är inte pålitlig
E-postsignatur
@@ -19,7 +19,7 @@
Misslyckades att ladda e-postkonfiguration
Jag litar på denna konfiguration
Ditt namn krävs.
- Nätverksfel. Vänligen kontrollera din anslutningsstatus och försök igen.
+ Nätverksfel. Vänligen se över din uppkoppling och försök igen.
Aldrig
Söker upp konfiguration…
Synkroniseringsinställningar
@@ -45,7 +45,7 @@
Papperskorgen mapp
Arkiv mapp
Spam mapp
- Den \"Automatiska\" Inmatningen följer automatiskt ändringar som görs av servern. Det aktuella servervärdet visas inom parentes.
+ Inmatningen \"Automatisk\" följer automatiskt ändringar som görs av servern. Det aktuella servervärdet visas inom parentes.
Lösenord krävs.
- 1 meddelande
@@ -53,10 +53,10 @@
- Varje minut
- - Var %d minuter
+ - Var %d minut
- Varje timme
- - Var %d timmar
+ - Var %d timme
\ No newline at end of file
diff --git a/feature/account/setup/src/main/res/values-uk/strings.xml b/feature/account/setup/src/main/res/values-uk/strings.xml
index a6b3daec935..3160e3a50a6 100644
--- a/feature/account/setup/src/main/res/values-uk/strings.xml
+++ b/feature/account/setup/src/main/res/values-uk/strings.xml
@@ -1,2 +1,68 @@
-
\ No newline at end of file
+
+ SSL/TLS
+ StartTLS
+ Не вдалося отримати список тек із сервера
+ Вкажіть спеціальні теки для вашого облікового запису.
+ Запис «Автоматично» буде автоматично слідувати за змінами, зробленими сервером. Поточне значення сервера показано в круглих дужках.
+ Отримання списку тек…
+ Усі спеціальні теки налаштовані сервером автоматично.
+ Тека «Архів»
+ Тека «Чернетки»
+ Тека «Надіслані»
+ Тека «Кошик»
+ Тека «Спам»
+ Автоматично (%s)
+ Ніколи
+ Кількість показуваних повідомлень
+ Показувати сповіщення
+ Виникла помилка під час спроби створити обліковий запис
+ Обліковий запис створено
+ Пароль обов\'язковий.
+ Це не довірена конфігурація
+ Ми отримали конфігурацію вашого поштового сервера через з\'єднання, яке недостатньо захищене. Це означає, що існує незначна ймовірність, що хтось міг його видозмінити. Чи могли б ви ще раз перевірити надану конфігурацію, щоб переконатися, що вона правильна?
+ Налаштувати вручну
+ Опції показу
+ Ім\'я облікового запису
+ Підпис е-пошти
+ Створення облікового запису…
+ Ім\'я облікового запису не може бути порожнім.
+ Ваше ім\'я
+ Потрібно вказати ім\'я.
+ Помилка в мережі. Перевірте стан вашого з\'єднання та повторіть спробу.
+ Невідома помилка
+ Адреса е-пошти обов\'язкова.
+ Конфігурація знайдена
+ Налаштувати автоматично
+ Ця адреса е-пошти не підтримується.
+ Конфігурація не знайдена
+ Я довіряю цій конфігурації
+ Ця адреса е-пошти не дозволена.
+ Ця адреса е-пошти не розпізнана дійсною.
+ Пошук конфігурації…
+ Не вдалося завантажити конфігурацію е-пошти
+ Змінити конфігурацію
+ Підтвердження конфігурації обовʼязкове.
+ Немає
+ Підпис е-пошти не може бути порожнім.
+
+ - Щохвилини
+ - Що %d хвилини
+ - Що %d хвилин
+ - Що %d хвилин
+
+ Параметри синхронізації
+ Частота перевірки
+
+ - Щогодини
+ - Що %d години
+ - Що %d годин
+ - Що %d годин
+
+
+ - 1 повідомлення
+ - %d повідомлення
+ - %d повідомлень
+ - %d повідомлень
+
+
\ No newline at end of file
diff --git a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/AccountSetupModuleKtTest.kt b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/AccountSetupModuleKtTest.kt
index d7cf766a8d1..b8c7799ec5f 100644
--- a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/AccountSetupModuleKtTest.kt
+++ b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/AccountSetupModuleKtTest.kt
@@ -3,7 +3,7 @@ package app.k9mail.feature.account.setup
import android.content.Context
import app.k9mail.autodiscovery.api.AutoDiscovery
import app.k9mail.core.common.oauth.OAuthConfigurationFactory
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.feature.account.common.AccountCommonExternalContract
import app.k9mail.feature.account.common.domain.entity.AccountState
import app.k9mail.feature.account.common.domain.entity.InteractionMode
@@ -14,7 +14,7 @@ import app.k9mail.feature.account.server.settings.ui.outgoing.OutgoingServerSett
import app.k9mail.feature.account.server.validation.ui.ServerValidationContract
import app.k9mail.feature.account.setup.AccountSetupExternalContract.AccountCreator
import app.k9mail.feature.account.setup.AccountSetupExternalContract.AccountCreator.AccountCreatorResult
-import app.k9mail.feature.account.setup.ui.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.FakeBrandNameProvider
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract
import app.k9mail.feature.account.setup.ui.createaccount.CreateAccountContract
import app.k9mail.feature.account.setup.ui.options.display.DisplayOptionsContract
@@ -66,7 +66,7 @@ class AccountSetupModuleKtTest : KoinTest {
single { mock() }
factory { mock() }
single>(named("extraAutoDiscoveries")) { emptyList() }
- single { FakeAppNameProvider }
+ single { FakeBrandNameProvider }
}
@Test
diff --git a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/FakeAppNameProvider.kt b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/FakeAppNameProvider.kt
deleted file mode 100644
index 7f1c7714626..00000000000
--- a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/FakeAppNameProvider.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package app.k9mail.feature.account.setup.ui
-
-import app.k9mail.core.common.provider.AppNameProvider
-
-internal object FakeAppNameProvider : AppNameProvider {
- override val appName: String = "Fake App Name"
-}
diff --git a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/FakeBrandNameProvider.kt b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/FakeBrandNameProvider.kt
new file mode 100644
index 00000000000..2795ff10cf5
--- /dev/null
+++ b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/FakeBrandNameProvider.kt
@@ -0,0 +1,7 @@
+package app.k9mail.feature.account.setup.ui
+
+import app.k9mail.core.common.provider.BrandNameProvider
+
+internal object FakeBrandNameProvider : BrandNameProvider {
+ override val brandName: String = "Fake Brand Name"
+}
diff --git a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreenKtTest.kt b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreenKtTest.kt
index dec3ec550e3..e4a5bf2bd0a 100644
--- a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreenKtTest.kt
+++ b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/autodiscovery/AccountAutoDiscoveryScreenKtTest.kt
@@ -3,7 +3,7 @@ package app.k9mail.feature.account.setup.ui.autodiscovery
import app.k9mail.core.ui.compose.testing.ComposeTest
import app.k9mail.core.ui.compose.testing.setContentWithTheme
import app.k9mail.feature.account.common.domain.entity.IncomingProtocolType
-import app.k9mail.feature.account.setup.ui.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.FakeBrandNameProvider
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.Effect
import app.k9mail.feature.account.setup.ui.autodiscovery.AccountAutoDiscoveryContract.State
import assertk.assertThat
@@ -25,7 +25,7 @@ class AccountAutoDiscoveryScreenKtTest : ComposeTest() {
onNext = { onNextCounter++ },
onBack = { onBackCounter++ },
viewModel = viewModel,
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
diff --git a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreenTest.kt b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreenTest.kt
index 6fa027fc42a..8bac1f6b9f4 100644
--- a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreenTest.kt
+++ b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/createaccount/CreateAccountScreenTest.kt
@@ -3,7 +3,7 @@ package app.k9mail.feature.account.setup.ui.createaccount
import app.k9mail.core.ui.compose.testing.ComposeTest
import app.k9mail.core.ui.compose.testing.setContentWithTheme
import app.k9mail.feature.account.setup.domain.entity.AccountUuid
-import app.k9mail.feature.account.setup.ui.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.FakeBrandNameProvider
import app.k9mail.feature.account.setup.ui.createaccount.CreateAccountContract.Effect
import app.k9mail.feature.account.setup.ui.createaccount.CreateAccountContract.State
import assertk.assertThat
@@ -31,7 +31,7 @@ class CreateAccountScreenTest : ComposeTest() {
onNext = { accountUuid -> navigateNextArguments.add(accountUuid) },
onBack = { navigateBackCounter++ },
viewModel = viewModel,
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
diff --git a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreenKtTest.kt b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreenKtTest.kt
index 33ba23f8ba1..aa514f1c40a 100644
--- a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreenKtTest.kt
+++ b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/options/display/DisplayOptionsScreenKtTest.kt
@@ -2,7 +2,7 @@ package app.k9mail.feature.account.setup.ui.options.display
import app.k9mail.core.ui.compose.testing.ComposeTest
import app.k9mail.core.ui.compose.testing.setContentWithTheme
-import app.k9mail.feature.account.setup.ui.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.FakeBrandNameProvider
import app.k9mail.feature.account.setup.ui.options.display.DisplayOptionsContract.Effect
import app.k9mail.feature.account.setup.ui.options.display.DisplayOptionsContract.State
import assertk.assertThat
@@ -24,7 +24,7 @@ class DisplayOptionsScreenKtTest : ComposeTest() {
onNext = { onNextCounter++ },
onBack = { onBackCounter++ },
viewModel = viewModel,
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
diff --git a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreenKtTest.kt b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreenKtTest.kt
index 42510f2c568..ec277145aea 100644
--- a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreenKtTest.kt
+++ b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/options/sync/SyncOptionsScreenKtTest.kt
@@ -2,7 +2,7 @@ package app.k9mail.feature.account.setup.ui.options.sync
import app.k9mail.core.ui.compose.testing.ComposeTest
import app.k9mail.core.ui.compose.testing.setContentWithTheme
-import app.k9mail.feature.account.setup.ui.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.FakeBrandNameProvider
import app.k9mail.feature.account.setup.ui.options.sync.SyncOptionsContract.Effect
import app.k9mail.feature.account.setup.ui.options.sync.SyncOptionsContract.State
import assertk.assertThat
@@ -24,7 +24,7 @@ class SyncOptionsScreenKtTest : ComposeTest() {
onNext = { onNextCounter++ },
onBack = { onBackCounter++ },
viewModel = viewModel,
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
diff --git a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreenKtTest.kt b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreenKtTest.kt
index fe87b83a3e5..d5d10961c8c 100644
--- a/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreenKtTest.kt
+++ b/feature/account/setup/src/test/kotlin/app/k9mail/feature/account/setup/ui/specialfolders/SpecialFoldersScreenKtTest.kt
@@ -2,7 +2,7 @@ package app.k9mail.feature.account.setup.ui.specialfolders
import app.k9mail.core.ui.compose.testing.ComposeTest
import app.k9mail.core.ui.compose.testing.setContentWithTheme
-import app.k9mail.feature.account.setup.ui.FakeAppNameProvider
+import app.k9mail.feature.account.setup.ui.FakeBrandNameProvider
import app.k9mail.feature.account.setup.ui.specialfolders.SpecialFoldersContract.Effect
import app.k9mail.feature.account.setup.ui.specialfolders.SpecialFoldersContract.State
import app.k9mail.feature.account.setup.ui.specialfolders.fake.FakeSpecialFoldersViewModel
@@ -25,7 +25,7 @@ class SpecialFoldersScreenKtTest : ComposeTest() {
onNext = { onNextCounter++ },
onBack = { onBackCounter++ },
viewModel = viewModel,
- appNameProvider = FakeAppNameProvider,
+ brandNameProvider = FakeBrandNameProvider,
)
}
diff --git a/feature/funding/googleplay/build.gradle.kts b/feature/funding/googleplay/build.gradle.kts
index 5de7b3512ff..0af29b076c0 100644
--- a/feature/funding/googleplay/build.gradle.kts
+++ b/feature/funding/googleplay/build.gradle.kts
@@ -10,10 +10,12 @@ android {
dependencies {
api(projects.feature.funding.api)
+ implementation(projects.core.common)
implementation(projects.core.ui.compose.designsystem)
implementation(libs.android.billing)
implementation(libs.android.billing.ktx)
+ implementation(libs.timber)
testImplementation(projects.core.ui.compose.testing)
}
diff --git a/feature/funding/googleplay/src/debug/AndroidManifest.xml b/feature/funding/googleplay/src/debug/AndroidManifest.xml
new file mode 100644
index 00000000000..43db1e8af73
--- /dev/null
+++ b/feature/funding/googleplay/src/debug/AndroidManifest.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionFooterPreview.kt b/feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionFooterPreview.kt
index d991d8bc5a9..c391b971ede 100644
--- a/feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionFooterPreview.kt
+++ b/feature/funding/googleplay/src/debug/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionFooterPreview.kt
@@ -11,8 +11,10 @@ fun ContributionFooterPreview() {
ContributionFooter(
onPurchaseClick = {},
onManagePurchaseClick = {},
+ onShowContributionListClick = {},
purchasedContribution = null,
isPurchaseEnabled = true,
+ isContributionListShown = true,
)
}
}
@@ -22,9 +24,11 @@ fun ContributionFooterPreview() {
fun ContributionFooterDisabledPreview() {
PreviewWithTheme {
ContributionFooter(
+ purchasedContribution = null,
onPurchaseClick = {},
onManagePurchaseClick = {},
- purchasedContribution = null,
+ onShowContributionListClick = {},
+ isContributionListShown = false,
isPurchaseEnabled = false,
)
}
@@ -35,10 +39,42 @@ fun ContributionFooterDisabledPreview() {
fun ContributionFooterWithRecurringContributionPreview() {
PreviewWithTheme {
ContributionFooter(
+ purchasedContribution = FakeData.recurringContribution,
onPurchaseClick = {},
onManagePurchaseClick = {},
- purchasedContribution = FakeData.recurringContribution,
+ onShowContributionListClick = {},
+ isPurchaseEnabled = true,
+ isContributionListShown = false,
+ )
+ }
+}
+
+@Composable
+@Preview(showBackground = true)
+fun ContributionFooterWithOneTimeContributionPreview() {
+ PreviewWithTheme {
+ ContributionFooter(
+ purchasedContribution = FakeData.oneTimeContribution,
+ onPurchaseClick = {},
+ onManagePurchaseClick = {},
+ onShowContributionListClick = {},
+ isPurchaseEnabled = true,
+ isContributionListShown = false,
+ )
+ }
+}
+
+@Composable
+@Preview(showBackground = true)
+fun ContributionFooterWithOneTimeContributionAndListPreview() {
+ PreviewWithTheme {
+ ContributionFooter(
+ purchasedContribution = FakeData.oneTimeContribution,
+ onPurchaseClick = {},
+ onManagePurchaseClick = {},
+ onShowContributionListClick = {},
isPurchaseEnabled = true,
+ isContributionListShown = true,
)
}
}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/FeatureFundingModule.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/FeatureFundingModule.kt
index ecc5a2a45de..f0d41af574f 100644
--- a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/FeatureFundingModule.kt
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/FeatureFundingModule.kt
@@ -1,9 +1,16 @@
package app.k9mail.feature.funding
+import app.k9mail.core.common.cache.InMemoryCache
import app.k9mail.feature.funding.api.FundingManager
import app.k9mail.feature.funding.api.FundingNavigation
import app.k9mail.feature.funding.googleplay.GooglePlayFundingManager
import app.k9mail.feature.funding.googleplay.GooglePlayFundingNavigation
+import app.k9mail.feature.funding.googleplay.data.DataContract
+import app.k9mail.feature.funding.googleplay.data.GoogleBillingClient
+import app.k9mail.feature.funding.googleplay.data.mapper.ProductDetailsMapper
+import app.k9mail.feature.funding.googleplay.domain.BillingManager
+import app.k9mail.feature.funding.googleplay.domain.ContributionIdProvider
+import app.k9mail.feature.funding.googleplay.domain.DomainContract
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module
@@ -12,5 +19,32 @@ val featureFundingModule = module {
single { GooglePlayFundingManager() }
single { GooglePlayFundingNavigation() }
- viewModel { ContributionViewModel() }
+ single {
+ ProductDetailsMapper()
+ }
+
+ single {
+ GoogleBillingClient(
+ context = get(),
+ productMapper = get(),
+ productCache = InMemoryCache(),
+ )
+ }
+
+ single {
+ ContributionIdProvider()
+ }
+
+ single {
+ BillingManager(
+ billingClient = get(),
+ contributionIdProvider = get(),
+ )
+ }
+
+ viewModel {
+ ContributionViewModel(
+ billingManager = get(),
+ )
+ }
}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/DataContract.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/DataContract.kt
new file mode 100644
index 00000000000..ea6ee5f9036
--- /dev/null
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/DataContract.kt
@@ -0,0 +1,61 @@
+package app.k9mail.feature.funding.googleplay.data
+
+import android.app.Activity
+import app.k9mail.feature.funding.googleplay.domain.entity.Contribution
+import app.k9mail.feature.funding.googleplay.domain.entity.OneTimeContribution
+import app.k9mail.feature.funding.googleplay.domain.entity.RecurringContribution
+import com.android.billingclient.api.ProductDetails
+
+interface DataContract {
+
+ interface Mapper {
+ interface Product {
+ fun mapToContribution(product: ProductDetails): Contribution
+
+ fun mapToOneTimeContribution(product: ProductDetails): OneTimeContribution
+ fun mapToRecurringContribution(product: ProductDetails): RecurringContribution
+ }
+ }
+
+ interface BillingClient {
+
+ /**
+ * Connect to the billing service.
+ *
+ * @param onConnected Callback to be invoked when the billing service is connected.
+ */
+ suspend fun connect(onConnected: suspend () -> T): T
+
+ /**
+ * Disconnect from the billing service.
+ */
+ fun disconnect()
+
+ /**
+ * Load one-time contributions.
+ */
+ suspend fun loadOneTimeContributions(
+ productIds: List,
+ ): List
+
+ /**
+ * Load recurring contributions.
+ */
+ suspend fun loadRecurringContributions(
+ productIds: List,
+ ): List
+
+ /**
+ * Load purchased contributions.
+ */
+ suspend fun loadPurchasedContributions(): List
+
+ /**
+ * Purchase a contribution.
+ */
+ suspend fun purchaseContribution(
+ activity: Activity,
+ contribution: Contribution,
+ ): Contribution?
+ }
+}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/GoogleBillingClient.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/GoogleBillingClient.kt
new file mode 100644
index 00000000000..20acfc30932
--- /dev/null
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/GoogleBillingClient.kt
@@ -0,0 +1,307 @@
+package app.k9mail.feature.funding.googleplay.data
+
+import android.app.Activity
+import android.content.Context
+import app.k9mail.core.common.cache.Cache
+import app.k9mail.feature.funding.googleplay.domain.entity.Contribution
+import app.k9mail.feature.funding.googleplay.domain.entity.OneTimeContribution
+import app.k9mail.feature.funding.googleplay.domain.entity.RecurringContribution
+import com.android.billingclient.api.AcknowledgePurchaseParams
+import com.android.billingclient.api.BillingClient
+import com.android.billingclient.api.BillingClient.BillingResponseCode
+import com.android.billingclient.api.BillingClient.ProductType
+import com.android.billingclient.api.BillingClientStateListener
+import com.android.billingclient.api.BillingFlowParams
+import com.android.billingclient.api.BillingFlowParams.ProductDetailsParams
+import com.android.billingclient.api.BillingResult
+import com.android.billingclient.api.ConsumeParams
+import com.android.billingclient.api.PendingPurchasesParams
+import com.android.billingclient.api.ProductDetails
+import com.android.billingclient.api.ProductDetailsResult
+import com.android.billingclient.api.Purchase
+import com.android.billingclient.api.PurchasesResult
+import com.android.billingclient.api.PurchasesUpdatedListener
+import com.android.billingclient.api.QueryProductDetailsParams
+import com.android.billingclient.api.QueryPurchaseHistoryParams
+import com.android.billingclient.api.QueryPurchasesParams
+import com.android.billingclient.api.acknowledgePurchase
+import com.android.billingclient.api.consumePurchase
+import com.android.billingclient.api.queryProductDetails
+import com.android.billingclient.api.queryPurchaseHistory
+import com.android.billingclient.api.queryPurchasesAsync
+import kotlin.coroutines.CoroutineContext
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.suspendCancellableCoroutine
+import timber.log.Timber
+
+@Suppress("TooManyFunctions")
+class GoogleBillingClient(
+ private val context: Context,
+ private val productMapper: DataContract.Mapper.Product,
+ private val productCache: Cache,
+ backgroundDispatcher: CoroutineContext = Dispatchers.IO,
+) : DataContract.BillingClient, PurchasesUpdatedListener {
+
+ private val coroutineScope = CoroutineScope(backgroundDispatcher)
+
+ private val billingClient: BillingClient by lazy {
+ BillingClient.newBuilder(context)
+ .setListener(this)
+ .enablePendingPurchases(
+ PendingPurchasesParams.newBuilder()
+ .enableOneTimeProducts()
+ .build(),
+ )
+ .build()
+ }
+
+ override suspend fun connect(onConnected: suspend () -> T): T {
+ return suspendCancellableCoroutine { continuation ->
+ billingClient.startConnection(
+ object : BillingClientStateListener {
+ override fun onBillingSetupFinished(billingResult: BillingResult) {
+ if (billingResult.responseCode == BillingResponseCode.OK) {
+ continuation.resumeWith(
+ Result.runCatching {
+ runBlocking { onConnected() }
+ },
+ )
+ } else {
+ continuation.resumeWith(
+ Result.failure(
+ IllegalStateException(
+ "Error connecting to billing service: ${billingResult.responseCode}",
+ ),
+ ),
+ )
+ }
+ }
+
+ override fun onBillingServiceDisconnected() {
+ continuation.resumeWith(
+ Result.failure(
+ IllegalStateException("Billing service disconnected"),
+ ),
+ )
+ }
+ },
+ )
+ }
+ }
+
+ override fun disconnect() {
+ productCache.clear()
+ // TODO: this is not working as expected and leads to crashes: SERVICE_DISCONNECTED
+// billingClient.endConnection()
+ }
+
+ override suspend fun loadOneTimeContributions(productIds: List): List {
+ val oneTimeProductsResult = queryProducts(ProductType.INAPP, productIds)
+ return if (oneTimeProductsResult.billingResult.responseCode == BillingResponseCode.OK) {
+ oneTimeProductsResult.productDetailsList.orEmpty().map {
+ val contribution = productMapper.mapToOneTimeContribution(it)
+ productCache[it.productId] = it
+ contribution
+ }
+ } else {
+ Timber.e(
+ "Error loading one-time products: ${oneTimeProductsResult.billingResult.responseCode}",
+ )
+ emptyList()
+ }
+ }
+
+ override suspend fun loadRecurringContributions(productIds: List): List {
+ val recurringProductsResult = queryProducts(ProductType.SUBS, productIds)
+ return if (recurringProductsResult.billingResult.responseCode == BillingResponseCode.OK) {
+ recurringProductsResult.productDetailsList.orEmpty().map {
+ val contribution = productMapper.mapToRecurringContribution(it)
+ productCache[it.productId] = it
+ contribution
+ }
+ } else {
+ Timber.e(
+ "Error querying recurring products: ${recurringProductsResult.billingResult.debugMessage}",
+ )
+ emptyList()
+ }
+ }
+
+ override suspend fun loadPurchasedContributions(): List {
+ val inAppPurchases = queryPurchase(ProductType.INAPP)
+ val subscriptionPurchases = queryPurchase(ProductType.SUBS)
+ val contributions = handlePurchases(inAppPurchases.purchasesList + subscriptionPurchases.purchasesList)
+ val recentContribution = if (inAppPurchases.purchasesList.isEmpty()) {
+ loadInAppPurchaseHistory()
+ } else {
+ null
+ }
+
+ return if (recentContribution != null) {
+ contributions + recentContribution
+ } else {
+ contributions
+ }
+ }
+
+ private suspend fun loadInAppPurchaseHistory(): Contribution? {
+ val queryPurchaseHistoryParams = QueryPurchaseHistoryParams.newBuilder()
+ .setProductType(ProductType.INAPP)
+ .build()
+
+ val result = billingClient.queryPurchaseHistory(queryPurchaseHistoryParams)
+ return if (result.billingResult.responseCode == BillingResponseCode.OK) {
+ val recentPurchaseId = result.purchaseHistoryRecordList.orEmpty().firstOrNull()?.products?.filter {
+ productCache.hasKey(it)
+ }?.firstOrNull()
+
+ if (recentPurchaseId != null) {
+ val recentPurchase = productCache[recentPurchaseId]
+ productMapper.mapToContribution(recentPurchase!!)
+ } else {
+ Timber.e("No recent purchase found: ${result.billingResult.debugMessage}")
+ null
+ }
+ } else {
+ Timber.e("Error querying purchase history: ${result.billingResult.debugMessage}")
+ null
+ }
+ }
+
+ private suspend fun queryProducts(
+ productType: String,
+ productIds: List,
+ ): ProductDetailsResult {
+ val productList = productIds.map { mapIdToProduct(productType, it) }
+
+ val queryProductDetailsParams = QueryProductDetailsParams.newBuilder()
+ .setProductList(productList)
+ .build()
+
+ return billingClient.queryProductDetails(queryProductDetailsParams)
+ }
+
+ private fun mapIdToProduct(
+ productType: String,
+ productId: String,
+ ): QueryProductDetailsParams.Product {
+ return QueryProductDetailsParams.Product.newBuilder()
+ .setProductType(productType)
+ .setProductId(productId)
+ .build()
+ }
+
+ private suspend fun queryPurchase(productType: String): PurchasesResult {
+ val queryPurchaseParams = QueryPurchasesParams.newBuilder()
+ .setProductType(productType)
+ .build()
+
+ return billingClient.queryPurchasesAsync(queryPurchaseParams)
+ }
+
+ override suspend fun purchaseContribution(activity: Activity, contribution: Contribution): Contribution? {
+ val productDetails = productCache[contribution.id] ?: return null
+ val offerToken = productDetails.subscriptionOfferDetails?.firstOrNull()?.offerToken
+
+ val productDetailsParamsList = listOf(
+ ProductDetailsParams.newBuilder()
+ .setProductDetails(productDetails)
+ .apply {
+ if (offerToken != null) {
+ setOfferToken(offerToken)
+ }
+ }
+ .build(),
+ )
+
+ val billingFlowParams = BillingFlowParams.newBuilder()
+ .setProductDetailsParamsList(productDetailsParamsList)
+ .build()
+
+ val result = billingClient.launchBillingFlow(activity, billingFlowParams)
+ return if (result.responseCode == BillingResponseCode.OK) {
+ contribution
+ } else {
+ null
+ }
+ }
+
+ override fun onPurchasesUpdated(billingResult: BillingResult, purchases: MutableList?) {
+ when (billingResult.responseCode) {
+ BillingResponseCode.OK -> coroutineScope.launch {
+ handlePurchases(purchases)
+ }
+
+ BillingResponseCode.USER_CANCELED -> {
+ Timber.d("User canceled the purchase")
+ }
+
+ BillingResponseCode.ITEM_ALREADY_OWNED -> coroutineScope.launch {
+ Timber.d("Item already owned by the user")
+ // TODO: Update purchases in this case
+ }
+
+ BillingResponseCode.DEVELOPER_ERROR -> {
+ // Make sure the SKU product id is correct and the test apk is signed with a release key.
+ Timber.e("Developer error: ${billingResult.debugMessage}")
+ }
+
+ else -> {
+ Timber.e(
+ "Response Code: ${billingResult.responseCode} " +
+ "Billing error: ${billingResult.debugMessage}",
+ )
+ }
+ }
+ }
+
+ private suspend fun handlePurchases(purchases: List?): List {
+ return purchases?.mapNotNull { purchase ->
+ handlePurchase(purchase)
+ } ?: emptyList()
+ }
+
+ private suspend fun handlePurchase(purchase: Purchase): Contribution? {
+ consumePurchase(purchase)
+
+ return if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {
+ val product = purchase.products.firstOrNull()?.let { productCache[it] } ?: return null
+ val contribution = productMapper.mapToContribution(product)
+
+ if (!purchase.isAcknowledged) {
+ val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
+ .setPurchaseToken(purchase.purchaseToken)
+ .build()
+
+ val acknowledgeResult: BillingResult = billingClient.acknowledgePurchase(acknowledgePurchaseParams)
+
+ if (acknowledgeResult.responseCode != BillingResponseCode.OK) {
+ contribution
+ } else {
+ // handle acknowledge error
+ Timber.e("acknowledgePurchase failed")
+ null
+ }
+ } else {
+ Timber.e("purchase already acknowledged")
+ null
+ }
+ } else {
+ Timber.e("purchase not purchased")
+ null
+ }
+ }
+
+ private suspend fun consumePurchase(purchase: Purchase) {
+ val consumeParams = ConsumeParams.newBuilder()
+ .setPurchaseToken(purchase.purchaseToken)
+ .build()
+
+ // This could fail but we can ignore the error as we handle purchases
+ // the next time the purchases are requested
+ billingClient.consumePurchase(consumeParams)
+ }
+}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/mapper/ProductDetailsMapper.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/mapper/ProductDetailsMapper.kt
new file mode 100644
index 00000000000..a27017077ba
--- /dev/null
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/data/mapper/ProductDetailsMapper.kt
@@ -0,0 +1,57 @@
+package app.k9mail.feature.funding.googleplay.data.mapper
+
+import app.k9mail.feature.funding.googleplay.data.DataContract.Mapper
+import app.k9mail.feature.funding.googleplay.domain.entity.Contribution
+import app.k9mail.feature.funding.googleplay.domain.entity.OneTimeContribution
+import app.k9mail.feature.funding.googleplay.domain.entity.RecurringContribution
+import com.android.billingclient.api.BillingClient
+import com.android.billingclient.api.ProductDetails
+
+class ProductDetailsMapper : Mapper.Product {
+
+ override fun mapToContribution(product: ProductDetails): Contribution {
+ return when (product.productType) {
+ BillingClient.ProductType.INAPP -> mapToOneTimeContribution(product)
+ BillingClient.ProductType.SUBS -> mapToRecurringContribution(product)
+ else -> throw IllegalArgumentException("Unknown product type: ${product.productType}")
+ }
+ }
+
+ override fun mapToOneTimeContribution(product: ProductDetails): OneTimeContribution {
+ require(product.productType == BillingClient.ProductType.INAPP) { "Product type must be INAPP" }
+
+ val offerDetails = product.oneTimePurchaseOfferDetails
+
+ return if (offerDetails != null) {
+ OneTimeContribution(
+ id = product.productId,
+ title = product.name,
+ description = product.description.replace("\n", ""),
+ price = offerDetails.priceAmountMicros,
+ priceFormatted = offerDetails.formattedPrice,
+ )
+ } else {
+ error("One-time product has no offer details: ${product.productId}")
+ }
+ }
+
+ override fun mapToRecurringContribution(product: ProductDetails): RecurringContribution {
+ require(product.productType == BillingClient.ProductType.SUBS) { "Product type must be SUBS" }
+
+ // We assume the product has only one offer and one pricing phase
+ val pricingPhase =
+ product.subscriptionOfferDetails?.firstOrNull()?.pricingPhases?.pricingPhaseList?.firstOrNull()
+
+ return if (pricingPhase != null) {
+ RecurringContribution(
+ id = product.productId,
+ title = product.name,
+ description = product.description.replace("\n", ""),
+ price = pricingPhase.priceAmountMicros,
+ priceFormatted = pricingPhase.formattedPrice,
+ )
+ } else {
+ error("Subscription product has no pricing phase: ${product.productId}")
+ }
+ }
+}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/BillingManager.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/BillingManager.kt
new file mode 100644
index 00000000000..086666721ea
--- /dev/null
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/BillingManager.kt
@@ -0,0 +1,44 @@
+package app.k9mail.feature.funding.googleplay.domain
+
+import android.app.Activity
+import app.k9mail.feature.funding.googleplay.data.DataContract
+import app.k9mail.feature.funding.googleplay.domain.entity.Contribution
+import app.k9mail.feature.funding.googleplay.domain.entity.OneTimeContribution
+import app.k9mail.feature.funding.googleplay.domain.entity.RecurringContribution
+
+class BillingManager(
+ private val billingClient: DataContract.BillingClient,
+ private val contributionIdProvider: DomainContract.ContributionIdProvider,
+) : DomainContract.BillingManager {
+
+ override suspend fun loadOneTimeContributions(): List {
+ return billingClient.connect {
+ billingClient.loadOneTimeContributions(contributionIdProvider.oneTimeContributionIds)
+ .sortedByDescending { it.price }
+ }
+ }
+
+ override suspend fun loadRecurringContributions(): List {
+ return billingClient.connect {
+ billingClient.loadRecurringContributions(contributionIdProvider.recurringContributionIds)
+ .sortedByDescending { it.price }
+ }
+ }
+
+ override suspend fun loadPurchasedContributions(): List {
+ return billingClient.connect {
+ billingClient.loadPurchasedContributions()
+ .sortedByDescending { it.price }
+ }
+ }
+
+ override suspend fun purchaseContribution(activity: Activity, contribution: Contribution): Contribution? {
+ return billingClient.connect {
+ billingClient.purchaseContribution(activity, contribution)
+ }
+ }
+
+ override fun clear() {
+ billingClient.disconnect()
+ }
+}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/ContributionIdProvider.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/ContributionIdProvider.kt
new file mode 100644
index 00000000000..00799d5b535
--- /dev/null
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/ContributionIdProvider.kt
@@ -0,0 +1,26 @@
+package app.k9mail.feature.funding.googleplay.domain
+
+import kotlinx.collections.immutable.ImmutableList
+import kotlinx.collections.immutable.persistentListOf
+
+// TODO should be provided externally per app variant
+class ContributionIdProvider :
+ DomainContract.ContributionIdProvider {
+ override val oneTimeContributionIds: ImmutableList = persistentListOf(
+ "contribution_tfa_onetime_xs",
+ "contribution_tfa_onetime_s",
+ "contribution_tfa_onetime_m",
+ "contribution_tfa_onetime_l",
+ "contribution_tfa_onetime_xl",
+ "contribution_tfa_onetime_xxl",
+ )
+
+ override val recurringContributionIds: ImmutableList = persistentListOf(
+ "contribution_tfa_monthly_xs",
+ "contribution_tfa_monthly_s",
+ "contribution_tfa_monthly_m",
+ "contribution_tfa_monthly_l",
+ "contribution_tfa_monthly_xl",
+ "contribution_tfa_monthly_xxl",
+ )
+}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/DomainContract.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/DomainContract.kt
new file mode 100644
index 00000000000..67c3193096d
--- /dev/null
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/DomainContract.kt
@@ -0,0 +1,49 @@
+package app.k9mail.feature.funding.googleplay.domain
+
+import android.app.Activity
+import app.k9mail.feature.funding.googleplay.domain.entity.Contribution
+import app.k9mail.feature.funding.googleplay.domain.entity.OneTimeContribution
+import app.k9mail.feature.funding.googleplay.domain.entity.RecurringContribution
+import kotlinx.collections.immutable.ImmutableList
+
+interface DomainContract {
+
+ interface ContributionIdProvider {
+ val oneTimeContributionIds: ImmutableList
+ val recurringContributionIds: ImmutableList
+ }
+
+ interface BillingManager {
+ /**
+ * Load contributions.
+ */
+ suspend fun loadOneTimeContributions(): List
+
+ /**
+ * Load recurring contributions.
+ */
+ suspend fun loadRecurringContributions(): List
+
+ /**
+ * Load purchased contributions.
+ */
+ suspend fun loadPurchasedContributions(): List
+
+ /**
+ * Purchase a contribution.
+ *
+ * @param activity The activity to use for the purchase flow.
+ * @param contribution The contribution to purchase.
+ * @return The purchased contribution or null if the purchase failed.
+ */
+ suspend fun purchaseContribution(
+ activity: Activity,
+ contribution: Contribution,
+ ): Contribution?
+
+ /**
+ * Release all resources.
+ */
+ fun clear()
+ }
+}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/entity/OneTimeContribution.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/entity/OneTimeContribution.kt
index 26b951c83b6..1d4d4c89577 100644
--- a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/entity/OneTimeContribution.kt
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/domain/entity/OneTimeContribution.kt
@@ -1,6 +1,6 @@
package app.k9mail.feature.funding.googleplay.domain.entity
-class OneTimeContribution(
+data class OneTimeContribution(
override val id: String,
override val title: String,
override val description: String,
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContent.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContent.kt
index 931f0a2affb..7cea4f044e8 100644
--- a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContent.kt
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContent.kt
@@ -44,27 +44,31 @@ internal fun ContributionContent(
purchasedContribution = state.purchasedContribution,
)
- ContributionList(
- oneTimeContributions = state.oneTimeContributions,
- recurringContributions = state.recurringContributions,
- selectedItem = state.selectedContribution,
- isRecurringContributionSelected = state.isRecurringContributionSelected,
- onOneTimeContributionTypeClick = {
- onEvent(Event.OnOneTimeContributionSelected)
- },
- onRecurringContributionTypeClick = {
- onEvent(Event.OnRecurringContributionSelected)
- },
- onItemClick = {
- onEvent(Event.OnContributionItemClicked(it))
- },
- )
+ if (state.showContributionList) {
+ ContributionList(
+ oneTimeContributions = state.oneTimeContributions,
+ recurringContributions = state.recurringContributions,
+ selectedItem = state.selectedContribution,
+ isRecurringContributionSelected = state.isRecurringContributionSelected,
+ onOneTimeContributionTypeClick = {
+ onEvent(Event.OnOneTimeContributionSelected)
+ },
+ onRecurringContributionTypeClick = {
+ onEvent(Event.OnRecurringContributionSelected)
+ },
+ onItemClick = {
+ onEvent(Event.OnContributionItemClicked(it))
+ },
+ )
+ }
ContributionFooter(
+ purchasedContribution = state.purchasedContribution,
onPurchaseClick = { onEvent(Event.OnPurchaseClicked(activity)) },
onManagePurchaseClick = { onEvent(Event.OnManagePurchaseClicked(it)) },
- purchasedContribution = state.purchasedContribution,
+ onShowContributionListClick = { onEvent(Event.OnShowContributionListClicked) },
isPurchaseEnabled = state.selectedContribution != null,
+ isContributionListShown = state.showContributionList,
)
}
}
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContract.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContract.kt
index bcd8604b459..46a029c563b 100644
--- a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContract.kt
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionContract.kt
@@ -17,8 +17,9 @@ internal class ContributionContract {
data class State(
val oneTimeContributions: ImmutableList = persistentListOf(),
val recurringContributions: ImmutableList = persistentListOf(),
- val purchasedContribution: Contribution? = null,
val selectedContribution: Contribution? = null,
+ val purchasedContribution: Contribution? = null,
+ val showContributionList: Boolean = true,
val isRecurringContributionSelected: Boolean = false,
)
@@ -26,6 +27,8 @@ internal class ContributionContract {
data object OnOneTimeContributionSelected : Event
data object OnRecurringContributionSelected : Event
+ data object OnShowContributionListClicked : Event
+
data class OnContributionItemClicked(
val item: Contribution,
) : Event
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionFooter.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionFooter.kt
index 150641aa869..5eacc58f645 100644
--- a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionFooter.kt
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionFooter.kt
@@ -8,6 +8,7 @@ import androidx.compose.ui.res.stringResource
import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonFilled
import app.k9mail.feature.funding.googleplay.R
import app.k9mail.feature.funding.googleplay.domain.entity.Contribution
+import app.k9mail.feature.funding.googleplay.domain.entity.OneTimeContribution
import app.k9mail.feature.funding.googleplay.domain.entity.RecurringContribution
@Composable
@@ -15,20 +16,36 @@ internal fun ContributionFooter(
purchasedContribution: Contribution?,
onPurchaseClick: () -> Unit,
onManagePurchaseClick: (Contribution) -> Unit,
+ onShowContributionListClick: () -> Unit,
isPurchaseEnabled: Boolean,
+ isContributionListShown: Boolean,
modifier: Modifier = Modifier,
) {
Column(
modifier = modifier,
) {
- if (purchasedContribution != null && purchasedContribution is RecurringContribution) {
- ButtonFilled(
- text = stringResource(
- R.string.funding_googleplay_contribution_footer_manage_button,
- ),
- onClick = { onManagePurchaseClick(purchasedContribution) },
- modifier = Modifier.fillMaxWidth(),
- )
+ if (purchasedContribution != null && !isContributionListShown) {
+ when (purchasedContribution) {
+ is RecurringContribution -> {
+ ButtonFilled(
+ text = stringResource(
+ R.string.funding_googleplay_contribution_footer_manage_button,
+ ),
+ onClick = { onManagePurchaseClick(purchasedContribution) },
+ modifier = Modifier.fillMaxWidth(),
+ )
+ }
+
+ is OneTimeContribution -> {
+ ButtonFilled(
+ text = stringResource(
+ R.string.funding_googleplay_contribution_footer_show_contribution_list_button,
+ ),
+ onClick = onShowContributionListClick,
+ modifier = Modifier.fillMaxWidth(),
+ )
+ }
+ }
} else {
ButtonFilled(
text = stringResource(
diff --git a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionViewModel.kt b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionViewModel.kt
index fc964212534..64cd197ebc0 100644
--- a/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionViewModel.kt
+++ b/feature/funding/googleplay/src/main/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionViewModel.kt
@@ -1,17 +1,88 @@
package app.k9mail.feature.funding.googleplay.ui.contribution
import android.app.Activity
+import androidx.lifecycle.viewModelScope
import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
+import app.k9mail.feature.funding.googleplay.domain.DomainContract
import app.k9mail.feature.funding.googleplay.domain.entity.Contribution
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.Event
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ViewModel
+import kotlinx.collections.immutable.toImmutableList
+import kotlinx.coroutines.launch
+@Suppress("TooManyFunctions")
internal class ContributionViewModel(
+ private val billingManager: DomainContract.BillingManager,
initialState: State = State(),
) : BaseViewModel(initialState),
ViewModel {
+ init {
+ viewModelScope.launch {
+ loadOneTimeContributions()
+ // TODO load recurring contributions
+ // loadRecurringContributions()
+ loadPurchasedContribution()
+ selectDefaultContribution()
+ }
+ }
+
+ private suspend fun loadOneTimeContributions() {
+ val result = billingManager.loadOneTimeContributions()
+
+ updateState { state ->
+ state.copy(
+ oneTimeContributions = result.toImmutableList(),
+ selectedContribution = if (
+ !state.isRecurringContributionSelected &&
+ result.contains(state.selectedContribution).not()
+ ) {
+ result.firstOrNull()
+ } else {
+ state.selectedContribution
+ },
+ )
+ }
+ }
+
+ private suspend fun loadRecurringContributions() {
+ val result = billingManager.loadRecurringContributions()
+
+ updateState { state ->
+ state.copy(
+ recurringContributions = result.toImmutableList(),
+ selectedContribution = if (
+ state.isRecurringContributionSelected &&
+ result.contains(state.selectedContribution).not()
+ ) {
+ result.firstOrNull()
+ } else {
+ state.selectedContribution
+ },
+ )
+ }
+ }
+
+ private suspend fun loadPurchasedContribution() {
+ val purchasedContribution = billingManager.loadPurchasedContributions().firstOrNull()
+ updateState { state ->
+ state.copy(
+ purchasedContribution = purchasedContribution,
+ showContributionList = purchasedContribution == null,
+ )
+ }
+ }
+
+ private fun selectDefaultContribution() {
+ val selectedContribution = state.value.selectedContribution ?: return
+ if (state.value.oneTimeContributions.contains(selectedContribution)) {
+ onOneTimeContributionSelected()
+ } else if (state.value.recurringContributions.contains(selectedContribution)) {
+ onRecurringContributionSelected()
+ }
+ }
+
override fun event(event: Event) {
when (event) {
Event.OnOneTimeContributionSelected -> onOneTimeContributionSelected()
@@ -19,6 +90,7 @@ internal class ContributionViewModel(
is Event.OnContributionItemClicked -> onContributionItemClicked(event.item)
is Event.OnPurchaseClicked -> onPurchaseClicked(event.activity)
is Event.OnManagePurchaseClicked -> onManagePurchaseClicked(event.contribution)
+ Event.OnShowContributionListClicked -> onShowContributionListClicked()
}
}
@@ -26,7 +98,8 @@ internal class ContributionViewModel(
updateState {
it.copy(
isRecurringContributionSelected = false,
- selectedContribution = it.oneTimeContributions.firstOrNull(),
+ selectedContribution = it.oneTimeContributions.getSecondLowestOrNull(),
+ showContributionList = true,
)
}
}
@@ -35,11 +108,20 @@ internal class ContributionViewModel(
updateState {
it.copy(
isRecurringContributionSelected = true,
- selectedContribution = it.recurringContributions.firstOrNull(),
+ selectedContribution = it.recurringContributions.getSecondLowestOrNull(),
+ showContributionList = true,
)
}
}
+ private fun List.getSecondLowestOrNull(): Contribution? {
+ return when {
+ this.size > 1 -> this.sortedBy { it.price }[1]
+ this.size == 1 -> this[0]
+ else -> null
+ }
+ }
+
private fun onContributionItemClicked(item: Contribution) {
updateState {
it.copy(
@@ -48,13 +130,36 @@ internal class ContributionViewModel(
}
}
- @Suppress("UnusedParameter")
private fun onPurchaseClicked(activity: Activity) {
- // TODO: Implement purchase logic
+ viewModelScope.launch {
+ val result = billingManager.purchaseContribution(activity, state.value.selectedContribution!!)
+
+ if (result != null) {
+ updateState {
+ it.copy(
+ purchasedContribution = result,
+ showContributionList = false,
+ )
+ }
+ }
+ }
}
@Suppress("UnusedParameter")
private fun onManagePurchaseClicked(contribution: Contribution) {
// TODO: Implement manage purchase logic
}
+
+ private fun onShowContributionListClicked() {
+ updateState {
+ it.copy(
+ showContributionList = true,
+ )
+ }
+ }
+
+ override fun onCleared() {
+ super.onCleared()
+ billingManager.clear()
+ }
}
diff --git a/feature/funding/googleplay/src/main/res/values-ar/strings.xml b/feature/funding/googleplay/src/main/res/values-ar/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ar/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-az/strings.xml b/feature/funding/googleplay/src/main/res/values-az/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-az/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-be/strings.xml b/feature/funding/googleplay/src/main/res/values-be/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-be/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-bg/strings.xml b/feature/funding/googleplay/src/main/res/values-bg/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-bg/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-br/strings.xml b/feature/funding/googleplay/src/main/res/values-br/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-br/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-bs/strings.xml b/feature/funding/googleplay/src/main/res/values-bs/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-bs/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-ca/strings.xml b/feature/funding/googleplay/src/main/res/values-ca/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ca/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-co/strings.xml b/feature/funding/googleplay/src/main/res/values-co/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-co/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-cs/strings.xml b/feature/funding/googleplay/src/main/res/values-cs/strings.xml
new file mode 100644
index 00000000000..f5b331cd013
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-cs/strings.xml
@@ -0,0 +1,10 @@
+
+
+ Bezpečné přispění
+ Jednou
+ Pokračovat k platbě
+ Nikdy nezobrazujeme reklamy ani neprodáváme vaše údaje. Jsme plně financováni z finančních příspěvků našich uživatelů. Pokud se vám Thunderbird líbí, pomozte jej podpořit. Bez vás to nedokážeme!
+ Příspěvky nelze odečíst z daní jako charitativní dary.
+ Měsíčně
+ Podpořte Thunderbird
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-cy/strings.xml b/feature/funding/googleplay/src/main/res/values-cy/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-cy/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-da/strings.xml b/feature/funding/googleplay/src/main/res/values-da/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-da/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-de/strings.xml b/feature/funding/googleplay/src/main/res/values-de/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-de/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-el/strings.xml b/feature/funding/googleplay/src/main/res/values-el/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-el/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-en-rGB/strings.xml b/feature/funding/googleplay/src/main/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-en-rGB/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-enm/strings.xml b/feature/funding/googleplay/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-eo/strings.xml b/feature/funding/googleplay/src/main/res/values-eo/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-eo/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-es/strings.xml b/feature/funding/googleplay/src/main/res/values-es/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-es/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-et/strings.xml b/feature/funding/googleplay/src/main/res/values-et/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-et/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-eu/strings.xml b/feature/funding/googleplay/src/main/res/values-eu/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-eu/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-fa/strings.xml b/feature/funding/googleplay/src/main/res/values-fa/strings.xml
new file mode 100644
index 00000000000..868e1aee314
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-fa/strings.xml
@@ -0,0 +1,10 @@
+
+
+ پرداخت یک باره
+ حمایت از تاندربرد
+ مشارکت امن
+ ماهانه
+ مشارکتها به عنوان اعانههای خیریه شامل مالیات نمیشوند.
+ ادامه به پرداخت
+ ما هرگز تبلیغات نشان نداده یا دادههایتان را نمیفروشیم و کاملاً به دست مشارکتهای مالی کاربرانمان تأمین میشویم. اگر از تاندربرد لذت می برید، لطفاُ در حمایت از آن کمک کنید. ما نمی توانیم این کار را بدون شما انجام دهیم!
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-fi/strings.xml b/feature/funding/googleplay/src/main/res/values-fi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-fi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-fr/strings.xml b/feature/funding/googleplay/src/main/res/values-fr/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-fr/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-fy/strings.xml b/feature/funding/googleplay/src/main/res/values-fy/strings.xml
new file mode 100644
index 00000000000..06121fe696f
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-fy/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Trochgean nei ôfrekkenjen
+ Moanliks
+ Bydragen binne net ôflûkber as donaasjes foar goede doelen.
+ Moanlikse betelling oanpasse
+ Ynstellingen
+ Stypje Thunderbird
+ Wy toane jo nea advertinsjes en ferkeapje nea jo gegevens. Wy wurde folslein finansiere troch finansjele bydragen fan ús brûkers. As jo genietsje fan Thunderbird, stypje it dan. Wy kinne dit net sûnder jo!
+ Feilige bydrage
+ Donearje ien kear
+ Neat beskikber
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-gd/strings.xml b/feature/funding/googleplay/src/main/res/values-gd/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-gd/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-gl/strings.xml b/feature/funding/googleplay/src/main/res/values-gl/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-gl/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-hi/strings.xml b/feature/funding/googleplay/src/main/res/values-hi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-hi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-hr/strings.xml b/feature/funding/googleplay/src/main/res/values-hr/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-hr/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-hu/strings.xml b/feature/funding/googleplay/src/main/res/values-hu/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-hu/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-hy/strings.xml b/feature/funding/googleplay/src/main/res/values-hy/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-hy/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-in/strings.xml b/feature/funding/googleplay/src/main/res/values-in/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-in/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-is/strings.xml b/feature/funding/googleplay/src/main/res/values-is/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-is/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-it/strings.xml b/feature/funding/googleplay/src/main/res/values-it/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-it/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-iw/strings.xml b/feature/funding/googleplay/src/main/res/values-iw/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-iw/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-ja/strings.xml b/feature/funding/googleplay/src/main/res/values-ja/strings.xml
new file mode 100644
index 00000000000..ecd9d64fcbe
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ja/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Thunderbird を支援する
+ 一度だけ
+ 毎月
+ 寄付する
+ 慈善活動への寄付として税控除の対象にはなりません。
+ お支払いへ進む
+ 私たちは広告を表示したりあなたのデータを販売したりしません。資金はすべてユーザーから寄付されています。もし Thunderbird に満足していただけたら、支援にご協力ください。あなたの支援が必要です!
+ 毎月のお支払いを変更
+ 設定
+ 利用できません
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-ka/strings.xml b/feature/funding/googleplay/src/main/res/values-ka/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ka/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-kab/strings.xml b/feature/funding/googleplay/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-kk/strings.xml b/feature/funding/googleplay/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-ko/strings.xml b/feature/funding/googleplay/src/main/res/values-ko/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ko/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-lt/strings.xml b/feature/funding/googleplay/src/main/res/values-lt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-lt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-lv/strings.xml b/feature/funding/googleplay/src/main/res/values-lv/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-lv/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-ml/strings.xml b/feature/funding/googleplay/src/main/res/values-ml/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ml/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-nb-rNO/strings.xml b/feature/funding/googleplay/src/main/res/values-nb-rNO/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-nb-rNO/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-nl/strings.xml b/feature/funding/googleplay/src/main/res/values-nl/strings.xml
new file mode 100644
index 00000000000..54a498c10ea
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-nl/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Steun Thunderbird
+ Veilige bijdrage
+ Doneer eenmalig
+ Maandelijks
+ Bijdragen zijn niet aftrekbaar als charitatieve donaties.
+ We tonen u nooit advertenties en verkopen nooit uw gegevens. We worden volledig gefinancierd door financiële bijdragen van onze gebruikers. Als u geniet van Thunderbird, ondersteun het dan. We kunnen dit niet zonder u!
+ Doorgaan naar afrekenen
+ Instellingen
+ Niets beschikbaar
+ Maandelijkse betaling aanpassen
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-nn/strings.xml b/feature/funding/googleplay/src/main/res/values-nn/strings.xml
new file mode 100644
index 00000000000..341b8b7297c
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-nn/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Støtt Thunderbird
+ Me viser aldri reklamar eller sel dataen din. Me er fullstendig finansiert av økonomiske bidrag frå brukarane våre. Om du likar Thunderbird, ver vennleg og støtt det. Me kan ikkje gjere dette utan deg!
+ Gå vidare til betaling
+ Bidrag er ikkje skattefrie som velgjerdsdonasjonar.
+ Sikkert bidrag
+ Gje ein gong
+ Månadleg
+ Ingen tilgjengelege
+ Endre månadleg betaling
+ Innstillingar
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-pl/strings.xml b/feature/funding/googleplay/src/main/res/values-pl/strings.xml
new file mode 100644
index 00000000000..39b3ce00dff
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-pl/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Bezpieczny wkład
+ Datki nie podlegają odliczeniu od podatku jako darowizny na cele charytatywne.
+ Przekaż raz
+ Miesięcznie
+ Przejdź do płatności
+ Wspieraj Thunderbirda
+ Nigdy nie pokazujemy reklam ani nie sprzedajemy Twoich danych. Jesteśmy w pełni finansowani ze składek finansowych od naszych użytkowników. Jeśli podoba Ci się Thunderbird, pomóż nam go wesprzeć. Nie możemy tego zrobić bez Ciebie!
+ Zmodyfikuj płatność miesięczną
+ Ustawienia
+ Brak dostępnych
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-pt-rBR/strings.xml b/feature/funding/googleplay/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-pt-rPT/strings.xml b/feature/funding/googleplay/src/main/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-pt-rPT/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-pt/strings.xml b/feature/funding/googleplay/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-ro/strings.xml b/feature/funding/googleplay/src/main/res/values-ro/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ro/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-ru/strings.xml b/feature/funding/googleplay/src/main/res/values-ru/strings.xml
new file mode 100644
index 00000000000..7a9438e6c8f
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ru/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Поддержка Thunderbird
+ Один раз
+ Настройки
+ Мы никогда не показываем рекламу и не продаём ваши данные. Мы полностью финансируемся за счёт пожертвований наших пользователей. Если вам нравится Thunderbird, поддержите его. Мы не можем обойтись без вас!
+ Ежемесячно
+ Перейти к платежу
+ Безопасное пожертвование
+ Недоступно
+ Пожертвования не подлежат налогообложению как благотворительность.
+ Изменить ежемесячный платёж
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-sk/strings.xml b/feature/funding/googleplay/src/main/res/values-sk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-sk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-sl/strings.xml b/feature/funding/googleplay/src/main/res/values-sl/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-sl/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-sq/strings.xml b/feature/funding/googleplay/src/main/res/values-sq/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-sq/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-sr/strings.xml b/feature/funding/googleplay/src/main/res/values-sr/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-sr/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-sv/strings.xml b/feature/funding/googleplay/src/main/res/values-sv/strings.xml
new file mode 100644
index 00000000000..8c0e3c140cc
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-sv/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Stöd Thunderbird
+ Månadsvis
+ Bidrag är inte avdragsgilla som donationer till välgörande ändamål.
+ Fortsätt till betalning
+ Vi visar aldrig annonser eller säljer din data. Vi är helt finansierade av ekonomiska bidrag från våra användare. Om du gillar Thunderbird, vänligen hjälp till att stödja det. Vi kan inte göra detta utan dig!
+ Säkert bidrag
+ Donera en gång
+ Inställningar
+ Ändra den månatliga betalningen
+ Inga tillgängliga
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-ta/strings.xml b/feature/funding/googleplay/src/main/res/values-ta/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-ta/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-tr/strings.xml b/feature/funding/googleplay/src/main/res/values-tr/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-tr/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-uk/strings.xml b/feature/funding/googleplay/src/main/res/values-uk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-uk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-vi/strings.xml b/feature/funding/googleplay/src/main/res/values-vi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-vi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-zh-rCN/strings.xml b/feature/funding/googleplay/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000000..9c44afd82b3
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,13 @@
+
+
+ 捐赠一次
+ 捐款不能作为慈善捐款免税。
+ 继续付款
+ 支持 Thunderbird
+ 我们永远不会显示广告或出售您的数据。我们的资金完全来自用户的捐款。如果您喜欢 Thunderbird,请考虑支持它。我们需要您的支持!
+ 立即捐款
+ 每月
+ 设置
+ 修改每月付款
+ 无可用
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values-zh-rTW/strings.xml b/feature/funding/googleplay/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/funding/googleplay/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/funding/googleplay/src/main/res/values/strings.xml b/feature/funding/googleplay/src/main/res/values/strings.xml
index 6e1f72faa22..bc3243922e4 100644
--- a/feature/funding/googleplay/src/main/res/values/strings.xml
+++ b/feature/funding/googleplay/src/main/res/values/strings.xml
@@ -1,6 +1,6 @@
- Settings
+ Support Thunderbird
Support Thunderbird
We never show advertisements or sell your data. We are fully funded by financial contributions from our users. If you’re enjoying Thunderbird, please help support it. We can’t do this without you!
@@ -14,4 +14,5 @@
Continue to payment
Modify monthly payment
+ Help keep Thunderbird alive
diff --git a/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/data/mapper/ProductDetailsMapperTest.kt b/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/data/mapper/ProductDetailsMapperTest.kt
new file mode 100644
index 00000000000..d5dd82c6c03
--- /dev/null
+++ b/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/data/mapper/ProductDetailsMapperTest.kt
@@ -0,0 +1,159 @@
+package app.k9mail.feature.funding.googleplay.data.mapper
+
+import app.k9mail.feature.funding.googleplay.domain.entity.OneTimeContribution
+import app.k9mail.feature.funding.googleplay.domain.entity.RecurringContribution
+import assertk.assertFailure
+import assertk.assertThat
+import assertk.assertions.isEqualTo
+import assertk.assertions.isInstanceOf
+import com.android.billingclient.api.BillingClient.ProductType
+import com.android.billingclient.api.ProductDetails
+import kotlin.test.Test
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+
+class ProductDetailsMapperTest {
+
+ private val testSubject = ProductDetailsMapper()
+
+ @Test
+ fun `mapToOneTimeContribution returns OneTimeContribution when product type is INAPP`() {
+ val productDetails = createInAppProductDetails()
+
+ val result = testSubject.mapToOneTimeContribution(productDetails)
+
+ assertThat(result).isEqualTo(ONE_TIME_CONTRIBUTION)
+ }
+
+ @Test
+ fun `mapToOneTimeContribution throws IllegalStateException when in app product has no offer details`() {
+ val productDetails = createInAppProductDetails(hasOfferDetails = false)
+
+ assertFailure {
+ testSubject.mapToOneTimeContribution(productDetails)
+ }.isInstanceOf(IllegalStateException::class)
+ }
+
+ @Test
+ fun `mapToRecurringContribution returns RecurringContribution when product type is SUBS`() {
+ val productDetails = createSubscriptionProductDetails()
+
+ val result = testSubject.mapToRecurringContribution(productDetails)
+
+ assertThat(result).isEqualTo(RECURRING_CONTRIBUTION)
+ }
+
+ @Test
+ fun `mapToRecurringContribution throws IllegalStateException when subscription product has no pricing phase`() {
+ val productDetails = createSubscriptionProductDetails(hasPricingPhase = false)
+
+ assertFailure {
+ testSubject.mapToRecurringContribution(productDetails)
+ }.isInstanceOf(IllegalStateException::class)
+ }
+
+ @Test
+ fun `mapToContribution return contribution for all supported types`() {
+ val inAppProductDetails = createInAppProductDetails()
+ val subscriptionProductDetails = createSubscriptionProductDetails()
+
+ val oneTimeContribution = testSubject.mapToContribution(inAppProductDetails)
+ val recurringContribution = testSubject.mapToContribution(subscriptionProductDetails)
+
+ assertThat(oneTimeContribution).isEqualTo(ONE_TIME_CONTRIBUTION)
+ assertThat(recurringContribution).isEqualTo(RECURRING_CONTRIBUTION)
+ }
+
+ @Test
+ fun `mapToContribution throws IllegalArgumentException when product type is unknown`() {
+ val productDetails = mock {
+ on { productType } doReturn "unknown"
+ }
+
+ assertFailure {
+ testSubject.mapToContribution(productDetails)
+ }.isInstanceOf(IllegalArgumentException::class)
+ }
+
+ private fun createInAppProductDetails(
+ hasOfferDetails: Boolean = true,
+ ): ProductDetails {
+ val oneTimePurchaseOfferDetails = mock {
+ on { priceAmountMicros }.thenReturn(ONE_TIME_PRICE)
+ on { formattedPrice }.thenReturn(ONE_TIME_PRICE_FORMATTED)
+ }
+
+ return mock {
+ on { productType } doReturn ProductType.INAPP
+ on { productId } doReturn ONE_TIME_ID
+ on { name } doReturn ONE_TIME_TITLE
+ on { description } doReturn ONE_TIME_DESCRIPTION_WITH_NEW_LINE
+ on { getOneTimePurchaseOfferDetails() } doReturn if (hasOfferDetails) {
+ oneTimePurchaseOfferDetails
+ } else {
+ null
+ }
+ }
+ }
+
+ private fun createSubscriptionProductDetails(
+ hasPricingPhase: Boolean = true,
+ ): ProductDetails {
+ val pricingPhase = mock {
+ on { priceAmountMicros } doReturn RECURRING_PRICE
+ on { formattedPrice } doReturn RECURRING_PRICE_FORMATTED
+ }
+
+ val pricingPhaseList = mock {
+ on { pricingPhaseList } doReturn listOf(pricingPhase)
+ }
+
+ val subscriptionOfferDetails = mock {
+ on { pricingPhases } doReturn pricingPhaseList
+ }
+
+ return mock {
+ on { productType } doReturn ProductType.SUBS
+ on { productId } doReturn RECURRING_ID
+ on { name } doReturn RECURRING_TITLE
+ on { description } doReturn RECURRING_DESCRIPTION_WITH_NEW_LINE
+ on { getSubscriptionOfferDetails() } doReturn if (hasPricingPhase) {
+ listOf(subscriptionOfferDetails)
+ } else {
+ null
+ }
+ }
+ }
+
+ private companion object {
+ const val ONE_TIME_ID = "one_time_id"
+ const val ONE_TIME_TITLE = "One-Time"
+ const val ONE_TIME_DESCRIPTION = "One-Time Description"
+ const val ONE_TIME_DESCRIPTION_WITH_NEW_LINE = "One-Time\n Description"
+ const val ONE_TIME_PRICE = 1_000L
+ const val ONE_TIME_PRICE_FORMATTED = "$10.00"
+
+ val ONE_TIME_CONTRIBUTION = OneTimeContribution(
+ id = ONE_TIME_ID,
+ title = ONE_TIME_TITLE,
+ description = ONE_TIME_DESCRIPTION,
+ price = ONE_TIME_PRICE,
+ priceFormatted = ONE_TIME_PRICE_FORMATTED,
+ )
+
+ const val RECURRING_ID = "recurring_product_id"
+ const val RECURRING_TITLE = "Recurring"
+ const val RECURRING_DESCRIPTION = "Recurring Description"
+ const val RECURRING_DESCRIPTION_WITH_NEW_LINE = "Recurring\n Description"
+ const val RECURRING_PRICE = 2_000L
+ const val RECURRING_PRICE_FORMATTED = "$20.00"
+
+ val RECURRING_CONTRIBUTION = RecurringContribution(
+ id = RECURRING_ID,
+ title = RECURRING_TITLE,
+ description = RECURRING_DESCRIPTION,
+ price = RECURRING_PRICE,
+ priceFormatted = RECURRING_PRICE_FORMATTED,
+ )
+ }
+}
diff --git a/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionViewModelTest.kt b/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionViewModelTest.kt
index 5bb02a5b7f9..22547a8d7ea 100644
--- a/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionViewModelTest.kt
+++ b/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/ContributionViewModelTest.kt
@@ -23,6 +23,10 @@ class ContributionViewModelTest {
val initialState = State(
isRecurringContributionSelected = true,
oneTimeContributions = FakeData.oneTimeContributions,
+ recurringContributions = FakeData.recurringContributions,
+ purchasedContribution = FakeData.oneTimeContributions.first(),
+ selectedContribution = FakeData.recurringContributions[FakeData.recurringContributions.size - 2],
+ showContributionList = true,
)
contributionRobot(initialState) {
@@ -35,7 +39,11 @@ class ContributionViewModelTest {
fun `should change selected contribution and selected type when recurring contribution selected`() = runMviTest {
val initialState = State(
isRecurringContributionSelected = false,
+ oneTimeContributions = FakeData.oneTimeContributions,
recurringContributions = FakeData.recurringContributions,
+ purchasedContribution = FakeData.oneTimeContributions.first(),
+ selectedContribution = FakeData.oneTimeContributions[FakeData.oneTimeContributions.size - 2],
+ showContributionList = true,
)
contributionRobot(initialState) {
@@ -48,7 +56,11 @@ class ContributionViewModelTest {
fun `should change selected contribution when contribution item clicked`() = runMviTest {
val initialState = State(
isRecurringContributionSelected = true,
+ oneTimeContributions = FakeData.oneTimeContributions,
recurringContributions = FakeData.recurringContributions,
+ purchasedContribution = FakeData.oneTimeContributions.first(),
+ selectedContribution = FakeData.recurringContributions[FakeData.oneTimeContributions.size - 2],
+ showContributionList = true,
)
val selectedContribution = FakeData.recurringContributions[2]
@@ -71,7 +83,10 @@ private class ContributionRobot(
private val mviContext: MviContext,
private val initialState: State = State(),
) {
- private val viewModel = ContributionViewModel(initialState)
+ private val viewModel: ContributionContract.ViewModel = ContributionViewModel(
+ initialState = initialState,
+ billingManager = FakeBillingManager(),
+ )
private lateinit var turbines: MviTurbines
suspend fun initialize() {
@@ -86,7 +101,8 @@ private class ContributionRobot(
assertThat(turbines.awaitStateItem()).isEqualTo(
initialState.copy(
isRecurringContributionSelected = false,
- selectedContribution = initialState.oneTimeContributions.first(),
+ selectedContribution = initialState.oneTimeContributions[initialState.oneTimeContributions.size - 2],
+ showContributionList = true,
),
)
}
@@ -99,7 +115,9 @@ private class ContributionRobot(
assertThat(turbines.awaitStateItem()).isEqualTo(
initialState.copy(
isRecurringContributionSelected = true,
- selectedContribution = initialState.recurringContributions.first(),
+ selectedContribution = initialState
+ .recurringContributions[initialState.recurringContributions.size - 2],
+ showContributionList = true,
),
)
}
diff --git a/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/FakeBillingManager.kt b/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/FakeBillingManager.kt
new file mode 100644
index 00000000000..075a2a0e372
--- /dev/null
+++ b/feature/funding/googleplay/src/test/kotlin/app/k9mail/feature/funding/googleplay/ui/contribution/FakeBillingManager.kt
@@ -0,0 +1,23 @@
+package app.k9mail.feature.funding.googleplay.ui.contribution
+
+import android.app.Activity
+import app.k9mail.feature.funding.googleplay.domain.DomainContract
+import app.k9mail.feature.funding.googleplay.domain.entity.Contribution
+
+class FakeBillingManager : DomainContract.BillingManager {
+
+ override suspend fun loadOneTimeContributions() = FakeData.oneTimeContributions
+
+ override suspend fun loadRecurringContributions() = FakeData.recurringContributions
+
+ override suspend fun loadPurchasedContributions(): List {
+ return listOf(
+ FakeData.oneTimeContributions.first(),
+ )
+ }
+
+ override suspend fun purchaseContribution(activity: Activity, contribution: Contribution) =
+ FakeData.oneTimeContributions.first()
+
+ override fun clear() = Unit
+}
diff --git a/feature/migration/qrcode/src/debug/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewPreview.kt b/feature/migration/qrcode/src/debug/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewPreview.kt
index 76bb923c7b0..5c2d5942be7 100644
--- a/feature/migration/qrcode/src/debug/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewPreview.kt
+++ b/feature/migration/qrcode/src/debug/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewPreview.kt
@@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.core.ui.compose.designsystem.atom.Surface
+import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.DisplayText
@Preview
@Composable
@@ -12,8 +13,7 @@ fun QrCodeScannerViewPreview_initial() {
Surface {
QrCodeScannerView(
cameraUseCasesProvider = { emptyList() },
- scannedCount = 0,
- totalCount = 0,
+ displayText = DisplayText.HelpText,
onDoneClick = {},
)
}
@@ -27,8 +27,7 @@ fun QrCodeScannerViewPreview_one_qr_code_scanned() {
Surface {
QrCodeScannerView(
cameraUseCasesProvider = { emptyList() },
- scannedCount = 1,
- totalCount = 2,
+ DisplayText.ProgressText(scannedCount = 1, totalCount = 2),
onDoneClick = {},
)
}
diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/CameraPreviewView.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/CameraPreviewView.kt
index 50a84939ab0..70e40cb4da0 100644
--- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/CameraPreviewView.kt
+++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/CameraPreviewView.kt
@@ -22,6 +22,7 @@ import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleLarge
import app.k9mail.feature.migration.qrcode.domain.QrCodeDomainContract.UseCase.CameraUseCasesProvider
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
+import android.graphics.Color as AndroidColor
/**
* Displays a camera preview and includes the provided CameraX [UseCase]s.
@@ -47,6 +48,7 @@ internal fun CameraPreviewView(
val previewView = remember {
PreviewView(context).apply {
+ setBackgroundColor(AndroidColor.TRANSPARENT)
scaleType = PreviewView.ScaleType.FIT_CENTER
}
}
diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerBottomContent.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerBottomContent.kt
index 07c2c8d31bb..21c031daebe 100644
--- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerBottomContent.kt
+++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerBottomContent.kt
@@ -1,7 +1,6 @@
package app.k9mail.feature.migration.qrcode.ui
import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
@@ -16,26 +15,21 @@ import app.k9mail.feature.migration.qrcode.R
@Composable
internal fun QrCodeScannerBottomContent(
- scannedCount: Int,
- totalCount: Int,
+ text: String,
onDoneClick: () -> Unit,
) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) {
- if (totalCount > 0) {
- TextBodyLarge(
- text = stringResource(R.string.migration_qrcode_scanning_progress, scannedCount, totalCount),
- modifier = Modifier
- .testTag("ScannedStatus")
- .padding(vertical = MainTheme.spacings.double)
- .padding(start = MainTheme.spacings.double)
- .weight(1f),
- )
- } else {
- Spacer(modifier = Modifier.weight(1f))
- }
+ TextBodyLarge(
+ text = text,
+ modifier = Modifier
+ .testTag("ScannedStatus")
+ .padding(vertical = MainTheme.spacings.double)
+ .padding(start = MainTheme.spacings.double)
+ .weight(1f),
+ )
ButtonOutlined(
text = stringResource(R.string.migration_qrcode_done_button_text),
diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerContent.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerContent.kt
index bba9dcc50c1..908c96c7f57 100644
--- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerContent.kt
+++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerContent.kt
@@ -30,8 +30,7 @@ internal fun QrCodeScannerContent(
UiPermissionState.Granted -> {
QrCodeScannerView(
cameraUseCasesProvider = cameraUseCasesProvider,
- scannedCount = state.scannedCount,
- totalCount = state.totalCount,
+ displayText = state.displayText,
onDoneClick = { onEvent(Event.DoneClicked) },
)
}
diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerContract.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerContract.kt
index 820793fde47..d61ce73f22c 100644
--- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerContract.kt
+++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerContract.kt
@@ -11,8 +11,7 @@ internal interface QrCodeScannerContract {
data class State(
val cameraPermissionState: UiPermissionState = UiPermissionState.Unknown,
- val scannedCount: Int = 0,
- val totalCount: Int = 0,
+ val displayText: DisplayText = DisplayText.HelpText,
)
sealed interface Event {
@@ -36,4 +35,9 @@ internal interface QrCodeScannerContract {
Denied,
Waiting,
}
+
+ sealed interface DisplayText {
+ data object HelpText : DisplayText
+ data class ProgressText(val scannedCount: Int, val totalCount: Int) : DisplayText
+ }
}
diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerView.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerView.kt
index ff001988ea9..7049ba12827 100644
--- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerView.kt
+++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerView.kt
@@ -2,16 +2,21 @@ package app.k9mail.feature.migration.qrcode.ui
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.res.stringResource
+import app.k9mail.core.ui.compose.theme2.MainTheme
+import app.k9mail.feature.migration.qrcode.R
import app.k9mail.feature.migration.qrcode.domain.QrCodeDomainContract.UseCase
+import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.DisplayText
@Composable
internal fun QrCodeScannerView(
cameraUseCasesProvider: UseCase.CameraUseCasesProvider,
- scannedCount: Int,
- totalCount: Int,
+ displayText: DisplayText,
onDoneClick: () -> Unit,
) {
Column(modifier = Modifier.testTag("QrCodeScannerView")) {
@@ -19,13 +24,31 @@ internal fun QrCodeScannerView(
cameraUseCasesProvider = cameraUseCasesProvider,
modifier = Modifier
.fillMaxWidth()
+ .padding(
+ top = MainTheme.spacings.double,
+ start = MainTheme.spacings.double,
+ end = MainTheme.spacings.double,
+ )
.weight(1f),
)
QrCodeScannerBottomContent(
- scannedCount = scannedCount,
- totalCount = totalCount,
+ text = buildString(displayText),
onDoneClick = onDoneClick,
)
}
}
+
+@Composable
+@ReadOnlyComposable
+private fun buildString(text: DisplayText): String {
+ return when (text) {
+ DisplayText.HelpText -> {
+ stringResource(R.string.migration_qrcode_scanning_instructions)
+ }
+
+ is DisplayText.ProgressText -> {
+ stringResource(R.string.migration_qrcode_scanning_progress, text.scannedCount, text.totalCount)
+ }
+ }
+}
diff --git a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModel.kt b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModel.kt
index 567dcbbb810..9df3855bd01 100644
--- a/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModel.kt
+++ b/feature/migration/qrcode/src/main/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModel.kt
@@ -6,6 +6,7 @@ import app.k9mail.feature.migration.qrcode.domain.QrCodeDomainContract.UseCase
import app.k9mail.feature.migration.qrcode.domain.entity.AccountData
import app.k9mail.feature.migration.qrcode.domain.entity.AccountData.Account
import app.k9mail.feature.migration.qrcode.domain.usecase.QrCodeImageAnalysisProvider
+import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.DisplayText
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.Effect
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.Event
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.State
@@ -33,6 +34,9 @@ internal class QrCodeScannerViewModel(
private val unsupportedPayloadHashes = ArrayDeque()
private val accountDataList = mutableListOf()
+ private var scannedCount = 0
+ private var totalCount = 0
+
override val cameraUseCasesProvider: UseCase.CameraUseCasesProvider =
createCameraUseCaseProvider(::handleQrCodeScanned)
@@ -103,13 +107,9 @@ internal class QrCodeScannerViewModel(
}
private fun handleSupportedPayload(accountData: AccountData) {
- val currentState = state.value
- if (accountData.sequenceEnd == currentState.totalCount) {
+ if (accountData.sequenceEnd == totalCount) {
accountDataList.add(accountData)
-
- updateState {
- it.copy(scannedCount = accountDataList.size)
- }
+ scannedCount = accountDataList.size
} else {
// Total QR code count doesn't match previous value. The user has probably started over.
@@ -117,9 +117,12 @@ internal class QrCodeScannerViewModel(
accountDataList.clear()
accountDataList.add(accountData)
- updateState {
- it.copy(scannedCount = 1, totalCount = accountData.sequenceEnd)
- }
+ scannedCount = 1
+ totalCount = accountData.sequenceEnd
+ }
+
+ updateState {
+ it.copy(displayText = DisplayText.ProgressText(scannedCount, totalCount))
}
if (accountDataList.size == accountData.sequenceEnd) {
diff --git a/feature/migration/qrcode/src/main/res/values-ar/strings.xml b/feature/migration/qrcode/src/main/res/values-ar/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ar/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-az/strings.xml b/feature/migration/qrcode/src/main/res/values-az/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-az/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-be/strings.xml b/feature/migration/qrcode/src/main/res/values-be/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-be/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-bg/strings.xml b/feature/migration/qrcode/src/main/res/values-bg/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-bg/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-br/strings.xml b/feature/migration/qrcode/src/main/res/values-br/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-br/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-bs/strings.xml b/feature/migration/qrcode/src/main/res/values-bs/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-bs/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-ca/strings.xml b/feature/migration/qrcode/src/main/res/values-ca/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ca/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-co/strings.xml b/feature/migration/qrcode/src/main/res/values-co/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-co/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-cs/strings.xml b/feature/migration/qrcode/src/main/res/values-cs/strings.xml
new file mode 100644
index 00000000000..fd9c631a041
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-cs/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Vyžadován přístup k fotoaparátu
+ Přejděte do nastavení systému Android, otevřete oprávnění a povolte přístup k fotoaparátu.
+ Přejít do nastavení
+ Naskenováno %1$s z %2$s
+ Hotovo
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-cy/strings.xml b/feature/migration/qrcode/src/main/res/values-cy/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-cy/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-da/strings.xml b/feature/migration/qrcode/src/main/res/values-da/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-da/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-de/strings.xml b/feature/migration/qrcode/src/main/res/values-de/strings.xml
new file mode 100644
index 00000000000..867e3e6d1f8
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-de/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Kamerazugriff erforderlich
+ Gehe zu den Android-Einstellungen, tippe auf Berechtigungen und erlaube den Zugriff auf die Kamera.
+ Zu den Einstellungen gehen
+ %1$s von %2$s gescannt
+ Erledigt
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-el/strings.xml b/feature/migration/qrcode/src/main/res/values-el/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-el/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-en-rGB/strings.xml b/feature/migration/qrcode/src/main/res/values-en-rGB/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-en-rGB/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-enm/strings.xml b/feature/migration/qrcode/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-eo/strings.xml b/feature/migration/qrcode/src/main/res/values-eo/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-eo/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-es/strings.xml b/feature/migration/qrcode/src/main/res/values-es/strings.xml
new file mode 100644
index 00000000000..14efc298c11
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-es/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Se necesita acceso a la cámara
+ Ve a los ajustes de Android, toca permisos y permite el acceso a la cámara.
+ Ir a la configuración
+ Escaneado %1$s de %2$s
+ Realizado
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-et/strings.xml b/feature/migration/qrcode/src/main/res/values-et/strings.xml
new file mode 100644
index 00000000000..bec2407c5dd
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-et/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Vajalik on ligipääs kaamerale
+ Ava Androidi seadistused, klõpsi õiguste seadistamisel ja luba ligipääs kaamerale.
+ Ava seadistused
+ Skaneeritud %1$s/%2$s
+ Valmis
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-eu/strings.xml b/feature/migration/qrcode/src/main/res/values-eu/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-eu/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-fa/strings.xml b/feature/migration/qrcode/src/main/res/values-fa/strings.xml
new file mode 100644
index 00000000000..d672d42f733
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-fa/strings.xml
@@ -0,0 +1,8 @@
+
+
+ نیازمند دسترسی دوربین
+ رفتن به تنظیمات اندروید، زدن روی اجازهها و اجازه به دسترسی به دوربین.
+ رفتن به تنظیمات
+ %1$s از %2$s پوییده
+ انجام شد
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-fi/strings.xml b/feature/migration/qrcode/src/main/res/values-fi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-fi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-fr/strings.xml b/feature/migration/qrcode/src/main/res/values-fr/strings.xml
new file mode 100644
index 00000000000..b78d7a9556b
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-fr/strings.xml
@@ -0,0 +1,8 @@
+
+
+ L’accès à l’appareil photo est nécessaire
+ Accédez aux paramètres d’Android, touchez les autorisations et accordez l’accès à l’appareil photo.
+ Accéder aux paramètres
+ %1$s codes sur %2$s a été lus
+ Terminé
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-fy/strings.xml b/feature/migration/qrcode/src/main/res/values-fy/strings.xml
new file mode 100644
index 00000000000..a76c3d9e6ca
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-fy/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Kamera hat tagong nedich
+ Gean nei Android-ynstellingen, tik op ‘toestemmingen’, en stean tagong ta de kamera ta.
+ Gea nei ynstellingen
+ Scand %1$s fan %2$s
+ Dien
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-gd/strings.xml b/feature/migration/qrcode/src/main/res/values-gd/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-gd/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-gl/strings.xml b/feature/migration/qrcode/src/main/res/values-gl/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-gl/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-hi/strings.xml b/feature/migration/qrcode/src/main/res/values-hi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-hi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-hr/strings.xml b/feature/migration/qrcode/src/main/res/values-hr/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-hr/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-hu/strings.xml b/feature/migration/qrcode/src/main/res/values-hu/strings.xml
new file mode 100644
index 00000000000..a99fce08340
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-hu/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Kamerához való hozzáférés szükséges
+ Kész
+ Menjen az Android beállításaihoz, koppintson az engedélyekre, és engedélyezze a kamerához való hozzáférést.
+ Menjen a beállításokhoz
+ %1$s %2$s beolvasása
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-hy/strings.xml b/feature/migration/qrcode/src/main/res/values-hy/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-hy/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-in/strings.xml b/feature/migration/qrcode/src/main/res/values-in/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-in/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-is/strings.xml b/feature/migration/qrcode/src/main/res/values-is/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-is/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-it/strings.xml b/feature/migration/qrcode/src/main/res/values-it/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-it/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-iw/strings.xml b/feature/migration/qrcode/src/main/res/values-iw/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-iw/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-ja/strings.xml b/feature/migration/qrcode/src/main/res/values-ja/strings.xml
new file mode 100644
index 00000000000..fac075441ca
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ja/strings.xml
@@ -0,0 +1,8 @@
+
+
+ 設定へ移動
+ 完了
+ カメラへのアクセス権が必要です
+ Android の設定で許可をタップして、カメラへのアクセスを許可してください。
+ %2$s / %1$s 個をスキャンしました
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-ka/strings.xml b/feature/migration/qrcode/src/main/res/values-ka/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ka/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-kab/strings.xml b/feature/migration/qrcode/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-kk/strings.xml b/feature/migration/qrcode/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-ko/strings.xml b/feature/migration/qrcode/src/main/res/values-ko/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ko/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-lt/strings.xml b/feature/migration/qrcode/src/main/res/values-lt/strings.xml
new file mode 100644
index 00000000000..6f958fd4a2f
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-lt/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Būtina fotoaparato prieiga
+ Eikite į „Android“ nustatymus, palieskite leidimus ir suteikite prieigą prie fotoaparato.
+ Eiti į nustatymus
+ Nuskenuota %1$s iš %2$s
+ Atlikta
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-lv/strings.xml b/feature/migration/qrcode/src/main/res/values-lv/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-lv/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-ml/strings.xml b/feature/migration/qrcode/src/main/res/values-ml/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ml/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-nb-rNO/strings.xml b/feature/migration/qrcode/src/main/res/values-nb-rNO/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-nb-rNO/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-nl/strings.xml b/feature/migration/qrcode/src/main/res/values-nl/strings.xml
new file mode 100644
index 00000000000..e1883aa6065
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-nl/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Camera heeft toegang nodig
+ Ga naar Android-instellingen, tik op toestemmingen, en sta toegang tot de camera toe.
+ Ga naar instellingen
+ Gescand %1$s van %2$s
+ Gereed
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-nn/strings.xml b/feature/migration/qrcode/src/main/res/values-nn/strings.xml
new file mode 100644
index 00000000000..f774105869b
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-nn/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Kamera-tilgjenge er påkravd
+ Gå til Android-innstillingar, trykk på løyve, og tillat tilgjenge til kameraet.
+ Gå til innstillingar
+ Skanna %1$s av %2$s
+ Ferdig
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-pl/strings.xml b/feature/migration/qrcode/src/main/res/values-pl/strings.xml
new file mode 100644
index 00000000000..5c5e5b6b298
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-pl/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Przejdź do ustawień
+ Przeskanowano %1$s z %2$s
+ Gotowe
+ Wymagany dostęp do aparatu
+ Przejdź do ustawień systemu Android, stuknij uprawnienia i zezwól na dostęp do aparatu.
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-pt-rBR/strings.xml b/feature/migration/qrcode/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-pt-rPT/strings.xml b/feature/migration/qrcode/src/main/res/values-pt-rPT/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-pt-rPT/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-pt/strings.xml b/feature/migration/qrcode/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-ro/strings.xml b/feature/migration/qrcode/src/main/res/values-ro/strings.xml
new file mode 100644
index 00000000000..b044720f8fe
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ro/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Accesul la cameră este necesar
+ Accesați «Setări»
+ Mergeți la «Setări» Android, selectați «Permisiuni» și permiteți accesul la cameră.
+ Scanat %1$s din %2$s
+ Gata
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-ru/strings.xml b/feature/migration/qrcode/src/main/res/values-ru/strings.xml
new file mode 100644
index 00000000000..7215b2b5266
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ru/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Перейти в настройки
+ Готово
+ Необходим доступ к камере
+ Перейдите в настройки Android, выберите \"Разрешения\" и предоставьте приложению доступ к камере.
+ Считано %1$s из %2$s
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-sk/strings.xml b/feature/migration/qrcode/src/main/res/values-sk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-sk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-sl/strings.xml b/feature/migration/qrcode/src/main/res/values-sl/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-sl/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-sq/strings.xml b/feature/migration/qrcode/src/main/res/values-sq/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-sq/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-sr/strings.xml b/feature/migration/qrcode/src/main/res/values-sr/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-sr/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-sv/strings.xml b/feature/migration/qrcode/src/main/res/values-sv/strings.xml
new file mode 100644
index 00000000000..d9aeb8d8023
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-sv/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Gå till inställningar
+ Skannade %1$s av %2$s
+ Klar
+ Kameraåtkomst behövs
+ Gå till Android-inställningar, tryck på behörigheter och tillåt åtkomst till kameran.
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-ta/strings.xml b/feature/migration/qrcode/src/main/res/values-ta/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-ta/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-tr/strings.xml b/feature/migration/qrcode/src/main/res/values-tr/strings.xml
new file mode 100644
index 00000000000..9484fcb91de
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-tr/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Kamera erişimi gerekli
+ Android ayarlarına gidin, izinlere dokunun ve kamera erişimine izin verin.
+ Ayarlara git
+ %1$s / %2$s tarandı
+ Tamam
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-uk/strings.xml b/feature/migration/qrcode/src/main/res/values-uk/strings.xml
new file mode 100644
index 00000000000..1c3fa89ba0f
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-uk/strings.xml
@@ -0,0 +1,8 @@
+
+
+ Перейти до Налаштувань
+ Скановано %1$s з %2$s
+ Готово
+ Потрібен доступ до камери
+ Перейдіть до налаштувань Android, торкніться Дозволи та дозвольте доступ до камери.
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-vi/strings.xml b/feature/migration/qrcode/src/main/res/values-vi/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-vi/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-zh-rCN/strings.xml b/feature/migration/qrcode/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 00000000000..55b96e066e1
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,8 @@
+
+
+ 转到 Android 设置,点击权限,然后允许访问相机。
+ 转到设置
+ 完成
+ 需要访问相机
+ 扫描了 %2$s 个中的 %1$s 个
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values-zh-rTW/strings.xml b/feature/migration/qrcode/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/migration/qrcode/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/migration/qrcode/src/main/res/values/strings.xml b/feature/migration/qrcode/src/main/res/values/strings.xml
index 242ef8cb78a..7c77dc6f444 100644
--- a/feature/migration/qrcode/src/main/res/values/strings.xml
+++ b/feature/migration/qrcode/src/main/res/values/strings.xml
@@ -4,5 +4,6 @@
Go to Android settings, tap permissions, and allow access to the camera.
Go to settings
Scanned %1$s of %2$s
+ Align the QR code provided from Thunderbird Desktop
Done
diff --git a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerBottomContentKtTest.kt b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerBottomContentKtTest.kt
index f7c640e248b..c0ec660ac21 100644
--- a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerBottomContentKtTest.kt
+++ b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerBottomContentKtTest.kt
@@ -15,25 +15,10 @@ import org.robolectric.annotation.Config
class QrCodeScannerBottomContentKtTest : ComposeTest() {
@Test
- fun `not having a total count should not show ScannedStatus`() = runComposeTest {
+ fun `text should be displayed`() = runComposeTest {
setContentWithTheme {
QrCodeScannerBottomContent(
- scannedCount = 0,
- totalCount = 0,
- onDoneClick = {},
- )
- }
-
- composeTestRule.onNodeWithTag("ScannedStatus").assertDoesNotExist()
- composeTestRule.onNodeWithTag("DoneButton").assertExists()
- }
-
- @Test
- fun `having a total count should show ScannedStatus`() = runComposeTest {
- setContentWithTheme {
- QrCodeScannerBottomContent(
- scannedCount = 1,
- totalCount = 2,
+ text = "Scanned 1 of 2",
onDoneClick = {},
)
}
@@ -48,8 +33,7 @@ class QrCodeScannerBottomContentKtTest : ComposeTest() {
setContentWithTheme {
QrCodeScannerBottomContent(
- scannedCount = 0,
- totalCount = 0,
+ text = "irrelevant",
onDoneClick = { doneClickCount++ },
)
}
diff --git a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModelTest.kt b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModelTest.kt
index bdb73183ee9..08879ad2d04 100644
--- a/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModelTest.kt
+++ b/feature/migration/qrcode/src/test/kotlin/app/k9mail/feature/migration/qrcode/ui/QrCodeScannerViewModelTest.kt
@@ -8,6 +8,7 @@ import app.k9mail.core.ui.compose.testing.mvi.runMviTest
import app.k9mail.core.ui.compose.testing.mvi.turbinesWithInitialStateCheck
import app.k9mail.feature.migration.qrcode.domain.QrCodeDomainContract.UseCase
import app.k9mail.feature.migration.qrcode.domain.usecase.QrCodePayloadReader
+import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.DisplayText
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.Effect
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.Event
import app.k9mail.feature.migration.qrcode.ui.QrCodeScannerContract.State
@@ -214,8 +215,10 @@ private class QrCodeScannerScreenRobot(
assertThat(turbines.awaitStateItem()).isEqualTo(
State(
cameraPermissionState = UiPermissionState.Granted,
- scannedCount = expectedScannedCount,
- totalCount = expectedScannedTotal,
+ displayText = DisplayText.ProgressText(
+ scannedCount = expectedScannedCount,
+ totalCount = expectedScannedTotal,
+ ),
),
)
}
diff --git a/feature/navigation/drawer/build.gradle.kts b/feature/navigation/drawer/build.gradle.kts
index d204f89975c..a0eac4680f8 100644
--- a/feature/navigation/drawer/build.gradle.kts
+++ b/feature/navigation/drawer/build.gradle.kts
@@ -8,16 +8,16 @@ android {
}
dependencies {
+ implementation(projects.core.mail.folder.api)
+
+ implementation(projects.core.ui.theme.api)
implementation(projects.core.ui.compose.designsystem)
- implementation(projects.legacy.core)
- implementation(projects.legacy.ui.base)
- implementation(projects.legacy.ui.account)
+ implementation(projects.legacy.account)
+ implementation(projects.legacy.mailstore)
+ implementation(projects.legacy.message)
+ implementation(projects.legacy.search)
implementation(projects.legacy.ui.folder)
- implementation(projects.core.ui.legacy.designsystem)
-
- implementation(libs.materialdrawer)
- implementation(libs.androidx.swiperefreshlayout)
testImplementation(projects.core.ui.compose.testing)
}
diff --git a/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatarPreview.kt b/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatarPreview.kt
index 3f4d0533fbb..95c305d231c 100644
--- a/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatarPreview.kt
+++ b/feature/navigation/drawer/src/debug/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatarPreview.kt
@@ -15,3 +15,29 @@ internal fun AccountAvatarPreview() {
)
}
}
+
+@Composable
+@Preview(showBackground = true)
+internal fun AccountAvatarWithUnreadCountPreview() {
+ PreviewWithThemes {
+ AccountAvatar(
+ account = DISPLAY_ACCOUNT.copy(
+ unreadMessageCount = 12,
+ ),
+ onClick = {},
+ )
+ }
+}
+
+@Composable
+@Preview(showBackground = true)
+internal fun AccountAvatarWithUnreadCountMaxedPreview() {
+ PreviewWithThemes {
+ AccountAvatar(
+ account = DISPLAY_ACCOUNT.copy(
+ unreadMessageCount = 100,
+ ),
+ onClick = {},
+ )
+ }
+}
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt
index 178273edb99..625950b56a5 100644
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt
+++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/FolderDrawer.kt
@@ -1,18 +1,15 @@
package app.k9mail.feature.navigation.drawer
-import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.ui.platform.ComposeView
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.lifecycle.compose.collectAsStateWithLifecycle
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import app.k9mail.core.ui.theme.api.FeatureThemeProvider
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayUnifiedFolderType
import app.k9mail.feature.navigation.drawer.domain.entity.createDisplayAccountFolderId
import app.k9mail.feature.navigation.drawer.ui.DrawerView
import app.k9mail.legacy.account.Account
-import com.mikepenz.materialdrawer.widget.MaterialDrawerSliderView
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.update
import org.koin.core.component.KoinComponent
@@ -36,19 +33,14 @@ class FolderDrawer(
private val themeProvider: FeatureThemeProvider by inject()
private val drawer: DrawerLayout = parent.findViewById(R.id.navigation_drawer_layout)
- private val drawerView: ComposeView = parent.findViewById(R.id.material_drawer_compose_view)
- private val sliderView: MaterialDrawerSliderView = parent.findViewById(R.id.material_drawer_slider)
- private val swipeRefreshLayout: SwipeRefreshLayout = parent.findViewById(R.id.material_drawer_swipe_refresh)
+ private val drawerContent: ComposeView = parent.findViewById(R.id.navigation_drawer_content)
private val drawerState = MutableStateFlow(FolderDrawerState())
init {
- sliderView.visibility = View.GONE
- drawerView.visibility = View.VISIBLE
- swipeRefreshLayout.isEnabled = false
drawer.addDrawerListener(createDrawerListener())
- drawerView.setContent {
+ drawerContent.setContent {
themeProvider.WithTheme {
val state = drawerState.collectAsStateWithLifecycle()
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/LegacyDrawer.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/LegacyDrawer.kt
deleted file mode 100644
index dbda63dbfd3..00000000000
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/LegacyDrawer.kt
+++ /dev/null
@@ -1,573 +0,0 @@
-package app.k9mail.feature.navigation.drawer
-
-import android.content.Context
-import android.content.res.ColorStateList
-import android.content.res.Resources
-import android.graphics.PorterDuff
-import android.graphics.drawable.Drawable
-import android.net.Uri
-import android.os.Bundle
-import android.view.View
-import android.widget.ImageView
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.GravityCompat
-import androidx.drawerlayout.widget.DrawerLayout
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-import app.k9mail.core.mail.folder.api.Folder
-import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons
-import app.k9mail.core.ui.theme.api.Theme
-import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
-import app.k9mail.feature.navigation.drawer.legacy.AccountsViewModel
-import app.k9mail.feature.navigation.drawer.legacy.DisplayUnifiedInbox
-import app.k9mail.feature.navigation.drawer.legacy.FolderList
-import app.k9mail.feature.navigation.drawer.legacy.FoldersViewModel
-import app.k9mail.legacy.account.Account
-import app.k9mail.legacy.message.controller.MessagingControllerMailChecker
-import app.k9mail.legacy.message.controller.SimpleMessagingListener
-import app.k9mail.legacy.ui.account.AccountImageLoader
-import app.k9mail.legacy.ui.folder.DisplayFolder
-import app.k9mail.legacy.ui.folder.FolderIconProvider
-import app.k9mail.legacy.ui.folder.FolderNameFormatter
-import app.k9mail.legacy.ui.theme.ThemeManager
-import com.fsck.k9.K9
-import com.fsck.k9.ui.base.livedata.observeNotNull
-import com.mikepenz.materialdrawer.holder.BadgeStyle
-import com.mikepenz.materialdrawer.holder.ImageHolder
-import com.mikepenz.materialdrawer.model.DividerDrawerItem
-import com.mikepenz.materialdrawer.model.PrimaryDrawerItem
-import com.mikepenz.materialdrawer.model.ProfileDrawerItem
-import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem
-import com.mikepenz.materialdrawer.model.interfaces.IProfile
-import com.mikepenz.materialdrawer.model.interfaces.badgeText
-import com.mikepenz.materialdrawer.model.interfaces.descriptionText
-import com.mikepenz.materialdrawer.model.interfaces.iconRes
-import com.mikepenz.materialdrawer.model.interfaces.nameRes
-import com.mikepenz.materialdrawer.model.interfaces.nameText
-import com.mikepenz.materialdrawer.model.interfaces.selectedColorInt
-import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
-import com.mikepenz.materialdrawer.util.DrawerImageLoader
-import com.mikepenz.materialdrawer.util.addItems
-import com.mikepenz.materialdrawer.util.addStickyFooterItem
-import com.mikepenz.materialdrawer.util.getDrawerItem
-import com.mikepenz.materialdrawer.util.removeAllItems
-import com.mikepenz.materialdrawer.widget.AccountHeaderView
-import com.mikepenz.materialdrawer.widget.MaterialDrawerSliderView
-import org.koin.androidx.viewmodel.ext.android.viewModel
-import org.koin.core.component.KoinComponent
-import org.koin.core.component.inject
-import com.fsck.k9.core.R as CoreR
-import com.mikepenz.materialdrawer.R as MaterialDrawerR
-
-private const val UNREAD_SYMBOL = "\u2B24"
-private const val STARRED_SYMBOL = "\u2605"
-private const val THIN_SPACE = "\u2009"
-private const val EN_SPACE = "\u2000"
-
-@Suppress("MagicNumber", "TooManyFunctions", "LongParameterList")
-class LegacyDrawer(
- override val parent: AppCompatActivity,
- private val openManageFolders: () -> Unit,
- private val openUnifiedInbox: () -> Unit,
- private val openFolder: (folderId: Long) -> Unit,
- private val openAccount: (account: Account) -> Boolean,
- private val openSettings: () -> Unit,
- createDrawerListener: () -> DrawerLayout.DrawerListener,
- savedInstanceState: Bundle?,
-) : NavigationDrawer, KoinComponent {
- private val foldersViewModel: FoldersViewModel by parent.viewModel()
- private val accountsViewModel: AccountsViewModel by parent.viewModel()
- private val folderNameFormatter: FolderNameFormatter by inject()
- private val themeManager: ThemeManager by inject()
- private val resources: Resources by inject()
- private val messagingController: MessagingControllerMailChecker by inject()
- private val accountImageLoader: AccountImageLoader by inject()
- private val folderIconProvider: FolderIconProvider by inject()
-
- private val drawer: DrawerLayout = parent.findViewById(R.id.navigation_drawer_layout)
- private val sliderView: MaterialDrawerSliderView = parent.findViewById(R.id.material_drawer_slider)
- private val composeView: View = parent.findViewById(R.id.material_drawer_compose_view)
- private val headerView: AccountHeaderView = AccountHeaderView(parent).apply {
- attachToSliderView(this@LegacyDrawer.sliderView)
- dividerBelowHeader = false
- displayBadgesOnCurrentProfileImage = false
- }
- private val swipeRefreshLayout: SwipeRefreshLayout
-
- private val userFolderDrawerIds = ArrayList()
- private var unifiedInboxSelected: Boolean = false
- private val textColor: Int
- private var selectedTextColor: ColorStateList? = null
- private var selectedBackgroundColor: Int = 0
- private var folderBadgeStyle: BadgeStyle? = null
- private var openedAccountUuid: String? = null
- private var openedFolderId: Long? = null
- private var latestFolderList: FolderList? = null
-
- override val isOpen: Boolean
- get() = drawer.isOpen
-
- init {
- composeView.visibility = View.GONE
- sliderView.visibility = View.VISIBLE
-
- textColor = parent.obtainDrawerTextColor()
-
- initializeImageLoader()
- configureAccountHeader()
-
- drawer.addDrawerListener(createDrawerListener())
- sliderView.tintStatusBar = true
- sliderView.onDrawerItemClickListener = { _, item, _ ->
- handleItemClickListener(item)
- false
- }
- sliderView.setSavedInstance(savedInstanceState)
- headerView.withSavedInstance(savedInstanceState)
-
- swipeRefreshLayout = parent.findViewById(R.id.material_drawer_swipe_refresh)
- headerView.addOnLayoutChangeListener { view, _, _, _, _, _, _, _, _ ->
- val densityMultiplier = view.resources.displayMetrics.density
- val progressViewStart = view.measuredHeight
- val progressViewEnd = progressViewStart + (PROGRESS_VIEW_END_OFFSET * densityMultiplier).toInt()
-
- val progressViewStartOld = swipeRefreshLayout.progressViewStartOffset
- val progressViewEndOld = swipeRefreshLayout.progressViewEndOffset
- if (progressViewStart != progressViewStartOld || progressViewEnd != progressViewEndOld) {
- swipeRefreshLayout.setProgressViewOffset(true, progressViewStart, progressViewEnd)
-
- val slingshotDistance = (PROGRESS_VIEW_SLINGSHOT_DISTANCE * densityMultiplier).toInt()
- swipeRefreshLayout.setSlingshotDistance(slingshotDistance)
- }
- }
-
- addFooterItems()
-
- accountsViewModel.displayAccountsLiveData.observeNotNull(parent) { accounts ->
- setAccounts(accounts)
- }
-
- foldersViewModel.getFolderListLiveData().observe(parent) { folderList ->
- setUserFolders(folderList)
- }
- }
-
- private fun initializeImageLoader() {
- DrawerImageLoader.init(
- object : AbstractDrawerImageLoader() {
- override fun set(imageView: ImageView, uri: Uri, placeholder: Drawable, tag: String?) {
- val email = uri.getQueryParameter(QUERY_EMAIL) ?: error("Missing '$QUERY_EMAIL' parameter in $uri")
- val color = uri.getQueryParameter(QUERY_COLOR)?.toInt()
- ?: error("Missing '$QUERY_COLOR' parameter in $uri")
-
- accountImageLoader.setAccountImage(imageView, email, color)
- }
-
- override fun cancel(imageView: ImageView) {
- accountImageLoader.cancel(imageView)
- }
- },
- ).apply {
- handledProtocols = listOf(INTERNAL_URI_SCHEME)
- }
- }
-
- private fun configureAccountHeader() {
- headerView.headerBackground = ImageHolder(R.drawable.navigation_drawer_header_background)
-
- headerView.onAccountHeaderListener = { _, profile, _ ->
- val account = (profile as ProfileDrawerItem).tag as Account
- openedAccountUuid = account.uuid
- val eventHandled = openAccount(account)
- updateUserAccountsAndFolders(account)
-
- eventHandled
- }
- }
-
- private fun buildBadgeText(displayAccount: DisplayAccount): String? {
- return buildBadgeText(displayAccount.unreadMessageCount, displayAccount.starredMessageCount)
- }
-
- private fun buildBadgeText(displayFolder: DisplayFolder): String? {
- return buildBadgeText(displayFolder.unreadMessageCount, displayFolder.starredMessageCount)
- }
-
- private fun buildBadgeText(unifiedInbox: DisplayUnifiedInbox): String? {
- return buildBadgeText(unifiedInbox.unreadMessageCount, unifiedInbox.starredMessageCount)
- }
-
- private fun buildBadgeText(unreadCount: Int, starredCount: Int): String? {
- return if (K9.isShowStarredCount) {
- buildBadgeTextWithStarredCount(unreadCount, starredCount)
- } else {
- buildBadgeTextWithUnreadCount(unreadCount)
- }
- }
-
- private fun buildBadgeTextWithStarredCount(unreadCount: Int, starredCount: Int): String? {
- if (unreadCount == 0 && starredCount == 0) return null
-
- return buildString {
- val hasUnreadCount = unreadCount > 0
- if (hasUnreadCount) {
- append(UNREAD_SYMBOL)
- append(THIN_SPACE)
- append(unreadCount)
- }
-
- if (starredCount > 0) {
- if (hasUnreadCount) {
- append(EN_SPACE)
- }
- append(STARRED_SYMBOL)
- append(THIN_SPACE)
- append(starredCount)
- }
- }
- }
-
- private fun buildBadgeTextWithUnreadCount(unreadCount: Int): String? {
- return if (unreadCount > 0) unreadCount.toString() else null
- }
-
- @Suppress("SpreadOperator")
- private fun setAccounts(displayAccounts: List) {
- val oldSelectedBackgroundColor = selectedBackgroundColor
-
- val isOpenedAccountStillAvailable = displayAccounts.any { it.account.uuid == openedAccountUuid }
- if (!isOpenedAccountStillAvailable) {
- openedAccountUuid = displayAccounts.first().account.uuid
- }
-
- var newActiveProfile: IProfile? = null
- val accountItems = displayAccounts.map { displayAccount ->
- val account = displayAccount.account
-
- val drawerColors = getDrawerColorsForAccount(account)
- val selectedTextColor = drawerColors.accentColor.toSelectedColorStateList()
-
- val accountItem = ProfileDrawerItem().apply {
- account.name.let { accountName ->
- isNameShown = accountName != null
- nameText = accountName.orEmpty()
- }
- descriptionText = account.email
- identifier = account.drawerId
- tag = account
- textColor = selectedTextColor
- descriptionTextColor = selectedTextColor
- selectedColorInt = drawerColors.selectedColor
- icon = ImageHolder(createAccountImageUri(account))
- buildBadgeText(displayAccount)?.let { text ->
- badgeText = text
- badgeStyle = BadgeStyle().apply {
- textColorStateList = selectedTextColor
- }
- }
- }
-
- if (account.uuid == openedAccountUuid) {
- initializeWithAccountColor(account)
- newActiveProfile = accountItem
- }
-
- accountItem
- }.toTypedArray()
-
- headerView.clear()
- headerView.addProfiles(*accountItems)
-
- newActiveProfile?.let { profile ->
- headerView.activeProfile = profile
- }
-
- if (oldSelectedBackgroundColor != selectedBackgroundColor) {
- // Recreate list of folders with updated account color
- setUserFolders(latestFolderList)
- }
- }
-
- private fun addFooterItems() {
- sliderView.addStickyFooterItem(
- PrimaryDrawerItem().apply {
- nameRes = R.string.navigation_drawer_action_manage_folders
- iconRes = Icons.Outlined.Folder
- identifier = DRAWER_ID_FOLDERS
- isSelectable = false
- },
- )
-
- sliderView.addStickyFooterItem(
- PrimaryDrawerItem().apply {
- nameRes = R.string.navigation_drawer_action_settings
- iconRes = Icons.Outlined.Settings
- identifier = DRAWER_ID_PREFERENCES
- isSelectable = false
- },
- )
- }
-
- private fun getFolderDisplayName(folder: Folder): String {
- return folderNameFormatter.displayName(folder)
- }
-
- override fun updateUserAccountsAndFolders(account: Account?) {
- if (account != null) {
- initializeWithAccountColor(account)
- headerView.setActiveProfile(account.drawerId)
- foldersViewModel.loadFolders(account)
- }
-
- // Account can be null to refresh all (unified inbox or account list).
- swipeRefreshLayout.setOnRefreshListener {
- val accountToRefresh = if (headerView.selectionListShown) null else account
- messagingController.checkMail(
- account = accountToRefresh,
- ignoreLastCheckedTime = true,
- useManualWakeLock = true,
- notify = true,
- listener = object : SimpleMessagingListener() {
- override fun checkMailFinished(context: Context?, account: Account?) {
- swipeRefreshLayout.post {
- swipeRefreshLayout.isRefreshing = false
- }
- }
- },
- )
- }
- }
-
- private fun initializeWithAccountColor(account: Account) {
- getDrawerColorsForAccount(account).let { drawerColors ->
- selectedBackgroundColor = drawerColors.selectedColor
- val selectedTextColor = drawerColors.accentColor.toSelectedColorStateList()
- this.selectedTextColor = selectedTextColor
- folderBadgeStyle = BadgeStyle().apply {
- textColorStateList = selectedTextColor
- }
- }
- headerView.accountHeaderBackground.setColorFilter(account.chipColor, PorterDuff.Mode.MULTIPLY)
- }
-
- private fun handleItemClickListener(drawerItem: IDrawerItem<*>) {
- when (drawerItem.identifier) {
- DRAWER_ID_PREFERENCES -> openSettings()
- DRAWER_ID_FOLDERS -> openManageFolders()
- DRAWER_ID_UNIFIED_INBOX -> openUnifiedInbox()
- else -> {
- val folder = drawerItem.tag as Folder
- openFolder(folder.id)
- }
- }
- }
-
- private fun setUserFolders(folderList: FolderList?) {
- this.latestFolderList = folderList
- clearUserFolders()
-
- var openedFolderDrawerId: Long = -1
-
- if (folderList == null) {
- return
- }
-
- folderList.unifiedInbox?.let { unifiedInbox ->
- val unifiedInboxItem = PrimaryDrawerItem().apply {
- iconRes = Icons.Outlined.AllInbox
- identifier = DRAWER_ID_UNIFIED_INBOX
- nameRes = R.string.navigation_drawer_unified_inbox_title
- selectedColorInt = selectedBackgroundColor
- textColor = selectedTextColor
- isSelected = unifiedInboxSelected
- buildBadgeText(unifiedInbox)?.let { text ->
- badgeText = text
- badgeStyle = folderBadgeStyle
- }
- }
-
- sliderView.addItems(unifiedInboxItem)
- sliderView.addItems(FixedDividerDrawerItem(identifier = DRAWER_ID_DIVIDER))
-
- if (unifiedInboxSelected) {
- openedFolderDrawerId = DRAWER_ID_UNIFIED_INBOX
- }
- }
-
- val accountOffset = folderList.accountId.toLong() shl DRAWER_ACCOUNT_SHIFT
- for (displayFolder in folderList.folders) {
- val folder = displayFolder.folder
- val drawerId = accountOffset + folder.id
-
- val drawerItem = FolderDrawerItem().apply {
- iconRes = folderIconProvider.getFolderIcon(folder.type)
- identifier = drawerId
- tag = folder
- nameText = getFolderDisplayName(folder)
- buildBadgeText(displayFolder)?.let { text ->
- badgeText = text
- badgeStyle = folderBadgeStyle
- }
- selectedColorInt = selectedBackgroundColor
- textColor = selectedTextColor
- }
-
- sliderView.addItems(drawerItem)
- userFolderDrawerIds.add(drawerId)
- if (folder.id == openedFolderId) {
- openedFolderDrawerId = drawerId
- }
- }
-
- if (openedFolderDrawerId != -1L) {
- sliderView.setSelection(openedFolderDrawerId, false)
- }
- }
-
- private fun clearUserFolders() {
- // remove old items first
- sliderView.selectExtension.deselect()
- sliderView.removeAllItems()
- userFolderDrawerIds.clear()
- }
-
- override fun selectAccount(accountUuid: String) {
- openedAccountUuid = accountUuid
- headerView.profiles?.firstOrNull { it.accountUuid == accountUuid }?.let { profile ->
- headerView.activeProfile = profile
- }
- }
-
- override fun selectFolder(accountUuid: String, folderId: Long) {
- deselect()
- openedFolderId = folderId
- for (drawerId in userFolderDrawerIds) {
- val folder = sliderView.getDrawerItem(drawerId)?.tag as? Folder
- if (folder?.id == folderId) {
- sliderView.setSelection(drawerId, false)
- return
- }
- }
- }
-
- override fun deselect() {
- unifiedInboxSelected = false
- openedFolderId = null
- sliderView.selectExtension.deselect()
- }
-
- override fun selectUnifiedInbox() {
- headerView.selectionListShown = false
- deselect()
- unifiedInboxSelected = true
- sliderView.setSelection(DRAWER_ID_UNIFIED_INBOX, false)
- }
-
- private data class DrawerColors(
- val accentColor: Int,
- val selectedColor: Int,
- )
-
- private fun getDrawerColorsForAccount(account: Account): DrawerColors {
- val baseColor = if (themeManager.appTheme == Theme.DARK) {
- getDarkThemeAccentColor(account.chipColor)
- } else {
- account.chipColor
- }
- return DrawerColors(
- accentColor = baseColor,
- selectedColor = baseColor.and(0xffffff).or(0x22000000),
- )
- }
-
- private fun getDarkThemeAccentColor(color: Int): Int {
- val lightColors = resources.getIntArray(CoreR.array.account_colors)
- val darkColors = resources.getIntArray(CoreR.array.drawer_account_accent_color_dark_theme)
- val index = lightColors.indexOf(color)
- return if (index == -1) color else darkColors[index]
- }
-
- override fun open() {
- drawer.openDrawer(GravityCompat.START)
- }
-
- override fun close() {
- drawer.closeDrawer(GravityCompat.START)
- }
-
- override fun lock() {
- drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
- }
-
- override fun unlock() {
- drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
- }
-
- private fun createAccountImageUri(account: Account): Uri {
- return Uri.parse("$INTERNAL_URI_SCHEME://account-image/")
- .buildUpon()
- .appendQueryParameter(QUERY_EMAIL, account.email)
- .appendQueryParameter(QUERY_COLOR, account.chipColor.toString())
- .build()
- }
-
- private fun Int.toSelectedColorStateList(): ColorStateList {
- val states = arrayOf(
- intArrayOf(android.R.attr.state_selected),
- intArrayOf(),
- )
-
- val colors = intArrayOf(
- this,
- textColor,
- )
-
- return ColorStateList(states, colors)
- }
-
- private val IProfile.accountUuid: String?
- get() = (this.tag as? Account)?.uuid
-
- private val Account.drawerId: Long
- get() = (accountNumber + 1).toLong()
-
- companion object {
- // Use the lower 48 bits for the folder ID, the upper bits for the account's drawer ID
- private const val DRAWER_ACCOUNT_SHIFT: Int = 48
-
- private const val DRAWER_ID_UNIFIED_INBOX: Long = 0
- private const val DRAWER_ID_DIVIDER: Long = 1
- private const val DRAWER_ID_PREFERENCES: Long = 2
- private const val DRAWER_ID_FOLDERS: Long = 3
-
- private const val PROGRESS_VIEW_END_OFFSET = 32
- private const val PROGRESS_VIEW_SLINGSHOT_DISTANCE = 48
-
- private const val INTERNAL_URI_SCHEME = "app-internal"
- private const val QUERY_EMAIL = "email"
- private const val QUERY_COLOR = "color"
- }
-}
-
-private fun Context.obtainDrawerTextColor(): Int {
- val styledAttributes = obtainStyledAttributes(
- null,
- MaterialDrawerR.styleable.MaterialDrawerSliderView,
- MaterialDrawerR.attr.materialDrawerStyle,
- MaterialDrawerR.style.Widget_MaterialDrawerStyle,
- )
- val textColor = styledAttributes.getColor(
- MaterialDrawerR.styleable.MaterialDrawerSliderView_materialDrawerPrimaryText,
- 0,
- )
- styledAttributes.recycle()
-
- return textColor
-}
-
-private class FixedDividerDrawerItem(override var identifier: Long) : DividerDrawerItem()
-
-// We ellipsize long folder names in the middle for better readability
-private class FolderDrawerItem : PrimaryDrawerItem() {
- override val type: Int = R.id.navigation_drawer_legacy_list_folder_item
- override val layoutRes: Int = R.layout.navigation_drawer_legacy_list_folder_item
-}
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt
index e4463ef4bdd..aa63cc325d4 100644
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt
+++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/NavigationDrawerModule.kt
@@ -6,11 +6,7 @@ import app.k9mail.feature.navigation.drawer.domain.usecase.GetDisplayFoldersForA
import app.k9mail.feature.navigation.drawer.domain.usecase.GetDrawerConfig
import app.k9mail.feature.navigation.drawer.domain.usecase.SyncAccount
import app.k9mail.feature.navigation.drawer.domain.usecase.SyncAllAccounts
-import app.k9mail.feature.navigation.drawer.legacy.AccountsViewModel
-import app.k9mail.feature.navigation.drawer.legacy.FoldersViewModel
import app.k9mail.feature.navigation.drawer.ui.DrawerViewModel
-import com.fsck.k9.CoreResourceProvider
-import com.fsck.k9.K9
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.module.Module
import org.koin.dsl.module
@@ -51,24 +47,6 @@ val navigationDrawerModule: Module = module {
)
}
- viewModel {
- AccountsViewModel(
- getDisplayAccounts = get(),
- )
- }
-
- viewModel {
- val coreResourceProvider = get()
-
- FoldersViewModel(
- folderRepository = get(),
- messageCountsProvider = get(),
- isShowUnifiedInbox = { K9.isShowUnifiedInbox },
- getUnifiedInboxTitle = { coreResourceProvider.searchUnifiedInboxTitle() },
- getUnifiedInboxDetail = { coreResourceProvider.searchUnifiedInboxDetail() },
- )
- }
-
viewModel {
DrawerViewModel(
getDrawerConfig = get(),
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/AccountsViewModel.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/AccountsViewModel.kt
deleted file mode 100644
index 8be73ff6726..00000000000
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/AccountsViewModel.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package app.k9mail.feature.navigation.drawer.legacy
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.asLiveData
-import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase
-import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
-
-internal class AccountsViewModel(
- getDisplayAccounts: UseCase.GetDisplayAccounts,
-) : ViewModel() {
- val displayAccountsLiveData: LiveData> = getDisplayAccounts().asLiveData()
-}
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/DisplayUnifiedInbox.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/DisplayUnifiedInbox.kt
deleted file mode 100644
index 72306d4c73e..00000000000
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/DisplayUnifiedInbox.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package app.k9mail.feature.navigation.drawer.legacy
-
-internal data class DisplayUnifiedInbox(
- val unreadMessageCount: Int,
- val starredMessageCount: Int,
-)
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/FolderList.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/FolderList.kt
deleted file mode 100644
index 94986198fea..00000000000
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/FolderList.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package app.k9mail.feature.navigation.drawer.legacy
-
-import app.k9mail.legacy.ui.folder.DisplayFolder
-
-internal data class FolderList(
- val unifiedInbox: DisplayUnifiedInbox?,
- val accountId: Int,
- val folders: List,
-)
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/FoldersViewModel.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/FoldersViewModel.kt
deleted file mode 100644
index 82d10287b39..00000000000
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/legacy/FoldersViewModel.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-package app.k9mail.feature.navigation.drawer.legacy
-
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.asLiveData
-import androidx.lifecycle.viewModelScope
-import app.k9mail.legacy.account.Account
-import app.k9mail.legacy.message.controller.MessageCountsProvider
-import app.k9mail.legacy.search.SearchAccount
-import app.k9mail.legacy.ui.folder.DisplayFolderRepository
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.flatMapLatest
-import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.launch
-
-@OptIn(ExperimentalCoroutinesApi::class)
-internal class FoldersViewModel(
- private val folderRepository: DisplayFolderRepository,
- private val messageCountsProvider: MessageCountsProvider,
- private val isShowUnifiedInbox: () -> Boolean,
- private val getUnifiedInboxTitle: () -> String,
- private val getUnifiedInboxDetail: () -> String,
- backgroundDispatcher: CoroutineDispatcher = Dispatchers.IO,
-) : ViewModel() {
- private val inputFlow = MutableSharedFlow(replay = 1)
- private val foldersFlow = inputFlow
- .flatMapLatest { account ->
- if (account == null) {
- flowOf(0 to emptyList())
- } else {
- folderRepository.getDisplayFoldersFlow(account.uuid)
- .map { displayFolders ->
- account.accountNumber to displayFolders
- }
- }
- }
- .map { (accountNumber, displayFolders) ->
- FolderList(
- unifiedInbox = createDisplayUnifiedInbox(),
- accountId = accountNumber + 1,
- folders = displayFolders,
- )
- }
- .flowOn(backgroundDispatcher)
-
- private fun createDisplayUnifiedInbox(): DisplayUnifiedInbox? {
- return getUnifiedInboxAccount()?.let { searchAccount ->
- val messageCounts = messageCountsProvider.getMessageCounts(searchAccount)
- DisplayUnifiedInbox(messageCounts.unread, messageCounts.starred)
- }
- }
-
- private fun getUnifiedInboxAccount(): SearchAccount? {
- return if (isShowUnifiedInbox()) {
- SearchAccount.createUnifiedInboxAccount(
- unifiedInboxTitle = getUnifiedInboxTitle(),
- unifiedInboxDetail = getUnifiedInboxDetail(),
- )
- } else {
- null
- }
- }
-
- fun getFolderListLiveData(): LiveData {
- return foldersFlow.asLiveData()
- }
-
- fun loadFolders(account: Account) {
- viewModelScope.launch {
- // When switching accounts we want to remove the old list right away, not keep it until the new list
- // has been loaded.
- inputFlow.emit(null)
-
- inputFlow.emit(account)
- }
- }
-}
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt
index 877d96c674e..ecceccb3a52 100644
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt
+++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerContract.kt
@@ -23,7 +23,7 @@ internal interface DrawerContract {
val selectedAccountUuid: String? = null,
val folders: ImmutableList = persistentListOf(),
val selectedFolderId: String? = null,
- val showAccountSelector: Boolean = false,
+ val showAccountSelector: Boolean = true,
val isLoading: Boolean = false,
)
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatar.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatar.kt
index 49e48afd7d1..229d727d002 100644
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatar.kt
+++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/account/AccountAvatar.kt
@@ -9,11 +9,16 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import app.k9mail.core.ui.compose.designsystem.atom.Surface
+import app.k9mail.core.ui.compose.designsystem.atom.text.TextLabelSmall
import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium
+import app.k9mail.core.ui.compose.theme2.ColorRoles
import app.k9mail.core.ui.compose.theme2.MainTheme
+import app.k9mail.core.ui.compose.theme2.toColorRoles
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
+import app.k9mail.feature.navigation.drawer.ui.common.labelForCount
@Composable
internal fun AccountAvatar(
@@ -21,27 +26,38 @@ internal fun AccountAvatar(
onClick: (DisplayAccount) -> Unit,
modifier: Modifier = Modifier,
) {
+ val context = LocalContext.current
val accountColor = calculateAccountColor(account.account.chipColor)
+ val accountColorRoles = accountColor.toColorRoles(context)
- Surface(
- modifier = modifier
- .size(MainTheme.sizes.iconAvatar)
- .border(2.dp, accountColor, CircleShape)
- .padding(2.dp),
- color = accountColor.copy(alpha = 0.3f),
- shape = CircleShape,
+ Box(
+ modifier = modifier,
+ contentAlignment = Alignment.BottomEnd,
) {
- Box(
- contentAlignment = Alignment.Center,
+ Surface(
modifier = Modifier
- .border(2.dp, MainTheme.colors.surfaceContainerLowest, CircleShape)
+ .size(MainTheme.sizes.iconAvatar)
+ .border(2.dp, accountColor, CircleShape)
+ .padding(2.dp)
.clickable(onClick = { onClick(account) }),
+ color = accountColor.copy(alpha = 0.3f),
+ shape = CircleShape,
) {
- Placeholder(
- email = account.account.email,
- )
- // TODO: Add image loading
+ Box(
+ contentAlignment = Alignment.Center,
+ modifier = Modifier
+ .border(2.dp, MainTheme.colors.surfaceContainerLowest, CircleShape),
+ ) {
+ Placeholder(
+ email = account.account.email,
+ )
+ // TODO: Add image loading
+ }
}
+ UnreadBadge(
+ unreadCount = account.unreadMessageCount,
+ accountColorRoles = accountColorRoles,
+ )
}
}
@@ -56,6 +72,35 @@ private fun Placeholder(
)
}
+@Composable
+private fun UnreadBadge(
+ unreadCount: Int,
+ accountColorRoles: ColorRoles,
+ modifier: Modifier = Modifier,
+) {
+ if (unreadCount > 0) {
+ val resources = LocalContext.current.resources
+
+ Surface(
+ color = accountColorRoles.accent,
+ shape = CircleShape,
+ modifier = modifier,
+ ) {
+ TextLabelSmall(
+ text = labelForCount(
+ count = unreadCount,
+ resources = resources,
+ ),
+ color = accountColorRoles.onAccent,
+ modifier = Modifier.padding(
+ horizontal = 3.dp,
+ vertical = 2.dp,
+ ),
+ )
+ }
+ }
+}
+
private fun extractDomainInitials(email: String): String {
return email.split("@")[1].take(2)
}
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/common/LabelForCount.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/common/LabelForCount.kt
new file mode 100644
index 00000000000..02b5973cb31
--- /dev/null
+++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/common/LabelForCount.kt
@@ -0,0 +1,22 @@
+package app.k9mail.feature.navigation.drawer.ui.common
+
+import android.content.res.Resources
+import app.k9mail.feature.navigation.drawer.R
+
+@Suppress("MagicNumber")
+internal fun labelForCount(
+ count: Int,
+ resources: Resources,
+) = when {
+ count in 1..99 -> "$count"
+
+ count in 100..1000 -> resources.getString(
+ R.string.navigation_drawer_folder_item_badge_count_greater_than_99,
+ )
+
+ count > 1000 -> resources.getString(
+ R.string.navigation_drawer_folder_item_badge_count_greater_than_1_000,
+ )
+
+ else -> ""
+}
diff --git a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItemBadge.kt b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItemBadge.kt
index 17f5ee320fb..49943fff00d 100644
--- a/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItemBadge.kt
+++ b/feature/navigation/drawer/src/main/kotlin/app/k9mail/feature/navigation/drawer/ui/folder/FolderListItemBadge.kt
@@ -1,6 +1,5 @@
package app.k9mail.feature.navigation.drawer.ui.folder
-import android.content.res.Resources
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.runtime.Composable
@@ -10,7 +9,7 @@ import androidx.compose.ui.platform.LocalContext
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons
import app.k9mail.core.ui.compose.designsystem.organism.drawer.NavigationDrawerItemBadge
import app.k9mail.core.ui.compose.theme2.MainTheme
-import app.k9mail.feature.navigation.drawer.R
+import app.k9mail.feature.navigation.drawer.ui.common.labelForCount
@Composable
internal fun FolderListItemBadge(
@@ -87,21 +86,3 @@ private fun FolderCountAndStarredBadge(
}
}
}
-
-@Suppress("MagicNumber")
-private fun labelForCount(
- count: Int,
- resources: Resources,
-) = when {
- count in 1..99 -> "$count"
-
- count in 100..1000 -> resources.getString(
- R.string.navigation_drawer_folder_item_badge_count_greater_than_99,
- )
-
- count > 1000 -> resources.getString(
- R.string.navigation_drawer_folder_item_badge_count_greater_than_1_000,
- )
-
- else -> ""
-}
diff --git a/feature/navigation/drawer/src/main/res/drawable-hdpi/navigation_drawer_header_background.png b/feature/navigation/drawer/src/main/res/drawable-hdpi/navigation_drawer_header_background.png
deleted file mode 100644
index f2a357a893e..00000000000
Binary files a/feature/navigation/drawer/src/main/res/drawable-hdpi/navigation_drawer_header_background.png and /dev/null differ
diff --git a/feature/navigation/drawer/src/main/res/drawable-mdpi/navigation_drawer_header_background.png b/feature/navigation/drawer/src/main/res/drawable-mdpi/navigation_drawer_header_background.png
deleted file mode 100644
index b4900bc1e36..00000000000
Binary files a/feature/navigation/drawer/src/main/res/drawable-mdpi/navigation_drawer_header_background.png and /dev/null differ
diff --git a/feature/navigation/drawer/src/main/res/drawable-xhdpi/navigation_drawer_header_background.png b/feature/navigation/drawer/src/main/res/drawable-xhdpi/navigation_drawer_header_background.png
deleted file mode 100644
index 8f8a2a17f1d..00000000000
Binary files a/feature/navigation/drawer/src/main/res/drawable-xhdpi/navigation_drawer_header_background.png and /dev/null differ
diff --git a/feature/navigation/drawer/src/main/res/drawable-xxhdpi/navigation_drawer_header_background.png b/feature/navigation/drawer/src/main/res/drawable-xxhdpi/navigation_drawer_header_background.png
deleted file mode 100644
index 16c19e0abe9..00000000000
Binary files a/feature/navigation/drawer/src/main/res/drawable-xxhdpi/navigation_drawer_header_background.png and /dev/null differ
diff --git a/feature/navigation/drawer/src/main/res/layout/navigation_drawer_content.xml b/feature/navigation/drawer/src/main/res/layout/navigation_drawer_content.xml
index acd17a69ef2..452c49baa1e 100644
--- a/feature/navigation/drawer/src/main/res/layout/navigation_drawer_content.xml
+++ b/feature/navigation/drawer/src/main/res/layout/navigation_drawer_content.xml
@@ -1,30 +1,8 @@
-
-
-
-
-
-
-
-
-
-
-
+ />
diff --git a/feature/navigation/drawer/src/main/res/layout/navigation_drawer_legacy_list_folder_item.xml b/feature/navigation/drawer/src/main/res/layout/navigation_drawer_legacy_list_folder_item.xml
deleted file mode 100644
index 38302d09ced..00000000000
--- a/feature/navigation/drawer/src/main/res/layout/navigation_drawer_legacy_list_folder_item.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/feature/navigation/drawer/src/main/res/values-az/strings.xml b/feature/navigation/drawer/src/main/res/values-az/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/navigation/drawer/src/main/res/values-az/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values-cs/strings.xml b/feature/navigation/drawer/src/main/res/values-cs/strings.xml
index 6d45b70608b..6eba6e546cc 100644
--- a/feature/navigation/drawer/src/main/res/values-cs/strings.xml
+++ b/feature/navigation/drawer/src/main/res/values-cs/strings.xml
@@ -2,7 +2,7 @@
Nastavení
Správa složek
- Integrovaná doručená pošta
+ Jednotná schránka
99+
1 tis.+
Zobrazit účty
diff --git a/feature/navigation/drawer/src/main/res/values-enm/strings.xml b/feature/navigation/drawer/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/navigation/drawer/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values-hr/strings.xml b/feature/navigation/drawer/src/main/res/values-hr/strings.xml
index 0f5ab7e5ba3..619c0a31ae5 100644
--- a/feature/navigation/drawer/src/main/res/values-hr/strings.xml
+++ b/feature/navigation/drawer/src/main/res/values-hr/strings.xml
@@ -1,6 +1,11 @@
-
+
Podešenja
Upravljanje mapama
- Objedinjena Dolazna Pošta
-
+ Objedinjena dolazna pošta
+ Sinkroniziraj sve račune
+ Prikaži račune
+ Sakrij račune
+ 1k+
+ 99+
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values-kab/strings.xml b/feature/navigation/drawer/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/navigation/drawer/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values-kk/strings.xml b/feature/navigation/drawer/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/navigation/drawer/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values-nn/strings.xml b/feature/navigation/drawer/src/main/res/values-nn/strings.xml
index 581bfb6ec33..d954cc979ee 100644
--- a/feature/navigation/drawer/src/main/res/values-nn/strings.xml
+++ b/feature/navigation/drawer/src/main/res/values-nn/strings.xml
@@ -1,4 +1,11 @@
-
+
Innstillingar
-
+ Handsam mapper
+ Synkroniser alle kontoar
+ Vis kontoar
+ Skjul kontoar
+ 99+
+ Samla innboks
+ 1k+
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values-pt/strings.xml b/feature/navigation/drawer/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/navigation/drawer/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values-ro/strings.xml b/feature/navigation/drawer/src/main/res/values-ro/strings.xml
index 9bfe5d70df5..09ee9f959d3 100644
--- a/feature/navigation/drawer/src/main/res/values-ro/strings.xml
+++ b/feature/navigation/drawer/src/main/res/values-ro/strings.xml
@@ -1,6 +1,11 @@
-
+
Opțiuni
Gestionează dosarele
Căsuță poștală unificată
-
+ Sincronizează toate conturile
+ Arată conturile
+ Ascunde conturile
+ 99+
+ 1k+
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values-uk/strings.xml b/feature/navigation/drawer/src/main/res/values-uk/strings.xml
index afbbaefdbdb..2ebaa30f1aa 100644
--- a/feature/navigation/drawer/src/main/res/values-uk/strings.xml
+++ b/feature/navigation/drawer/src/main/res/values-uk/strings.xml
@@ -1,6 +1,11 @@
-
+
Налаштування
- Керування теками
+ Керувати теками
Об\'єднані Вхідні
-
+ Синхронізувати всі облікові записи
+ Показати облікові записи
+ 1 тис.+
+ 99+
+ Сховати облікові записи
+
\ No newline at end of file
diff --git a/feature/navigation/drawer/src/main/res/values/ids.xml b/feature/navigation/drawer/src/main/res/values/ids.xml
index 132c7ff4157..8669147ea76 100644
--- a/feature/navigation/drawer/src/main/res/values/ids.xml
+++ b/feature/navigation/drawer/src/main/res/values/ids.xml
@@ -2,7 +2,6 @@
-
-
+
diff --git a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerStateTest.kt b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerStateTest.kt
index 243b6fc54b9..14421045ecf 100644
--- a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerStateTest.kt
+++ b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerStateTest.kt
@@ -23,7 +23,7 @@ internal class DrawerStateTest {
selectedAccountUuid = null,
folders = persistentListOf(),
selectedFolderId = null,
- showAccountSelector = false,
+ showAccountSelector = true,
isLoading = false,
),
)
diff --git a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt
index 493fb8c8c13..3e13ea534ee 100644
--- a/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt
+++ b/feature/navigation/drawer/src/test/kotlin/app/k9mail/feature/navigation/drawer/ui/DrawerViewModelTest.kt
@@ -368,11 +368,11 @@ internal class DrawerViewModelTest {
testSubject.event(Event.OnAccountSelectorClick)
- assertThat(turbines.awaitStateItem()).isEqualTo(State(showAccountSelector = true))
+ assertThat(turbines.awaitStateItem()).isEqualTo(State(showAccountSelector = false))
testSubject.event(Event.OnAccountSelectorClick)
- assertThat(turbines.awaitStateItem()).isEqualTo(State(showAccountSelector = false))
+ assertThat(turbines.awaitStateItem()).isEqualTo(State(showAccountSelector = true))
}
@Test
diff --git a/feature/onboarding/main/build.gradle.kts b/feature/onboarding/main/build.gradle.kts
index c763c93d08b..a2a70b3da0e 100644
--- a/feature/onboarding/main/build.gradle.kts
+++ b/feature/onboarding/main/build.gradle.kts
@@ -14,4 +14,5 @@ dependencies {
implementation(projects.feature.account.setup)
implementation(projects.feature.settings.import)
implementation(projects.feature.onboarding.permissions)
+ implementation(projects.feature.onboarding.migration.api)
}
diff --git a/feature/onboarding/main/src/main/kotlin/app/k9mail/feature/onboarding/main/navigation/OnboardingNavHost.kt b/feature/onboarding/main/src/main/kotlin/app/k9mail/feature/onboarding/main/navigation/OnboardingNavHost.kt
index 1c00ff94cd8..19d052c4805 100644
--- a/feature/onboarding/main/src/main/kotlin/app/k9mail/feature/onboarding/main/navigation/OnboardingNavHost.kt
+++ b/feature/onboarding/main/src/main/kotlin/app/k9mail/feature/onboarding/main/navigation/OnboardingNavHost.kt
@@ -10,17 +10,25 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import app.k9mail.feature.account.setup.navigation.AccountSetupNavHost
+import app.k9mail.feature.onboarding.migration.api.OnboardingMigrationManager
import app.k9mail.feature.onboarding.permissions.domain.PermissionsDomainContract.UseCase.HasRuntimePermissions
import app.k9mail.feature.onboarding.permissions.ui.PermissionsScreen
import app.k9mail.feature.onboarding.welcome.ui.WelcomeScreen
+import app.k9mail.feature.settings.import.ui.SettingsImportAction
import app.k9mail.feature.settings.import.ui.SettingsImportScreen
import org.koin.compose.koinInject
private const val NESTED_NAVIGATION_ROUTE_WELCOME = "welcome"
+private const val NESTED_NAVIGATION_ROUTE_MIGRATION = "migration"
private const val NESTED_NAVIGATION_ROUTE_ACCOUNT_SETUP = "account_setup"
private const val NESTED_NAVIGATION_ROUTE_SETTINGS_IMPORT = "settings_import"
+private const val NESTED_NAVIGATION_ROUTE_SETTINGS_IMPORT_QR_CODE = "settings_import_qr_code"
private const val NESTED_NAVIGATION_ROUTE_PERMISSIONS = "permissions"
+private fun NavController.navigateToMigration() {
+ navigate(NESTED_NAVIGATION_ROUTE_MIGRATION)
+}
+
private fun NavController.navigateToAccountSetup() {
navigate(NESTED_NAVIGATION_ROUTE_ACCOUNT_SETUP)
}
@@ -29,6 +37,10 @@ private fun NavController.navigateToSettingsImport() {
navigate(NESTED_NAVIGATION_ROUTE_SETTINGS_IMPORT)
}
+private fun NavController.navigateToSettingsImportQrCode() {
+ navigate(NESTED_NAVIGATION_ROUTE_SETTINGS_IMPORT_QR_CODE)
+}
+
private fun NavController.navigateToPermissions() {
navigate(NESTED_NAVIGATION_ROUTE_PERMISSIONS) {
popUpTo(NESTED_NAVIGATION_ROUTE_WELCOME) {
@@ -37,23 +49,48 @@ private fun NavController.navigateToPermissions() {
}
}
+@Suppress("LongMethod")
@Composable
fun OnboardingNavHost(
onFinish: (String?) -> Unit,
hasRuntimePermissions: HasRuntimePermissions = koinInject(),
+ onboardingMigrationManager: OnboardingMigrationManager = koinInject(),
) {
val navController = rememberNavController()
var accountUuid by rememberSaveable { mutableStateOf(null) }
+ fun onImportSuccess() {
+ if (hasRuntimePermissions()) {
+ navController.navigateToPermissions()
+ } else {
+ onFinish(null)
+ }
+ }
+
NavHost(
navController = navController,
startDestination = NESTED_NAVIGATION_ROUTE_WELCOME,
) {
composable(route = NESTED_NAVIGATION_ROUTE_WELCOME) {
WelcomeScreen(
- onStartClick = { navController.navigateToAccountSetup() },
+ onStartClick = {
+ if (onboardingMigrationManager.isFeatureIncluded()) {
+ navController.navigateToMigration()
+ } else {
+ navController.navigateToAccountSetup()
+ }
+ },
onImportClick = { navController.navigateToSettingsImport() },
appNameProvider = koinInject(),
+ onboardingMigrationManager = koinInject(),
+ )
+ }
+
+ composable(route = NESTED_NAVIGATION_ROUTE_MIGRATION) {
+ onboardingMigrationManager.OnboardingMigrationScreen(
+ onQrCodeScan = { navController.navigateToSettingsImportQrCode() },
+ onAddAccount = { navController.navigateToAccountSetup() },
+ onImport = { navController.navigateToSettingsImport() },
)
}
@@ -73,13 +110,16 @@ fun OnboardingNavHost(
composable(route = NESTED_NAVIGATION_ROUTE_SETTINGS_IMPORT) {
SettingsImportScreen(
- onImportSuccess = {
- if (hasRuntimePermissions()) {
- navController.navigateToPermissions()
- } else {
- onFinish(null)
- }
- },
+ action = SettingsImportAction.Overview,
+ onImportSuccess = ::onImportSuccess,
+ onBack = { navController.popBackStack() },
+ )
+ }
+
+ composable(route = NESTED_NAVIGATION_ROUTE_SETTINGS_IMPORT_QR_CODE) {
+ SettingsImportScreen(
+ action = SettingsImportAction.ScanQrCode,
+ onImportSuccess = ::onImportSuccess,
onBack = { navController.popBackStack() },
)
}
diff --git a/feature/onboarding/migration/api/build.gradle.kts b/feature/onboarding/migration/api/build.gradle.kts
new file mode 100644
index 00000000000..ade7f0d6196
--- /dev/null
+++ b/feature/onboarding/migration/api/build.gradle.kts
@@ -0,0 +1,13 @@
+plugins {
+ id(ThunderbirdPlugins.Library.androidCompose)
+ alias(libs.plugins.kotlin.serialization)
+}
+
+android {
+ namespace = "app.k9mail.feature.onboarding.migration.api"
+ resourcePrefix = "onboarding_migration_api_"
+}
+
+dependencies {
+ api(projects.core.ui.compose.navigation)
+}
diff --git a/feature/onboarding/migration/api/src/main/kotlin/app/k9mail/feature/onboarding/migration/api/OnboardingMigrationManager.kt b/feature/onboarding/migration/api/src/main/kotlin/app/k9mail/feature/onboarding/migration/api/OnboardingMigrationManager.kt
new file mode 100644
index 00000000000..1234da1bb07
--- /dev/null
+++ b/feature/onboarding/migration/api/src/main/kotlin/app/k9mail/feature/onboarding/migration/api/OnboardingMigrationManager.kt
@@ -0,0 +1,14 @@
+package app.k9mail.feature.onboarding.migration.api
+
+import androidx.compose.runtime.Composable
+
+interface OnboardingMigrationManager {
+ fun isFeatureIncluded(): Boolean
+
+ @Composable
+ fun OnboardingMigrationScreen(
+ onQrCodeScan: () -> Unit,
+ onAddAccount: () -> Unit,
+ onImport: () -> Unit,
+ )
+}
diff --git a/feature/onboarding/migration/noop/build.gradle.kts b/feature/onboarding/migration/noop/build.gradle.kts
new file mode 100644
index 00000000000..5a9a87cd298
--- /dev/null
+++ b/feature/onboarding/migration/noop/build.gradle.kts
@@ -0,0 +1,12 @@
+plugins {
+ id(ThunderbirdPlugins.Library.androidCompose)
+}
+
+android {
+ namespace = "app.k9mail.feature.onboarding.migration.noop"
+ resourcePrefix = "onboarding_migration_noop_"
+}
+
+dependencies {
+ api(projects.feature.onboarding.migration.api)
+}
diff --git a/feature/onboarding/migration/noop/src/main/kotlin/app/k9mail/feature/onboarding/migration/OnboardingMigrationModule.kt b/feature/onboarding/migration/noop/src/main/kotlin/app/k9mail/feature/onboarding/migration/OnboardingMigrationModule.kt
new file mode 100644
index 00000000000..9412d626976
--- /dev/null
+++ b/feature/onboarding/migration/noop/src/main/kotlin/app/k9mail/feature/onboarding/migration/OnboardingMigrationModule.kt
@@ -0,0 +1,10 @@
+package app.k9mail.feature.onboarding.migration
+
+import app.k9mail.feature.onboarding.migration.api.OnboardingMigrationManager
+import app.k9mail.feature.onboarding.migration.noop.NoOpOnboardingMigrationManager
+import org.koin.core.module.Module
+import org.koin.dsl.module
+
+val onboardingMigrationModule: Module = module {
+ single { NoOpOnboardingMigrationManager() }
+}
diff --git a/feature/onboarding/migration/noop/src/main/kotlin/app/k9mail/feature/onboarding/migration/noop/NoOpOnboardingMigrationManager.kt b/feature/onboarding/migration/noop/src/main/kotlin/app/k9mail/feature/onboarding/migration/noop/NoOpOnboardingMigrationManager.kt
new file mode 100644
index 00000000000..bc37a1b321e
--- /dev/null
+++ b/feature/onboarding/migration/noop/src/main/kotlin/app/k9mail/feature/onboarding/migration/noop/NoOpOnboardingMigrationManager.kt
@@ -0,0 +1,15 @@
+package app.k9mail.feature.onboarding.migration.noop
+
+import androidx.compose.runtime.Composable
+import app.k9mail.feature.onboarding.migration.api.OnboardingMigrationManager
+
+class NoOpOnboardingMigrationManager : OnboardingMigrationManager {
+ override fun isFeatureIncluded(): Boolean = false
+
+ @Composable
+ override fun OnboardingMigrationScreen(
+ onQrCodeScan: () -> Unit,
+ onAddAccount: () -> Unit,
+ onImport: () -> Unit,
+ ) = Unit
+}
diff --git a/feature/onboarding/migration/thunderbird/build.gradle.kts b/feature/onboarding/migration/thunderbird/build.gradle.kts
new file mode 100644
index 00000000000..c9663f0ec1c
--- /dev/null
+++ b/feature/onboarding/migration/thunderbird/build.gradle.kts
@@ -0,0 +1,17 @@
+plugins {
+ id(ThunderbirdPlugins.Library.androidCompose)
+}
+
+android {
+ namespace = "app.k9mail.feature.onboarding.migration.thunderbird"
+ resourcePrefix = "onboarding_migration_thunderbird_"
+}
+
+dependencies {
+ api(projects.feature.onboarding.migration.api)
+ implementation(projects.core.common)
+ implementation(projects.core.ui.compose.designsystem)
+ implementation(projects.feature.account.common)
+
+ testImplementation(projects.core.ui.compose.testing)
+}
diff --git a/feature/onboarding/migration/thunderbird/src/debug/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreenPreview.kt b/feature/onboarding/migration/thunderbird/src/debug/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreenPreview.kt
new file mode 100644
index 00000000000..63064a0b112
--- /dev/null
+++ b/feature/onboarding/migration/thunderbird/src/debug/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreenPreview.kt
@@ -0,0 +1,24 @@
+package app.k9mail.feature.onboarding.migration.thunderbird
+
+import androidx.compose.runtime.Composable
+import app.k9mail.core.common.provider.BrandNameProvider
+import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
+import app.k9mail.core.ui.compose.designsystem.atom.Surface
+import app.k9mail.core.ui.compose.theme2.thunderbird.ThunderbirdTheme2
+
+@Composable
+@PreviewDevices
+internal fun TbOnboardingMigrationScreenPreview() {
+ ThunderbirdTheme2 {
+ Surface {
+ TbOnboardingMigrationScreen(
+ onQrCodeScan = {},
+ onAddAccount = {},
+ onImport = {},
+ brandNameProvider = object : BrandNameProvider {
+ override val brandName: String = "Thunderbird"
+ },
+ )
+ }
+ }
+}
diff --git a/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/OnboardingMigrationModule.kt b/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/OnboardingMigrationModule.kt
new file mode 100644
index 00000000000..e6f7afb65d1
--- /dev/null
+++ b/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/OnboardingMigrationModule.kt
@@ -0,0 +1,10 @@
+package app.k9mail.feature.onboarding.migration
+
+import app.k9mail.feature.onboarding.migration.api.OnboardingMigrationManager
+import app.k9mail.feature.onboarding.migration.thunderbird.TbOnboardingMigrationManager
+import org.koin.core.module.Module
+import org.koin.dsl.module
+
+val onboardingMigrationModule: Module = module {
+ single { TbOnboardingMigrationManager() }
+}
diff --git a/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationManager.kt b/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationManager.kt
new file mode 100644
index 00000000000..fbd2c019058
--- /dev/null
+++ b/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationManager.kt
@@ -0,0 +1,21 @@
+package app.k9mail.feature.onboarding.migration.thunderbird
+
+import androidx.compose.runtime.Composable
+import app.k9mail.feature.onboarding.migration.api.OnboardingMigrationManager
+
+class TbOnboardingMigrationManager : OnboardingMigrationManager {
+ override fun isFeatureIncluded(): Boolean = true
+
+ @Composable
+ override fun OnboardingMigrationScreen(
+ onQrCodeScan: () -> Unit,
+ onAddAccount: () -> Unit,
+ onImport: () -> Unit,
+ ) {
+ TbOnboardingMigrationScreen(
+ onQrCodeScan,
+ onAddAccount,
+ onImport,
+ )
+ }
+}
diff --git a/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreen.kt b/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreen.kt
new file mode 100644
index 00000000000..d2deab666c1
--- /dev/null
+++ b/feature/onboarding/migration/thunderbird/src/main/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreen.kt
@@ -0,0 +1,198 @@
+package app.k9mail.feature.onboarding.migration.thunderbird
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.LineHeightStyle
+import app.k9mail.core.common.provider.BrandNameProvider
+import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonFilled
+import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonOutlined
+import app.k9mail.core.ui.compose.designsystem.atom.card.CardFilled
+import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium
+import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium
+import app.k9mail.core.ui.compose.designsystem.template.ResponsiveWidthContainer
+import app.k9mail.core.ui.compose.theme2.MainTheme
+import app.k9mail.feature.account.common.ui.AppTitleTopHeader
+import kotlinx.collections.immutable.ImmutableList
+import kotlinx.collections.immutable.persistentListOf
+import org.koin.compose.koinInject
+
+@Composable
+internal fun TbOnboardingMigrationScreen(
+ onQrCodeScan: () -> Unit,
+ onAddAccount: () -> Unit,
+ onImport: () -> Unit,
+ modifier: Modifier = Modifier,
+ brandNameProvider: BrandNameProvider = koinInject(),
+) {
+ val scrollState = rememberScrollState()
+
+ ResponsiveWidthContainer(
+ modifier = Modifier
+ .fillMaxSize()
+ .then(modifier),
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .verticalScroll(scrollState),
+ ) {
+ AppTitleTopHeader(
+ title = brandNameProvider.brandName,
+ )
+
+ Spacer(
+ modifier = Modifier
+ .height(MainTheme.spacings.double)
+ .weight(1f),
+ )
+
+ AlreadyUsingThunderbirdCard(onQrCodeScan)
+
+ Spacer(modifier = Modifier.height(MainTheme.spacings.triple))
+
+ TextGroup(title = stringResource(R.string.onboarding_migration_thunderbird_new_account_title)) {
+ ButtonOutlined(
+ text = stringResource(R.string.onboarding_migration_thunderbird_new_account_button_text),
+ onClick = onAddAccount,
+ modifier = Modifier.testTag("AddAccountButton"),
+ )
+ }
+
+ TextGroup(title = stringResource(R.string.onboarding_migration_thunderbird_import_title)) {
+ ButtonOutlined(
+ text = stringResource(R.string.onboarding_migration_thunderbird_import_button_text),
+ onClick = onImport,
+ modifier = Modifier.testTag("ImportButton"),
+ )
+ }
+
+ Spacer(
+ modifier = Modifier
+ .height(MainTheme.spacings.double)
+ .weight(1f),
+ )
+ }
+ }
+}
+
+@Composable
+private fun AlreadyUsingThunderbirdCard(onQrCodeScan: () -> Unit) {
+ TextCard(title = stringResource(R.string.onboarding_migration_thunderbird_qr_code_import_title)) {
+ TextBodyMedium(
+ text = stringResource(R.string.onboarding_migration_thunderbird_qr_code_import_text),
+ modifier = Modifier
+ .padding(bottom = MainTheme.spacings.double),
+ )
+
+ TextBodyMediumFullLineHeight(
+ text = stringResource(R.string.onboarding_migration_thunderbird_qr_code_import_instructions_intro),
+ )
+
+ BulletList(
+ items = persistentListOf(
+ stringResource(R.string.onboarding_migration_thunderbird_qr_code_import_instructions_bullet_1),
+ stringResource(R.string.onboarding_migration_thunderbird_qr_code_import_instructions_bullet_2),
+ ),
+ modifier = Modifier
+ .padding(bottom = MainTheme.spacings.double),
+ )
+
+ ButtonFilled(
+ text = stringResource(R.string.onboarding_migration_thunderbird_qr_code_import_button_text),
+ onClick = onQrCodeScan,
+ modifier = Modifier
+ .testTag("QrCodeImportButton")
+ .align(Alignment.CenterHorizontally),
+ )
+ }
+}
+
+@Composable
+private fun TextCard(
+ title: String,
+ content: @Composable ColumnScope.() -> Unit,
+) {
+ CardFilled(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = MainTheme.spacings.quadruple),
+ ) {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(MainTheme.spacings.double),
+ ) {
+ TextTitleMedium(
+ text = title,
+ color = MainTheme.colors.primary,
+ modifier = Modifier
+ .padding(bottom = MainTheme.spacings.double),
+ )
+
+ content()
+ }
+ }
+}
+
+@Composable
+private fun TextGroup(
+ title: String,
+ content: @Composable ColumnScope.() -> Unit,
+) {
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(MainTheme.spacings.double),
+ ) {
+ TextTitleMedium(
+ text = title,
+ color = MainTheme.colors.primary,
+ modifier = Modifier
+ .padding(bottom = MainTheme.spacings.default),
+ )
+
+ content()
+ }
+}
+
+@Composable
+private fun BulletList(
+ items: ImmutableList,
+ modifier: Modifier = Modifier,
+) {
+ Column(modifier = modifier) {
+ for (item in items) {
+ Row {
+ TextBodyMediumFullLineHeight(text = " \u2022 ")
+ TextBodyMediumFullLineHeight(text = item)
+ }
+ }
+ }
+}
+
+@Composable
+private fun TextBodyMediumFullLineHeight(text: String) {
+ // Disable line height trimming so that the space between TextBodyMediumFullLineHeight instances following each
+ // other is the same as the space between lines of text inside a single TextBodyMedium.
+ TextBodyMedium(
+ text = text,
+ lineHeightStyle = LineHeightStyle(
+ alignment = LineHeightStyle.Alignment.Proportional,
+ trim = LineHeightStyle.Trim.None,
+ ),
+ )
+}
diff --git a/feature/onboarding/migration/thunderbird/src/main/res/values/strings.xml b/feature/onboarding/migration/thunderbird/src/main/res/values/strings.xml
new file mode 100644
index 00000000000..d373a1bdf61
--- /dev/null
+++ b/feature/onboarding/migration/thunderbird/src/main/res/values/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Already using Thunderbird on desktop?
+ Easily import your account settings by scanning a QR code.
+ In Thunderbird desktop, go to:
+ ‘Settings’ in the Spaces Toolbar (bottom left)
+ Select ‘Export to Mobile’ and follow the instructions
+ Import settings
+ New to Thunderbird?
+ Add an email account now
+ Moving from another app or device?
+ Import your account settings now
+
diff --git a/feature/onboarding/migration/thunderbird/src/test/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreenKtTest.kt b/feature/onboarding/migration/thunderbird/src/test/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreenKtTest.kt
new file mode 100644
index 00000000000..395c0ba6ba2
--- /dev/null
+++ b/feature/onboarding/migration/thunderbird/src/test/kotlin/app/k9mail/feature/onboarding/migration/thunderbird/TbOnboardingMigrationScreenKtTest.kt
@@ -0,0 +1,74 @@
+package app.k9mail.feature.onboarding.migration.thunderbird
+
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performScrollTo
+import app.k9mail.core.common.provider.BrandNameProvider
+import app.k9mail.core.ui.compose.testing.ComposeTest
+import app.k9mail.core.ui.compose.testing.setContentWithTheme
+import assertk.assertThat
+import assertk.assertions.isEqualTo
+import org.junit.Test
+
+class TbOnboardingMigrationScreenKtTest : ComposeTest() {
+ @Test
+ fun `pressing QrCodeImportButton should call onQrCodeScan`() = runComposeTest {
+ var qrCodeScanClickCounter = 0
+ setContentWithTheme {
+ TbOnboardingMigrationScreen(
+ onQrCodeScan = { qrCodeScanClickCounter++ },
+ onAddAccount = { error("Should not be called") },
+ onImport = { error("Should not be called") },
+ brandNameProvider = FakeBrandNameProvider,
+ )
+ }
+
+ composeTestRule.onNodeWithTag("QrCodeImportButton")
+ .performScrollTo()
+ .performClick()
+
+ assertThat(qrCodeScanClickCounter).isEqualTo(1)
+ }
+
+ @Test
+ fun `pressing AddAccountButton button should call onAddAccount`() = runComposeTest {
+ var addAccountClickCounter = 0
+ setContentWithTheme {
+ TbOnboardingMigrationScreen(
+ onQrCodeScan = { error("Should not be called") },
+ onAddAccount = { addAccountClickCounter++ },
+ onImport = { error("Should not be called") },
+ brandNameProvider = FakeBrandNameProvider,
+ )
+ }
+
+ composeTestRule.onNodeWithTag("AddAccountButton")
+ .performScrollTo()
+ .performClick()
+
+ assertThat(addAccountClickCounter).isEqualTo(1)
+ }
+
+ @Test
+ fun `pressing ImportButton button should call onImport`() = runComposeTest {
+ var importClickCounter = 0
+ setContentWithTheme {
+ TbOnboardingMigrationScreen(
+ onQrCodeScan = { error("Should not be called") },
+ onAddAccount = { error("Should not be called") },
+ onImport = { importClickCounter++ },
+ brandNameProvider = FakeBrandNameProvider,
+ )
+ }
+
+ composeTestRule.onNodeWithTag("ImportButton")
+ .performScrollTo()
+ .performClick()
+
+ assertThat(importClickCounter).isEqualTo(1)
+ }
+}
+
+private object FakeBrandNameProvider : BrandNameProvider {
+ override val brandName = "Thunderbird"
+}
diff --git a/feature/onboarding/permissions/src/debug/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionContentPreview.kt b/feature/onboarding/permissions/src/debug/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionContentPreview.kt
index c5b3fa1d50c..55575ed1797 100644
--- a/feature/onboarding/permissions/src/debug/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionContentPreview.kt
+++ b/feature/onboarding/permissions/src/debug/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionContentPreview.kt
@@ -17,7 +17,7 @@ internal fun PermissionContentPreview() {
isNextButtonVisible = false,
),
onEvent = {},
- appName = "AppName",
+ brandName = "BrandName",
)
}
}
diff --git a/feature/onboarding/permissions/src/debug/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionScreenPreview.kt b/feature/onboarding/permissions/src/debug/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionScreenPreview.kt
index cfbaf7b25eb..6f26a995677 100644
--- a/feature/onboarding/permissions/src/debug/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionScreenPreview.kt
+++ b/feature/onboarding/permissions/src/debug/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionScreenPreview.kt
@@ -2,7 +2,7 @@ package app.k9mail.feature.onboarding.permissions.ui
import androidx.compose.runtime.Composable
import app.k9mail.core.android.permissions.PermissionState
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import kotlinx.coroutines.Dispatchers
@@ -16,8 +16,8 @@ internal fun PermissionScreenPreview() {
checkPermission = { PermissionState.Denied },
backgroundDispatcher = Dispatchers.Main.immediate,
),
- appNameProvider = object : AppNameProvider {
- override val appName: String = "AppName"
+ brandNameProvider = object : BrandNameProvider {
+ override val brandName: String = "BrandName"
},
onNext = {},
)
diff --git a/feature/onboarding/permissions/src/main/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionsContent.kt b/feature/onboarding/permissions/src/main/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionsContent.kt
index e626a11ffa0..2d4490ba0ec 100644
--- a/feature/onboarding/permissions/src/main/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionsContent.kt
+++ b/feature/onboarding/permissions/src/main/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionsContent.kt
@@ -39,7 +39,7 @@ import app.k9mail.feature.account.common.R as CommonR
internal fun PermissionsContent(
state: State,
onEvent: (Event) -> Unit,
- appName: String,
+ brandName: String,
) {
val scrollState = rememberScrollState()
@@ -60,7 +60,7 @@ internal fun PermissionsContent(
.fillMaxHeight()
.verticalScroll(state = scrollState),
) {
- HeaderArea(appName = appName)
+ HeaderArea(brandName = brandName)
ContentArea(state, onEvent)
@@ -74,13 +74,13 @@ internal fun PermissionsContent(
@Composable
private fun HeaderArea(
- appName: String,
+ brandName: String,
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
AppTitleTopHeader(
- title = appName,
+ title = brandName,
)
TextHeadlineSmall(
diff --git a/feature/onboarding/permissions/src/main/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionsScreen.kt b/feature/onboarding/permissions/src/main/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionsScreen.kt
index 6a3ea1a2172..1d7a2e47934 100644
--- a/feature/onboarding/permissions/src/main/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionsScreen.kt
+++ b/feature/onboarding/permissions/src/main/kotlin/app/k9mail/feature/onboarding/permissions/ui/PermissionsScreen.kt
@@ -8,7 +8,7 @@ import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
-import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.core.common.provider.BrandNameProvider
import app.k9mail.core.ui.compose.common.mvi.observe
import app.k9mail.feature.onboarding.permissions.ui.PermissionsContract.Effect
import app.k9mail.feature.onboarding.permissions.ui.PermissionsContract.Event
@@ -18,7 +18,7 @@ import org.koin.compose.koinInject
@Composable
fun PermissionsScreen(
viewModel: PermissionsContract.ViewModel = koinViewModel(),
- appNameProvider: AppNameProvider = koinInject(),
+ brandNameProvider: BrandNameProvider = koinInject(),
onNext: () -> Unit,
) {
val contactsPermissionLauncher = rememberLauncherForActivityResult(RequestPermission()) { success ->
@@ -48,7 +48,7 @@ fun PermissionsScreen(
PermissionsContent(
state = state.value,
onEvent = dispatch,
- appName = appNameProvider.appName,
+ brandName = brandNameProvider.brandName,
)
}
diff --git a/feature/onboarding/permissions/src/main/res/values-enm/strings.xml b/feature/onboarding/permissions/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/onboarding/permissions/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/onboarding/permissions/src/main/res/values-hr/strings.xml b/feature/onboarding/permissions/src/main/res/values-hr/strings.xml
index a6b3daec935..dd6f3fc0680 100644
--- a/feature/onboarding/permissions/src/main/res/values-hr/strings.xml
+++ b/feature/onboarding/permissions/src/main/res/values-hr/strings.xml
@@ -1,2 +1,10 @@
-
\ No newline at end of file
+
+ Poboljšajte iskustvo
+ Kontakti
+ Obavijesti
+ Omogućite pristup kako biste mogli dobivati prijedloge kontakata i prikazivati imena i fotografije kontakata.
+ Uključite obavijesti kako ne biste propustili nijednu email poruku.
+ Dopusti
+ Preskoči
+
\ No newline at end of file
diff --git a/feature/onboarding/permissions/src/main/res/values-kab/strings.xml b/feature/onboarding/permissions/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/onboarding/permissions/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/onboarding/permissions/src/main/res/values-kk/strings.xml b/feature/onboarding/permissions/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/onboarding/permissions/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/onboarding/permissions/src/main/res/values-nn/strings.xml b/feature/onboarding/permissions/src/main/res/values-nn/strings.xml
index e0741f015db..64b9ccfd41f 100644
--- a/feature/onboarding/permissions/src/main/res/values-nn/strings.xml
+++ b/feature/onboarding/permissions/src/main/res/values-nn/strings.xml
@@ -4,4 +4,7 @@
Kontaktar
Tillat
Hopp over
+ Tillat tilgjenge for å vere i stand til å føreslå kontaktar og for å vise kontaktnamn og bilete.
+ Notifikasjonar
+ Skru på notifikasjonar så du ikkje går glipp av nokon e-postar.
\ No newline at end of file
diff --git a/feature/onboarding/permissions/src/main/res/values-pl/strings.xml b/feature/onboarding/permissions/src/main/res/values-pl/strings.xml
index abb25ccccda..0eb925655d8 100644
--- a/feature/onboarding/permissions/src/main/res/values-pl/strings.xml
+++ b/feature/onboarding/permissions/src/main/res/values-pl/strings.xml
@@ -1,6 +1,6 @@
- Zezwól na dostęp, aby móc sugerować kontakty oraz wyświetlać ich imiona, nazwiska i zdjęcia.
+ Zezwól na dostęp, aby móc sugerować kontakty oraz wyświetlać ich imiona, nazwiska i zdjęcia.
Włącz powiadomienia, aby nie przegapić żadnych e-maili.
Powiadomienia
Popraw doświadczenie
diff --git a/feature/onboarding/permissions/src/main/res/values-pt/strings.xml b/feature/onboarding/permissions/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/onboarding/permissions/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/onboarding/permissions/src/main/res/values-uk/strings.xml b/feature/onboarding/permissions/src/main/res/values-uk/strings.xml
index a6b3daec935..6b3b35c9188 100644
--- a/feature/onboarding/permissions/src/main/res/values-uk/strings.xml
+++ b/feature/onboarding/permissions/src/main/res/values-uk/strings.xml
@@ -1,2 +1,10 @@
-
\ No newline at end of file
+
+ Зробіть користування зручнішим
+ Контакти
+ Дозвольте доступ, щоб з\'явилася можливість пропонувати контакти та показувати імена та світлини контактів.
+ Сповіщення
+ Увімкніть сповіщення, щоб не пропустити жодного листа.
+ Дозволити
+ Пропустити
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/build.gradle.kts b/feature/onboarding/welcome/build.gradle.kts
index 47e7ff9db7c..997e42b0c69 100644
--- a/feature/onboarding/welcome/build.gradle.kts
+++ b/feature/onboarding/welcome/build.gradle.kts
@@ -10,4 +10,5 @@ android {
dependencies {
implementation(projects.core.common)
implementation(projects.core.ui.compose.designsystem)
+ implementation(projects.feature.onboarding.migration.api)
}
diff --git a/feature/onboarding/welcome/src/debug/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeContentPreview.kt b/feature/onboarding/welcome/src/debug/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeContentPreview.kt
index d19aaca6d36..1dd6307e058 100644
--- a/feature/onboarding/welcome/src/debug/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeContentPreview.kt
+++ b/feature/onboarding/welcome/src/debug/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeContentPreview.kt
@@ -2,28 +2,31 @@ package app.k9mail.feature.onboarding.welcome.ui
import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
+import app.k9mail.core.ui.compose.designsystem.PreviewThemeType
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
@Composable
@PreviewDevices
-internal fun WelcomeContentPreview() {
- PreviewWithTheme {
+internal fun WelcomeContentThunderbirdPreview() {
+ PreviewWithTheme(themeType = PreviewThemeType.THUNDERBIRD) {
WelcomeContent(
onStartClick = {},
onImportClick = {},
- appName = "AppName",
+ appName = "Thunderbird Beta",
+ showImportButton = false,
)
}
}
@Composable
@PreviewDevices
-internal fun WelcomeContentWithLongTitlePreview() {
- PreviewWithTheme {
+internal fun WelcomeContentK9MailPreview() {
+ PreviewWithTheme(themeType = PreviewThemeType.K9MAIL) {
WelcomeContent(
onStartClick = {},
onImportClick = {},
- appName = "Thunderbird Debug",
+ appName = "K-9 Mail",
+ showImportButton = true,
)
}
}
diff --git a/feature/onboarding/welcome/src/debug/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeScreenPreview.kt b/feature/onboarding/welcome/src/debug/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeScreenPreview.kt
deleted file mode 100644
index a72dc7a5e08..00000000000
--- a/feature/onboarding/welcome/src/debug/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeScreenPreview.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package app.k9mail.feature.onboarding.welcome.ui
-
-import androidx.compose.runtime.Composable
-import app.k9mail.core.common.provider.AppNameProvider
-import app.k9mail.core.ui.compose.common.annotation.PreviewDevices
-import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
-
-@Composable
-@PreviewDevices
-internal fun WelcomeScreenPreview() {
- PreviewWithTheme {
- WelcomeScreen(
- onStartClick = {},
- onImportClick = {},
- appNameProvider = object : AppNameProvider {
- override val appName: String = "AppName"
- },
- )
- }
-}
diff --git a/feature/onboarding/welcome/src/main/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeContent.kt b/feature/onboarding/welcome/src/main/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeContent.kt
index f5121892273..a07b29c66f2 100644
--- a/feature/onboarding/welcome/src/main/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeContent.kt
+++ b/feature/onboarding/welcome/src/main/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeContent.kt
@@ -39,6 +39,7 @@ internal fun WelcomeContent(
onStartClick: () -> Unit,
onImportClick: () -> Unit,
appName: String,
+ showImportButton: Boolean,
modifier: Modifier = Modifier,
) {
Surface(
@@ -49,11 +50,12 @@ internal fun WelcomeContent(
modifier = Modifier.fillMaxSize(),
footer = {
WelcomeFooter(
+ showImportButton = showImportButton,
+ onStartClick = onStartClick,
+ onImportClick = onImportClick,
modifier = Modifier
.fillMaxWidth()
.padding(top = MainTheme.spacings.quadruple),
- onStartClick = onStartClick,
- onImportClick = onImportClick,
)
},
verticalArrangement = Arrangement.SpaceEvenly,
@@ -142,6 +144,7 @@ private fun WelcomeMessage(
@Composable
private fun WelcomeFooter(
+ showImportButton: Boolean,
onStartClick: () -> Unit,
onImportClick: () -> Unit,
modifier: Modifier = Modifier,
@@ -155,10 +158,12 @@ private fun WelcomeFooter(
text = stringResource(id = R.string.onboarding_welcome_start_button),
onClick = onStartClick,
)
- ButtonText(
- text = stringResource(id = R.string.onboarding_welcome_import_button),
- onClick = onImportClick,
- )
+ if (showImportButton) {
+ ButtonText(
+ text = stringResource(id = R.string.onboarding_welcome_import_button),
+ onClick = onImportClick,
+ )
+ }
}
}
diff --git a/feature/onboarding/welcome/src/main/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeScreen.kt b/feature/onboarding/welcome/src/main/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeScreen.kt
index 77d1de4ae2b..f38ebbf538c 100644
--- a/feature/onboarding/welcome/src/main/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeScreen.kt
+++ b/feature/onboarding/welcome/src/main/kotlin/app/k9mail/feature/onboarding/welcome/ui/WelcomeScreen.kt
@@ -2,16 +2,19 @@ package app.k9mail.feature.onboarding.welcome.ui
import androidx.compose.runtime.Composable
import app.k9mail.core.common.provider.AppNameProvider
+import app.k9mail.feature.onboarding.migration.api.OnboardingMigrationManager
@Composable
fun WelcomeScreen(
onStartClick: () -> Unit,
onImportClick: () -> Unit,
appNameProvider: AppNameProvider,
+ onboardingMigrationManager: OnboardingMigrationManager,
) {
WelcomeContent(
onStartClick = onStartClick,
onImportClick = onImportClick,
appName = appNameProvider.appName,
+ showImportButton = !onboardingMigrationManager.isFeatureIncluded(),
)
}
diff --git a/feature/onboarding/welcome/src/main/res/values-az/strings.xml b/feature/onboarding/welcome/src/main/res/values-az/strings.xml
index 7c67847aaf0..efc9124cacf 100644
--- a/feature/onboarding/welcome/src/main/res/values-az/strings.xml
+++ b/feature/onboarding/welcome/src/main/res/values-az/strings.xml
@@ -1,5 +1,6 @@
-
+
Başlat
Tənzimləmələri idxal et
-
+ %s -ə Xoş Gəlmisiniz, yüksəldilmiş təhlükəsizlik, asan fərdiləşdirmə və bütün e-poçt hesablarınızın qüsursuz idarə edilməsi üçün hazırlanmış Android e-poçt müştərisi.
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-enm/strings.xml b/feature/onboarding/welcome/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/onboarding/welcome/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-hr/strings.xml b/feature/onboarding/welcome/src/main/res/values-hr/strings.xml
index a6b3daec935..aea222c809e 100644
--- a/feature/onboarding/welcome/src/main/res/values-hr/strings.xml
+++ b/feature/onboarding/welcome/src/main/res/values-hr/strings.xml
@@ -1,2 +1,6 @@
-
\ No newline at end of file
+
+ Započni
+ Uvoz postavki
+ Dobrodošli u %s, Android email klijent dizajniran za poboljšanu sigurnost, jednostavnu prilagodbu i besprijekorno upravljanje svim vašim računima e-pošte.
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-kab/strings.xml b/feature/onboarding/welcome/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..07b7a3167a2
--- /dev/null
+++ b/feature/onboarding/welcome/src/main/res/values-kab/strings.xml
@@ -0,0 +1,5 @@
+
+
+ Bdu
+ Taǧǧawt n iɣewwaṛen
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-kk/strings.xml b/feature/onboarding/welcome/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/onboarding/welcome/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-nb-rNO/strings.xml b/feature/onboarding/welcome/src/main/res/values-nb-rNO/strings.xml
index 4e3aab78884..2c345c1800a 100644
--- a/feature/onboarding/welcome/src/main/res/values-nb-rNO/strings.xml
+++ b/feature/onboarding/welcome/src/main/res/values-nb-rNO/strings.xml
@@ -1,5 +1,6 @@
-
+
Start
Importer innstillinger
-
+ Velkommen til %s, e-postklienten for Android designet for ekstra sikkerhet, enkel tilpasning, og sømløs administrasjon av alle e-postkontoene dine.
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-nn/strings.xml b/feature/onboarding/welcome/src/main/res/values-nn/strings.xml
index 69ec85070cd..af41eed660f 100644
--- a/feature/onboarding/welcome/src/main/res/values-nn/strings.xml
+++ b/feature/onboarding/welcome/src/main/res/values-nn/strings.xml
@@ -1,5 +1,6 @@
-
+
Start
Importer innstillingar
+ Velkommen til %s, Android e-post-klienten som er designa for forbetra sikkerheit, enkel tilpassing, og saumlaus handtering av alle dine e-post-kontoar.
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-pl/strings.xml b/feature/onboarding/welcome/src/main/res/values-pl/strings.xml
index 68318e3b1fc..92b7972b0c2 100644
--- a/feature/onboarding/welcome/src/main/res/values-pl/strings.xml
+++ b/feature/onboarding/welcome/src/main/res/values-pl/strings.xml
@@ -2,5 +2,5 @@
Rozpocznij
Importuj ustawienia
- Witamy w %s, kliencie poczty e-mail dla systemu Android zaprojektowanym z myślą o większym bezpieczeństwie, łatwym dostosowywaniu i bezproblemowym zarządzaniu wszystkimi kontami e-mail.
-
+ Witamy w %s, kliencie poczty e-mail dla systemu Android, zaprojektowanym z myślą o zwiększonym bezpieczeństwie, łatwej personalizacji i bezproblemowym zarządzaniu wszystkimi kontami e-mail.
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-pt/strings.xml b/feature/onboarding/welcome/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/onboarding/welcome/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-sl/strings.xml b/feature/onboarding/welcome/src/main/res/values-sl/strings.xml
index a6b3daec935..74f81da3857 100644
--- a/feature/onboarding/welcome/src/main/res/values-sl/strings.xml
+++ b/feature/onboarding/welcome/src/main/res/values-sl/strings.xml
@@ -1,2 +1,6 @@
-
\ No newline at end of file
+
+ Uvozi nastavitve
+ Začni
+ Dobrodošli v %s, e-poštnem odjemalcu za Android, ki je zasnovan za večjo varnost, enostavno prilagajanje in nemoteno upravljanje vseh e-poštnih računov.
+
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-sv/strings.xml b/feature/onboarding/welcome/src/main/res/values-sv/strings.xml
index e68dd63759a..305a6671bb8 100644
--- a/feature/onboarding/welcome/src/main/res/values-sv/strings.xml
+++ b/feature/onboarding/welcome/src/main/res/values-sv/strings.xml
@@ -2,5 +2,5 @@
Starta
Importera inställningar
- Välkommen till %s, Android-e-postklienten designad för förbättrad säkerhet, enkel anpassning och sömlös hantering av alla dina e-postkonton.
+ Välkommen till %s, e-postklienten för Android som är utformad för förbättrad säkerhet, enkel anpassning och smidig hantering av alla dina e-postkonton.
\ No newline at end of file
diff --git a/feature/onboarding/welcome/src/main/res/values-uk/strings.xml b/feature/onboarding/welcome/src/main/res/values-uk/strings.xml
index a6b3daec935..1ad7bc9c3f2 100644
--- a/feature/onboarding/welcome/src/main/res/values-uk/strings.xml
+++ b/feature/onboarding/welcome/src/main/res/values-uk/strings.xml
@@ -1,2 +1,6 @@
-
\ No newline at end of file
+
+ Розпочати
+ Вітаємо в %s, поштовому клієнті для Android, створеному для посилення безпеки, легкого налаштування та безперешкодного керування всіма вашими поштовими обліковими записами.
+ Імпорт налаштувань
+
\ No newline at end of file
diff --git a/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportAction.kt b/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportAction.kt
new file mode 100644
index 00000000000..8ad8be9d777
--- /dev/null
+++ b/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportAction.kt
@@ -0,0 +1,25 @@
+package app.k9mail.feature.settings.import.ui
+
+import android.os.Bundle
+import androidx.core.os.bundleOf
+
+enum class SettingsImportAction(private val bundleValue: String) {
+ Overview("overview"),
+ ScanQrCode("scan_qr_code"),
+ ;
+
+ fun toBundle(): Bundle {
+ return bundleOf(
+ BUNDLE_KEY_ACTION to bundleValue,
+ )
+ }
+
+ companion object {
+ const val BUNDLE_KEY_ACTION = "action"
+
+ fun fromBundle(bundle: Bundle): SettingsImportAction {
+ val actionString = bundle.getString(BUNDLE_KEY_ACTION)
+ return entries.find { it.bundleValue == actionString } ?: Overview
+ }
+ }
+}
diff --git a/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportFragment.kt b/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportFragment.kt
index 4f8da6a10f6..f378b009661 100644
--- a/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportFragment.kt
+++ b/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportFragment.kt
@@ -70,6 +70,11 @@ class SettingsImportFragment : Fragment() {
viewModel.getUiModel().observeNotNull(this) { viewHolder.updateUi(it) }
viewModel.getActionEvents().observeNotNull(this) { handleActionEvents(it) }
+
+ arguments?.let { arguments ->
+ val action = SettingsImportAction.fromBundle(arguments)
+ viewModel.setAction(action)
+ }
}
private fun initializeSettingsImportList(recyclerView: RecyclerView) {
diff --git a/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportScreen.kt b/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportScreen.kt
index 6a18cd60584..bcb8d293eb3 100644
--- a/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportScreen.kt
+++ b/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportScreen.kt
@@ -19,6 +19,7 @@ import app.k9mail.feature.settings.importing.R
@Composable
fun SettingsImportScreen(
+ action: SettingsImportAction,
onImportSuccess: () -> Unit,
onBack: () -> Unit,
modifier: Modifier = Modifier,
@@ -38,12 +39,13 @@ fun SettingsImportScreen(
},
modifier = modifier,
) { innerPadding ->
- SettingsImportContent(onImportSuccess, onBack, innerPadding)
+ SettingsImportContent(action, onImportSuccess, onBack, innerPadding)
}
}
@Composable
private fun SettingsImportContent(
+ action: SettingsImportAction,
onImportSuccess: () -> Unit,
onBack: () -> Unit,
paddingValues: PaddingValues,
@@ -62,6 +64,7 @@ private fun SettingsImportContent(
}
AndroidFragment(
+ arguments = action.toBundle(),
modifier = Modifier
.fillMaxSize()
.padding(paddingValues),
diff --git a/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportViewModel.kt b/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportViewModel.kt
index e8ae7baeb17..294171da149 100644
--- a/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportViewModel.kt
+++ b/feature/settings/import/src/main/kotlin/app/k9mail/feature/settings/import/ui/SettingsImportViewModel.kt
@@ -43,6 +43,9 @@ internal class SettingsImportViewModel(
private val uiModelLiveData = MutableLiveData()
private val actionLiveData = SingleLiveEvent()
+ private var action = SettingsImportAction.Overview
+ private var wasActionHandled = false
+
private val uiModel = SettingsImportUiModel()
private var accountsMap: MutableMap = mutableMapOf()
private val accountStateMap: MutableMap = mutableMapOf()
@@ -98,7 +101,9 @@ internal class SettingsImportViewModel(
return uiModelLiveData
}
+ @Suppress("LongMethod")
fun initializeFromSavedState(savedInstanceState: Bundle) {
+ wasActionHandled = true
contentUri = BundleCompat.getParcelable(savedInstanceState, STATE_CONTENT_URI, Uri::class.java)
currentlyAuthorizingAccountUuid = savedInstanceState.getString(STATE_CURRENTLY_AUTHORIZING_ACCOUNT_UUID)
@@ -197,6 +202,19 @@ internal class SettingsImportViewModel(
outState.putParcelable(STATE_CONTENT_URI, contentUri)
}
+ fun setAction(action: SettingsImportAction) {
+ this.action = action
+
+ if (!wasActionHandled) {
+ wasActionHandled = true
+
+ when (action) {
+ SettingsImportAction.Overview -> Unit
+ SettingsImportAction.ScanQrCode -> onScanQrCodeButtonClicked()
+ }
+ }
+ }
+
fun onPickDocumentButtonClicked() {
updateUiModel {
disablePickButtons()
@@ -222,8 +240,12 @@ internal class SettingsImportViewModel(
}
fun onDocumentPickCanceled() {
- updateUiModel {
- enablePickButtons()
+ if (action == SettingsImportAction.ScanQrCode) {
+ sendActionEvent(Action.Close(importSuccess = false))
+ } else {
+ updateUiModel {
+ enablePickButtons()
+ }
}
}
diff --git a/feature/settings/import/src/main/res/values-br/strings.xml b/feature/settings/import/src/main/res/values-br/strings.xml
index 6a48694620a..4afe655faf9 100644
--- a/feature/settings/import/src/main/res/values-br/strings.xml
+++ b/feature/settings/import/src/main/res/values-br/strings.xml
@@ -5,4 +5,12 @@
Oc’h enporzhiañ an arventennoù…
Arventennoù hollek
-
+ Dibab ur fichennaoueg
+ C\'hwitet eo enporzhiañ an arventennoù
+ Enporzhiañ diwar an arload
+ Enporzhiañ diwar an arload
+ Enporzhiet eo bet an arventennoù gant berzh
+ Lakait gerioù-tremen mar plij
+ Kevreit mar plij
+ Mar plij, kevreit ha lakait ho gerioù-tremen
+
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-cs/strings.xml b/feature/settings/import/src/main/res/values-cs/strings.xml
index 52f535acf74..e23e68243e4 100644
--- a/feature/settings/import/src/main/res/values-cs/strings.xml
+++ b/feature/settings/import/src/main/res/values-cs/strings.xml
@@ -41,4 +41,6 @@
Hlavní nastavení
Importovat z aplikace
Importovat z aplikace
+ Naskenovat QR kód
+ Verze aplikace není podporována.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-de/strings.xml b/feature/settings/import/src/main/res/values-de/strings.xml
index 5d97674bcb7..0efa05a4b2f 100644
--- a/feature/settings/import/src/main/res/values-de/strings.xml
+++ b/feature/settings/import/src/main/res/values-de/strings.xml
@@ -39,4 +39,6 @@
Allgemeine Einstellungen
Aus App importieren
Aus App importieren
+ QR-Code scannen
+ App-Version nicht unterstützt.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-enm/strings.xml b/feature/settings/import/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/settings/import/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-es/strings.xml b/feature/settings/import/src/main/res/values-es/strings.xml
index f78dc5a7b91..36857450d74 100644
--- a/feature/settings/import/src/main/res/values-es/strings.xml
+++ b/feature/settings/import/src/main/res/values-es/strings.xml
@@ -40,4 +40,6 @@
Ajustes generales
Importar desde la aplicación
Importar desde la aplicación
+ Escanear el código QR
+ Versión de la aplicación no compatible.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-et/strings.xml b/feature/settings/import/src/main/res/values-et/strings.xml
index 28fefb0b870..196b18c94bc 100644
--- a/feature/settings/import/src/main/res/values-et/strings.xml
+++ b/feature/settings/import/src/main/res/values-et/strings.xml
@@ -39,4 +39,6 @@
Üldised sätted
Impordi rakendusest
Impordi rakendusest
+ Skaneeri QR-koodi
+ Sellest rakenduse versioonist pole importimine toetatud.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-fa/strings.xml b/feature/settings/import/src/main/res/values-fa/strings.xml
index dec43c04708..7ea7d4d9823 100644
--- a/feature/settings/import/src/main/res/values-fa/strings.xml
+++ b/feature/settings/import/src/main/res/values-fa/strings.xml
@@ -39,4 +39,6 @@
تنظیمات کلی
درونریزی از کاره
درونریزی از کاره
+ نگارش کاره پشتیبانی نمیشود.
+ پویش کد پاس
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-fr/strings.xml b/feature/settings/import/src/main/res/values-fr/strings.xml
index ef1a168e3cd..480794817fc 100644
--- a/feature/settings/import/src/main/res/values-fr/strings.xml
+++ b/feature/settings/import/src/main/res/values-fr/strings.xml
@@ -40,4 +40,6 @@
Paramètres généraux
Importer de l’appli
Importer de l’appli
+ Lire un code QR
+ La version de l’appli n’est pas prise en charge.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-fy/strings.xml b/feature/settings/import/src/main/res/values-fy/strings.xml
index 5afc10db844..cff59de92bf 100644
--- a/feature/settings/import/src/main/res/values-fy/strings.xml
+++ b/feature/settings/import/src/main/res/values-fy/strings.xml
@@ -39,4 +39,6 @@
Algemiene ynstellingen
Ymportearje fan app út
Ymportearje fan app út
+ QR-koade scanne
+ App-ferzje net stipe.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-hr/strings.xml b/feature/settings/import/src/main/res/values-hr/strings.xml
index d99404b5163..382ea0dbae1 100644
--- a/feature/settings/import/src/main/res/values-hr/strings.xml
+++ b/feature/settings/import/src/main/res/values-hr/strings.xml
@@ -2,7 +2,7 @@
Uvoz postavki
Odaberi datoteku
- Uvoz
+ Uvezi
Postavke su uspješno uvezene
Molimo unesite lozinke
@@ -17,15 +17,28 @@
Nije uvezeno
Uvoz nije uspio
Kasnije
- Uvozim postavke…
+ Uvoz postavki…
- - Da bi bili u mogućnosti da koristite račun \"%s\" potrebno je da unesete lozinku za server.
- - Da bi bili u mogućnosti da koristite račun \"%s\" potrebno je da unesete lozinke za server.
- - Da bi bili u mogućnosti da koristite račun \"%s\" potrebno je da unesete lozinke za server.
+ - Da biste mogli koristiti račun \"%s\" trebate unijeti lozinku za poslužitelj.
+ - Da biste mogli koristiti račun\"%s\" trebate unijeti lozinke za poslužitelj.
+ - Da biste mogli koristiti račun \"%s\" trebate unijeti lozinke za poslužitelj.
Lozinka dolaznog poslužitelja
Lozinka odlaznog poslužitelja
- Koristi istu loziku za odlazni poslužitelj
+ Koristi istu lozinku za odlazni poslužitelj
Naziv servera: %s
- Opća podešavanja
-
+ Opće postavke
+ Prijavite se
+ Uvezi iz aplikacije
+ Prijava je obavezna
+ Autorizacija nije uspjela sa sljedećom pogreškom: %s
+ Molimo Vas prijavite se
+ Uvezi iz aplikacije
+ Za korištenje ovog računa e-pošte trebate se prijaviti i omogućiti aplikaciji pristup vašim emailovima.
+ Prijavite se s Googleom
+ Autorizacija poništena
+ OAuth 2.0 trenutačno nije podržan kod ovog pružatelja usluga e-pošte.
+ Aplikacija nije mogla pronaći preglednik za davanje pristupa vašem računu.
+ Skeniraj QR kod
+ Molimo Vas prijavite se i unesite lozinke
+
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-hu/strings.xml b/feature/settings/import/src/main/res/values-hu/strings.xml
index ab69433ce73..678e235fbae 100644
--- a/feature/settings/import/src/main/res/values-hu/strings.xml
+++ b/feature/settings/import/src/main/res/values-hu/strings.xml
@@ -39,4 +39,6 @@
Általános beállítások
Importálás alkalmazásból
Importálás alkalmazásból
+ QR-kód beolvasása
+ Nem támogatott alkalmazásverzió.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-ja/strings.xml b/feature/settings/import/src/main/res/values-ja/strings.xml
index 014316bc6ac..10087f356d7 100644
--- a/feature/settings/import/src/main/res/values-ja/strings.xml
+++ b/feature/settings/import/src/main/res/values-ja/strings.xml
@@ -38,4 +38,6 @@
一般設定
アプリからインポート
アプリからインポート
+ QR コードをスキャン
+ 対応していないバージョンのアプリです。
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-kab/strings.xml b/feature/settings/import/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/settings/import/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-kk/strings.xml b/feature/settings/import/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/settings/import/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-nl/strings.xml b/feature/settings/import/src/main/res/values-nl/strings.xml
index ce0ba0489c3..60874ad0239 100644
--- a/feature/settings/import/src/main/res/values-nl/strings.xml
+++ b/feature/settings/import/src/main/res/values-nl/strings.xml
@@ -39,4 +39,6 @@
Algemene instellingen
Importeren vanuit app
Importeren vanuit app
+ QR-code scannen
+ App-versie niet ondersteund.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-nn/strings.xml b/feature/settings/import/src/main/res/values-nn/strings.xml
index 9d2565dd670..16f4a85895c 100644
--- a/feature/settings/import/src/main/res/values-nn/strings.xml
+++ b/feature/settings/import/src/main/res/values-nn/strings.xml
@@ -5,4 +5,37 @@
Importerer innstillingar …
Generelle innstilingar
-
+ Vel fil
+ Skann QR-kode
+ Bruk same passord for utgåande tenar
+ Utgåande tenar-passord
+ Autorisering mislukka med følgjande feil: %s
+ Vellykka import av innstillingar
+ Importer frå app
+ Importer frå app
+ Ver vennleg og logg inn
+ Logg inn, og fyll inn passord
+ Vellukka import
+ Seinare
+ Servernamn: %s
+ Logg inn
+ Logg inn med Google
+ Autorisering kansellert
+ Appen kunne ikkje finne ein nettlesar for å gje tilgjenge til kontoen din.
+ OAuth 2.0 er ikkje støtta med denne tilbydaren enno.
+ Ver vennleg og skriv inn passord
+ Importering av innstillingar feila
+ Kunne ikkje lese innstillingsfil
+ Kunne ikkje importere nokre innstillingar
+ Passord påkravd
+ Innlogging påkravd
+ Ikkje importert
+ Feil under import
+ Innkommande tenar-passord
+
+ - For å vere i stand til å bruke kontoen \"%s\" må du angje tenar-passordet.
+ - For å vere i stand til å bruke kontoen \"%s\" må du angje tenar-passorda.
+
+ For å bruke denne e-postkontoen, må du logge inn, og gje tilgjenge til e-postane dine.
+ App-versjon er ikkje støtta.
+
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-pl/strings.xml b/feature/settings/import/src/main/res/values-pl/strings.xml
index a3f5bf6a3f5..2feff616054 100644
--- a/feature/settings/import/src/main/res/values-pl/strings.xml
+++ b/feature/settings/import/src/main/res/values-pl/strings.xml
@@ -9,11 +9,11 @@
Zaloguj się
- Zaloguj się i podaj hasła
+ Zaloguj się i podaj hasła
Import ustawień się nie powiódł
Odczyt pliku ustawień się nie powiódł
Import niektórych ustawień się nie powiódł
- Zaimportowano z powodzeniem
+ Zaimportowano z powodzeniem
Hasło wymagane
Wymagane jest zalogowanie się
@@ -31,14 +31,16 @@
Hasło serwera poczty wychodzącej
Użyj tego samego hasła dla serwera poczty wychodzącej
Nazwa serwera: %s
- Aby używać tego konta e-mail, musisz się zalogować i przyznać aplikacji dostęp do swoich e-maili.
+ Aby używać tego konta e-mail, musisz się zalogować i przyznać aplikacji dostęp do swoich e-maili.
Zaloguj się
Zaloguj się przez Google
Autoryzacja anulowana
- Autoryzacja nie powiodła się z następującym błędem: %s
+ Autoryzacja nie powiodła się z następującym błędem: %s
Ten dostawca nie obsługuje obecnie protokołu OAuth 2.0.
Aplikacja nie mogła znaleźć przeglądarki, za pomocą której można uzyskać dostęp do Twojego konta.
Ustawienia ogólne
- Importuj z aplikacji
- Importuj z aplikacji
+ Importuj z aplikacji
+ Importuj z aplikacji
+ Zeskanuj kod QR
+ Wersja aplikacji nie jest obsługiwana.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-pt-rBR/strings.xml b/feature/settings/import/src/main/res/values-pt-rBR/strings.xml
index 716d4ea677a..8bc06ce24f9 100644
--- a/feature/settings/import/src/main/res/values-pt-rBR/strings.xml
+++ b/feature/settings/import/src/main/res/values-pt-rBR/strings.xml
@@ -40,4 +40,5 @@
Configurações gerais
Importar de app
Importar do app
+ Ler código QR
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-pt/strings.xml b/feature/settings/import/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/settings/import/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-ro/strings.xml b/feature/settings/import/src/main/res/values-ro/strings.xml
index 25573778ffb..30e53c22eb2 100644
--- a/feature/settings/import/src/main/res/values-ro/strings.xml
+++ b/feature/settings/import/src/main/res/values-ro/strings.xml
@@ -40,4 +40,6 @@
Preferințe generale
Import din aplicație
Import din aplicație
+ Scanează codul QR
+ Versiunea aplicației nu este compatibilă.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-ru/strings.xml b/feature/settings/import/src/main/res/values-ru/strings.xml
index e0ac00c4908..6cfdc45596f 100644
--- a/feature/settings/import/src/main/res/values-ru/strings.xml
+++ b/feature/settings/import/src/main/res/values-ru/strings.xml
@@ -41,4 +41,6 @@
Основные
Импорт из приложения
Импорт из приложения
+ Сканировать QR-код
+ Версия приложения не поддерживается.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-sl/strings.xml b/feature/settings/import/src/main/res/values-sl/strings.xml
index 20b4c4b027b..82e0e32e768 100644
--- a/feature/settings/import/src/main/res/values-sl/strings.xml
+++ b/feature/settings/import/src/main/res/values-sl/strings.xml
@@ -39,4 +39,6 @@
S tem ponudnikom šifriranje OAuth 2.0 podprto.
Brskalnik nima dostopa do brskalnika za odobritev prijavnih podatkov računa.
Splošne nastavitve
+ Uvoz iz aplikacije
+ Uvoz iz aplikacije
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-sq/strings.xml b/feature/settings/import/src/main/res/values-sq/strings.xml
index 94780a4fb77..61c7f2a57e0 100644
--- a/feature/settings/import/src/main/res/values-sq/strings.xml
+++ b/feature/settings/import/src/main/res/values-sq/strings.xml
@@ -37,4 +37,7 @@
OAuth 2.0 aktualisht nuk mbulohet me këtë furnizues shërbimi.
Aplikacioni sgjeti dot një shfletues për ta përdorur për ti akorduar hyrje te llogaria juaj.
Rregullime të përgjithshme
+ Importo prej aplikacioni
+ Importo prej aplikacioni
+ Skanoni kodin QR
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-sv/strings.xml b/feature/settings/import/src/main/res/values-sv/strings.xml
index 8f8114b95fc..6cdaab8ce8b 100644
--- a/feature/settings/import/src/main/res/values-sv/strings.xml
+++ b/feature/settings/import/src/main/res/values-sv/strings.xml
@@ -39,4 +39,6 @@
Allmänna inställningar
Importera från app
Importera från app
+ Skanna QR-kod
+ Appversionen stöds inte.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-tr/strings.xml b/feature/settings/import/src/main/res/values-tr/strings.xml
index 06f1374dca5..c6a7d7ef51f 100644
--- a/feature/settings/import/src/main/res/values-tr/strings.xml
+++ b/feature/settings/import/src/main/res/values-tr/strings.xml
@@ -40,4 +40,6 @@
Genel ayarlar
Uygulamadan içe aktar
Uygulamadan içe aktar
+ QR kodu okut
+ Uygulama sürümü desteklenmiyor.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-uk/strings.xml b/feature/settings/import/src/main/res/values-uk/strings.xml
index 06fca933145..b8e9d3eb553 100644
--- a/feature/settings/import/src/main/res/values-uk/strings.xml
+++ b/feature/settings/import/src/main/res/values-uk/strings.xml
@@ -1,42 +1,46 @@
- Імпортувати налаштування
+ Імпорт налаштувань
Вибрати файл
Імпорт
- Налаштування успішно імпортовано
+ Налаштування імпортовано
Введіть паролі
- Увійдіть, будь ласка
+ Будь ласка, увійдіть
- Будь ласка, увійдіть та наберіть паролі
+ Будь ласка, увійдіть та введіть паролі
Не вдалося імпортувати налаштування
Не вдалося прочитати файл з налаштуваннями
Не вдалося імпортувати деякі налаштування
- Успішно імпортовано
+ Імпортовано
Потрібен пароль
- Потрібно увійти
+ Потрібно ввійти
Не імпортовано
- Збій імпортування
+ Збій імпорту
Пізніше
- Імпортуються налаштування…
+ Налаштування імпортуються…
- - Щоб користуватися обліковим записом %s, потрібно надати пароль сервера.
- - Щоб користуватися обліковим записом %s, потрібно надати паролі сервера.
- - Щоб користуватися обліковим записом %s, потрібно надати паролі сервера.
- - Щоб користуватися обліковим записом %s, потрібно надати паролі сервера.
+ - Щоб користуватися обліковим записом %s, потрібно вказати пароль сервера.
+ - Щоб користуватися обліковим записом %s, потрібно вказати паролі сервера.
+ - Щоб користуватися обліковим записом %s, потрібно вказати паролі сервера.
+ - Щоб користуватися обліковим записом %s, потрібно вказати паролі сервера.
Пароль сервера вхідної пошти
Пароль сервера вихідної пошти
Використовувати той же пароль для сервера вихідної пошти
Ім\'я сервера: %s
- Для використання цього поштового облікового запису у K-9 Mail Вам потрібно увійти в обліковий запис та надати доступ до ел.листів.
+ Для користування цим обліковим записом е-пошти потрібно ввійти та надати застосунку доступ до е-пошти.
Увійти
- Увійти з Google
+ Увійти за допомогою Google
Авторизація скасована
- Авторизація на вдалася з таких причин: %s
- OAuth 2.0 наразі цим провайдером не підтримується.
- Програма не може знайти браузер для надання доступу до Вашого облікового запису.
+ Не вдалося авторизувати через цю помилку: %s
+ Цей постачальник наразі не підтримує OAuth 2.0.
+ Застосунок не може знайти браузер для надання доступу до вашого облікового запису.
Загальні налаштування
+ Імпорт із застосунку
+ Імпорт із застосунку
+ Сканувати QR-код
+ Версія застосунку не підтримується.
\ No newline at end of file
diff --git a/feature/settings/import/src/main/res/values-zh-rCN/strings.xml b/feature/settings/import/src/main/res/values-zh-rCN/strings.xml
index 69f290c0a85..72acf87acfb 100644
--- a/feature/settings/import/src/main/res/values-zh-rCN/strings.xml
+++ b/feature/settings/import/src/main/res/values-zh-rCN/strings.xml
@@ -19,7 +19,7 @@
需要登录
没有导入
导入失败
- 之后
+ 稍后
正在导入设置…
- 您需要提供服务器密码才能使用此账号 \"%s\"。
@@ -38,4 +38,6 @@
常规设置
从应用导入
从应用导入
+ 扫描二维码
+ 应用版本不支持。
\ No newline at end of file
diff --git a/feature/widget/message-list/src/main/res/values-az/strings.xml b/feature/widget/message-list/src/main/res/values-az/strings.xml
index 2a7c61ced80..606a2c51b04 100644
--- a/feature/widget/message-list/src/main/res/values-az/strings.xml
+++ b/feature/widget/message-list/src/main/res/values-az/strings.xml
@@ -1,4 +1,8 @@
-
+
Tərtib et
-
+ Mesaj siyahısı
+ Yüklənir…
+ Yüklənir…
+ Ümumi Gələnlər Qutusu
+
\ No newline at end of file
diff --git a/feature/widget/message-list/src/main/res/values-enm/strings.xml b/feature/widget/message-list/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/message-list/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/message-list/src/main/res/values-hr/strings.xml b/feature/widget/message-list/src/main/res/values-hr/strings.xml
index cdc736460c4..bdd4b30f3b4 100644
--- a/feature/widget/message-list/src/main/res/values-hr/strings.xml
+++ b/feature/widget/message-list/src/main/res/values-hr/strings.xml
@@ -1,7 +1,8 @@
-
+
- Sastavi
- Učitavam…
- Učitavam…
- Objedinjena Dolazna Pošta
-
+ Nova poruka
+ Učitavanje…
+ Učitavanje…
+ Objedinjena dolazna pošta
+ Popis poruka
+
\ No newline at end of file
diff --git a/feature/widget/message-list/src/main/res/values-kab/strings.xml b/feature/widget/message-list/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/message-list/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/message-list/src/main/res/values-kk/strings.xml b/feature/widget/message-list/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/message-list/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/message-list/src/main/res/values-nn/strings.xml b/feature/widget/message-list/src/main/res/values-nn/strings.xml
index 1dd116ac081..e09dd077d03 100644
--- a/feature/widget/message-list/src/main/res/values-nn/strings.xml
+++ b/feature/widget/message-list/src/main/res/values-nn/strings.xml
@@ -1,6 +1,8 @@
-
+
Skriv
Lastar …
Lastar …
-
+ Meldingsliste
+ Samla innboks
+
\ No newline at end of file
diff --git a/feature/widget/message-list/src/main/res/values-pt/strings.xml b/feature/widget/message-list/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/message-list/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/message-list/src/main/res/values-uk/strings.xml b/feature/widget/message-list/src/main/res/values-uk/strings.xml
index fdbf0bc00e8..f8dac59fd5f 100644
--- a/feature/widget/message-list/src/main/res/values-uk/strings.xml
+++ b/feature/widget/message-list/src/main/res/values-uk/strings.xml
@@ -1,7 +1,8 @@
-
+
- Написати новий лист
+ Написати
Завантаження…
Завантаження…
Об\'єднані Вхідні
-
+ Список повідомлень
+
\ No newline at end of file
diff --git a/feature/widget/shortcut/src/main/res/values-enm/strings.xml b/feature/widget/shortcut/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/shortcut/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/shortcut/src/main/res/values-hr/strings.xml b/feature/widget/shortcut/src/main/res/values-hr/strings.xml
index a6b3daec935..86352ce5e6f 100644
--- a/feature/widget/shortcut/src/main/res/values-hr/strings.xml
+++ b/feature/widget/shortcut/src/main/res/values-hr/strings.xml
@@ -1,2 +1,4 @@
-
\ No newline at end of file
+
+ Računi
+
\ No newline at end of file
diff --git a/feature/widget/shortcut/src/main/res/values-kab/strings.xml b/feature/widget/shortcut/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/shortcut/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/shortcut/src/main/res/values-kk/strings.xml b/feature/widget/shortcut/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/shortcut/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/shortcut/src/main/res/values-lt/strings.xml b/feature/widget/shortcut/src/main/res/values-lt/strings.xml
index a6b3daec935..b4fd560b3ed 100644
--- a/feature/widget/shortcut/src/main/res/values-lt/strings.xml
+++ b/feature/widget/shortcut/src/main/res/values-lt/strings.xml
@@ -1,2 +1,4 @@
-
\ No newline at end of file
+
+ Paskyros
+
\ No newline at end of file
diff --git a/feature/widget/shortcut/src/main/res/values-nb-rNO/strings.xml b/feature/widget/shortcut/src/main/res/values-nb-rNO/strings.xml
index a6b3daec935..cd2a5b31af2 100644
--- a/feature/widget/shortcut/src/main/res/values-nb-rNO/strings.xml
+++ b/feature/widget/shortcut/src/main/res/values-nb-rNO/strings.xml
@@ -1,2 +1,4 @@
-
\ No newline at end of file
+
+ Kontoer
+
\ No newline at end of file
diff --git a/feature/widget/shortcut/src/main/res/values-pt/strings.xml b/feature/widget/shortcut/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/shortcut/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/shortcut/src/main/res/values-uk/strings.xml b/feature/widget/shortcut/src/main/res/values-uk/strings.xml
index a6b3daec935..2fa1803c8a0 100644
--- a/feature/widget/shortcut/src/main/res/values-uk/strings.xml
+++ b/feature/widget/shortcut/src/main/res/values-uk/strings.xml
@@ -1,2 +1,4 @@
-
\ No newline at end of file
+
+ Облікові записи
+
\ No newline at end of file
diff --git a/feature/widget/unread/src/main/res/values-enm/strings.xml b/feature/widget/unread/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/unread/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/unread/src/main/res/values-et/strings.xml b/feature/widget/unread/src/main/res/values-et/strings.xml
index 064959f4518..27d2539814b 100644
--- a/feature/widget/unread/src/main/res/values-et/strings.xml
+++ b/feature/widget/unread/src/main/res/values-et/strings.xml
@@ -8,7 +8,7 @@
Näita lugemata kirjade üldarvu vaid üksiku kausta kohta
Kaust
Kaust, mille lugemata kirjade üldarvu peaks näitama
- Tehtud
+ Valmis
%1$s - %2$s
Konto on valimata
Kaust on valimata
diff --git a/feature/widget/unread/src/main/res/values-fy/strings.xml b/feature/widget/unread/src/main/res/values-fy/strings.xml
index 34f35a00ce3..21a9e68aa45 100644
--- a/feature/widget/unread/src/main/res/values-fy/strings.xml
+++ b/feature/widget/unread/src/main/res/values-fy/strings.xml
@@ -1,11 +1,11 @@
- Tal net-lêzen werjaan foar…
+ Tal net-lêzen toane foar…
Account
De account wêrfoar it tal net-lêzen berjochten toand wurde moat
Kombinearre Postfek YN
Mapoantal
- It tal net-lêzen berjochten fan in inkelde map toane
+ Tal net-lêzen berjochten fan in inkelde map toane
Map
De map wêrfoar it tal net-lêzen berjochten toand wurde moat
Dien
diff --git a/feature/widget/unread/src/main/res/values-hr/strings.xml b/feature/widget/unread/src/main/res/values-hr/strings.xml
index 336ad8f4712..51c34ed11e4 100644
--- a/feature/widget/unread/src/main/res/values-hr/strings.xml
+++ b/feature/widget/unread/src/main/res/values-hr/strings.xml
@@ -1,15 +1,17 @@
-
+
- Prikaži brojač nepročitanih za…
+ Prikaži broj nepročitanih poruka za…
Račun
- Račun za koji će broj nepročitanih biti prikazivan
- Objedinjena Dolazna Pošta
+ Račun za koji treba prikazati broj nepročitanih poruka
+ Objedinjena dolazna pošta
Broj mapa
Mapa
- Mapa za koju će broj nepročitanih biti prikazivan
+ Mapa za koju treba prikazati broj nepročitanih poruka
Gotovo
%1$s - %2$s
Nijedan račun nije odabran
Nijedna mapa nije odabrana
Odaberite račun
-
+ Broj nepročitanih poruka
+ Prikaži broj nepročitanih poruka samo za jednu mapu e-pošte
+
\ No newline at end of file
diff --git a/feature/widget/unread/src/main/res/values-kab/strings.xml b/feature/widget/unread/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/unread/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/unread/src/main/res/values-kk/strings.xml b/feature/widget/unread/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/unread/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/unread/src/main/res/values-nl/strings.xml b/feature/widget/unread/src/main/res/values-nl/strings.xml
index 052cc43ee12..987a2b712a7 100644
--- a/feature/widget/unread/src/main/res/values-nl/strings.xml
+++ b/feature/widget/unread/src/main/res/values-nl/strings.xml
@@ -5,7 +5,7 @@
De account waarvoor het aantal ongelezen berichten getoond moet worden
Samengevoegd Postvak IN
Mapaantal
- Het aantal ongelezen berichten van een enkele map tonen
+ Aantal ongelezen berichten van een enkele map tonen
Map
De map waarvoor het aantal ongelezen berichten getoond moet worden
Gereed
diff --git a/feature/widget/unread/src/main/res/values-nn/strings.xml b/feature/widget/unread/src/main/res/values-nn/strings.xml
index 0ed49663b02..3f582e1840a 100644
--- a/feature/widget/unread/src/main/res/values-nn/strings.xml
+++ b/feature/widget/unread/src/main/res/values-nn/strings.xml
@@ -4,4 +4,14 @@
Vel konto
Antal ulesne
Konto
+ Kontoen der talet på ulesne meldingar skal visast
+ Mappeantal
+ Samla innboks
+ Vis antal ulesne frå kun ei mappe
+ Mappe
+ Mappa der antal ulesne skal visast
+ Ferdig
+ %1$s - %2$s
+ Ingen konto valt
+ Ingen mappe valt
\ No newline at end of file
diff --git a/feature/widget/unread/src/main/res/values-pl/strings.xml b/feature/widget/unread/src/main/res/values-pl/strings.xml
index cb9aa2db31b..c042da5699d 100644
--- a/feature/widget/unread/src/main/res/values-pl/strings.xml
+++ b/feature/widget/unread/src/main/res/values-pl/strings.xml
@@ -8,7 +8,7 @@
Wyświetl licznik nieprzeczytanych wiadomości tylko dla pojedynczego folderu
Folder
Folder, dla którego liczba nieprzeczytanych wiadomości powinna być wyświetlana
- Wykonano
+ Gotowe
%1$s - %2$s
Nie wybrano konta
Nie wybrano folderu
diff --git a/feature/widget/unread/src/main/res/values-pt/strings.xml b/feature/widget/unread/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/feature/widget/unread/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/feature/widget/unread/src/main/res/values-sv/strings.xml b/feature/widget/unread/src/main/res/values-sv/strings.xml
index 2cc7f58555b..e5612bdd13d 100644
--- a/feature/widget/unread/src/main/res/values-sv/strings.xml
+++ b/feature/widget/unread/src/main/res/values-sv/strings.xml
@@ -1,4 +1,4 @@
-
+
Visa antalet olästa för…
Konto
@@ -13,4 +13,5 @@
Inget konto valt
Ingen mapp vald
Välj konto
-
+ Antal olästa
+
\ No newline at end of file
diff --git a/feature/widget/unread/src/main/res/values-uk/strings.xml b/feature/widget/unread/src/main/res/values-uk/strings.xml
index 1353d7c41d0..f394d842e73 100644
--- a/feature/widget/unread/src/main/res/values-uk/strings.xml
+++ b/feature/widget/unread/src/main/res/values-uk/strings.xml
@@ -1,16 +1,17 @@
-
+
Показати кількість непрочитаних для…
Обліковий запис
- Обліковий запис, для якого має відображатися кількість непрочитаних листів
+ Обліковий запис, для якого має показуватись кількість непрочитаних
Об\'єднані Вхідні
Кількість тек
- Показати кількість непрочитаних листів тільки однієї теки
+ Показати кількість непрочитаних лише однієї теки
Тека
- Тека, для якої має відображатися кількість непрочитаних листів
+ Тека, для якої має показуватись кількість непрочитаних
Готово
%1$s - %2$s
- Не вибрано жодного облікового запису
- Не вибрано жодної теки
+ Обліковий запис не вибрано
+ Теку не вибрано
Вибрати обліковий запис
-
+ Кількість непрочитаних
+
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index a2f81e19f4f..09fafbb6cb9 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -17,22 +17,22 @@ androidMaterial = "1.12.0"
# AGP and tools should be updated together
androidGradlePlugin = "8.5.2"
androidTools = "31.5.2"
-androidxActivity = "1.9.2"
-androidxAnnotation = "1.8.2"
+androidxActivity = "1.9.3"
+androidxAnnotation = "1.9.0"
androidxAppCompat = "1.7.0"
androidxBiometric = "1.1.0"
-androidxCamera = "1.3.1"
+androidxCamera = "1.3.4"
# https://developer.android.com/jetpack/compose/bom/bom-mapping
-androidxComposeBom = "2024.09.00"
+androidxComposeBom = "2024.10.00"
androidxConstraintLayout = "2.1.4"
androidxCoordinatorLayout = "1.2.0"
androidxCore = "1.13.1"
androidxCoreSplashscreen = "1.0.1"
androidxDrawerLayout = "1.1.1"
-androidxFragment = "1.8.3"
-androidxLifecycle = "2.8.5"
+androidxFragment = "1.8.4"
+androidxLifecycle = "2.8.6"
androidxLocalBroadcastManager = "1.1.0"
-androidxNavigation = "2.8.0"
+androidxNavigation = "2.8.3"
androidxRecyclerView = "1.3.2"
androidxPreference = "1.2.1"
androidxSwiperefreshlayout = "1.1.0"
@@ -52,16 +52,16 @@ commonsIo = "2.16.1"
dependencyCheckPlugin = "0.51.0"
dependencyGuardPlugin = "0.5.0"
detektPlugin = "1.23.5"
-detektPluginCompose = "0.4.11"
+detektPluginCompose = "0.4.16"
fastAdapter = "5.7.0"
forkhandlesBom = "2.20.0.0"
glide = "4.16.0"
-gradle = "8.10"
-http4kBom = "5.30.0.0"
+gradle = "8.10.2"
+http4kBom = "5.32.4.0"
icu4j = "72.1"
javaDiffUtils = "4.12"
jcipAnnotations = "1.0"
-jetbrainsAnnotations = "24.1.0"
+jetbrainsAnnotations = "26.0.1"
jdom = "2.0.6.1"
jmapClient = "0.3.1"
jsoup = "1.17.2"
@@ -69,21 +69,20 @@ junit = "4.13.2"
jutf7 = "1.0.0"
jzlib = "1.0.7"
koinBom = "3.5.6"
-kotlinBom = "2.0.20"
+kotlinBom = "2.0.21"
# Needs to match the version used by Gradle, just check with `./gradlew --version`
kotlinGradleBom = "1.9.24"
-kotlinKsp = "2.0.20-1.0.25"
-kotlinxCoroutines = "1.8.1"
+kotlinKsp = "2.0.21-1.0.25"
+kotlinxCoroutines = "1.9.0"
kotlinxCollectionsImmutable = "0.3.8"
kotlinxDateTime = "0.6.1"
kotlinxSerialization = "1.7.3"
ktlint = "1.2.1"
kxml2 = "1.0"
leakcanary = "2.13"
-materialDrawer = "9.0.2"
mime4j = "0.8.9"
minidns = "1.0.5"
-mockito = "5.13.0"
+mockito = "5.14.2"
mockitoKotlin = "5.4.0"
moshi = "1.15.1"
mozillaAndroidComponents = "130.0"
@@ -96,7 +95,7 @@ searchPreference = "v2.3.0"
spotlessPlugin = "6.25.0"
timber = "5.0.1"
tokenautocomplete = "4.0.0-beta01-k9mail02"
-turbine = "1.1.0"
+turbine = "1.2.0"
xmlpull = "1.0"
zxing = "3.5.3"
@@ -220,7 +219,6 @@ kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerialization" }
kxml2 = { module = "com.github.cketti:kxml2-extracted-from-android", version.ref = "kxml2" }
leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" }
-materialdrawer = { module = "com.mikepenz:materialdrawer", version.ref = "materialDrawer" }
mime4j-core = { module = "org.apache.james:apache-mime4j-core", version.ref = "mime4j" }
mime4j-dom = { module = "org.apache.james:apache-mime4j-dom", version.ref = "mime4j" }
minidns-hla = { module = "org.minidns:minidns-hla", version.ref = "minidns" }
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 66cd5a0e49b..79eb9d003fe 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/legacy/core/src/main/res/values/arrays_drawer.xml b/legacy/core/src/main/res/values/arrays_drawer.xml
deleted file mode 100644
index e6483724860..00000000000
--- a/legacy/core/src/main/res/values/arrays_drawer.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
- - @color/material_amber_600
- - @color/material_orange_500
- - @color/material_deep_orange_400
- - @color/material_red_400
-
- - @color/material_lime_600
- - @color/material_light_green_600
- - @color/material_green_500
- - @color/material_teal_300
-
- - @color/material_cyan_600
- - @color/material_light_blue_500
- - @color/material_blue_400
- - @color/material_indigo_200
-
- - @color/material_pink_200
- - @color/material_purple_200
- - @color/material_deep_purple_200
- - @color/material_blue_gray_300
-
-
-
diff --git a/legacy/core/src/main/res/values/arrays_general_settings_values.xml b/legacy/core/src/main/res/values/arrays_general_settings_values.xml
index f47089f79d1..1b2fefe35b3 100644
--- a/legacy/core/src/main/res/values/arrays_general_settings_values.xml
+++ b/legacy/core/src/main/res/values/arrays_general_settings_values.xml
@@ -39,6 +39,7 @@
- ml
- nb
- nl
+ - nn
- pl
- pt_BR
- pt_PT
@@ -100,6 +101,7 @@
- nl
- no
- nb
+ - nn
- uz
- pl
- pt_PT
diff --git a/legacy/ui/account/build.gradle.kts b/legacy/ui/account/build.gradle.kts
index 6258ad44d67..8f79a4ad046 100644
--- a/legacy/ui/account/build.gradle.kts
+++ b/legacy/ui/account/build.gradle.kts
@@ -7,14 +7,7 @@ android {
}
dependencies {
- api(projects.legacy.account)
-
- implementation(projects.core.android.common)
implementation(projects.core.ui.legacy.designsystem)
- implementation(projects.legacy.mailstore)
- implementation(projects.legacy.message)
-
- implementation(libs.androidx.lifecycle.livedata.ktx)
implementation(libs.glide)
}
diff --git a/legacy/ui/account/src/main/java/app/k9mail/legacy/ui/account/AccountImageLoader.kt b/legacy/ui/account/src/main/java/app/k9mail/legacy/ui/account/AccountImageLoader.kt
deleted file mode 100644
index 70dce6a3aaf..00000000000
--- a/legacy/ui/account/src/main/java/app/k9mail/legacy/ui/account/AccountImageLoader.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package app.k9mail.legacy.ui.account
-
-import android.content.Context
-import android.widget.ImageView
-import app.k9mail.core.android.common.activity.findActivity
-import com.bumptech.glide.Glide
-import com.bumptech.glide.load.engine.DiskCacheStrategy
-
-/**
- * Load the account image into an [ImageView].
- */
-class AccountImageLoader(private val accountFallbackImageProvider: AccountFallbackImageProvider) {
- fun setAccountImage(imageView: ImageView, email: String, color: Int) {
- imageView.context.ifNotDestroyed { context ->
- Glide.with(context)
- .load(AccountImage(email, color))
- .placeholder(accountFallbackImageProvider.getDrawable(color))
- .diskCacheStrategy(DiskCacheStrategy.NONE)
- .dontAnimate()
- .into(imageView)
- }
- }
-
- fun cancel(imageView: ImageView) {
- imageView.context.ifNotDestroyed { context ->
- Glide.with(context).clear(imageView)
- }
- }
-
- private inline fun Context.ifNotDestroyed(block: (Context) -> Unit) {
- if (findActivity()?.isDestroyed == true) {
- // Do nothing because Glide would throw an exception
- } else {
- block(this)
- }
- }
-}
diff --git a/legacy/ui/base/src/main/res/values-az/strings.xml b/legacy/ui/base/src/main/res/values-az/strings.xml
index 8154125ecb8..6fe07e497ec 100644
--- a/legacy/ui/base/src/main/res/values-az/strings.xml
+++ b/legacy/ui/base/src/main/res/values-az/strings.xml
@@ -3,4 +3,5 @@
Oldu
Ləğv et
-
+ Ulduz
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-bg/strings.xml b/legacy/ui/base/src/main/res/values-bg/strings.xml
index 629b923615a..4c6547850a8 100644
--- a/legacy/ui/base/src/main/res/values-bg/strings.xml
+++ b/legacy/ui/base/src/main/res/values-bg/strings.xml
@@ -2,5 +2,6 @@
ОК
- Откажи
-
+ Отказ
+ Звезда
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-cs/strings.xml b/legacy/ui/base/src/main/res/values-cs/strings.xml
index ec4ce60a1b9..409013fed27 100644
--- a/legacy/ui/base/src/main/res/values-cs/strings.xml
+++ b/legacy/ui/base/src/main/res/values-cs/strings.xml
@@ -3,4 +3,5 @@
OK
Zrušit
-
+ Hvězdička
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-de/strings.xml b/legacy/ui/base/src/main/res/values-de/strings.xml
index 67ee1857cd0..74c9b444a41 100644
--- a/legacy/ui/base/src/main/res/values-de/strings.xml
+++ b/legacy/ui/base/src/main/res/values-de/strings.xml
@@ -3,4 +3,5 @@
OK
Abbrechen
+ Wichtigkeit
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-enm/strings.xml b/legacy/ui/base/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/base/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-es/strings.xml b/legacy/ui/base/src/main/res/values-es/strings.xml
index 82a86497588..27250ee5935 100644
--- a/legacy/ui/base/src/main/res/values-es/strings.xml
+++ b/legacy/ui/base/src/main/res/values-es/strings.xml
@@ -3,4 +3,5 @@
Aceptar
Cancelar
-
+ Destacar
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-et/strings.xml b/legacy/ui/base/src/main/res/values-et/strings.xml
index a1e1983dcb2..54841a9c4d2 100644
--- a/legacy/ui/base/src/main/res/values-et/strings.xml
+++ b/legacy/ui/base/src/main/res/values-et/strings.xml
@@ -3,4 +3,5 @@
Ok
Tühista
-
+ Märgi tähega
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-fa/strings.xml b/legacy/ui/base/src/main/res/values-fa/strings.xml
index 955d4d10218..68e5a793d82 100644
--- a/legacy/ui/base/src/main/res/values-fa/strings.xml
+++ b/legacy/ui/base/src/main/res/values-fa/strings.xml
@@ -3,4 +3,5 @@
خب
لغو
-
+ ستاره
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-fr/strings.xml b/legacy/ui/base/src/main/res/values-fr/strings.xml
index 36f2aab7f35..14e71de5b26 100644
--- a/legacy/ui/base/src/main/res/values-fr/strings.xml
+++ b/legacy/ui/base/src/main/res/values-fr/strings.xml
@@ -3,4 +3,5 @@
D’accord
Annuler
+ Ajouter une étoile
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-fy/strings.xml b/legacy/ui/base/src/main/res/values-fy/strings.xml
index af9cf96aacc..871cb51ed94 100644
--- a/legacy/ui/base/src/main/res/values-fy/strings.xml
+++ b/legacy/ui/base/src/main/res/values-fy/strings.xml
@@ -3,4 +3,5 @@
OK
Annulearje
+ Stjer
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-hr/strings.xml b/legacy/ui/base/src/main/res/values-hr/strings.xml
index 8b4fe3c34f7..5ad393dc52e 100644
--- a/legacy/ui/base/src/main/res/values-hr/strings.xml
+++ b/legacy/ui/base/src/main/res/values-hr/strings.xml
@@ -1,6 +1,7 @@
- U REDU
+ U redu
Otkaži
-
+ Označi zvjezdicom
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-hu/strings.xml b/legacy/ui/base/src/main/res/values-hu/strings.xml
index 0fd7144c72b..a2a75a1c63e 100644
--- a/legacy/ui/base/src/main/res/values-hu/strings.xml
+++ b/legacy/ui/base/src/main/res/values-hu/strings.xml
@@ -3,4 +3,5 @@
OK
Mégse
-
+ Csillag
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-ja/strings.xml b/legacy/ui/base/src/main/res/values-ja/strings.xml
index 679fbf985ee..b300b47ac80 100644
--- a/legacy/ui/base/src/main/res/values-ja/strings.xml
+++ b/legacy/ui/base/src/main/res/values-ja/strings.xml
@@ -3,4 +3,5 @@
OK
キャンセル
-
+ スターを付ける
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-kab/strings.xml b/legacy/ui/base/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..25c7836a3ad
--- /dev/null
+++ b/legacy/ui/base/src/main/res/values-kab/strings.xml
@@ -0,0 +1,5 @@
+
+
+ Sefsex
+ Rnu itri
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-kk/strings.xml b/legacy/ui/base/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/base/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-nl/strings.xml b/legacy/ui/base/src/main/res/values-nl/strings.xml
index f84de8d8ade..9bf72f9187a 100644
--- a/legacy/ui/base/src/main/res/values-nl/strings.xml
+++ b/legacy/ui/base/src/main/res/values-nl/strings.xml
@@ -3,4 +3,5 @@
OK
Annuleren
+ Ster
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-nn/strings.xml b/legacy/ui/base/src/main/res/values-nn/strings.xml
index ac1c91839e3..998f1b7264e 100644
--- a/legacy/ui/base/src/main/res/values-nn/strings.xml
+++ b/legacy/ui/base/src/main/res/values-nn/strings.xml
@@ -3,4 +3,5 @@
Greitt
Avbryt
-
+ Stjerne
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-pl/strings.xml b/legacy/ui/base/src/main/res/values-pl/strings.xml
index 5e0ce00a843..3961e2091bb 100644
--- a/legacy/ui/base/src/main/res/values-pl/strings.xml
+++ b/legacy/ui/base/src/main/res/values-pl/strings.xml
@@ -3,4 +3,5 @@
OK
Anuluj
-
+ Gwiazdka
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-pt-rBR/strings.xml b/legacy/ui/base/src/main/res/values-pt-rBR/strings.xml
index d5e565edb60..537ef306d4f 100644
--- a/legacy/ui/base/src/main/res/values-pt-rBR/strings.xml
+++ b/legacy/ui/base/src/main/res/values-pt-rBR/strings.xml
@@ -3,4 +3,5 @@
OK
Cancelar
-
+ Estrela
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-pt/strings.xml b/legacy/ui/base/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/base/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-ro/strings.xml b/legacy/ui/base/src/main/res/values-ro/strings.xml
index cbce4caea86..517e789fc57 100644
--- a/legacy/ui/base/src/main/res/values-ro/strings.xml
+++ b/legacy/ui/base/src/main/res/values-ro/strings.xml
@@ -3,4 +3,5 @@
OK
Renunță
-
+ Stea
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-ru/strings.xml b/legacy/ui/base/src/main/res/values-ru/strings.xml
index cbaaa5c5690..26d5c2ac659 100644
--- a/legacy/ui/base/src/main/res/values-ru/strings.xml
+++ b/legacy/ui/base/src/main/res/values-ru/strings.xml
@@ -3,4 +3,5 @@
ОК
Отмена
-
+ Избранное
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-sq/strings.xml b/legacy/ui/base/src/main/res/values-sq/strings.xml
index 45c1ffdd66c..75040d44eaa 100644
--- a/legacy/ui/base/src/main/res/values-sq/strings.xml
+++ b/legacy/ui/base/src/main/res/values-sq/strings.xml
@@ -3,4 +3,5 @@
OK
Anuloje
+ Yll
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-sv/strings.xml b/legacy/ui/base/src/main/res/values-sv/strings.xml
index 0eff58572dc..ee4f15462f3 100644
--- a/legacy/ui/base/src/main/res/values-sv/strings.xml
+++ b/legacy/ui/base/src/main/res/values-sv/strings.xml
@@ -3,4 +3,5 @@
OK
Avbryt
-
+ Stjärna
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-tr/strings.xml b/legacy/ui/base/src/main/res/values-tr/strings.xml
index 1a295b00bda..acf0c62b245 100644
--- a/legacy/ui/base/src/main/res/values-tr/strings.xml
+++ b/legacy/ui/base/src/main/res/values-tr/strings.xml
@@ -3,4 +3,5 @@
Tamam
İptal
+ Yıldız
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-uk/strings.xml b/legacy/ui/base/src/main/res/values-uk/strings.xml
index 913456032a5..547f8676b20 100644
--- a/legacy/ui/base/src/main/res/values-uk/strings.xml
+++ b/legacy/ui/base/src/main/res/values-uk/strings.xml
@@ -3,4 +3,5 @@
Гаразд
Скасувати
-
+ Позначити зірочкою
+
\ No newline at end of file
diff --git a/legacy/ui/base/src/main/res/values-zh-rCN/strings.xml b/legacy/ui/base/src/main/res/values-zh-rCN/strings.xml
index 1cd15b172f4..d79cfdef447 100644
--- a/legacy/ui/base/src/main/res/values-zh-rCN/strings.xml
+++ b/legacy/ui/base/src/main/res/values-zh-rCN/strings.xml
@@ -3,4 +3,5 @@
确定
取消
-
+ 星标
+
\ No newline at end of file
diff --git a/legacy/ui/folder/src/main/res/values-az/strings.xml b/legacy/ui/folder/src/main/res/values-az/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/folder/src/main/res/values-az/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/folder/src/main/res/values-enm/strings.xml b/legacy/ui/folder/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/folder/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/folder/src/main/res/values-kab/strings.xml b/legacy/ui/folder/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/folder/src/main/res/values-kab/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/folder/src/main/res/values-kk/strings.xml b/legacy/ui/folder/src/main/res/values-kk/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/folder/src/main/res/values-kk/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/folder/src/main/res/values-pt/strings.xml b/legacy/ui/folder/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/folder/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/legacy/build.gradle.kts b/legacy/ui/legacy/build.gradle.kts
index 72aa582cb75..067030606d9 100644
--- a/legacy/ui/legacy/build.gradle.kts
+++ b/legacy/ui/legacy/build.gradle.kts
@@ -43,7 +43,6 @@ dependencies {
implementation(libs.ckchangelog.core)
implementation(libs.tokenautocomplete)
implementation(libs.safeContentResolver)
- implementation(libs.materialdrawer)
implementation(libs.searchPreference)
implementation(libs.fastadapter)
implementation(libs.fastadapter.extensions.drag)
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt
index 1b996e8962d..2a444c1f083 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt
@@ -25,13 +25,10 @@ import androidx.fragment.app.commitNow
import app.k9mail.core.android.common.compat.BundleCompat
import app.k9mail.core.android.common.contact.CachingRepository
import app.k9mail.core.android.common.contact.ContactRepository
-import app.k9mail.core.featureflag.FeatureFlagKey
-import app.k9mail.core.featureflag.FeatureFlagProvider
import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons
import app.k9mail.feature.launcher.FeatureLauncherActivity
import app.k9mail.feature.launcher.FeatureLauncherTarget
import app.k9mail.feature.navigation.drawer.FolderDrawer
-import app.k9mail.feature.navigation.drawer.LegacyDrawer
import app.k9mail.feature.navigation.drawer.NavigationDrawer
import app.k9mail.legacy.account.Account
import app.k9mail.legacy.account.AccountManager
@@ -69,12 +66,10 @@ import com.fsck.k9.ui.settings.SettingsActivity
import com.fsck.k9.view.ViewSwitcher
import com.fsck.k9.view.ViewSwitcher.OnSwitchCompleteListener
import com.google.android.material.textview.MaterialTextView
-import com.mikepenz.materialdrawer.util.getOptimalDrawerWidth
import org.koin.android.ext.android.inject
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import timber.log.Timber
-import app.k9mail.feature.navigation.drawer.R as DrawerR
/**
* MessageList is the primary user interface for the program. This Activity shows a list of messages.
@@ -97,7 +92,6 @@ open class MessageList :
private val messagingController: MessagingController by inject()
private val contactRepository: ContactRepository by inject()
private val coreResourceProvider: CoreResourceProvider by inject()
- private val featureFlagProvider: FeatureFlagProvider by inject()
private lateinit var actionBar: ActionBar
private var searchView: SearchView? = null
@@ -175,11 +169,8 @@ open class MessageList :
}
}
- val swipeRefreshLayout = findViewById(DrawerR.id.material_drawer_swipe_refresh)
- swipeRefreshLayout.layoutParams.width = getOptimalDrawerWidth(this)
-
initializeActionBar()
- initializeDrawer(savedInstanceState)
+ initializeDrawer()
if (!decodeExtras(intent)) {
return
@@ -577,33 +568,14 @@ open class MessageList :
actionBar.setDisplayShowTitleEnabled(false)
}
- private fun initializeDrawer(savedInstanceState: Bundle?) {
+ private fun initializeDrawer() {
if (!isDrawerEnabled) {
val drawerLayout = findViewById(R.id.navigation_drawer_layout)
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
return
}
- featureFlagProvider.provide(FeatureFlagKey("material3_navigation_drawer"))
- .onEnabled {
- initializeFolderDrawer()
- }
- .onDisabledOrUnavailable {
- initializeLegacyDrawer(savedInstanceState)
- }
- }
-
- private fun initializeLegacyDrawer(savedInstanceState: Bundle?) {
- navigationDrawer = LegacyDrawer(
- parent = this,
- savedInstanceState = savedInstanceState,
- openManageFolders = { launchManageFoldersScreen() },
- openUnifiedInbox = { openUnifiedInbox() },
- openFolder = { folderId -> openFolder(folderId) },
- openAccount = { account -> openRealAccount(account) },
- openSettings = { SettingsActivity.launch(this) },
- createDrawerListener = { createDrawerListener() },
- )
+ initializeFolderDrawer()
}
private fun initializeFolderDrawer() {
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupComposition.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupComposition.kt
index f80c1fd45f0..11228140e57 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupComposition.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/activity/setup/AccountSetupComposition.kt
@@ -126,7 +126,7 @@ class AccountSetupComposition : K9Activity() {
private fun saveSettings() {
account.email = accountEmail.text.toString().trim()
- account.alwaysBcc = accountAlwaysBcc.text.toString().takeUnless { it.isNotBlank() }
+ account.alwaysBcc = accountAlwaysBcc.text.toString().takeUnless { it.isBlank() }
account.senderName = accountSenderName.text.toString().takeUnless { it.isBlank() }
account.signatureUse = accountSignatureUse.isChecked
if (accountSignatureUse.isChecked) {
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/account/KoinModule.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/account/KoinModule.kt
index 8b9f6433b65..5e8bb83cd91 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/account/KoinModule.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/account/KoinModule.kt
@@ -1,11 +1,9 @@
package com.fsck.k9.ui.account
import app.k9mail.legacy.ui.account.AccountFallbackImageProvider
-import app.k9mail.legacy.ui.account.AccountImageLoader
import org.koin.dsl.module
val accountUiModule = module {
- factory { AccountImageLoader(accountFallbackImageProvider = get()) }
factory { AccountFallbackImageProvider(context = get()) }
factory { AccountImageModelLoaderFactory(contactPhotoLoader = get(), accountFallbackImageProvider = get()) }
}
diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/AboutFragment.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/AboutFragment.kt
index d4d597efbd5..8f60279bc1e 100644
--- a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/AboutFragment.kt
+++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/settings/AboutFragment.kt
@@ -165,7 +165,6 @@ class AboutFragment : Fragment() {
"https://github.com/material-components/material-components-android",
"Apache License, Version 2.0",
),
- Library("Material Drawer", "https://github.com/mikepenz/MaterialDrawer", "Apache License, Version 2.0"),
Library("Mime4j", "https://james.apache.org/mime4j/", "Apache License, Version 2.0"),
Library("MiniDNS", "https://github.com/MiniDNS/minidns", "Multiple, Apache License, Version 2.0"),
Library("Moshi", "https://github.com/square/moshi", "Apache License, Version 2.0"),
diff --git a/legacy/ui/legacy/src/main/res/values-ar/strings.xml b/legacy/ui/legacy/src/main/res/values-ar/strings.xml
index e02aa38ecb6..5f87370e4ed 100644
--- a/legacy/ui/legacy/src/main/res/values-ar/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ar/strings.xml
@@ -313,12 +313,6 @@
متقدمة
إعدادات الحساب
إشعارات البريد الجديد
- مجلد الإخطارات
- الكل
- المجلدات من الفئة الأولى فقط
- المجلدات من الفئة الأولى و الثانية
- الكل عدا مجلدات الفئة الثانية
- بدون
إخطارات المزامنة
بريدك الإليكتروني
إظهار إشعارات على شريط الحالة عند تلقي بريد جديد
@@ -407,27 +401,12 @@
خلال الأشهر الـ 3 الماضية
خلال الأشهر الـ 6 الماضية
خلال العام الماضي
- المجلدات التي تود إظهارها
- الكل
- المجلدات من الفئة الأولى فقط
- المجلدات من الفئة الأولى و الثانية
- الكل عدا مجلدات الفئة الثانية
- مجلدات الإستجواب
- الكل
- المجلدات من الفئة الأولى فقط
- المجلدات من الفئة الأولى و الثانية
- الكل عدا مجلدات الفئة الثانية
- بدون
مزامنة عمليات حذف الخادم
احذف الرسائل عند حذفها على الخادم
تطبيق OpenPGP مفقود - هل تم إلغاء تثبيته؟
إعدادات المجلد
العرض في قمة المجموعة
اعرض بالقرب من أعلى قائمة المجلدات
- فئة عرض المجلد
- دون تصنيف
- الفئة الأولى
- الفئة الثانية
امحوا الرسائل المحلية
خادم الوارد
إعداد خادم البريد الوارد
diff --git a/legacy/ui/legacy/src/main/res/values-az/strings.xml b/legacy/ui/legacy/src/main/res/values-az/strings.xml
index 7871f0e2323..ed014a52b17 100644
--- a/legacy/ui/legacy/src/main/res/values-az/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-az/strings.xml
@@ -10,7 +10,7 @@
Açıq Mənbə Layihəsi
Veb sayt
Kömək al
- İstifadəçi forumu
+ İstifadəçi mərkəzi
Kitabxanalar
Lisenziya
Dəyişiklik jurnalı
@@ -19,7 +19,7 @@
Nə yenidir
Tətbiq yeniləndisə son dəyişiklikləri göstər
- Bu buraxılışda nə yenidir oxu
+ Bu buraxılışda nə yenidir bil
@@ -30,13 +30,13 @@
Cavab ver
Hamısın cavabla
Göndər
- Birləşmə kimi göndər
+ Əlavə kimi göndər
Qovluq seç
Bura Köçür…
Bura Yapışdır…
%d seçildi
Göndər
- Mövzu boşdur, necəsə göndərmək üçün təkrar kliklə
+ Mövzu boşdur, yenə də göndərmək üçün təkrar kliklə
Cavab ver
Hamısına cavab ver
Sil
@@ -126,42 +126,42 @@
Paylaş
Göndəricini seç
Ulduz əlavə et
- Thunderbird Mobile komandası
- Yerini dəyiş
+ Thunderbird Mobile Komandası
+ Köçür
Qaralamalara köçür
Qovluq siyahısını yenilə
Hesab əlavə et
Qovluğu tap
- Mövzu mətni kopyalandı
- Qaralama olaraq yadda saxla
+ Mövzu mətni buferə köçürüldü
+ Qaralama olaraq saxla
İmtina
Qovluqları idarə et
- Hesab parametrləri
- Kopyala
+ Hesab tənzimləmələri
+ Köçür
Ulduzu sil
Abunəlikdən çıx
- Oxunma bildirişi tələb et
+ Oxunma bildirişi alınacaq
Oxunmamış olaraq işarələ
Oxunma bildirişləri
Fayl əlavə et
- Oxunma bildirişi tələb etmə
+ Oxunma bildirişi alınmayacaq
Zibil qutusunu boşalt
- Sil
+ Təmizlə
- - Ünvan kopyalandı
- - Ünvanlar kopyalandı
+ - Ünvan buferə köçürüldü
+ - Ünvanlar buferə köçürüldü
(Mövzu yoxdur)
Mesajlar yüklənir…
Göndərən yoxdur
Bağlantı xətası
- Yeni mesaj olaraq redaktə et
+ Yeni mesaj ikən düzəliş et
Başlıqları göstər
Mesaj yükləmə xətası
%s haqqında
Axtar
\"%s\" hesabı %s-dan silinəcək.
- Oldu
- E-poçtu yoxla
- Mesaj göndər
+ Bitir
+ Poçtu yoxla
+ Mesajları göndər
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-be/strings.xml b/legacy/ui/legacy/src/main/res/values-be/strings.xml
index 9165c883b40..db10de87ced 100644
--- a/legacy/ui/legacy/src/main/res/values-be/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-be/strings.xml
@@ -308,12 +308,6 @@
Дадаткова
Налады акаўнта
Апавяшчэнне пра новую пошту
- Апавяшчэнні каталогаў
- Усе
- 1 клас
- 1 і 2 класы
- Апроч 1 і 2 класаў
- Няма
Апавяшчэнне пра сінхранізацыю
Ваш адрас электроннай пошты
Паказваць на панэлі стану апавяшчэнні пра новую пошту
@@ -402,27 +396,12 @@
3 апошнія месяцы
6 апошніх месяцаў
апошні год
- Бачнасць каталогаў
- Усе
- 1 клас
- 1 і 2 класы
- Апроч 1 і 2 класаў
- Апытанне каталогаў
- Усе
- 1 клас
- 1 і 2 класы
- Апроч 1 і 2 класаў
- Няма
Сінхроннае выдаленне
Выдаляць лісты пры выдаленні з сервера
Праграма OpenPGP адсутнічае. Яна была выдаленая?
Налады каталога
Паказваць у пачатку
Паказваць бліжэй да спіса каталогаў
- Бачнасць каталогаў
- Без класа
- 1 клас
- 2 клас
Выдаліць лакальныя лісты
Сервер уваходных лістоў
Наладжванне сервера ўваходнай пошты
diff --git a/legacy/ui/legacy/src/main/res/values-bg/strings.xml b/legacy/ui/legacy/src/main/res/values-bg/strings.xml
index 4dda879224a..5222a321f78 100644
--- a/legacy/ui/legacy/src/main/res/values-bg/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-bg/strings.xml
@@ -280,12 +280,6 @@
Разширени
Настройки на профила
Ново известие за поща
- Папка с известия
- Всички
- Само 1-ви Клас папки
- 1-ви и 2-ри Клас папки
- Всички освен 2-ри Клас папки
- Никой
Известия за синхронизация
Вашият пощенски адрес
Уведомявай в статус бара при ново съобщение
@@ -360,27 +354,12 @@
последните 3 месеца
последните 6 месеца
последната година
- Папки за показване
- Всички
- Само 1-ви Клас папки
- 1-ви и 2-ри Клас папки
- Всички освен 2-ри Клас папки
- Проверка на папките
- Всички
- Само 1-ви Клас папки
- 1-ви и 2-ри Клас папки
- Всички освен 2-ри Клас папки
- Никой
Синхронизирай изтриванията от сървъра
Премахни съобщенията, когато се изтрият от сървъра
Липсва OpenPGP приложение - да не сте го деинсталирали?
Настройки на папка
Показвай в основната група
Показвай в началото на списъка с папки
- Клас на папки за показване
- Без клас
- 1-ви Клас
- 2-ри Клас
Изчисти локалните съобщения
Сървър за входяща поща
Конфигуриране на сървър за входяща поща
@@ -628,7 +607,7 @@
Запазване в чернови
Изтегляне на прикачен файл…
- *Крипитиран*
+ *Шифрован*
Добавяне в контакти
Cc
Bcc
diff --git a/legacy/ui/legacy/src/main/res/values-br/strings.xml b/legacy/ui/legacy/src/main/res/values-br/strings.xml
index 76bd7f9e4f0..a28f6735af5 100644
--- a/legacy/ui/legacy/src/main/res/values-br/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-br/strings.xml
@@ -262,12 +262,6 @@
Kemplezhoc’h
Arventennoù ar gont
Rebuzadurioù posteloù nevez
- Teuliadoù rebuzadurioù
- Pep tra
- Teuliadoù ar rummad 1añ hepken
- Teuliadoù ar rummad 1añ hag an eil
- An holl estreget teuliadoù an eil rummad
- Netra
Rebuzadurioù goubredañ
Ho chomlec’h postel
Rebuziñ en ho parrenn-statud pa erru ur postel
@@ -335,27 +329,12 @@
an 3 miz tremenet
ar 6 miz tremenet
ar bloaz tremenet
- Teuliadoù da ziskouez
- An holl
- Teuliadoù ar rummad 1añ hepken
- Teuliadoù ar rummad 1añ hag an eil
- An holl estreget teuliadoù an eil rummad
- Kerc’hat an teuliadoù
- Pep tra
- Teuliadoù ar rummad 1añ hepken
- Teuliadoù ar rummad 1añ hag an eil
- An holl estreget teuliadoù an eil rummad
- Netra
Goubredañ dilamadurioù an dafariad
Dilemel ar c’hemennadennoù pa ’z int dilamet war an dafariad
Diouer a arload OpenPGP - ha staliet eo bet?
Arventennoù an teuliad
Diskouez er strollad uhelañ
Diskouez e-kichen krec’h roll an teuliadoù
- Rummad skrammañ an teuliad
- Rummad ebet
- 1añ rummad
- Eil rummad
Skarzhañ ar c’hemennadennoù lec’hel
Dafariad degemer
Kefluniañ an dafariad postel degemer
diff --git a/legacy/ui/legacy/src/main/res/values-ca/strings.xml b/legacy/ui/legacy/src/main/res/values-ca/strings.xml
index 987a041bebf..21fe7aab28e 100644
--- a/legacy/ui/legacy/src/main/res/values-ca/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ca/strings.xml
@@ -21,7 +21,7 @@
Esbrineu les novetats d’aquesta versió
- Vista
+ Mostra
@@ -307,12 +307,6 @@
Avançat
Configuració del compte
Notificacions noves de correu
- Carpetes de notificacions
- Tot
- Només carpetes de 1a Classe
- Carpetes de 1a i 2a Classe
- Totes les carpetes excepte de 2a Classe
- Cap
Notificacions de sincronització
La vostra adreça de correu
Notifica-ho a la barra d\'estat quan arribi correu
@@ -401,27 +395,12 @@
dels darrers 3 mesos
dels darrers 6 mesos
del darrer any
- Carpetes a mostrar
- Tot
- Només carpetes de 1a Classe
- Carpetes de 1a i 2a Classe
- Tot excepte carpetes de 2a classe
- Comprova les carpetes
- Tot
- Només carpetes de 1a Classe
- Carpetes de 1a i 2a Classe
- Tot excepte carpetes de 2a Classe
- Cap
Sincronitza els elements suprimits al servidor
Elimina els missatges quan se suprimeixin al servidor
Falta una aplicació d\'OpenPGP. S\'ha desinstal·lat\?
Configuració de les carpetes
Mostra al grup superior
Mostra a prop del capdamunt de la llista de carpetes
- Classe de vista de carpetes
- Sense Classe
- 1a Classe
- 2a Classe
Neteja els missatges locals
Servidor d\'entrada
Configura el servidor d\'entrada
@@ -907,8 +886,8 @@
Toca per a concedir permís.
Equip de Thunderbird per al mòbil
L\'aplicació OpenKeychain és necessària per habilitar el suport per a l\'encriptació d\'extrem a extrem.
- Quant a %s
- El compte \"%s\" s\'eliminarà de %s.
+ Quant al %s
+ El compte \"%s\" s\'eliminarà del %s.
Quan s\'utilitza Push, %1$s manté una connexió amb el servidor de correu. Android requereix que es mostri una notificació en curs mentre l\'aplicació està activa en segon pla. %2$s
Notificacions
Recollida de dades
@@ -917,4 +896,6 @@
Mostra les carpetes ocultes
Comparteix dades de rendiment, ús, maquinari i personalització d\'aquesta aplicació amb Mozilla per ajudar-nos a millorar el Thunderbird
Dades tècniques i d\'ús
+ Mostra la carpeta
+ Doneu suport al %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-co/strings.xml b/legacy/ui/legacy/src/main/res/values-co/strings.xml
index 3853af2faae..84a5629e026 100644
--- a/legacy/ui/legacy/src/main/res/values-co/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-co/strings.xml
@@ -284,12 +284,6 @@
tutti i messaghji
Ùn si pò micca cupià o dispiazzà un messaghju chì ùn hè micca sincrunizatu cù u servitore
Espertu
- Cartulari di e nutificazioni
- Tutti
- Solu i cartulari di 1a classa
- Cartulari di 1a è 2a classa
- Tutti i cartulari fora di a 2a classa
- Nisunu
Nutificazioni di sincrunizazione
U vostru indirizzu elettronicu
Nutificazione in a barra di statu à ricezzione d’un messaghju novu
@@ -358,19 +352,7 @@
i 3 ultimi mesi
i 6 ultimi mesi
l’ultimu annu
- Cartulari à affissà
- Tutti
- Solu i cartulari di 1a classa
- Cartulari di 1a è 2a classa
- Tutti i cartulari fora di a 2a classa
- Cartulari à sullicità
- Tutti
- Tutti i cartulari fora di a 2a classa
- Nisunu
Affissà in a parte superiore di a lista di i cartulari
- Classa d’affissera di u cartulare
- Nisuna classa
- 2a classa
Squassà i messaghji lucale
Cunfigurà u servitore d’esciuta (SMTP) di i messaghji
Vibrazione
@@ -408,8 +390,6 @@
10 Mio
i 2 ultimi ghjorni
e 3 ultime settimane
- Solu i cartulari di 1a classa
- Cartulari di 1a è 2a classa
Sincrunizà e squassature di u servitore
Caccià i messaghji quand’elli sò squassati nant’à u servitore
L’appiecazione OpenPGP hè assente ; seria desinstallata ?
@@ -421,7 +401,6 @@
Mudellu 4
Mudellu 2
Mudellu 5
- 1a classa
Servitore d’entrata
Cunfigurà u servitore d’entrata di i messaghji
Servitore d’esciuta
diff --git a/legacy/ui/legacy/src/main/res/values-cs/strings.xml b/legacy/ui/legacy/src/main/res/values-cs/strings.xml
index b442f8662c7..7a9a857e040 100644
--- a/legacy/ui/legacy/src/main/res/values-cs/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-cs/strings.xml
@@ -308,12 +308,6 @@
Rozšířené
Nastavení účtu
Oznamování nové pošty
- Složky oznámení
- Všechny
- Jen složky 1. třídy
- Složky 1. a 2. třídy
- Všechny vyjma složek 2. třídy
- Žádné
Synchronizovat oznámení
Vaše e-mailová adresa
Oznamovat došlou poštu ve stavovém řádku
@@ -402,27 +396,12 @@
za poslední 3 měsíce
za posledních 6 měsíců
za poslední rok
- Zobrazované složky
- Všechny
- Jen složky 1. třídy
- Složky 1. a 2. třídy
- Všechny vyjma složek 2. třídy
- Složky řízené dotazováním
- Všechny
- Jen složky 1. třídy
- Složky 1. a 2. třídy
- Všechny vyjma složek 2. třídy
- Žádné
Synchronizace mazání serveru
Odstranit zprávy, když je smaže server
Chybí OpenPGP aplikace – byla odinstalována?
Nastavení složky
Zobrazit v nejvyšší skupině
Zobrazit blízko špičky seznamu složek
- Třída zobrazování složky
- Žádná třída
- 1. třída
- 2. třída
Vyčistit místní zprávy
Server příchozí pošty
Nastavení serveru příchozí pošty
@@ -553,7 +532,7 @@
Navigace v zobrazení mailů pomocí tlačítek hlasitosti
Ukázat sjednocený pohled na doručenou poštu
Zobrazit počet označených hvězdičkou
- Integrovaná doručená pošta
+ Jednotná schránka
Všechny zprávy v integrovaných složkách
Integrovat
Všechny zprávy jsou zobrazeny v Integrované doručené poště
@@ -925,4 +904,6 @@ Tuto zprávu si můžete ponechat a použít jí jako zálohu svého tajného kl
Povolit oznámení
Zapnout synchronizaci
Zobrazit skryté složky
+ Zobrazit složku
+ Podpora %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-cy/strings.xml b/legacy/ui/legacy/src/main/res/values-cy/strings.xml
index 7dd5308699e..91696f35050 100644
--- a/legacy/ui/legacy/src/main/res/values-cy/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-cy/strings.xml
@@ -294,12 +294,6 @@
Uwch
Gosodiadau cyfrif
Hysbysiadau negeseuon newydd
- Ffolderi i hysbysu amdanynt
- Pob un
- Dim ond ffolderi rhenc 1af
- Ffolderi rhenc 1af ac 2ail
- Pob ffolder ond 2ail renc
- Dim
Hysbysiadau cydweddu
Dy gyfeiriad ebost
Dangos yn bar statws pan fo neges newydd
@@ -388,27 +382,12 @@
y 3 mis diwethaf
y 6 mis diwethaf
y flwyddyn ddiwethaf
- Ffolderi i\'w dangos
- Pob un
- Ffolderi rhenc 1af yn unig
- Ffolderi rhenc 1af ac 2ail
- Pob ffolder ond 2ail renc
- Ffolderi i\'w gwirio
- Pob un
- Ffolderi rhenc 1af yn unig
- Ffolderi rhenc 1af ac 2ail
- Pob ffolder ond 2ail renc
- Dim
Cydweddu dileu ar y gweinydd
Dileu negeseuon pan maen nhw\'n cael eu dileu ar y gweinydd.
Map OpenPGP ar goll. A chafodd ei osod?
Gosodiadau ffolder
Dangos yn y grŵp uchaf
Dangos yn agos at frig y rhestr ffolderi
- Rhenc dangos y ffolder
- Dim Rhenc
- Rhenc 1af
- 2ail renc
Clirio negeseuon lleol
Gweinydd
Ffurfweddu\'r gweinydd derbyn
diff --git a/legacy/ui/legacy/src/main/res/values-da/strings.xml b/legacy/ui/legacy/src/main/res/values-da/strings.xml
index 16629a4e2cb..b1b5302e8b1 100644
--- a/legacy/ui/legacy/src/main/res/values-da/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-da/strings.xml
@@ -302,12 +302,6 @@
Avanceret
Konto opsætning
Vis besked når ny mail er modtaget
- Påmindelses mapper
- Alle
- Kun primære mapper
- Primære og sekundære mapper
- Alle undtaget sekundære mapper
- Ingen
Besked om synkronisering
Din mailaddresse
Vis besked i statusbar når mail ankommer
@@ -395,27 +389,12 @@
de seneste 3 måneder
de seneste 6 måneder
det seneste år
- Mapper som ønskes vist
- Alle
- Kun primære mapper
- Primære og sekundære mapper
- Alle undtaget sekundære mapper
- Hent/send mail fra mapper (Sync)
- Alle
- Kun primære mapper
- Primære og sekundære mapper
- Alle undtaget sekundære mapper
- Ingen
Synkroniser fjern-sletning
Fjern mails når de slettes på server
Mangler OpenPGP program - er det afinstalleret?
Mappe opsætning
Vis i topgruppen
Vis nær toppen af mappelisten
- Mappeklasse for visning
- Ingen
- Primær
- Sekundær
Fjern lokalt lagrede mails
Indgående server
Konfigurer indgående mail server
diff --git a/legacy/ui/legacy/src/main/res/values-de/strings.xml b/legacy/ui/legacy/src/main/res/values-de/strings.xml
index caaa086c58a..c98a15d9970 100644
--- a/legacy/ui/legacy/src/main/res/values-de/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-de/strings.xml
@@ -302,12 +302,6 @@
Erweitert
Kontoeinstellungen
Bei neuen Nachrichten
- Benachrichtigungsordner
- Alle
- Nur Hauptordner
- Haupt- und Nebenordner
- Alle außer Nebenordner
- Kein
Benachrichtigung bei Synchronisation
Deine E-Mail-Adresse
Benachrichtigung in der Statuszeile anzeigen, wenn eine neue Nachricht empfangen wird
@@ -396,27 +390,12 @@
der letzten 3 Monate
der letzten 6 Monate
des letzten Jahres
- Angezeigte Ordner
- Alle
- Nur Hauptordner
- Haupt- und Nebenordner
- Alle außer Nebenordner
- Abzufragende Ordner
- Alle
- Nur Hauptordner
- Haupt- und Nebenordner
- Alle außer Nebenordner
- Keine
Löschungen vom Server übernehmen
Nachrichten löschen, wenn sie vom Server gelöscht wurden
Fehlende OpenPGP-App – wurde sie deinstalliert?
Ordnereinstellungen
Oben anzeigen
Ordner am Anfang der Ordnerliste anzeigen
- Anzeigeklasse
- Keine Klasse
- Hauptordner
- Nebenordner
Lokale Nachrichten löschen
Posteingangsserver
Einstellungen des Posteingangsservers bearbeiten
@@ -911,4 +890,6 @@ Du kannst diese Nachricht aufheben und sie als Backup für deinen geheimen Schl
Push aktivieren
Synchronisation aktivieren
Ausgeblendete Ordner anzeigen
+ Ordner anzeigen
+ Support %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-el/strings.xml b/legacy/ui/legacy/src/main/res/values-el/strings.xml
index e3637b3851e..defb59480dc 100644
--- a/legacy/ui/legacy/src/main/res/values-el/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-el/strings.xml
@@ -304,12 +304,6 @@
Προχωρημένα
Ρυθμίσεις λογαριασμού
Ειδοποιήσεις νέων μηνυμάτων
- Φάκελοι ειδοποιήσεων
- Όλοι
- Μόνο φάκελοι 1ου επιπέδου
- Φάκελοι 1ου και 2ου επιπέδου
- Όλοι εκτός από του 2ου επιπέδου
- Κανένας
Συγχρονισμός ειδοποιήσεων
Η ηλεκτρονική σου διεύθυνση
Ειδοποίηση στη γραμμή κατάστασης όταν φτάνει νέο μήνυμα
@@ -398,27 +392,12 @@
τους τελευταίους 3 μήνες
τους τελευταίους 6 μήνες
το τελευταίο έτος
- Φάκελοι που προβάλλονται
- Όλοι
- Μόνο φάκελοι 1ου επιπέδου
- Φάκελοι 1ου και 2ου επιπέδου
- Όλοι εκτός από του 2ου επιπέδου
- Φάκελοι που ενημερώνονται
- Όλοι
- Μόνο φάκελοι 1ου επιπέδου
- Φάκελοι 1ου και 2ου επιπέδου
- Όλοι εκτός από του 2ου επιπέδου
- Κανένας
Συγχρονισμός διαγραφών εξυπηρετητή
Αφαίρεση των μηνυμάτων που διαγράφονται στον εξυπηρετητή.
Λείπει η εφαρμογή OpenPGP - απεγκαταστήθηκε;
Ρυθμίσεις φακέλων
Προβολή στην ομάδα κορυφής
Προβολή κοντά στην κορυφή της λίστας των φακέλων
- Επίπεδο προβολής φακέλου
- Χωρίς Επίπεδο
- Πρώτο επίπεδο
- Δεύτερο επίπεδο
Καθαρισμός τοπικών μηνυμάτων
Ρυθμίσεις εισερχομένων
Ρύθμιση εξυπηρετητή εισερχόμενης αλληλογραφίας
diff --git a/legacy/ui/legacy/src/main/res/values-en-rGB/strings.xml b/legacy/ui/legacy/src/main/res/values-en-rGB/strings.xml
index 9ced8b713dc..6a3076052c2 100644
--- a/legacy/ui/legacy/src/main/res/values-en-rGB/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-en-rGB/strings.xml
@@ -204,7 +204,6 @@
White
Message discarded
Identity description
- Only 1st Class folders
Vibration pattern
Every hour
Show in top group
@@ -221,11 +220,9 @@
Yes
Notify in status bar while mail is checked
Use gaudy visual effects
- 1st and 2nd Class folders
Settings successfully exported
Max folders to check with push
+ %1$d more on %2$s
- All except 2nd Class folders
Light
After marking a message as unread
Manually
@@ -244,7 +241,6 @@
the last 3 days
Spam
Time and date
- 1st and 2nd Class folders
This will remove all local messages from the folder. No messages will be deleted from the server.
the last 3 months
Subject
@@ -282,7 +278,6 @@
Encrypt drafts only if encryption is enabled
Prefix (like Gmail)
today
- 2nd Class
Signature
Notification light
Unable to find viewer for %s.
@@ -311,7 +306,6 @@
Mark All Read
Preview
No email address could be found for this contact.
- Notifications folders
Starred messages first
- Do you really want to delete this message?
@@ -334,7 +328,6 @@
No
all messages
Fetch messages up to
- Only 1st Class folders
Store all drafts encrypted
Pattern 4
Export successful. Logs might contain sensitive information. Be careful who you send them to.
@@ -354,7 +347,6 @@
HTML (keep images and formatting)
Disable notifications
Message text
- None
-------- Original Message --------
(Optional)
Sending mail: %s
@@ -406,7 +398,6 @@
Subject reverse alphabetical
Arrival
Send as
- All except 2nd Class folders
25 folders
500 folders
Show Unified Inbox
@@ -418,7 +409,6 @@
Some attachments cannot be forwarded because they have not been downloaded.
Always show Cc/Bcc
Do you want to empty the trash folder?
- All
Signature position
Configure the outgoing mail (SMTP) server
Delete
@@ -446,7 +436,6 @@
%.1f MB
Outgoing server
Refresh IDLE connection
- Poll folders
Quoted text prefix
Don\'t show notifications for messages belonging to an email chat
Set up a new account
@@ -459,7 +448,6 @@
Authentication failed
Notifications related to messages
Sending mail
- Only 1st Class folders
Confirm move to spam folder
Message composition options
Include outgoing mail
@@ -483,7 +471,6 @@
Mark as read when deleted
Confirm actions
No suitable application for this action found.
- All
Messages
100 messages
Every 36 minutes
@@ -519,7 +506,6 @@
%d B
Animation
the last week
- All except 2nd Class folders
Always show images
Set up alternate \'From\' addresses and signatures
Enable debug logging
@@ -533,13 +519,11 @@
Cc:
Show contact names
Mark Read
- Folders to display
25 messages
Folder poll frequency
Delete (from notification)
:
Send failed: %s
- 1st Class
Compact
Remove quoted text
Folders
@@ -569,7 +553,6 @@
Automatic
Ignore chat messages
Bcc all messages to
- Folder display class
Strip signatures on reply
To:
Interaction
@@ -577,16 +560,12 @@
the last 3 weeks
Header (like Outlook)
2 KiB
- 1st and 2nd Class folders
- No Class
32 KiB
- Do you really want to move this message to the spam folder?
- Do you really want to move %1$d messages to the spam folder?
Save or Discard changes?
- None
- All
Use recipient names from Contacts when available
Log sensitive information
No settings found
diff --git a/legacy/ui/legacy/src/main/res/values-enm/strings.xml b/legacy/ui/legacy/src/main/res/values-enm/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/legacy/src/main/res/values-enm/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-eo/strings.xml b/legacy/ui/legacy/src/main/res/values-eo/strings.xml
index 9adad17d686..3ee372fb45b 100644
--- a/legacy/ui/legacy/src/main/res/values-eo/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-eo/strings.xml
@@ -279,12 +279,6 @@
Spertaj
Agordoj de konto
Sciigoj pri novaj mesaĝoj
- Sciigoj el mesaĝujoj
- El ĉiuj
- Nur el mesaĝujoj de klaso 1
- El mesaĝujoj de klaso 1 kaj 2
- El ĉiuj escepte de klaso 2
- El neniuj
Sciigoj pri samtempigo
Via retpoŝtadreso
Sciigas en stata breto kiam retletero alvenas
@@ -373,27 +367,12 @@
antaŭaj 3 monatoj
antaŭaj 6 monatoj
antaŭa jaro
- Mesaĝujoj por montri
- Ĉiuj
- Nur mesaĝujoj de klaso 1
- Mesaĝujoj de klasoj 1 kaj 2
- Ĉiuj escepte de klaso 2
- Kontroli mesaĝujojn
- Ĉiuj
- Nur mesaĝujoj de klaso 1
- Mesaĝujoj de klasoj 1 kaj 2
- Ĉiuj escepte de klaso 2
- Neniuj
Samtempigo de forigadoj kun servilo
Forigi mesaĝojn kiam forigitaj el servilo
Mankas OpenPGP-aplikaĵo - eble malinstalita?
Agordoj de mesaĝujo
Montri supre
Montras ĉe supro de mesaĝuj-listo
- Montr-klaso de mesaĝujo
- Neniu klaso
- Klaso 1
- Klaso 2
Forviŝi lokajn mesaĝojn
Enira servilo
Agordoj de enira retpoŝta servilo
diff --git a/legacy/ui/legacy/src/main/res/values-es/strings.xml b/legacy/ui/legacy/src/main/res/values-es/strings.xml
index 8414535e2ad..06a7377c31e 100644
--- a/legacy/ui/legacy/src/main/res/values-es/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-es/strings.xml
@@ -305,12 +305,6 @@
Avanzado
Ajustes de la cuenta
Notificar sobre correos entrantes
- Carpetas de notificaciones
- Todas
- Sólo carpetas de 1ª clase
- Carpetas de 1ª y 2ª clase
- Todas excepto las carpetas de 2ª clase
- Ninguna
Notificar sincronización
Tu dirección de correo
Avisar cuando llegue correo nuevo
@@ -399,27 +393,12 @@
los últimos 3 meses
los últimos 6 meses
el último año
- Carpetas a mostrar
- Todas
- Sólo 1ª clase
- 1ª y 2ª clase
- Todas excepto las de 2ª clase
- Comprobación de carpetas
- Todas
- Sólo 1ª clase
- 1ª y 2ª clase
- Todas excepto las de 2ª clase
- Ninguna
Sincronizar con el borrado remoto
Eliminar los correos cuando se borren del servidor
Falta la aplicación OpenPGP, ¿se ha desinstalado?
Ajustes de carpetas
Mostrar al principio
Mostrar cerca del principio de la lista
- Tipos de carpeta mostrados
- Sin clase
- 1ª clase
- 2ª clase
Borrar correos locales
Servidor de entrada
Configurar servidor de entrada
@@ -904,9 +883,9 @@ Puedes guardar este mensaje y usarlo como copia de seguridad de tu clave secreta
Seguir en el correo actual
Tras marcar un correo como no leído
Volver al listado de correos
- Falta permiso para programar alarmas
- Pulse para conceder el permiso.
- Equipo de Thunderbird Mobile
+ Falta el permiso para programar alarmas
+ Toca aquí para conceder el permiso.
+ El equipo de Thunderbird Mobile
Acerca de %s
La aplicación OpenKeychain es necesaria para permitir el cifrado de extremo a extremo.
Cuando se utiliza Push, %1$s mantiene una conexión con el servidor de correo. Android requiere mostrar una notificación continua mientras la aplicación está activa en segundo plano. %2$s
@@ -915,5 +894,9 @@ Puedes guardar este mensaje y usarlo como copia de seguridad de tu clave secreta
Datos técnicos y de uso
Recopilación de datos
Comparte datos de rendimiento, uso, hardware y personalización sobre esta aplicación con Mozilla para ayudarnos a mejorar Thunderbird
- Activar push
+ Activar sincronización rápida («push»)
+ Activar sincronización
+ Mostrar carpeta
+ Ver las carpetas ocultas
+ Apoya a %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-et/strings.xml b/legacy/ui/legacy/src/main/res/values-et/strings.xml
index 5ba0752f124..3d335aad8ae 100644
--- a/legacy/ui/legacy/src/main/res/values-et/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-et/strings.xml
@@ -49,7 +49,7 @@
Teisalda
Teisalda mustanditesse
Paiguta ümber…
- Tehtud
+ Valmis
Loobu
Salvesta mustandina
Kontrolli e-kirju
@@ -304,12 +304,6 @@
Täpsemalt
Konto sätted
Uue sõnumi teated
- Teadete kaust
- Kõik
- Ainult 1. klassi kaustad
- 1. ja 2. klassi kaustad
- Kõik, v.a 2. klassi kaustad
- Mitte ükski
Sünkroniseerimise teated
Sinu e-posti aadress
Teata uue sõnumi saabumisest olekuribal
@@ -398,27 +392,12 @@
viimased 3 kuud
viimased 6 kuud
viimane aasta
- Kuvatavad kaustad
- Kõik
- Ainult 1. klassi kaustad
- 1. ja 2. klassi kaustad
- Kõik, v.a 2. klassi kaustad
- Kontrolli kaustu
- Kõik
- Ainult 1. klassi kaustad
- 1. ja 2. klassi kaustad
- Kõik, v.a 2. klassi kaustad
- Mitte ükski
Süngi serveris kustutamised
Eemalda kirjad kui need serveris kustutatud
OpenPGP rakendus puudub - kas see on eemaldatud?
Kausta sätted
Näita tipp grupis
Näita kaustade loendi tippu lähedal
- Kausta kuvamise klass
- Klassita
- 1. klass
- 2. klass
Puhasta kohalikud kirjad
Sissetuleva meili server
Konfigureeri sisse tuleva meili server
@@ -913,4 +892,6 @@ Palun jäta see kiri alles ning kasuta seda muu hulgas oma krüptovõtme varunda
Kasuta tõuketeenuseid
Kasuta sünkroniseerimist
Näita peidetud kaustu
+ Näita kausta
+ Toeta %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-eu/strings.xml b/legacy/ui/legacy/src/main/res/values-eu/strings.xml
index f04a9baefc7..a8c0d391d78 100644
--- a/legacy/ui/legacy/src/main/res/values-eu/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-eu/strings.xml
@@ -303,12 +303,6 @@
Aurreratua
Kontu ezarpenak
Posta berrien jakinarazpenak
- Jakinarazpenen karpeta
- Guztiak
- 1. klaseko karpetak bakarrik
- 1. eta 2. klaseko karpetak
- Guztiak 2. klaseko karpetak izan ezik
- Bat ere ez
Sinkronizazio jakinarazpenak
Zure posta helbidea
Jakinarazi egoera barran posta iristean
@@ -397,27 +391,12 @@
azken 3 hilabeteak
azken 6 hilabeteak
azken urtea
- Bistaratuko diren karpetak
- Guztiak
- 1. klaseko karpetak bakarrik
- 1. eta 2. klaseko karpetak
- Guztiak 2. klaseko karpetak izan ezik
- Atzitu karpetak
- Guztiak
- 1. klaseko karpetak bakarrik
- 1. eta 2. klaseko karpetak
- Guztiak 2. klaseko karpetak izan ezik
- Bat ere ez
sinkronizatu zerbitzariko ezabatzeak
Kendu mezuak zerbitzarian ezabatzean
OpenPGP aplikazioa falta da, desinstalatu da?
Karpeta ezarpenak
Erakutsi goiko taldean
Erakutsi karpeta zerrendaren goialdetik hurbil
- Bistaratzeko karpeta klaseak
- Klaserik ez
- 1. klasea
- 2. klasea
Garbitu mezu lokalak
Sarrerako zerbitzaria
Konfiguratu sarrerako posta zerbitzaria
diff --git a/legacy/ui/legacy/src/main/res/values-fa/strings.xml b/legacy/ui/legacy/src/main/res/values-fa/strings.xml
index 0369ccbfdfe..323497b99a6 100644
--- a/legacy/ui/legacy/src/main/res/values-fa/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-fa/strings.xml
@@ -305,12 +305,6 @@
پیشرفته
تنظیمات حساب
آگاهیهای نامهٔ جدید
- پوشههای دارای آگاهی
- همه
- فقط پوشههای سطح ۱
- پوشههای سطح ۱ و ۲
- همه بهجز پوشههای سطح ۲
- هیچکدام
آگاهیهای همگامسازی
نشانی رایانامهتان
آگاهی در نپار وضعیت هنگام رسیدن نامه
@@ -399,27 +393,12 @@
۳ ماه پیش
۶ ماه پیش
سال قبل
- پوشههای نمایان
- همه
- فقط پوشههای سطح ۱
- پوشههای سطح ۱ و ۲
- همه بهجز پوشههای سطح ۲
- پوشهها برای سرکشی
- همه
- فقط پوشههای سطح ۱
- پوشههای سطح ۱ و ۲
- همه بهجز پوشههای سطح ۲
- هیچکدام
همگامسازی حذفیات کارساز
وقتی پیامها در کارساز پاک شدند از اینجا هم حذف شود
برنامهٔ OpenPGP نیست - حذف شده؟
تنظیمات پوشه
نمایش در بالا
نمایش در بالای سیاههٔ پوشهها
- سطح نمایش پوشه
- بدون سطح
- سطح ۱
- سطح ۲
پاککردن پیامها از روی دستگاه
کارساز ورودی
کارساز ورودی رایانامه را پیکربندی کنید
@@ -914,4 +893,6 @@
جمعآوری داده
فعالسازی همگامسازی
نمایش پوشههای مخفی
+ نمایش پوشه
+ پشتیبانی از %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-fi/strings.xml b/legacy/ui/legacy/src/main/res/values-fi/strings.xml
index f9218f47ee3..2f05acb7220 100644
--- a/legacy/ui/legacy/src/main/res/values-fi/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-fi/strings.xml
@@ -303,12 +303,6 @@
Lisäasetukset
Yleiset
Saapuneiden viestien ilmoitukset
- Ilmoitukset kansioista
- Kaikki
- Vain 1. luokan kansiot
- 1. ja 2. luokan kansiot
- Kaikki paitsi 2. luokan kansiot
- Ei mitään
Synkronointi-ilmoitukset
Sähköpostiosoite
Näytä tilapalkissa ilmoitus uusista viesteistä
@@ -397,27 +391,12 @@
viimeiset 3 kuukautta
viimeiset 6 kuukautta
viime vuosi
- Näytä kansiot
- Kaikki
- Vain 1. luokan kansiot
- 1. ja 2. luokan kansiot
- Kaikki paitsi 2. luokan kansiot
- Tarkistettavat kansiot
- Kaikki
- Vain 1. luokan kansiot
- 1. ja 2. luokan kansiot
- Kaikki paitsi 2. luokan kansiot
- Ei mitään
Synkronoi etäpoistot
Poista viestit, kun ne poistetaan palvelimelta
OpenPGP-sovellus puuttuu - poistettiinko se?
Kansioiden asetukset
Näytä yläryhmässä
Näytä yläosassa lähellä kansiolistaa
- Näytettävän kansion luokka
- Ei luokkaa
- 1. luokka
- 2. luokka
Poista paikalliset viestit
Saapuvan postin palvelin
Määritä saapuvan postin palvelin
diff --git a/legacy/ui/legacy/src/main/res/values-fr/strings.xml b/legacy/ui/legacy/src/main/res/values-fr/strings.xml
index fbde4737cff..46ee6378e74 100644
--- a/legacy/ui/legacy/src/main/res/values-fr/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-fr/strings.xml
@@ -306,12 +306,6 @@
Avancé
Paramètres du compte
Notifications de nouveaux courriels
- Dossiers des notifications
- Tous
- Seulement les dossiers de 1re classe
- Dossiers de 1re et 2e classes
- Tous sauf les dossiers de 2e classe
- Aucun
Notifications de synchronisation
Votre adresse courriel
Notification dans la barre d’état dès réception d’un courriel
@@ -400,27 +394,12 @@
des 3 dernières mois
des 6 dernières mois
de la dernière année
- Dossiers à afficher
- Tous
- Seulement les dossiers de 1re classe
- Dossiers de 1re et 2e classes
- Tous sauf les dossiers de 2e classe
- Dossiers à scruter
- Tous
- Seulement les dossiers de 1re classe
- Les dossiers de 1re et 2e classes
- Tous sauf les dossiers de 2e classe
- Aucun
Synchroniser les suppressions sur le serveur
Supprimer les courriels quand ils sont supprimés sur le serveur
L’appli OpenPGP est absente — A-t-elle été installée ?
Paramètres du dossier
Afficher dans le groupe principal
Afficher dans le haut de la liste des dossiers
- Classe d’affichage du dossier
- Aucune classe
- 1re classe
- 2e classe
Effacer les courriels locaux
Serveur entrant
Configurer le serveur de courriel entrant
@@ -914,4 +893,6 @@
Activer le pousser
Afficher les dossiers cachés
Activer la synchronisation
+ Afficher le dossier
+ Soutenir %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-fy/strings.xml b/legacy/ui/legacy/src/main/res/values-fy/strings.xml
index a22e4202bc6..eee9e66f96c 100644
--- a/legacy/ui/legacy/src/main/res/values-fy/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-fy/strings.xml
@@ -198,7 +198,7 @@
Nammen yn jo kontaktelist ynkleurje
Kleur foar nammen fan kontakten
Fêste breedte lettertypen
- Brûk in lettertype mei fêste breedte by it werjaan fan platte-tekstberjochten
+ Brûk in lettertype mei fêste breedte by it toanen fan platte-tekstberjochten
Berjochten auto-passe
Berjochten passend meitsje op it skerm
Aksjes befêstigje
@@ -305,20 +305,14 @@
Avansearre
Accountynstellingen
Nije e-mailmelding
- Meldingsmappen
- Alle
- Allinnich 1e-klassemappen
- 1e- en 2e-klassemappen
- Alle útsein 2e-klassemappen
- Gjin
Syngronisaasjemeldingen
Jo e-mailadres
Melding yn steatbalke by in nij e-mailberjocht
- Melding yn steatbalke werjaan wannear’t op nije e-mailberjochten kontrolearre wurdt
+ Melding yn steatbalke toane wannear’t op nije e-mailberjochten kontrolearre wurdt
Melding foar e-mailberjocht hokker ik ferstjoer
Melding ek foar e-mailberjocht ferstjoerd fan in identiteit ôf
Allinnich kontakten
- Meldingen allinnich werjaan foar bekende kontakten
+ Meldingen allinnich toane foar bekende kontakten
Petearberjochten negearje
Gjin meldingen toane foar berjochten dy’t ûnderdiel binne fan in e-mailpetear
As lêzen markearje nei iepenjen
@@ -399,27 +393,12 @@
ôfrûne 3 moannen
ôfrûne 6 moannen
ôfrûne jier
- Mappen om te toanen
- Alle
- Allinnich 1e-klassemappen
- 1e- en 2e-klassemappen
- Alle útsein 2e-klassemappen
- Peiling mappen
- Alle
- Allinnich 1e-klassemappen
- 1e- en 2e-klassemappen
- Alle útsein 2e-klassemappen
- Gjin
Ferwideringen op server syngronisearje
Berjochten fuortsmite as fuortsmiten fan server
OpenPGP-app net oanwêzich – is de app fuortsmiten?
Mapynstellingen
Yn topgroep toane
By top fan de maplist toane
- Mapwerjefteklasse
- Gjin klasse
- 1e klasse
- 2e klasse
Lokale berjochten wiskje
Ynkommende server
Ynkommende mailserver ynstelle
@@ -549,7 +528,7 @@
Fisuele effekten brûke
Folumetoetsnavigaasje yn berjochtbyld
Kombinearre Postfek YN toane
- It tal berjochten mei in stjer werjaan
+ Tal berjochten mei in stjer toane
Kombinearre Postfek YN
Alle berjochten yn kombinearre mappen
Kombinearje
@@ -727,7 +706,7 @@
Yn dizze modus wurdt dyn PGP-kaai brûkt foar in kryptografyske hantekening of in net-kodearre e-mailberjocht.
Dit fersiferet net it e-mailberjocht, mar kontrolearret oft it ferstjoerd is mei jo kaai.
Hantekeningen kinne by ferstjoeren nei ferstjoerlist skansearre reitsje.
- Hantekeningen kinne by guon programma’s as ‘signature.asc’-bylage werjûn wurde.
+ Hantekeningen kinne by guon programma’s as ‘signature.asc’-bylage toand wurde.
Fersifere berjochten befetsje altyd in hantekening.
Platte tekst
ein-ta-einhantekening befettet in flater
@@ -770,8 +749,8 @@
Spesjale lêstekens wurde noch net stipe!
Flater by ferwurkjen fan adres!
Net-fersifere hantekeningen ferstopje
- Allinnich fersifere hantekeningen wurde werjûn
- Alle hantekeningen wurde werjûn
+ Allinnich fersifere hantekeningen wurde toand
+ Alle hantekeningen wurde toand
Fersifering net mooglik yn sign-only-modus!
net ûndertekene tekst
Dit e-mailberjocht is fersifere
@@ -812,7 +791,7 @@
Ynstelberjocht oan it generearjen…
Berjocht stjoere nei:
Om te foltôgjen, iepenje it berjocht op jo oare apparaat en fier de ynstelkoade yn.
- Ynstelkoade werjaan
+ Ynstelkoade toane
Autocrypt-ynstelberjocht
Dit berjocht befettet alle ynformaasje om jo Autocrypt-ynstellingen mei geheime kaai befeilige oer te bringen fan jo oarspronklike apparaat ôf. Folgje de ynstruksjes op jo nije apparaat om dêrop Autocrypt yn te stellen. Jo kinne dit berjocht bewarje as reservekopy foar jo geheime kaai. As jo dit dwaan wolle, skriuw dan it wachtwurd op en bewarje it op in feilich plak.
Der is in flater bard wylst it ferstjoeren fan it berjocht. Kontrolearje de netwurkferbining en útgeande-serverkonfiguraasje.
@@ -828,7 +807,7 @@
Android makket it echter ek mooglik om meldingen te ferstopjen.
Mear ynfo
Melding ynstelle
- As jo it net nedich fine om daliks meldingen te ûntfangen fan nije berjochten, dan kinne jo better push útskeakelje en yn stee dêrfan kieze foar peilen. Mei peilen wurdt der om de sa folle tiid kontrolearre oft der nije e-mailberjochten ynkommen binne. Dêrfoar is it werjaan fan in melding net kontinu nedich.
+ As jo it net nedich fine om daliks meldingen te ûntfangen fan nije berjochten, dan kinne jo better push útskeakelje en yn stee dêrfan kieze foar peilen. Mei peilen wurdt der om de sa folle tiid kontrolearre oft der nije e-mailberjochten ynkommen binne. Dêrfoar is it toanen fan in melding net kontinu nedich.
Push útskeakelje
Selektearje
@@ -900,7 +879,7 @@
Tastimming om alarms te plannen ûntbrekt
Tik om tastimming te jaan.
De account \"%s\" sil út %s fuortsmiten wurde.
- By gebrûk fan Push ûnderhâldt %1$s in ferbining mei de mailserver. Android fereasket it trochrinnend werjaan fan in melding as de app aktyf is op de eftergrûn. %2$s
+ By gebrûk fan Push ûnderhâldt %1$s in ferbining mei de mailserver. Android fereasket it trochrinnend toanen fan in melding as de app aktyf is op de eftergrûn. %2$s
De app OpenKeychain is fereaske om stipe foar end-to-end-fersifering mooglik te meitsjen.
Oer %s
Thunderbird Mobile-team
@@ -911,4 +890,6 @@
Push aktivearje
Ferstoppe mappen toane
Syngronisaasje ynskeakelje
+ Map toane
+ %s stypje
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-gd/strings.xml b/legacy/ui/legacy/src/main/res/values-gd/strings.xml
index 573259be2ea..8b8d681e0fa 100644
--- a/legacy/ui/legacy/src/main/res/values-gd/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-gd/strings.xml
@@ -274,12 +274,6 @@
Adhartach
Roghainnean a’ chunntais
Brathan mu phost ùr
- Pasganan a chuireas brath
- Na h-uile
- Pasganan na 1ᵈ ìre a-mhàin
- Pasganan na 1ᵈ is na 2ⁿᵃ ìre
- Gach aon ach pasganan na 2ⁿᵃ ìre
- Chan eil gin
Brathan sioncronachaidh
An seòladh puist-d agad
Thoir brath dhomh air bàr na staide nuair a ruigeas post
@@ -352,26 +346,11 @@
o na 3 mìosan seo chaidh
on na 6 mìosan seo chaidh
on uiridh
- Na pasganan a thèid a shealltainn
- Na h-uile
- Pasganan na 1ᵈ ìre a-mhàin
- Pasganan na 1ᵈ is na 2ⁿᵃ ìre
- Gach aon ach pasganan na 2ⁿᵃ ìre
- Na pasganan a thèid a cheasnachadh
- Na h-uile
- Pasganan na 1ᵈ ìre a-mhàin
- Pasganan na 1ᵈ is na 2ⁿᵃ ìre
- Gach aon ach pasganan na 2ⁿᵃ ìre
- Chan eil gin
Sioncronaich sguabadh às air an fhrithealaiche
Thoir air falbh teachdaireachdan a chaidh a sguabadh às an fhrithealaiche
Roghainnean a’ phasgain
Seall aig a’ bhàrr sa bhuidheann
Seall faisg air bàrr liosta nam pasganan
- Ìre taisbeanadh a’ phasgain
- Gun ìre
- 1ᵈ ìre
- 2ⁿᵃ ìre
Falamhaich na teachdaireachdan ionadail
Am frithealaiche a-steach
Rèitich frithealaiche a’ phuist a-steach
diff --git a/legacy/ui/legacy/src/main/res/values-gl/strings.xml b/legacy/ui/legacy/src/main/res/values-gl/strings.xml
index a8af0885b7f..34d3d0491df 100644
--- a/legacy/ui/legacy/src/main/res/values-gl/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-gl/strings.xml
@@ -283,12 +283,6 @@
Avanzado
Configuración de conta
Notificar correo novo
- Cartafoles de notificacións
- Todas
- Só 1a clase
- 1a e 2a Clase
- Todas agás 1a e 2a clase
- ningunha
Notificar sincronización
O teu entderezo de correo
Avisarme no estatus cando chegue correo novo
@@ -377,27 +371,12 @@
os últimos 3 meses
os últimos 6 meses
o último ano
- Carpetas a amosar
- Todas
- Só 1a clase
- 1a y 2a Clase
- Todas agás as de 2a clase
- Comprobación de carpetas
- Todas
- Só 1a clase
- 1a e 2a Clase
- Todas agás 1a e 2a clase
- ningunha
Sincronizar eliminacións
Eliminar as mensaxes cando se borren d servidor
Falta o aplicativo OpenPGP - foi desinstalado?
Configuración de carpeta
Amosar ao principio
Amosar cerca do principio da lista
- Clase de carpeta
- Sen Clase
- 1a Clase
- 2a Clase
Borrar mensaxes locais
Servidor de entrada
Configurar servidor de entrada
diff --git a/legacy/ui/legacy/src/main/res/values-hr/strings.xml b/legacy/ui/legacy/src/main/res/values-hr/strings.xml
index 25bd3816dff..9b759e45875 100644
--- a/legacy/ui/legacy/src/main/res/values-hr/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-hr/strings.xml
@@ -264,12 +264,6 @@
Napredno
Postavke računa
Nova obavijest pošte
- Mapa obavijesti
- Svi
- Samo mape 1. Razreda
- Mape 1. i 2. Razreda
- Sve osim mapa 2. Razreda
- Ništa
Obavijesti sinhronitzacije
Vaša adresa e-pošte
Obavijesti me u traci stanja o pristigloj pošti
@@ -353,27 +347,12 @@
posljednja 3 mjeseca
posljednjih 6 mjeseci
posljednjih godinu dana
- Mape za prikaz
- Sve
- Samo mape 1. Razreda
- Mape 1. i 2. Razreda
- Sve osim mapa 2. Razreda
- Provjera mapa
- Sve
- Samo mape 1. Razreda
- Mape 1. i 2. Razreda
- Sve osim mapa 2. Razreda
- Nijedna
Sinhronizacija brisanja poslužitelja
Makni poruke prilikom brisanja sa poslužitelja
OpenPGP aplikacija nedostaje - da li je deinstalirana?
Postavke mape
Prikaži na vrhu grupe
Prikaži blizu vrha na popisu mapa
- Razred prikaza mape
- Bez razreda
- 1. Razreda
- 2. Razreda
Očistiti lokalne poruke
Dolazni poslužitelj
Postavite dolazni poslužitelj e-pošte
@@ -770,4 +749,55 @@
+Pretraži svugdje
+ Nove poruke
+ Sinkroniziraj (Slanje)
+ Izvezi zapise
+ Izvoz nije uspio.
+ Boja imena kontakata
+ Vrati se na popis poruka
+ Premjesti u skice
+ Odjavite se
+ Tekst predmeta kopiran u međuspremnik
+ za %s
+ Nakon brisanja ili premještanja poruke
+ Prikaži sljedeću poruku
+ Thunderbird mobilni tim
+ Kopiraj u…
+ Greška certifikata
+ Greška u obavijesti
+ Prikaži slike s udaljenog poslužitelja
+ +
+ mene
+ Prikaži prethodnu poruku
+ Nakon označavanja poruke kao nepročitane
+ Akcije povlačenja
+ Označi kao pročitano/nepročitano
+ Vrati se na popis poruka
+ Ostani na trenutnoj poruci
+ Povlačenje udesno
+ Povlačenje ulijevo
+ Dodaj/ukloni zvjezdicu
+ Gustoća
+ Kompaktno
+ Opušteno
+ Broj novih poruka
+ Pregledaj
+ Saznajte što je novo u ovom izdanju
+ Verzija %s
+ O aplikaciji %s
+ Što je novo
+ Prikaži nedavne promjene kada je aplikacija ažurirana
+ Račun \"%s\" biti će uklonjen iz %s.
+ Premjesti u…
+ Došlo je do greške prilikom pokušaja stvaranja sistemske obavijesti za novu poruku. Razlog je najvjerojatnije nedostatak zvuka obavijesti.\n\nDodirnite za otvaranje postavki obavijesti.
+ Prikazano dok čekate nove poruke
+ Izvoz uspješan. Zapisi mogu sadržavati osjetljive informacije. Budite oprezni kome ih šaljete.
+ Zapis izmjena
+ Nije moguće učitati zapis izmjena.
+ Izvorni kod
+ Projekt otvorenog koda
+ Web stranica
+ Zatraži pomoć
+ Korisnički forum
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-hu/strings.xml b/legacy/ui/legacy/src/main/res/values-hu/strings.xml
index ab988054d58..d97d321f671 100644
--- a/legacy/ui/legacy/src/main/res/values-hu/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-hu/strings.xml
@@ -303,12 +303,6 @@
Bővített
Fiók beállításai
Új levél értesítések
- Értesítések mappái
- Összes
- Csak 1. osztályú mappák
- 1. és 2. osztályú mappák
- Összes, kivéve a 2. osztályú mappákat
- Nincs
Szinkronizációs értesítések
Saját e-mail-cím
Értesítés az állapotsávon új levél érkezésekor
@@ -397,27 +391,12 @@
az elmúlt 3 hónap
az elmúlt 6 hónap
az elmúlt év
- Megjelenítendő mappák
- Összes
- Csak 1. osztályú mappák
- 1. és 2. osztályú mappák
- Összes, kivéve a 2. osztályú mappákat
- Mappák lekérdezése
- Összes
- Csak 1. osztályú mappák
- 1. és 2. osztályú mappák
- Összes, kivéve a 2. osztályú mappákat
- Nincs
Kiszolgáló törléseinek szinkronizálása
Üzenetek eltávolítása a kiszolgálóról törléskor
Hiányzó OpenPGP alkalmazás – talán eltávolításra került\?
Mappa beállításai
Megjelenítés a felső csoportban
Megjelenítés a mappalista teteje környékén
- Mappa megjelenítésnek osztálya
- Nincs osztály
- 1. osztály
- 2. osztály
Helyi üzenetek törlése
Bejövő kiszolgáló
A bejövő levelek kiszolgálójának beállítása
@@ -510,7 +489,7 @@
Alkalmazás témájának használata
Sötét
Világos
- Rendszer alapértelmezettjének használata
+ Rendszer alapértelmezésének használata
Megjelenés
Globális
Hibakeresés
@@ -528,7 +507,7 @@
Rögzített üzenet téma
Az üzenetmegtekintési téma kiválasztása, miközben megtekinti az üzenetet
Rögzített üzenetmegtekintési téma használata
- Rendszer alapértelmezettje
+ Rendszer alapértelmezése
Háttér-szinkronizálás
Soha
Mindig
@@ -896,14 +875,14 @@ Megtarthatja ezt az üzenetet, és felhasználhatja a titkos kulcs biztonsági m
Következő üzenet megjelenítése
Üzenet törlése vagy áthelyezése után
A Thunderbird Mobile csapata
- A „%s” fiók eltávolításra kerül a %s fiókból.
+ A(z) „%s” fiók eltávolításra kerül a %s alkalmazásból.
Hiányzó engedély a riasztások ütemezéséhez
Koppintson az engedély megadásához.
Vissza az üzenetekhez
Maradás a jelenlegi üzenetnél
Adatgyűjtés
Felhasználási és műszaki adatok
- Üzenet olvashatatlannak jelölése után
+ Üzenet olvasatlannak jelölése után
Leküldések engedélyezése
Értesítések
Megosztja az alkalmazás teljesítmény-, használati-, hardver- és testreszabási adatait a Mozillával, hogy segítsen nekünk a Thunderbird jobbá tételében
@@ -912,4 +891,6 @@ Megtarthatja ezt az üzenetet, és felhasználhatja a titkos kulcs biztonsági m
Lekérdezések használatakor a %1$s kapcsolatot tart fenn a levelezőkiszolgálóval. Az Android megköveteli a folyamatos értesítés megjelenítését, amíg az alkalmazás aktív a háttérben. %2$s
Szinkronizálás engedélyezése
Rejtett mappák megjelenítése
+ Mappa megjelenítése
+ A %s támogatása
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-hy/strings.xml b/legacy/ui/legacy/src/main/res/values-hy/strings.xml
index 56292444267..ce17d191100 100644
--- a/legacy/ui/legacy/src/main/res/values-hy/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-hy/strings.xml
@@ -229,12 +229,6 @@
Առաջադէմ
Հաշուի կարգաւորումներ
Նոր իմակների ծանուցումներ
- Ծանուցումների պանակներ
- Բոլորը
- Միայն 1֊ին կարգի պանակներ
- 1֊ին եւ 2֊րդ կարգի պանակներ
- Բոլորը բացի 2֊րդ կարգի պանակներից
- Ոչ մէկը
Սինխրոնիզացիայի ծանուցումներ
Ձեր էլ․ փոստի հասցէն
Ծանուցել ստատուսի վահանակում, երբ իմակ է եկել
@@ -290,23 +284,9 @@
վերջին 3 ամսուայ
վերջին 6 ամսուայ
վերջին տարուայ
- ցուրադրուող պանակներ
- Բոլորը
- Միայն 1֊ին դասի պանակները
- 1֊ին եւ 2֊րդ դասի պանակները
- Բոլորը, բացի 2֊րդ դասի պանակներից
- Պանակների թարմացում
- Բոլորը
- Միայն 1֊ին դասի պանակները
- 1֊ին եւ 2֊րդ դասի պանակները
- Բոլորը բացի 2֊րդ դասի պանակներից
- Ոչ մէկը
Սինխրոնացնել սերուերում հեռացածները
Ջնջել նամակները, եթէ սերուերից ջնջուել են։
Պանակի կարգաւորումներ
- Առանց Դասի
- 1ին Դաս
- 2րդ Դաս
Մաքրել լոկալ հաղորդագրութիւնները
Դուրս տանող բանավար
Հաշվի անունը
diff --git a/legacy/ui/legacy/src/main/res/values-in/strings.xml b/legacy/ui/legacy/src/main/res/values-in/strings.xml
index 5cf50efb20c..e4a28e758c9 100644
--- a/legacy/ui/legacy/src/main/res/values-in/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-in/strings.xml
@@ -270,12 +270,6 @@
Lanjutan
Pengaturan akun
Notifikasi surat baru
- Folder notifikasi
- Semua
- Hanya folder Kelas 1
- Hanya folder Kelas 1 dan 2
- Semuanya kecuali folder Kelas 2
- Tidak ada
Sinkronkan notifikasi
Alamat surel Anda
Beri tahu di bilah status saat ada surat masuk
@@ -359,27 +353,12 @@
3 bulan terakhir
6 bulan terakhir
tahun lalu
- Folder yang ditampilkan
- Semua
- Hanya folder Kelas 1
- Hanya folder Kelas 2
- Semuanya kecuali folder Kelas 2
- Folder polling
- Semua
- Hanya folder Kelas 1
- Hanya folder Kelas 2
- Semuanya kecuali folder Kelas 2
- Tidak ada
Sinkronkan penghapusan server
Hapus pesan saat dihapus di server
Aplikasi OpenPGP tidak ada - apakah sudah dihapus?
Pengaturan folder
Perlihatkan di grup teratas
Tunjukkan di dekat bagian atas daftar folder
- Kelas tampilan folder
- Tak ada kelas
- Kelas 1
- Kelas 2
Bersihkan pesan lokal
Server masuk
Konfigurasikan server surat masuk
diff --git a/legacy/ui/legacy/src/main/res/values-is/strings.xml b/legacy/ui/legacy/src/main/res/values-is/strings.xml
index c8fcedc0a8a..bc840c564db 100644
--- a/legacy/ui/legacy/src/main/res/values-is/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-is/strings.xml
@@ -304,12 +304,6 @@
Ítarlegt
Aðgangsstillingar
Tilkynningar um nýjan póst
- Tilkynningamöppur
- Allar
- Einungis 1. flokks möppur
- 1. og 2. flokks möppur
- Allt nema 2. flokks möppur
- Engin
Tilkynningar vegna samstillingar
Tölvupóstfangið þitt
Gefa merki á stöðustiku þegar nýr póstur berst
@@ -398,27 +392,12 @@
síðustu 3 mánuðum
síðustu 6 mánuðum
síðasta ári
- Möppur sem á að birta
- Allar
- Einungis 1. flokks möppur
- 1. og 2. flokks möppur
- Allt nema 2. flokks möppur
- Vakta möppur
- Allar
- Einungis 1. flokks möppur
- 1. og 2. flokks möppur
- Allt nema 2. flokks möppur
- Engin
Eyðing á samstilltum póstþjóni
Fjarlægja skilaboð þegar þeim er eytt á póstþjóni
OpenPGP-forrit vantar - var það fjarlægt?
Stillingar möppu
Birta í efsta hópi
Sýna nálægt efri enda möppulista
- Birtingarflokkur möppu
- Enginn flokkur
- 1. flokkur
- 2. flokkur
Hreinsa staðvær skilaboð
Inn-póstþjónn
Stilla móttöku-póstþjón
diff --git a/legacy/ui/legacy/src/main/res/values-it/strings.xml b/legacy/ui/legacy/src/main/res/values-it/strings.xml
index 1268f5736e4..2f630f756a5 100644
--- a/legacy/ui/legacy/src/main/res/values-it/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-it/strings.xml
@@ -307,12 +307,6 @@
Avanzate
Impostazioni account
Notifiche nuovi messaggi
- Cartelle notificate
- Tutte
- Solo cartelle di 1a classe
- Cartelle di 1a e 2a classe
- Tutte salvo cartelle di 2a classe
- Nessuna
Notifiche di sincronizzazione
Il tuo indirizzo email
Notifica nella barra di stato la ricezione di un nuovi messaggi
@@ -401,27 +395,12 @@
ultimi 3 mesi
ultimi 6 mesi
ultimo anno
- Cartelle da visualizzare
- Tutte
- Solo cartelle di 1a classe
- Cartelle di 1a e 2a classe
- Tutte tranne cartelle di 2a classe
- Cartelle da sincronizzare
- Tutte
- Solo cartelle di 1a classe
- Cartelle di 1a e 2a classe
- Tutte tranne cartelle di 2a classe
- Nessuna
Sincronizza eliminazioni del server
Rimuovi i messaggi eliminati dal server
Applicazione OpenPGP non trovata, è stata disinstallata\?
Impostazioni cartella
Mostra in alto
Mostra nella parte superiore dell\'elenco delle cartelle
- Classe cartelle visualizzate
- Nessuna classe
- 1a classe
- 2a classe
Pulisci messaggi locali
Server posta in arrivo
Configura server della posta in arrivo
diff --git a/legacy/ui/legacy/src/main/res/values-iw/strings.xml b/legacy/ui/legacy/src/main/res/values-iw/strings.xml
index 7061a6a906a..0596abfda7d 100644
--- a/legacy/ui/legacy/src/main/res/values-iw/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-iw/strings.xml
@@ -261,8 +261,6 @@
מתקדם
הגדרות חשבון
התראות על הודעה חדשה
- הכל
- כלום
סינכרון התראות
כתובת הדוא\"ל שלך
נא הודע לי בשורת מצב כאשר מגיע דואר
@@ -313,10 +311,6 @@
משלושת החודשים האחרונים
מהחצי שנה האחרונה
מהשנה האחרונה
- תיקיות להצגה
- הכל
- הכל
- כלום
לסנכרן מחיקות שרת
הסר הודעות כאשר נמחק בשרת
הגדרות תיקייה
@@ -660,8 +654,6 @@
כמות הודעות חדשות
זהה למצב בו המסך אינו נעול
כמות הודעות ושולחים
- רק תיקיות מחלקה ראשונה (1st Class)
- תיקיות מחלקה ראשונה ושנייה (1st and 2nd Class)
הצג כמות הודעות מסומנות בכוכב
שליחה נכשלה: %s
למחוק הודעות מקומיות?
@@ -705,8 +697,6 @@
אל %s
+
אני
- התראות תיקיות
- הכל חוץ מתיקיות מחלקה שנייה (2nd Class)
שדות טקסט
רוצה לרוקן את תיקיית פריטים שנמחקו?
@@ -748,7 +738,6 @@
32 ק\"ב
64 ק\"ב
128 ק\"ב
- תיקיות הזמנה לשידור (poll)
השתמש בברירת מחדל המערכת
אינטראקציה
תמת (theme) הצגת הודעות
@@ -791,8 +780,6 @@
קטגוריות התראה
לא הוגדר יישומון OpenPGP
תדירות בדיקת תיקייה במצב הזמנה לשידור (poll)
- רק תיקיות מחלקה ראשונה (1st Class)
- תיקיות מחלקה ראשונה ושנייה (1st and 2nd Class)
תבנית 1
תבנית 2
תבנית 3
@@ -819,11 +806,6 @@
16 ק\"ב
5 מ\"ב
10 מ\"ב
- הכל חוץ מתיקיות מחלקה שנייה (2nd Class)
- הכל חוץ מתיקיות מחלקה שנייה (2nd Class)
- ללא מחלקה
- סוג מחלקת הצגת תיקיה (Folder display class)
- מחלקה ראשונה
תבנית 4
זמן הגעה
חובה להוריד הודעה בשלמותה עבור פענוח
@@ -841,11 +823,8 @@
טוען…
הצפנת הודעות מוודאת שהן יוכלו להיקרא ע\"י הנמען, ולא ע\"י אף אחד אחר.
שגיאה בחיבור אל %s!
- מחלקה שנייה
1 מ\"ב
2 מ\"ב
- רק תיקיות מחלקה ראשונה (1st Class)
- תיקיות מחלקה ראשונה ושנייה (1st and 2nd Class)
החלק הזה לא הוצפן, ויכול להיות לא בטוח.
חובה להוריד הודעה מוצפנת עבור פענוח.
פענוח בוטל.
diff --git a/legacy/ui/legacy/src/main/res/values-ja/strings.xml b/legacy/ui/legacy/src/main/res/values-ja/strings.xml
index 6154b32104e..ed53284037e 100644
--- a/legacy/ui/legacy/src/main/res/values-ja/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ja/strings.xml
@@ -303,12 +303,6 @@
プッシュ接続の拡張設定
アカウント設定
新着メール通知
- 通知するフォルダー
- すべて
- 1st クラスフォルダーのみ
- 1st および 2nd クラスフォルダー
- 2nd クラスフォルダーを除くすべて
- なし
同期通知
メールアドレス
メールの受信時はステータスバーに通知します
@@ -397,27 +391,12 @@
3 か月前
6 か月前
1 年前
- 表示するフォルダー
- すべて
- 1st クラスフォルダーのみ
- 1st および 2nd クラスフォルダー
- 2nd クラスフォルダーを除くすべて
- 同期するフォルダー
- すべて
- 1st クラスフォルダーのみ
- 1st および 2nd クラスフォルダー
- 2nd クラスフォルダーを除くすべて
- なし
サーバーのメッセージ削除を同期する
サーバーでメッセージが削除されたときにローカルのメッセージも削除します
OpenPGP アプリが見つかりません - アンインストールしましたか?
フォルダー設定
一覧の先頭グループに表示する
フォルダー一覧の先頭に表示します
- フォルダー表示クラス
- クラスなし
- 1st クラス
- 2nd クラス
ローカルのメッセージをクリア
受信メールサーバー設定
受信メールサーバーを設定します
@@ -904,4 +883,6 @@
プッシュを有効にする
隠しフォルダーを表示
同期を有効にする
+ フォルダーを表示する
+ %s を支援する
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-ka/strings.xml b/legacy/ui/legacy/src/main/res/values-ka/strings.xml
index 1449a16bb04..2a60ee16b44 100644
--- a/legacy/ui/legacy/src/main/res/values-ka/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ka/strings.xml
@@ -227,12 +227,6 @@
გაფართოებული
ანგარიშის პარამეტრები
შეტყობინება ახალ წერილზე
- შეტყობინებების საკეცები
- ყველა
- მხოლოდ 1-ლი კლასის საკეცები
- 1-ლი და მე-2 კლასის საკეცები
- ყველა, გარდა მე-2 კლასის საკეცებისა
- არც ერთი
შეტყობინებების სინქრონიზაცია
თქვენი ფოსტის მისამართი
მხოლოდ კონტაქტები
@@ -289,21 +283,8 @@
ბოლო 3 თვე
ბოლო 6 თვე
ბოლო წელი
- ყველა
- მხოლოდ 1-ლი კლასის საკეცები
- 1-ლი და მე-2 კლასის საკეცები
- ყველა, გარდა მე-2 კლასის საკეცებისა
- საკეცების გამოკითხვა
- ყველა
- მხოლოდ 1-ლი კლასის საკეცები
- 1-ლი და მე-2 კლასის საკეცები
- ყველა, გარდა მე-2 კლასის საკეცებისა
- არც ერთი
წაშლის სინქრონიზაცია სერვერთან
მესიჯების წაშლა სერვერზე წაშლის შემთხვევაში
- კლასის გარეშე
- 1-ლი კლასი
- მე-2 კლასი
შემავალი სერვერი
შემავალი საფოსტო სერვერის გამართვა
გამავალი სერვერი
diff --git a/legacy/ui/legacy/src/main/res/values-kab/strings.xml b/legacy/ui/legacy/src/main/res/values-kab/strings.xml
new file mode 100644
index 00000000000..2da958ac1a2
--- /dev/null
+++ b/legacy/ui/legacy/src/main/res/values-kab/strings.xml
@@ -0,0 +1,66 @@
+
+
+ Kkes
+ Azmul
+ Azmul
+ Azemz
+ Timsedlisin
+ Turagt
+ Sken
+ Seɣber
+ Nadi
+ Ffeɣ seg ujerred
+ Iɣewwaṛen
+ Tiririt
+ Seɣber
+ Ɣef
+ Kkes
+ Sekles
+ :
+ Asentel
+ +
+ I:
+ Anɣ. I:
+ Kkes
+ Anɣ. I:
+ Seɣber
+ Ikaramen
+ Kkes
+ Amezwer
+ Uhu
+ Tazeggaɣt
+ Tadalt
+ Tazegzawt
+ Tawraɣt
+ Ẓreg
+ Itri
+ Aɣmis n ibeddilen
+ Imeskaren
+ Imiḍanen
+ Tiririt
+ Azen
+ Tiririt
+ Kkes
+ Aspam
+ Smutti
+ Immed
+ Bḍu
+ Nɣel
+ Aspam
+ Iznan
+ Ayen nniḍen
+ Azmul
+ Asentel:
+ Sɣur:
+ I:
+ Anɣ. Uff. I:
+ nekki
+ Aspam
+ Aspam
+ S ufus
+ Awurman
+ ass-a
+ Ilɣa
+ Ilɣa
+ Amezwer
+
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-ko/strings.xml b/legacy/ui/legacy/src/main/res/values-ko/strings.xml
index 53f4399018e..3a9966f79ae 100644
--- a/legacy/ui/legacy/src/main/res/values-ko/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ko/strings.xml
@@ -277,12 +277,6 @@
고급
계정 설정
새 메일 알림
- 알림 폴더
- 모두
- 제 1종 폴더만
- 제 1종 및 2종 폴더
- 제 2종 폴더 외 모두
- 없음
동기화 알림
이메일 주소
메일이 도착하면 상태 표시줄에 알림 표시
@@ -341,25 +335,11 @@
최근 3달
최근 6달
최근 1년
- 보일 폴더
- 모든 폴더
- 제 1종 폴더만
- 제 1종 및 2종
- 제 2종 폴더 외 모두
- 동기화할 폴더
- 모든 폴더
- 제 1종 폴더만
- 제 1종 및 2종
- 제 2종 폴더 외 모두
- 없음
서버 삭제 동기화
서버에서 삭제된 메시지를 앱에서도 삭제합니다
폴더 설정
첫번째 그룹에 보여짐
폴더 목록의 가장 위에 보여짐
- 폴더의 보이기 클래스
- 제 1종
- 제 2종
로컬 메시지 삭제
수신 서버
메일 수신 서버 수정
diff --git a/legacy/ui/legacy/src/main/res/values-lt/strings.xml b/legacy/ui/legacy/src/main/res/values-lt/strings.xml
index 7620fdfb38b..d4cdddb35d0 100644
--- a/legacy/ui/legacy/src/main/res/values-lt/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-lt/strings.xml
@@ -4,7 +4,7 @@
- K-9 šunų vedžiotojai
+ „K-9“ šunų vedžiotojai
Šaltinio kodas
Apache licencija, versija 2.0
Atvirojo kodo projektas
@@ -15,11 +15,11 @@
Licencija
Pakeitimų sąrašas
Nepavyko įkelti pakeitimų žurnalo.
- Versija %s
+ %s versija
Kas naujo
Rodyti naujausius pakeitimus, kai programa buvo atnaujinta
- Sužinokite, kas naujo šioje versijoje
+ Sužinokite, kas naujo šioje laidoje
@@ -36,35 +36,35 @@
Kopijuoti į…
%d pasirinkta
Siųsti
- Tema yra tuščia, spustelėkite dar kartą, kad vis tiek išsiųstumėte
+ Tema yra tuščia. Spustelėkite dar kartą, kad vis tiek išsiųstumėte
Atsakyti
Atsakyti visiems
- Šalinti
+ Ištrinti
Archyvuoti
Brukalas
Persiųsti
Persiųsti kaip priedą
- Redaguoti kaip naują žinutę
+ Redaguoti kaip naują laišką
Perkelti
Perkelti į Juodraščius
Pertvarkyti…
Atlikta
Atmesti
Išsaugoti kaip juodraštį
- Ieškoti naujų laiškų
+ Tikrinti paštą
Siųsti laiškus
Atnaujinti aplankų sąrašus
- Ieškoti aplanko
+ Rasti aplanko
Pridėti paskyrą
Sukurti
Ieškoti
Ieškoti visur
Paieškos rezultatai
- Naujos žinutės
+ Naujas laiškas
Tvarkyti aplankus
Paskyros nustatymai
Pašalinti paskyrą
- Pažymėti kaip skaitytą
+ Žymėti kaip skaitytą
Bendrinti
Pasirinkti siuntėją
Pridėti žvaigždutę
@@ -73,32 +73,30 @@
Atsisakyti prenumeratos
Rodyti antraštes
- - Adresas nukopijuotas į iškarpinę
- - Adresai nukopijuoti į iškarpinę
- - Adresai nukopijuoti į iškarpinę
- - Adresai nukopijuoti į iškarpinę
+ - Nukopijuotas adresas į iškarpinę
+ - Nukopijuoti adresai į iškarpinę
+ - Nukopijuota adresų į iškarpinę
- Temos tekstas nukopijuotas į iškarpinę
- Persijungti į tamsią temą
- Persijungti į šviesią temą
- Pažymėti kaip neskaitytą
- Skaitymo patvirtinimas
- Prašys perskaitymo patvirtinimo
- Neprašys perskaitymo patvirtinimo
+ Nukopijuotas temos tekstas į iškarpinę
+ Perjungti į tamsią temą
+ Perjungti į šviesią temą
+ Žymėti kaip neskaitytą
+ Skaitymo pranešimas
+ Prašys skaitymo pranešimą
+ Neprašys skaitymo pranešimo
Pridėti priedą
- Išvalyti šiukšliadėžę
- Išvalyti
+ Valyti šiukšlinę
+ Valyti
Apie
Nustatymai
(Nėra temos)
Nėra siuntėjo
Įkeliami laiškai\u2026
- Prisijungimo klaida
- Laiškas nerastas
- Laiško įkėlimo klaida
- Įkelti dar
- iki %d laiškų
+ Ryšio klaida.
+ Laiškas nerastas.
+ Laiško įkėlimo klaida.
+ Įkelti iki %d daugiau
%.1f GB
%.1f MB
%.1f kB
@@ -106,19 +104,18 @@
- %d naujas laiškas
- %d nauji laiškai
- - %d nauji laiškai
- - %d nauji laiškai
+ - %d naujų laiškų
- + %1$d daugiau ant %2$s
+ + %1$d daugiau paskyroje %2$s
Atsakyti
- Pažymėti kaip skaitytą
- Pažymėti viską kaip skaitytą
- Šalinti
- Šalinti Visus
+ Žymėti kaip skaitytą
+ Žymėti viską kaip skaitytą
+ Ištrinti
+ Ištrinti viską
Archyvuoti
Archyvuoti viską
Brukalas
- Sertifikato klaida
+ Sertifikato klaida.
Sertifikato klaida %s
Patikrinkite serverio nustatymus
Autentifikavimas nepavyko
@@ -299,12 +296,6 @@
Išplėstinis
Aplanko nustatymai
Pranešimai apie naujus laiškus
- Pranešimų aplankai
- Visi
- Tik 1 klasės aplankai
- 1 ir 2 klasės aplankai
- Visus išskyrus 2 klasės aplankus
- Jokios
Sinchronizuoti pranešimus
Jūsų el. pašto adresas
Gavus laišką pranešti apie tai būsenos juostoje
@@ -393,27 +384,12 @@
paskutinių 3 mėnesių
paskutinių 6 mėnesių
praėjusių metų
- Rodomi aplankai
- Visi
- Tik 1 klasės aplankai
- 1 ir 2 klasės aplankai
- Visi išskyrus 2 klasės aplankus
- Stebimi aplankai
- Visi
- Tik 1 klasės aplankai
- 1 ir 2 klasės aplankai
- Visi išskyrus 2 klasės aplankus
- Jokie
Sinchronizuoti serverio pašalinimus
Pašalinti laiškus kai jie pašalinami serveryje
Trūksta OpenPGP programos - ar ji buvo pašalinta?
Aplanko nustatymai
Rodyti viršutinėje grupėje
Rodyti aplankų sąrašo viršuje
- Rodomos aplankų klasės
- Be klasės
- 1 klasė
- 2 klasė
Išvalyti vietinius laiškus
Laiškų gavimo serveris
Konfigūruoti gaunamųjų laiškų serverį
@@ -913,5 +889,9 @@ Norėdami nustatyti automatinį šifravimą naujajame prietaise, vadovaukitės i
Rašyti laišką
Šalinama paskyra…
neskaityti, %s
- Rodyti
+ Peržiūrėti
+ „Thunderbird Mobile“ komanda
+ Bendrina su „Mozilla“ šios programos veikimo, naudojimo, aparatinės įrangos ir tinkinimo duomenis, kad padėtų mums tobulinti „Thunderbird“
+ Paskyra \"%s\" bus pašalinta iš „%s“.
+ Apie „%s“
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-lv/strings.xml b/legacy/ui/legacy/src/main/res/values-lv/strings.xml
index 0b939a50a90..3dbdfe5e9e2 100644
--- a/legacy/ui/legacy/src/main/res/values-lv/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-lv/strings.xml
@@ -308,12 +308,6 @@ pat %d vairāk
Papildus
Konta iestatījumi
Jauna pasta paziņojumi
- Paziņojumu mapes
- Visas
- Tikai 1.kategorijas mapes
- 1. un 2.kategorijas mapes
- Visas, izņemot 2.kategorijas mapes
- Nevienu
Sinhronizācijas paziņojumi
Jūsu e-pasta adrese
Paziņot statusa joslā, kad saņemts jauns pasts
@@ -402,27 +396,12 @@ pat %d vairāk
pēdējiem 3 mēnešiem
pēdējiem 6 mēnešiem
pēdējā gada
- Parādāmās mapes
- Visas
- Tikai 1. kategorijas mapes
- Tikai 1. un 2. kategorijas mapes
- Visas, izņemot 2.kategorijas mapes
- Pārbaudīt mapes
- Visas
- Tikai 1.kategorijas mapes
- 1. un 2.kategorijas mapes
- Visas, izņemot 2.kategorijas mapes
- Nevienu
Sinhronizēt dzēšanu ar serveri
Dzēst ziņas, kad tās dzēstas serverī
Trūkst OpenPGP lietotnes - vai tā noinstalēta\?
Mapes iestatījumi
Parādīt augšējā grupā
Rādīt līdzās mapju saraksta augšgalam
- Mapes attēlošanas kategorija
- Nekategorizēta
- 1.kategorija
- 2.kategorija
Dzēst ierīcē atrodošās ziņas
Ienākošais serveris
Iestatīt ienākošā pasta serveri
diff --git a/legacy/ui/legacy/src/main/res/values-ml/strings.xml b/legacy/ui/legacy/src/main/res/values-ml/strings.xml
index 74a464b5883..02ba4ab78a5 100644
--- a/legacy/ui/legacy/src/main/res/values-ml/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ml/strings.xml
@@ -285,12 +285,6 @@
വിപുലമായത്
അക്കൗണ്ട് സജ്ജീകരണങ്ങൾ
പുതിയ മെയിൽ അറിയിപ്പുകൾ
- അറിയിപ്പുകൾ ഫോൾഡറുകൾ
- എല്ലാം
- ഒന്നാം ക്ലാസ് ഫോൾഡറുകൾ മാത്രം
- 1ഉം 2ഉം ക്ലാസ് ഫോൾഡറുകൾ
- 2ആം ക്ലാസ് ഫോൾഡറുകൾ ഒഴികെ എല്ലാം
- ഒന്നുമില്ല
അറിയിപ്പുകൾ സമന്വയിപ്പിക്കുക
നിങ്ങളുടെ ഇമെയിൽ വിലാസം
മെയിൽ വരുമ്പോൾ സ്റ്റാറ്റസ് ബാറിൽ അറിയിക്കുക
@@ -379,27 +373,12 @@
കഴിഞ്ഞ 3 മാസം
കഴിഞ്ഞ 6 മാസം
കഴിഞ്ഞ 6 മാസം
- പ്രദർശിപ്പിക്കുന്നതിനുള്ള ഫോൾഡറുകൾ
- എല്ലാം
- ഒന്നാം ക്ലാസ് ഫോൾഡറുകൾ മാത്രം
- 1ഉം 2ഉം ക്ലാസ് ഫോൾഡറുകൾ
- 2 ആം ക്ലാസ് ഫോൾഡറുകൾ ഒഴികെ എല്ലാം
- പോൾ ഫോൾഡറുകൾ
- എല്ലാം
- ഒന്നാം ക്ലാസ് ഫോൾഡറുകൾ മാത്രം
- 1ഉം 2ഉം ക്ലാസ് ഫോൾഡറുകൾ
- 2 ആം ക്ലാസ് ഫോൾഡറുകൾ ഒഴികെ എല്ലാം
- ഒന്നുമില്ല
സെർവർ ഇല്ലാതാക്കലുകൾ സമന്വയിപ്പിക്കുക
സെർവറിൽ ഇല്ലാതാക്കുമ്പോൾ സന്ദേശങ്ങൾ നീക്കംചെയ്യുക
OpenPGP അപ്ലിക്കേഷൻ കാണുന്നില്ല - ഇത് അൺഇൻസ്റ്റാൾ ചെയ്തോ?
ഫോൾഡർ ക്രമീകരണങ്ങൾ
മുകളിലെ ഗ്രൂപ്പിൽ കാണിക്കുക
ഫോൾഡർ ലിസ്റ്റിന്റെ മുകളിൽ കാണിക്കുക
- ഫോൾഡർ പ്രദർശന ക്ലാസ്
- ക്ലാസ് ഇല്ല
- 1 ആം ക്ലാസ്
- 2 ആം ക്ലാസ്സ്
പ്രാദേശിക സന്ദേശങ്ങൾ മായ്ക്കുക
ഇൻകമിംഗ് സെർവർ
ഇൻകമിംഗ് മെയിൽ സെർവർ ക്രമീകരിക്കുക
diff --git a/legacy/ui/legacy/src/main/res/values-nb/strings.xml b/legacy/ui/legacy/src/main/res/values-nb/strings.xml
index d4f3d753cf6..46781632419 100644
--- a/legacy/ui/legacy/src/main/res/values-nb/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-nb/strings.xml
@@ -269,12 +269,6 @@ til %d flere
Avansert
Kontoinnstillinger
Varsel om ny e-post
- Mapper med varslinger
- Alle
- Bare førsteklasses mapper
- Første- og andre -klasses mapper
- Alle utenom andreklasses mapper
- Ingen
Synkroniseringsvarsel
Din e-postadresse
Varsel i statuslinjen når ny e-post ankommer
@@ -357,27 +351,12 @@ til %d flere
de siste 3 måneder
det siste halve året
det siste året
- Mapper å vise
- Alle
- Kun førsteklassesmapper
- Første- og andre -klassesmapper
- Alle unntatt andreklassesmapper
- Sjekke-mapper
- Alle
- Kun førsteklassesmapper
- Første og andreklassesmapper
- Alle unntatt andreklassesmapper
- Ingen
Synkroniser slettinger på tjener
Fjern meldinger når slettet fra tjener
Manglende OpenPGP-program - ble det avinstallert?
Mappeinnstillinger
Vis i toppgruppe
Vis nær toppen av mappelisten
- Visningsklasse for mappe
- Ingen klasse
- Førsteklasses
- Andreklasses
Fjern lokale meldinger
Innkommende tjener
Sett opp innkommende e-posttjener
@@ -899,4 +878,5 @@ til %d flere
Etter markering av melding som ulest
Mangler tillatelse til å planlegge alarmer
Trykk for å gi tillatelse.
+ Thunderbird Mobil Teamet
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-nl/strings.xml b/legacy/ui/legacy/src/main/res/values-nl/strings.xml
index b9eba01fab2..e13c8cb8cc5 100644
--- a/legacy/ui/legacy/src/main/res/values-nl/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-nl/strings.xml
@@ -198,7 +198,7 @@
Namen in uw adreslijst inkleuren
Kleur voor namen van contactpersonen
Vaste breedte lettertypen
- Gebruik een lettertype met vaste breedte bij het weergeven van platte-tekstberichten
+ Gebruik een lettertype met vaste breedte bij het tonen van platte-tekstberichten
Berichten auto-passen
Berichten passend maken op het scherm
Acties bevestigen
@@ -305,12 +305,6 @@
Geavanceerd
Accountinstellingen
Nieuwe e-mailmelding
- Meldingsmappen
- Alle
- Alleen 1e-klassemappen
- 1e- en 2e-klassemappen
- Alle behalve 2e-klassemappen
- Geen
Synchronisatiemeldingen
Uw e-mailadres
Melding in statusbalk bij een nieuw e-mailbericht
@@ -318,7 +312,7 @@
Melding voor e-mailbericht welke ik verstuur
Melding ook voor e-mailbericht verzonden vanaf een identiteit
Alleen contacten
- Meldingen alleen weergeven voor bekende contacten
+ Meldingen alleen tonen voor bekende contacten
Chatberichten negeren
Geen meldingen tonen voor berichten die onderdeel zijn van een e-mail-chat
Als gelezen markeren na openen
@@ -399,27 +393,12 @@
afgelopen 3 maanden
afgelopen 6 maanden
afgelopen jaar
- Mappen om te tonen
- Alle
- Alleen 1e-klassemappen
- 1e- en 2e-klassemappen
- Alle behalve 2e-klassemappen
- Peiling mappen
- Alle
- Alleen 1e-klassemappen
- 1e- en 2e-klassemappen
- Alle behalve 2e-klassemappen
- Geen
Verwijderingen op server synchroniseren
Berichten verwijderen wanneer verwijderd van server
OpenPGP-app niet aanwezig – is de app verwijderd?
Mapinstellingen
In topgroep tonen
Bij de top van de maplijst tonen
- Mapweergaveklasse
- Geen klasse
- 1e klasse
- 2e klasse
Lokale berichten wissen
Inkomende server
Inkomende mailserver instellen
@@ -549,7 +528,7 @@
Opvallende visuele effecten gebruiken
Volumetoetsnavigatie in berichtbeeld
Samengevoegd Postvak IN tonen
- Het aantal berichten met een ster weergeven
+ Aantal berichten met een ster tonen
Samengevoegd Postvak IN
Alle berichten in gecombineerde mappen
Combineer
@@ -727,7 +706,7 @@
In deze modus wordt de PGP-sleutel gebruikt voor een cryptografische handtekening of een ongecodeerd e-mailbericht.
Dit versleutelt niet het e-mailbericht, maar controleert of het is verstuurd met uw sleutel.
Handtekening kan bij versturing naar verzendlijst beschadigd raken.
- Handtekening kan bij sommige programma’s als ‘signature.asc’-bijlage worden weergegeven.
+ Handtekening kan bij sommige programma’s als ‘signature.asc’-bijlage worden getoond.
Versleutelde berichten bevatten altijd een handtekening.
Platte tekst
end-to-end-handtekening bevat een fout
@@ -828,7 +807,7 @@
Android maakt het echter ook mogelijk om meldingen te verbergen.
Meer info
Melding instellen
- Als u het niet nodig vindt om per direct meldingen van nieuwe berichten te ontvangen, dan kunt u beter push uitschakelen en in plaats daarvan kiezen voor peilen. Met peilen wordt er om de zoveel tijd gekeken of er nieuwe e-mailberichten zijn binnengekomen. Daarvoor is het weergeven van een melding niet continu nodig.
+ Als u het niet nodig vindt om per direct meldingen van nieuwe berichten te ontvangen, dan kunt u beter push uitschakelen en in plaats daarvan kiezen voor peilen. Met peilen wordt er om de zoveel tijd gekeken of er nieuwe e-mailberichten zijn binnengekomen. Daarvoor is het tonen van een melding niet continu nodig.
Push uitschakelen
Selecteren
@@ -902,7 +881,7 @@
De app OpenKeychain is vereist om ondersteuning voor end-to-end-encryptie mogelijk te maken.
De account \"%s\" zal uit %s worden verwijderd.
Over %s
- Bij gebruik van Push onderhoudt %1$s een verbinding met de mailserver. Android vereist het doorlopend weergeven van een melding als de app actief is op de achtergrond. %2$s
+ Bij gebruik van Push onderhoudt %1$s een verbinding met de mailserver. Android vereist het doorlopend tonen van een melding als de app actief is op de achtergrond. %2$s
Thunderbird Mobile-team
Meldingen
Gebruik en technische gegevens
@@ -911,4 +890,6 @@
Push activeren
Synchronisatie inschakelen
Verborgen mappen tonen
+ Map tonen
+ %s steunen
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-nn/strings.xml b/legacy/ui/legacy/src/main/res/values-nn/strings.xml
index f0e8be032e6..e0473d4d8fa 100644
--- a/legacy/ui/legacy/src/main/res/values-nn/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-nn/strings.xml
@@ -75,15 +75,15 @@
Slett alle
Arkiver
Arkiver alle
- Sertifikatfeil for %s
+ Sertifikatfeil for %s
Sjekk tenarinnstillingane dine
Autentisering feila
Autentisering feila for %s. Oppdater tenarinnstillingane dine.
- Sjekkar e-post: %1$s:%2$s
+ Sjekkar e-post: %1$s:%2$s
Sjekkar e-post
- Sender e-post: %s
+ Sender e-post: %s
Sender e-post
:
Meldingar
@@ -186,8 +186,6 @@
Innfløkt
Kontoinnstillingar
Nye e-postvarsel
- Alle
- Ingen
Synkroniser varsel
E-postadressa di
Alltid syn bilete
@@ -220,10 +218,6 @@
dei siste tre månadene
det siste halvåret
det siste året
- Mapper som skal synast:
- Alle
- Alle
- Ingen
Mappeinnstillingar
Fjern lokale meldingar
Kontonamn
@@ -386,7 +380,7 @@
Søk
Søk i meldingar på tenaren
Ei nettverkstilkopling trengst for å søkja på tenaren.
- Trådsyning
+ Trådvising
Grupper meldingar i samtalar
Oppgraderer databasar
Oppgraderer databasar …
@@ -586,4 +580,317 @@
Standard
Skru av varslingar
Avslappa
+ Tettleik
+ Slett stjernemerkede (i meldingsvising)
+ Hald deg til noverande melding
+ Returner til meldingsliste
+ Fjern brukaragent frå mail-header
+ Stilletid
+ Deaktiver ringing, vibrering og blinking på natta
+ Deaktiver notifikasjonar i stillemodus, fullstendig
+ Kompakt
+ Same som når skjermen er opplåst
+ Under polling
+ Vis dialog når du utfører selekterte handlingar
+ Bekreft handlingar
+ Søppelpost
+ Stillemodus startar
+ Søppelpost-mappe
+ Skjul tidssone
+ Bruk UTC i staden for lokal tidssone i mail-headere og svar-header
+ Antal nye meldingar
+ Antal meldingar og avsendarar
+ Stillemodus ender
+ Vis notifikasjonar kun frå meldingar frå kjende kontaktar
+ Synkroniser serversletting
+ Manglande OpenPGP app - var den avinstallert?
+ Vis i toppgruppe
+ Vi nær toppen av mappelista
+ Fjern signaturar under svar
+ Leser e-post
+ 64 KiB
+ Kan ikkje kopiera eller flytta melding som ikkje er synkronisert med tenaren
+ Svarsiteringsstil
+ Signaturar vil bli fjerna frå siterte meldingar
+ 1 KiB
+ 128 KiB
+ 1 MiB
+ 5 MiB
+ Last opp sende meldingar
+ 4 KiB
+ 10 MiB
+ Fjern meldingar etter sletting frå tenar
+ Kopla til %s
+ Krypter malar kun om kryptering er aktivert
+ 2 KiB
+ Pollefrekvens for mappe
+ Auto-utvid mapper
+ Inkluder utgåande e-post
+ Berre kontaktar
+ Marker som lesen etter opning
+ Marker ein melding som lesen etter den vert opna for visning
+ Marker melding som lesen etter den er sletta
+ Notifikasjons-kategoriar
+ Konfigurer feil- og statusnotifikasjonar
+ Siter melding under svaring
+ Inkluder original melding i svaret ditt.
+ Svar etter sitert tekst
+ Sitert tekst-prefiks
+ Ende-til-ende kryptering
+ Konfigurerer…
+ Lagre alle utkast enkryptert
+ Alle utkast vil bli lagra ukryptert
+ 8 KiB
+ 2 MiB
+ Innkommande tenar
+ Utgåande tenar
+ Notifikasjonar
+ Aktiver Push
+ Aksentfargen for denne kontoen er brukt i mappe- og kontolista
+ 512 KiB
+ Aktiver synkronisering
+ Konfigurer innkommande e-post tenar
+ Ignorer chat-meldingar
+ Ikkje vis notifikasjonar frå meldingar som høyrer til ein e-post chat
+ Varsle i statuslinja, medan mail er sjekka
+ Ingen OpenPGP app funne
+ 256 KiB
+ Hentar e-post
+ Vis kun abonnerte mapper
+ Varsle i statuslinja når e-post kjem
+ Vis notifikasjonar for meldingar eg har sendt
+ Marker som lesen etter sletting
+ Konfigurer notifikasjonar for nye meldingar
+ Den originale meldinga vil dukke opp over svaret ditt.
+ Header (som outlook)
+ Aktiver OpenPGP støtte
+ Lokal mappestørrelse
+ 16 KiB
+ Vis mappe
+ Prefiks (som Gmail)
+ Last opp meldingar til Sendt-mappe etter sending
+ 32 KiB
+ Gjenoppfrisk IDLE-forbindelse
+ Vel OpenGPG app
+ Konfigurer ende-til-ende nøkkel
+ Konfigurer utgåande mail (SMTP) tenar
+ Vibrasjon
+ Vibrer
+ Mønster 2
+ Mønster 3
+ Systemstandardfarge
+ Komposisjonstema
+ Tema for meldinsvising
+ Magenta
+ Vibreringsmønster
+ Blå
+ Flytt til topp / set standard
+ Innstillingar for meldingskomposisjon
+ Komposisjonsstandard
+ Stjernemerka meldingar fyrst
+ Global
+ Ingen innstillingar funne
+ Mønster 1
+ Kvit
+ Raud
+ Grøn
+ Set standard Frå, Blindkopi og signatur
+ Mappenamn inneheld
+ Feilsøking
+ Mønster 4
+ Notifikasjonsljos
+ Deaktivert
+ Gul
+ Cyan
+ Vis skjulte mapper
+ Mønster 5
+ Repeter vibrasjon
+ Deaktivert
+ Ringetone for ny e-post
+ Vising
+ Personvern
+ Bruk systemstandard
+ Fast meldingstema
+ Usternemerka meldingar fyrst
+ Uleste meldingar fyrst
+ Maks antal mapper å sjekke med push
+ Bruk glorete visuelle effektar
+ Volumknappsnavigasjon i meldingsvising
+ Animasjon
+ Samla innboks
+ Alle meldingar i samla mapper
+ Vis antal stjernemerka
+ Vel meldinsvisingstema for vising av meldingar
+ Bruk fast tema for vising av meldingar
+ Vis samla innboks
+ Automatisk (%s)
+ Mottakarar
+ Fjern lokale meldingar?
+ Fjern meldingar
+ Alle meldingar er vist i samla innboks
+ Samle
+ Tekstinputfelt
+ Dette vil fjerne alle lokale meldingar frå mappa. Ingen meldingar vil bli sletta frå tenaren.
+ Lagre eller forkast endringar?
+ Bekreft tømming av papirkorg
+ Er du sikker på at du vil tømme papirkorga?
+ Bekreft flytting til søppelpost
+
+ - Hentar %d resultat
+ - Hentar %d resultatar
+
+ Eksporter innstillingar
+ Lenketekst
+ Kopier lenketekst til utklippstavle
+
+ - Er du sikker på du vil flytte denne meldinga til søppelpost?
+ - Er du sikker på du vil flytte %1$d meldingar til søppelpost?
+
+ Sikkerheitskopi
+ Ring nummer
+ Velykka eksportering av innstillingar
+ kundestønad %s
+ Byt farge etter lese
+ Ein annan bakgrunn vil vise at meldinga er lesen
+ Kryptert
+ <Ukjend mottakar>
+ Vis valde handlinger i meldingsvisingmenyen
+
+ - Hentar %1$d av %2$d resultat
+ - Hentar %1$d av %2$d resultat
+
+ Lås opp
+ <Ukjend avsendar>
+ Svar til
+ må laste ned heile meldinga for dektryptering
+ Kryptert
+ Kan ikkje kople til krypteringsleverandør, sjekk innstillingane dine eller klikk kryperingsikonet for å forsøke på ny!
+ Denne e-posten er sendt i PGP/INLINE format.\nDette skal kun brukast for kompatibilitet:
+ Signaturar kan øydeleggjast under levering
+ Dette krypterer ikkje e-posten, men verifiserer at den var sendt frå nøkkelen din.
+ ende-til-ende signaturen inneheld ein feil
+ Signert klartekst
+ frå verifisert underskrivar
+ frå ukjend ende-til-ende nøkkel
+ men det var ein dektrypteringsfeil
+ men ende-til-ende nøkkel er utgått
+ men ende-til-ende nøkkel er trekt tilbake
+ men ende-til-ende nøkkel er ikkje å sjå på som trygg
+ Ingen nøkkel er konfigurert for denne kontoen! Sjekk innstillingane dine.
+ Aktiver PGP/INLINE
+ Vedlegg er ikkje støtta
+ Kun PGP signeringsmodus
+ I denne modusen, vil PGP-nøkkelen din brukast til å opprette ein kryptografisk signatur av ein ukryptert e-post.
+ Signaturar kan øydeleggjast når dei er sende til e-post-lister.
+ Signaturar kan vere viste som \'signature.asc\' i nokre klientar.
+ Deaktiver PGP/INLINE
+ Deaktiver kun PGP signering
+ Krypteringsleverandøren din brukar inkompatibel versjon. Sjekk innstillingane dine!
+ PGP/INLINE modus støttar ikkje vedlegg!
+ Aktiver kun PGP signering
+ Krypterte meldingar inneheld alltid ein signatur.
+ men ende-til-ende nøkkel samsvarer ikkje med sendar
+ Ende-til-ende signert klartekst
+ PGP/INLINE Modus
+ Klartekst
+ må laste ned heile meldinga for å prosessere signatur
+ inneheld ende-til-ende signatur som ikkje er støtta
+ men ikkje ende-til-ende
+ Klarte ikkje initialisere ende-til-ende kryptering, sjekk innstillingane dine
+ Men ingen krypteringsapp er konfigurert
+ Ingen OpenPGP app installert
+ Sikker deling av ende-til-ende oppsett med andre einingar
+ Manglande løyve til å planleggje alarmar
+ Fjernar konto…
+ Skjul ukrypterte signaturar
+ Deaktiver Push
+ Denne dele var ikkje kryptert, og kan vere usikker.
+ Denne e-posten er kryptert
+ Dekrypteringa vart kansellert.
+ Kryptering er ikkje mogleg
+ Skru av/på krypering med å klikke på dette ikonet.
+ Krypter meldingsemne
+ Gjensidig autokrypteringsmodus
+ Kryptering av meldingar sikrar at dei kan bli lesne av mottakaren, og ingen andre.
+ OpenPGP kryptering
+ Mappa er ikkje funnen
+ Kryptering vil kun visast om det er støtta av alle mottakarar, og dei må ha sendt deg ein e-post tidlegare.
+ Tilbake
+ Deaktiver kryptering
+ Intern feil: Ugyldig konto!
+ Feil under tilkopling til %s!
+ For å fullføre, opne meldinga på di andre eining, og tast inn oppsett-koden.
+ Konfigurer notifikasjon
+ Ende-til-ende kryptert
+ frå verifisert avsendar
+ men ende-til-ende nøkkelen er tilbakekalt
+ men ende-til-ende dataen har feil
+ Den krypterte meldinga må lastast ned for dekryptering.
+ Feil under dekryptering av e-post
+ Prøv igjen
+ Kun krypterte signaturar vil bli viste
+ Alle signaturar vil bli viste
+ Kryptering er utilgjengeleg i kun-signer modus!
+ Denne e-posten har vorte kryptert med OpenPGP.\nFor å lese den, må du installere og konfigurere ein kompatibel OpenPGP App.
+ Gå til innstillingar
+ Skru på kryptering
+ Nokre av mottakarane støttar ikkje denne funksjonen!
+ Deaktiver kryptering
+ Meldingar vil normalt sett krypterast etter eige val, eller når ein svarer på krypterte meldingar.
+ Om både avsendar og mottakar aktiverer gjensidig modus, vil kryptering blir slådd på som standard.
+ Ein Autocrypt oppsett-melding deler ditt ende-til-ende oppsett med andre einingar på ein sikker måte.
+ Ein feil oppstod under sending av meldinga. Ver vennleg og sjekk nettverkstilkopling og utgåande tenar-konfigurasjon.
+ Under bruk av Push, held %1$s ei forbindelse med e-post-tenaren. Android påkrevjer visning av ein pågåande notifikasjon medan appen er aktiv i bakgrunnen. %2$s
+ Feil under lasting av meldingsdetaljar.
+ Eg forstår
+ Appen OpenKeychain er påkravd for å aktivere stønad for ende-til-ende kryptering.
+ Sender melding til:
+ Gjensidig autokrypteringsmodus
+ Manglande \'dato\'-header
+ Svar til
+ Skriv melding til
+ Autocrypt oppsett-melding
+ Feil under lasting av data
+ Initialiserer…
+ Søv til nettverket er tilgjengeleg
+ Trykk for å lære meir.
+ Men, Android tillet og at du kan skjule notifikasjonen.
+ Lær meir
+ Spesialkarakterar er ikkje støtta enno!
+ Feil under tolking av adressa!
+ Autocrypt oppsett-melding
+ Er kanskje ikkje støtta for nokon av mottakarane
+ Av
+ Marker som lesen
+ Meldingsdetaljar
+ Legg til i kontaktar
+ Deler yting, bruk, maskinvare og tiplassingsdata om denne appen til Mozilla for å hjelpe oss å gjere Thunderbird betre
+ Datainnsamling
+ Ubeskytta vedlegg
+ Send Autocrypt oppsett-melding
+ Installer
+ Du kan klikke her for å lære meir.
+ Bruk og teknisk data
+ Kopier namn og e-postadresse
+ ulesne, %s
+ Namn og e-postadresse
+ men ende-til-ende nøkkelen er ikkje å rekne som sikker
+ men krypteringa er ikkje å rekne som sikker
+ Push-informasjon
+ Send oppsett-melding
+ Genererer oppsett-melding…
+ På
+ Kopier e-postadresse
+ Vis oppsett-kode
+ Ventar på nye e-postar
+ Søv til bakgrunns-synkronisering er tillaten
+ Usignert tekst
+ Kryptert
+ men ende-til-ende nøkkelen samsvarer ikkje med avsendaren
+ men ende-til-ende nøkkelen er utgått
+ Denne meldinga inneheld all informasjonenen som trengs for å overføre Autocrypt-innstillingane dine, saman med din hemmelege nøkkelen din frå din originale eining. For å setje opp Autocrypt på din nye eining, følg instruksjonane som vert presentert på einingane. Du kan behalde denne meldinga og bruke den som backup for din hemmelege nøkkel. Om du vil gjere dette bør du skrive ned passordet, og lagre det sikkert.
+ For å gje tillating.
+ Meldinga vil bli sendt til di adresse:
+ Om du ikkje treng umiddelbare notifikasjonar om nye meldingar, bør du skru av Push og bruke polling. Polling sjekkar for mail med regelmessige mellomrom og treng ikkje notifikasjonen.
+ Frå ukjend ende-til-ende nøkkel
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-pl/strings.xml b/legacy/ui/legacy/src/main/res/values-pl/strings.xml
index 2806ca1a81b..492140acef0 100644
--- a/legacy/ui/legacy/src/main/res/values-pl/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-pl/strings.xml
@@ -19,7 +19,7 @@
Co nowego
Pokaż ostatnie zmiany po aktualizacji aplikacji
- Dowiedz się, co nowego w tej wersji
+ Dowiedz się, co nowego w tej wersji
Wyświetl
@@ -51,7 +51,7 @@
Przenieś do wersji roboczych
Operacje…
Gotowe
- Usuń
+ Odrzuć
Zapisz jako wersję roboczą
Sprawdź pocztę
Wyślij wiadomości
@@ -84,9 +84,9 @@
Przełącz na ciemny styl
Przełącz na jasny styl
Oznacz jako nieprzeczytane
- Powiadomienie o przeczytaniu
- Żadaj powiadomienia o przeczytaniu
- Nie wymagaj powiadomienia o przeczytaniu
+ Powiadomienie o przeczytaniu
+ Żadaj powiadomienia o przeczytaniu
+ Nie wymagaj powiadomienia o przeczytaniu
Dodaj załącznik
Opróżnij kosz
Wyczyść
@@ -115,7 +115,7 @@
Oznacz jako przeczytane
Oznacz wszystkie jako przeczytane
Usuń
- Skasuj wszystkie
+ Usuń wszystkie
Archiwizuj
Archiwizuj wszystkie
Spam
@@ -136,9 +136,9 @@
Synchronizuj (push)
Wyświetlane podczas oczekiwania na nowe wiadomości
Wiadomości
- Powiadomienia związane z wiadomościami
+ Powiadomienia związane z wiadomościami
Różne
- Dodatkowe powiadomienia jak błędy itp.
+ Dodatkowe powiadomienia, takie jak błędy itp.
Niektóre wiadomości nie zostały wysłane
Wersja
Włącz rejestrowanie debugowania
@@ -186,28 +186,28 @@
Pobierz całą wiadomość
przez %1$s
Więcej od tego nadawcy
- Wiadomość usunięta
+ Wiadomość odrzucona
Wiadomość zapisana jako wersja robocza
Oznaczaj gwiazdkami
Gwiazdki wskazują oznakowane wiadomości
Podgląd wierszy
- Pokazuj imiona i nazwiska korespondentów
- Pokazuj imiona i nazwiska korespondentów zamiast ich adresów e-mail
+ Pokazuj imiona i nazwiska korespondentów
+ Pokazuj imiona i nazwiska korespondentów, a nie ich adresy e-mail
Korespondent powyżej tematu
- Pokazuj imiona i nazwiska korespondentów powyżej, a nie poniżej tematu
- Pokazuj imiona i nazwiska kontaktów
- Użyj imion i nazwisk nadawców z kontaktów, jeżeli są dostępne
+ Pokazuj imiona i nazwiska korespondentów powyżej, a nie poniżej tematu
+ Pokazuj imiona i nazwiska kontaktów
+ Użyj imion i nazwisk nadawców z kontaktów, jeżeli są dostępne
Koloruj kontakty
- Koloruj imiona i nazwiska na liście kontaktów
- Kolor imienia i nazwiska kontaktu
- Czcionka o stałej szerokości
- Użyj czcionki o stałej szerokości do wyświetlania wiadomości tekstowych
+ Koloruj imiona i nazwiska na liście kontaktów
+ Kolor imienia i nazwiska kontaktu
+ Czcionka o stałej szerokości
+ Użyj czcionki o stałej szerokości do wyświetlania wiadomości tekstowych
Dopasuj wiadomość do rozmiaru ekranu
Zmniejsza wiadomości, aby mieściły się na ekranie
Potwierdź czynności
Pokaż potwierdzające okno dialogowe, gdy wykonujesz wybrane czynności
Usuń
- Usuń oznacz. gwiazdką (tylko widok wiadomości)
+ Usuń oznaczoną gwiazdką (w widoku wiadomości)
Spam
Odrzuć wiadomość
Oznacz wszystkie wiadomości jako przeczytane
@@ -215,9 +215,9 @@
Czynności przesunięcia
- Przesuń w prawo
+ Przesuń w prawo
- Przesuń w lewo
+ Przesuń w lewo
Brak
@@ -242,27 +242,27 @@
Ukryj klienta poczty
Usuń identyfikator programu z nagłówka wiadomości
Ukryj strefę czasową
- Używaj czasu UTC zamiast czasu lokalnego w nagłówkach wiadomości i odpowiedzi
+ Używaj czasu UTC zamiast czasu lokalnego w nagłówkach wiadomości i odpowiedzi
Pokaż przycisk „Usuń”
Nigdy
- Dla powiadomień o pojedynczych wiadomościach
+ Dla powiadomień o pojedynczych wiadomościach
Zawsze
Powiadomienia na ekranie blokady
Bez powiadomień na ekranie blokady
Nazwa aplikacji
Liczba nowych wiadomości
- Nadawcy i liczba wiadomości
+ Nadawcy i liczba wiadomości
Tak samo, jak przy odblokowanym ekranie
Okres ciszy
- Wyłącz dzwonienie, wibracje i mruganie w nocy
+ Wyłącz dzwonienie, wibracje i mruganie w nocy
Wyłącz powiadomienia
Całkowicie wyłącz powiadomienia podczas okresu ciszy
Początek okresu ciszy
Koniec okresu ciszy
Dodaj konto
- Gdy skasuję wiadomość
- Nie usuwaj z serwera
- Usuń ją z serwera
+ Kiedy usuwam wiadomość
+ Nie usuwaj z serwera
+ Usuń ją z serwera
Oznacz jako przeczytane na serwerze
Kasowanie usuniętych wiadomości na serwerze
Od razu
@@ -304,16 +304,10 @@
5000 wiadomości
10000 wiadomości
Wszystkie wiadomości
- Nie można skopiować ani przenieść wiadomości, która nie jest zsynchronizowana z serwerem
+ Nie można skopiować ani przenieść wiadomości, która nie jest zsynchronizowana z serwerem
Zaawansowane
Ustawienia ogólne
Nowe wiadomości
- Powiadomienia z folderów
- Wszystkie
- Tylko foldery klasy 1
- Foldery klasy 1 oraz 2
- Wszystkie poza klasą 2
- Żadne
Synchronizacja konta
Twój adres e-mail
Powiadomiaj na pasku stanu, gdy jest nowa wiadomość
@@ -322,7 +316,7 @@
Pokaż powiadomienie dla wiadomości wysłanych przeze mnie
Tylko kontakty
Pokaż powiadomienia tylko dla wiadomości od znanych kontaktów
- Ignoruj wiadomości z czatu
+ Ignoruj wiadomości z czatu
Nie pokazuj powiadomień dla wiadomości należących do czatu e-mail
Oznacz jako przeczytane
Oznacz wiadomość jako przeczytaną przy otwieraniu
@@ -330,7 +324,7 @@
Oznacz wiadomość jako przeczytaną przy usuwaniu
Kategorie powiadomień
Konfiguruj powiadomienia dla nowych wiadomości
- Konfiguruj powiadomienia o błędach i stanie
+ Konfiguruj powiadomienia o błędach i stanie
Zawsze pokazuj obrazy
Nie
Od kontaktów
@@ -340,15 +334,15 @@
Dołącz oryginalną wiadomość do swojej odpowiedzi.
Odpowiedź pod cytatem
Oryginalna wiadomość pojawi się nad Twoją odpowiedzią.
- Wycinaj podpis z tekstu
+ Wycinaj podpis z tekstu
Gdy odpowiadasz na wiadomość, cytowany tekst nie bedzie zawierał podpisu
Format wiadomości
- Zwykły tekst (bez obrazów i formatowania)
- HTML (z obrazami i formatowaniem)
+ Zwykły tekst (bez obrazów i formatowania)
+ HTML (z obrazami i formatowaniem)
Automatycznie
Zawsze wyświetlaj DW/UDW
Potwierdzenie przeczytania
- Zawsze wymagaj potwierdzenia o przeczytaniu
+ Zawsze wymagaj potwierdzenia o przeczytaniu
Styl cytowania podczas odpowiedzi
Prefiks (jak Gmail)
Nagłówek (jak Microsoft Outlook)
@@ -362,16 +356,16 @@
Szyfrowanie typu „end-to-end”
Aktywuj wsparcie dla OpenPGP
Wybierz aplikację OpenPGP
- Skonfiguruj klucz szyfrowania typu „end-to-end”
+ Skonfiguruj klucz „end-to-end”
Brak skonfigurowanej aplikacji OpenPGP
- Połączono z %s
+ Połączono z %s
Konfigurowanie…
Szyfruj wszystkie przechowywane wersje robocze
Wszystkie wersje robocze będą szyfrowane
Szyfruj wersje robocze tylko wtedy, gdy szyfrowanie jest włączone
Częstotliwość sprawdzania konta
Kolor konta
- Wybierz kolor, który będzie użyty przy wyświetlaniu folderów i listy kont
+ Wybierz kolor, który będzie użyty przy wyświetlaniu folderów i listy kont
Liczba wiadomości
Rozmiar pobieranych wiadomości
1 KiB
@@ -402,34 +396,19 @@
ostatnie 3 miesiące
ostatnie 6 miesięcy
ostatni rok
- Wyświetlaj foldery
- Wszystkie
- Tylko foldery klasy 1
- Foldery klasy 1 oraz 2
- Wszystkie poza klasą 2
- Sprawdź foldery
- Wszystkie
- Tylko foldery klasy 1
- Foldery klasy 1 oraz 2
- Wszystkie poza klasą 2
- Żadne
Synchronizacja usunięć
- Usuwaj wiadomości również z serwera poczty
+ Usuwaj wiadomości również z serwera poczty
Brakuje aplikacji OpenPGP. Czy została odinstalowana\?
Ustawienia folderu
Umieść na początku
Umieść na początku wyświetlanej listy folderów
- Klasa wyświetlania
- Bez klasy
- Klasa 1
- Klasa 2
Wyczyść wiadomości lokalne
Serwer poczty przychodzącej
Ustawienia serwera poczty przychodzącej
Serwer poczty wychodzącej
Ustawienia serwera poczty wychodzącej (SMTP)
Nazwa konta
- Twoje imię i nazwisko
+ Twoje imię i nazwisko
Powiadomienia
Wibracja
Wibruj
@@ -466,13 +445,13 @@
Nowa tożsamość
Adres UDW dla wysyłanych wiadomości (opcja)
Edytuj
- Przesuń w górę
- Przesuń w dół
+ Przesuń w górę
+ Przesuń w dół
Na początek (jako domyślna)
Usuń
Opis tożsamości
(Opcjonalny)
- Imię i nazwisko
+ Imię i nazwisko
(Opcjonalne)
Adres e-mail
(Wymagany)
@@ -489,15 +468,15 @@
Nie możesz użyć tożsamości bez podanego adresu e-mail
Najstarsze wiadomości na początku
Najnowsze wiadomości na początku
- Alfabetycznie, po temacie (A->Z)
- Alfabetycznie, po temacie (Z->A)
+ Alfabetycznie, według tematu (A->Z)
+ Alfabetycznie, według tematu (Z->A)
Alfabetycznie, według nadawcy (A->Z)
Alfabetycznie, według nadawcy (Z->A)
- Wiadomości oznaczone gwiazką jako pierwsze
+ Wiadomości oznaczone gwiazdką jako pierwsze
Wiadomości bez gwiazdki jako pierwsze
Nieprzeczytane wiadomości jako pierwsze
Przeczytane wiadomości jako pierwsze
- Wiadomości z załącznikami jako pierwsze
+ Wiadomości z załącznikami jako pierwsze
Wiadomości bez załączników jako pierwsze
Sortuj wg…
Data
@@ -531,14 +510,14 @@
Język
Nie znaleziono ustawień
Stała kolorystyka widoku wiadomości
- Wybierz kolorystykę z poziomu widoku wiadomości
- Użyj kolorystyki wskazanej w konfiguracji
+ Wybierz kolorystykę z poziomu widoku wiadomości
+ Użyj kolorystyki wskazanej w konfiguracji
Domyślny systemowy
- Synchronizacja w tle
+ Synchronizacja w tle
Nigdy
Zawsze
Gdy „Autosynchronizacja” jest włączona
- Zaznacz wszystko
+ Wybierz wszystkie
Sprawdzanie przez push
Do 5 folderów
Do 10 folderów
@@ -550,13 +529,13 @@
Do 1000 folderów
Animacje
Używaj efektów wizualnych
- Nawigacja klawiszem głośności w widoku wiadomości
+ Nawigacja klawiszem głośności w widoku wiadomości
Pokaż zintegrowaną skrzynkę odbiorczą
Pokaż liczbę oznaczonych gwiazdką
Zintegrowana odbiorcza
Nieprzeczytane wiadomości ze wszystkich kont
Integruj
- Pokazuj nieprzeczytane wiadomości w zintegrowanym widoku
+ Pokazuj nieprzeczytane wiadomości w zintegrowanym widoku
Żaden
Automatyczny (%s)
Rozmiar czcionki
@@ -572,7 +551,7 @@
Nadawca
Odbiorcy
Temat
- Godzina i data
+ Godzina i data
Treść wiadomości
Kompozycja wiadomości
Pole wprawadzania tekstu
@@ -587,14 +566,14 @@
Nie znaleziono odpowiedniej aplikacji.
Wysyłanie nieudane: %s
Zapisać wersję roboczą wiadomości?
- Zapisać czy porzucić wiadomość?
+ Zapisać czy odrzucić wiadomość?
Zapisać czy odrzucić zmiany?
- Usunąć wiadomość?
- Czy na pewno chcesz usunąć tą wiadomość?
+ Odrzucić wiadomość?
+ Czy na pewno chcesz odrzucić tę wiadomość?
Usunąć wiadomości lokalne?
- Wszystkie wiadomości lokalne z folderu zostaną usunięte. Wiadomości nie zostaną usunięte z serwera.
+ Wszystkie wiadomości lokalne z folderu zostaną usunięte. Wiadomości nie zostaną usunięte z serwera.
Wyczyść wiadomości
- Potwiedź usunięcie
+ Potwierdź usunięcie
Czy chcesz usunąć tę wiadomość\?
- Czy chcesz usunąć tę wiadomość?
@@ -674,7 +653,7 @@
Wyszukiwanie na serwerze nie powiodło się
Wyszukiwanie
Wyszukuj wiadomości na serwerze
- Połączenie sieciowe jest wymagane, aby korzystać z wyszukiwania na serwerze.
+ Połączenie sieciowe jest wymagane, aby korzystać z wyszukiwania na serwerze.
Zmień kolor przeczytanych
Inne tło wskazuje, że wiadomość została przeczytana
Widok wątków
@@ -685,22 +664,22 @@
Użyj widoku podzielonego ekranu
Zawsze
Nigdy
- W trybie poziomym
- Wybierz wiadomość z listy po lewej
+ W trybie poziomym
+ Wybierz wiadomość z listy po lewej
Wyświetl zdjęcie kontaktu
- Wyświetla zdjęcia konktaktów w widoku listy wiadomości
+ Wyświetla zdjęcia konktaktów w widoku listy wiadomości
Oznacz wszystkie jako przeczytane
Pokoloruj zdjęcia kontaktów
Używa kolorów, gdy brakuje zdjęć kontaktów
Widoczne czynności wiadomości
- Pokaż wybrane czynności w menu widoku wiadomości
+ Pokaż wybrane czynności w menu widoku wiadomości
Wczytywanie załącznika…
Wysyłanie wiadomości
Zapisywanie wersji roboczej
Pobieranie załącznika…
*Zaszyfrowane*
- Dodaj z kontaktów
+ Dodaj z kontaktów
DW
UDW
Do
@@ -714,8 +693,8 @@
Mobilny
Folderu wersji roboczych nie skonfigurowano dla tego konta!
Nie skonfigurowanego klucza dla tego konta! Sprawdź ustawienia.
- Aplikacja szyfrująca w niezgodnej wersji. Sprawdź ustawienia!
- Nie można połączyć się z dostawcą kryptografii, sprawdź ustawienia lub kliknij ikonę kryptografii, aby spróbować ponownie!
+ Aplikacja szyfrująca w niezgodnej wersji. Sprawdź ustawienia!
+ Nie można połączyć się z dostawcą kryptografii, sprawdź ustawienia lub kliknij ikonę kryptografii, aby spróbować ponownie!
Inicjalizacja szyfrowania typu „end-to-end” nie powiodła się. Sprawdź ustawienia.
Tryb PGP/INLINE nie obsługuje załączników!
Włącz PGP/INLINE
@@ -723,27 +702,27 @@
Włącz PGP Sign-Only
Wyłącz PGP Sign-Only
Tryb PGP/INLINE
- Ten e-mail został wysłany w formacie PGP/INLINE.\nPowinno to być użyte wyłącznie dla kompatybilności:
+ Ten e-mail został wysłany w formacie PGP/INLINE.\nPowinno to być użyte wyłącznie dla kompatybilności:
Niektóre klienty obsługują tylko ten format
Podpisy mogą ulec uszkodzeniu podczas przesyłania
Załączniki nie są obsługiwane
Rozumiem!
Wyłącz
- Utrzymuj włączone
+ Pozostaw włączone
Rozumiem!
Wyłącz
Pozostaw włączone
Tryb PGP sign-only
- W tym trybie twój klucz PGP zostanie użyty do utworzenia podpisu kryptograficznego niezaszyfrowanej wiadomości e-mail.
- Nie szyfruje to wiadomości e-mail, ale sprawdza, czy została wysłana z Twojego klucza.
+ W tym trybie Twój klucz PGP zostanie użyty do utworzenia podpisu kryptograficznego niezaszyfrowanej wiadomości e-mail.
+ Nie szyfruje to wiadomości e-mail, ale sprawdza, czy została wysłana z Twojego klucza.
Podpisy mogą ulec uszkodzeniu przy wysyłaniu do list mailingowych.
- W przypadku niektórych klientów, podpisy mogą być wyświetlane jako załączniki \'signature.asc\' .
+ W przypadku niektórych klientów, podpisy mogą być wyświetlane jako załączniki „signature.asc” .
Zaszyfrowane wiadomości są zawsze opatrzone podpisem.
Tekst jawny
podpis „end-to-end” zawiera błąd
- musisz w pełni pobrać wiadomość, aby przetworzyć podpis
+ musisz w pełni pobrać wiadomość, aby przetworzyć podpis
zawiera niewspierany podpis „end-to-end”
- Wiadomość jest zaszyfrowana, ale w niewspieranym formacie.
+ Wiadomość jest zaszyfrowana, ale w niewspieranym formacie.
Wiadomość jest zaszyfrowana, ale deszyfrowanie zostało przerwane.
podpisany „end-to-end” tekst jawny
od zaufanego dostawcy
@@ -754,8 +733,8 @@
ale klucz „end-to-end” nie jest uważany za bezpieczny
od nieznanego klucza „end-to-end”
Zaszyfrowana
- ale jest tu błąd deszyfrowania
- musisz w pełni pobrać wiadomość, aby odszyfrować
+ ale wystąpił błąd deszyfrowania
+ musisz w pełni pobrać wiadomość, aby odszyfrować
ale żadna aplikacja kryptograficzna nie jest skonfigurowana
Zaszyfrowana
ale nie „end-to-end”
@@ -770,7 +749,7 @@
ale dane „end-to-end” mają błędy
ale szyfrowanie nie jest uważane za bezpieczne
Odblokuj
- Ta część nie została zaszyfrowana i może nie być zabezpieczona.
+ Ta część nie została zaszyfrowana i może nie być zabezpieczona.
Niechroniony załącznik
Wczytywanie…
Anulowano odszyfrowywanie.
@@ -785,25 +764,25 @@
Szyfrowanie nie jest dostępne w trybie sign-only!
Niepodpisany tekst
Ta wiadomość e-mail jest zaszyfrowana
- Ta wiadomość e-mail została zaszyfrowana z użyciem OpenPGP.\n Aby ją odczytać, należy zainstalować i skonfigurować zgodną aplikację OpenPGP.
+ Ta wiadomość e-mail została zaszyfrowana z użyciem OpenPGP.\n Aby ją odczytać, należy zainstalować i skonfigurować zgodną aplikację OpenPGP.
Przejdź do ustawień
Szyfrowanie nie jest możliwe
- Część z wybranych odbiorców nie obsługuje tej funkcjonalności!
+ Część z wybranych odbiorców nie obsługuje tej funkcjonalności!
Włącz szyfrowanie
Wyłącz szyfrowanie
- Szyfrowanie wiadomości gwarantuje, że wiadomości mogą być odczytane tylko przez odbiorcę i nikogo innego.
- Szyfrowanie pojawi się tylko wtedy, gdy wszyscy odbiorcy wiadomości je obsługują, a wcześniej wysłali Ci wiadomość.
- Przełącz szyfrowanie klikając ten przycisk.
+ Szyfrowanie wiadomości gwarantuje, że wiadomości mogą być odczytane tylko przez odbiorcę i nikogo innego.
+ Szyfrowanie pojawi się tylko wtedy, gdy wszyscy odbiorcy wiadomości je obsługują, a wcześniej wysłali Ci wiadomość.
+ Przełącz szyfrowanie, klikając tę ikonę.
Zrozumiano
Cofnij
Wyłącz szyfrowanie
Szyfrowanie OpenPGP
Tryb wzajemny Autocrypt
Tryb wzajemny Autocrypt
- Wiadomości normalnie będą szyfrowane z wyboru lub kiedy odpowiadasz na szyfrowaną wiadomość.
- Jeśli nadawca i odbiorcy włączą tryb obustronnego automatycznego szyfrowania, szyfrowanie będzie włączone domyślnie.
+ Wiadomości normalnie będą szyfrowane z wyboru lub kiedy odpowiadasz na szyfrowaną wiadomość.
+ Jeśli nadawca i odbiorcy włączą tryb obustronnego automatycznego szyfrowania, szyfrowanie będzie włączone domyślnie.
Możesz kliknąć tutaj, aby dowiedzieć się więcej.
Ustawienia ogólne
Brak aplikacji dla OpenPGP
@@ -814,37 +793,32 @@
Błąd wewnętrzny: nieprawidłowe konto!
Błąd połączenia z %s!
Wyślij wiadomość konfiguracyjną Autocrypt
- Bezpiecznie wymieniaj z innymi urządzeniami konfigurację szyfrowania typu „end-to-end”
+ Bezpiecznie wymieniaj z innymi urządzeniami konfigurację szyfrowania typu „end-to-end”
Wiadomość konfiguracyjna Autocrypt
Wiadomość konfiguracyjna Autocrypt bezpiecznie udostępnia Twoją konfigurację szyfrowania typu „end-to-end” innym urządzeniom.
Wyślij wiadomość konfiguracyjną
Wiadomość zostanie wysłana na adres:
Generowanie wiadomości konfiguracyjnej…
Wysyłanie wiadomości do:
- Aby zakończyć, otwórz wiadomość na drugim urządzeniu i wpisz kod konfiguracyjny.
+ Aby zakończyć, otwórz wiadomość na drugim urządzeniu i wpisz kod konfiguracyjny.
Pokaż kod konfiguracyjny
Wiadomość konfiguracyjna Autocrypt
- Ta wiadomość zawiera wszystkie informacje do bezpiecznego wyeksportowania wszystkich ustawień oraz klucza Autocrypt z oryginalnego urządzenia.
-
-Aby skonfigurować Autocrypt na nowym urządzeniu, należy podążać za wyświetlonymi na nim wskazówkami.
-
-Tą wiadomość można zachować i użyć w formie kopii zapasowej twojego klucza prywatnego, aby to uczynić należy zachować hasło i przechowywać je w bezpiecznym miejscu.
-
- Podczas wysyłania wiadomości wystąpił błąd. Sprawdź połączenie sieciowe i konfigurację serwera poczty wychodzącej.
+ Ta wiadomość zawiera wszystkie informacje do bezpiecznego wyeksportowania wszystkich ustawień oraz klucza Autocrypt z oryginalnego urządzenia. Aby skonfigurować Autocrypt na nowym urządzeniu, należy podążać za wyświetlonymi na nim wskazówkami. Możesz zachować tę wiadomość i użyć jej jako kopii zapasowej swojego klucza prywatnego. Jeśli chcesz to zrobić, zapisz hasło i przechowuj je bezpiecznie.
+ Podczas wysyłania wiadomości wystąpił błąd. Sprawdź połączenie sieciowe i konfigurację serwera poczty wychodzącej.
Włącz
Wyłącz
Podczas wczytywania danych wystąpił błąd
Inicjowanie…
Oczekiwanie na nowe e-maile
- Uśpione, dopóki synchronizacja w tle nie będzie dozwolona
+ Uśpione, dopóki synchronizacja w tle nie będzie dozwolona
Uśpione, dopóki sieć nie będzie dostępna
Stuknij, aby dowiedzieć się więcej.
Informacje push
- Podczas korzystania z funkcji push, %1$s utrzymuje połączenie z serwerem pocztowym. Android wymaga wyświetlania ciągłego, gdy aplikacja jest aktywna w tle. %2$s
+ Podczas korzystania z funkcji push, %1$s utrzymuje połączenie z serwerem pocztowym. Android wymaga wyświetlania ciągłego, gdy aplikacja jest aktywna w tle. %2$s
Jednak Android pozwala również ukryć powiadomienie.
Dowiedz się więcej
Skonfiguruj powiadomienie
- Jeśli nie potrzebujesz natychmiastowych powiadomień o nowych wiadomościach, wyłącz funkcję push i użyj regularnego sprawdzania. Sprawdzanie w regularnych odstępach czasu sprawdza nową pocztę i nie wymaga powiadomienia.
+ Jeśli nie potrzebujesz natychmiastowych powiadomień o nowych wiadomościach, wyłącz funkcję push i użyj regularnego sprawdzania. Sprawdzanie w regularnych odstępach czasu sprawdza nową pocztę i nie wymaga powiadomienia.
Wyłącz funkcję push
Zaznacz
@@ -897,7 +871,7 @@ Tą wiadomość można zachować i użyć w formie kopii zapasowej twojego klucz
Skopiuj adres e-mail
- Skopiuj imię, nazwisko i adres e-mail
+ Skopiuj imię, nazwisko i adres e-mail
Adres e-mail
@@ -917,10 +891,12 @@ Tą wiadomość można zachować i użyć w formie kopii zapasowej twojego klucz
Stuknij, aby udzielić uprawnienia.
Zespół Thunderbird Mobile
Powiadomienia
- Dane techniczne i dotyczące użytkowania
+ Dane techniczne i dotyczące użytkowania
Zbieranie danych
- Udostępnia firmie Mozilla dane dotyczące wydajności, użytkowania, sprzętu i dostosowywania tej aplikacji, aby pomóc nam udoskonalić Thunderbirda
+ Udostępnia firmie Mozilla dane dotyczące wydajności, użytkowania, sprzętu i dostosowywania tej aplikacji, aby pomóc nam udoskonalić Thunderbirda
Włącz funkcję push
Włącz synchronizację
Pokaż ukryte foldery
+ Pokaż folder
+ Wesprzyj %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-pt-rBR/strings.xml b/legacy/ui/legacy/src/main/res/values-pt-rBR/strings.xml
index 9e244a4933b..e6a6da07f0a 100644
--- a/legacy/ui/legacy/src/main/res/values-pt-rBR/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-pt-rBR/strings.xml
@@ -307,12 +307,6 @@
Avançado
Configurações da conta
Notificações de novas mensagens
- Notificações de pastas
- Todas
- Apenas pastas de 1ª classe
- Pastas de 1ª e 2ª classe
- Todas, exceto as pastas de 2ª classe
- Nenhuma
Notificações de sincronização
Seu endereço de e-mail
Notifica, na barra de status, quando chegarem novas mensagens
@@ -401,27 +395,12 @@
dos últimos 3 meses
dos últimos 6 meses
do último ano
- Pastas a serem exibidas
- Todas
- Apenas pastas de 1ª classe
- Pastas de 1ª e 2ª classe
- Todas, exceto as pastas de 2ª classe
- Verificar pastas
- Todas
- Apenas pastas de 1ª classe
- Pastas de 1ª e 2ª classe
- Todas, exceto as pastas de 2ª classe
- Nenhuma
Sincronizar exclusões no servidor
Remove mensagens quando excluídas no servidor
O aplicativo de OpenPGP não foi encontrado - ele foi desinstalado?
Configurações da pasta
Exibir no grupo superior
Exibe perto do topo da lista de pastas
- Classe de exibição da pasta
- Nenhuma classe
- 1ª classe
- 2ª classe
Limpar mensagens locais
Servidor de recebimento
Configure o servidor recebimento de mensagens
@@ -917,7 +896,9 @@ Você pode guardar esta mensagem e usá-la como um backup da sua chave secreta.
Coleta de dados
Dados de uso e técnicos
Compartilha dados sobre performance, uso, hardware, e customização deste app com a Mozilla para nos ajudar a fazer o Thunderbird melhor
- Ativar Pusg
+ Ativar Push
Ativar sincronização
Mostrar pastas escondidas
+ Mostrar pasta
+ Apoie o %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-pt-rPT/strings.xml b/legacy/ui/legacy/src/main/res/values-pt-rPT/strings.xml
index 1456e5724cc..f2a7c909949 100644
--- a/legacy/ui/legacy/src/main/res/values-pt-rPT/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-pt-rPT/strings.xml
@@ -306,12 +306,6 @@
Avançado
Configurações da conta
Notificação de novos emails
- Notificações de pastas
- Todas
- Apenas pastas de 1ª classe
- Pastas de 1ª e 2ª classe
- Todas excepto pastas de 2ª classe
- Nenhuma
Notificações de sincronização
O seu endereço de email
Notificar na barra de estado na chegada de novos emails
@@ -400,27 +394,12 @@
os últimos 3 meses
os últimos 6 meses
o último ano
- Pastas para exibição
- Todas
- Apenas pastas de 1ª classe
- Pastas de 1ª e 2ª classe
- Todas excepto pastas de 2ª classe
- Verificar pastas
- Todas
- Apenas pastas de 1ª classe
- Pastas de 1ª e 2ª classe
- Todas excepto pastas de 2ª classe
- Nenhuma
Sincronizar as eliminações do servidor
Remove as mensagens quando eliminadas no servidor
Falta uma aplicação OpenPGP; foi desinstalada?
Configurações da pasta
Mostrar no grupo do topo
Mostrar junto ao topo da lista de pastas
- Classe de exibição da pasta
- Sem Classe
- 1ª classe
- 2ª classe
Apagar mensagens locais
Servidor de entrada
Configure o servidor de email de entrada
diff --git a/legacy/ui/legacy/src/main/res/values-pt/strings.xml b/legacy/ui/legacy/src/main/res/values-pt/strings.xml
new file mode 100644
index 00000000000..a6b3daec935
--- /dev/null
+++ b/legacy/ui/legacy/src/main/res/values-pt/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-ro/strings.xml b/legacy/ui/legacy/src/main/res/values-ro/strings.xml
index 4e75ea24b16..54d95501f71 100644
--- a/legacy/ui/legacy/src/main/res/values-ro/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ro/strings.xml
@@ -306,12 +306,6 @@ cel mult încă %d
Avansat
Setări cont
Notificări mail noi
- Dosare notificări
- Toate
- Doar dosare de Nivel 1
- Dosare de Nivel 1 și 2
- Toate mai puțin dosarele de Nivel 2
- Fără
Sincronizare notificări
Adresa ta de email
Notifică în bara de stare când sosește mail
@@ -400,27 +394,12 @@ cel mult încă %d
ultimele 3 luni
ultimele 6 luni
ultimul an
- Dosare de afișat
- Toate
- Doar dosare de Nivel 1
- Dosare de Nivel 1 și 2
- Toate mai puțin dosarele de Nivel 2
- Dosare interogate
- Toate
- Doar dosare de Nivel 1
- Dosare de Nivel 1 și 2
- Toate mai puțin dosarele de Nivel 2
- Nimic
Sincronizare mesaje șterse pe server
Elimină mesajele șterse pe server
Aplicație OpenPGP lipsă - a fost dezinstalată?
Setări dosar
Arată în grupul de sus
Arată aproape de partea de sus a listei de dosare
- Nivel de afișare dosar
- Nici o clasă
- Nivel 1
- Nivel 2
Curăță mesajele locale
Server primire
Configurare server primire
@@ -919,4 +898,6 @@ Poți păstra acest mesaj și să îl folosești drept copie de siguranță a ch
Activează sincronizarea
Activează trimiterile „push”
Afișează dosarele ascunse
+ Afișează dosarul
+ Suport %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-ru/strings.xml b/legacy/ui/legacy/src/main/res/values-ru/strings.xml
index de83bf47849..07eacd868e5 100644
--- a/legacy/ui/legacy/src/main/res/values-ru/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ru/strings.xml
@@ -309,12 +309,6 @@
Дополнительно
Настройки учётной записи
Уведомить о почте
- Уведомления папок
- Все
- Папки только 1-го класса
- Папки 1-го и 2-го классов
- Все, кроме папок 2-го класса
- Нет
Уведомить о проверке
Ваш адрес эл. почты
Показать уведомление о новой почте
@@ -403,27 +397,12 @@
3 месяца
6 месяцев
1 год
- Видимость папок
- Все
- Папки только 1-го класса
- Папки 1-го и 2-го классов
- Все, кроме папок 2-го класса
- Проверка папок
- Все
- Папки только 1-го класса
- Папки 1-го и 2-го классов
- Все, кроме папок 2-го класса
- Нет
Синхронное удаление
Удалять сообщения при удалении на сервере
Отсутствует OpenPGP-приложение – было удалено?
Настройки папки
Начало списка
Отображать ближе к началу списка папок
- Видимость
- Нет класса
- 1-й класс
- 2-й класс
Стереть локальные
Сервер входящих
Настройки сервера входящей почты
@@ -737,7 +716,7 @@
Не отключать
Режим PGP \"Только подпись\"
В этом режиме ваш PGP-ключ будет использоваться для создания криптографической подписи нешифрованного электронного письма.
- Адресат сможет убедиться, что сообщение подлинное и подписано Вашим ключом
+ Адресат сможет убедиться, что сообщение подлинное и подписано вашим ключом
Подписи могут повредиться при отправке нескольким адресатам
Подписи могут отображаться как вложенные файлы \"signature.asc\"
Всегда добавлять подпись к шифрованным сообщениям
@@ -927,4 +906,6 @@
Включить push
Показать скрытые папки
Включить синхронизацию
+ Показать папку
+ Поддержка %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-sk/strings.xml b/legacy/ui/legacy/src/main/res/values-sk/strings.xml
index bacee81d85f..2d629f950b0 100644
--- a/legacy/ui/legacy/src/main/res/values-sk/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-sk/strings.xml
@@ -273,12 +273,6 @@
Pokročilé
Nastavenia účtu
Oznámenia o nových správach
- Priečinky oznámení
- Všetky
- Len priečinky 1. triedy
- Priečinky 1. a 2. triedy
- Všetky okrem priečinkov 2. triedy
- Žiadne
Oznámenia o synchronizácii
Vaša e-mailová adresa
Oznamovať v stavovej lište, keď príde nová pošta
@@ -362,27 +356,12 @@
Posledné 3 mesiace
Posledných 6 mesiacov
Posledný rok
- Priečinky na zobrazenie
- Všetky
- Len priečinky 1. triedy
- Priečinky 1. a 2. triedy
- Všetky okrem priečinkov 2. triedy
- Synchronizované priečinky
- Všetky
- Len priečinky 1. triedy
- Priečinky 1. a 2. triedy
- Všetky okrem priečinkov 2. triedy
- Žiadne
Synchronizácia mazaní na serveri
Odstrániť správy, ktoré boli odstránené na serveri
Aplikácia pre OpenPGP chýba - bola odinštalovaná?
Nastavenia priečinku
Zobraziť v najvyššej skupine
Zobraziť v hornej časti zoznamu priečinkov
- Trieda zobrazenia priečinka
- Žiadna trieda
- 1. trieda
- 2. trieda
Vymazať správy
Server prichádzajúcej pošty
Nastaviť server prichádzajúcej pošty
diff --git a/legacy/ui/legacy/src/main/res/values-sl/strings.xml b/legacy/ui/legacy/src/main/res/values-sl/strings.xml
index 56a583490ef..d09c3be68b3 100644
--- a/legacy/ui/legacy/src/main/res/values-sl/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-sl/strings.xml
@@ -304,12 +304,6 @@ dodatnih %d sporočil
Napredne možnosti
Nastavitve računa
Obvestila za prejem nove pošte
- Prikaz obvestil
- Za vse ravni map
- Za mape 1. ravni
- Za mape 1. in 2. ravni
- Za vse, razen map 2. ravni
- Ne pokaži obvestil
Obvestila usklajevanja
Elektronski naslov
Pokaže obvestilo v vrstici stanja ob prihodu novega sporočila
@@ -398,27 +392,12 @@ dodatnih %d sporočil
Zadnjih 3 mesecev
Zadnjih 6 mesecev
Zadnjega leta
- Prikaz map
- Pokaži vse mape
- Pokaži le mape 1. ravni
- Pokaži mape 1. in 2. ravni
- Pokaži vse, razen map 2. ravni
- Izpraševanje map
- Izprašaj vse mape
- Izprašaj le mape 1. ravni
- Izprašaj mape 1. in 2. ravni
- Izprašaj vse, razen map 2. ravni
- Ne izprašuj map
Usklajevanje izbrisanih sporočil
Odstrani sporočila, ki so bila izbrisana na strežniku
Ni programa OpenPGP – ali je bila namestitev odstranjena?
Nastavitve mape
Pokaži mapo v zgornji skupini
Razvrsti mapo v zgornjo skupino map na seznamu
- Prikaz map
- Brez ravni
- Pokaži mape 1. ravni
- Pokaži mape 2. ravni
Počisti krajevna sporočila
Dohodni strežnik
Nastavitev strežnika dohodne pošte
diff --git a/legacy/ui/legacy/src/main/res/values-sq/strings.xml b/legacy/ui/legacy/src/main/res/values-sq/strings.xml
index 593c2c1e53b..e6bacd0981a 100644
--- a/legacy/ui/legacy/src/main/res/values-sq/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-sq/strings.xml
@@ -304,12 +304,6 @@
Të mëtejshme
Rregullime llogarie
Njoftime email-i të ri
- Dosje njoftimesh
- Krejt
- Vetëm dosje të Klasës I
- Dosje të Klasës I dhe II
- Krejt, hiq dosje të Klasës II
- Asnjë
Njoftime njëkohësimesh
Adresa juaj email
Njofto në shtyllë gjendjeje kur mbërrin postë
@@ -398,27 +392,12 @@
3 muajt e shkuar
6 muajt e shkuar
vitin e shkuar
- Dosje për tu shfaqur
- Krejt
- Vetëm dosje të Klasës I
- Dosje të Klasës I dhe II
- Krejt, hiq dosje të Klasës II
- Vili dosjet
- Krejt
- Vetëm dosje të Klasës I
- Dosje të Klasës I dhe II
- Krejt, hiq dosje të Klasës II
- Asnjë
Njëkohëso fshirje në shërbyes
Hiqi mesazhet kur janë fshirë në shërbyes
Mungon aplikacioni OpenPGP - mos është çinstaluar?
Rregullime dosjeje
Shfaqe në grupin e epërm
Shfaqe pranë kreut të listës së dosjeve
- Klasë shfaqjeje dosjesh
- Pa Klasë
- Klasa I
- Klasa II
Pastro mesazhet vendore
Shërbyes për marrje
Formësoni shërbyesin për marrje
@@ -904,4 +883,12 @@
Llogaria \"%s\" do të hiqet nga %s.
Kur përdoret Push, %1$s mban një lidhje me shërbyesin e postës. Android-i lyp shfaqjen e vazhdueshme të një njoftimi, teksa aplikacioni është aktiv në prapaskenë. %2$s
Ekipi i Thunderbird-it Për Celular
+ Grumbullim të dhënash
+ Të dhëna përdorimi dhe teknike
+ I jepen Mozilla-s të dhëna funksionimi, rreth hardware-it dhe përshtatjesh për këtë aplikacion, për të ndihmuar të bëhet më i mirë Thunderbird
+ Aktivizo njëkohësim
+ Njoftime
+ Shfaq dosjen
+ Përkrahni %s
+ Shfaq dosje të fshehura
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-sr/strings.xml b/legacy/ui/legacy/src/main/res/values-sr/strings.xml
index 142fc37d6d7..f2b81f19b3d 100644
--- a/legacy/ui/legacy/src/main/res/values-sr/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-sr/strings.xml
@@ -272,12 +272,6 @@
Напредно
Поставке налога
Обавештења о новој пошти
- Обавештења за фасцикле
- све
- само фасцикле I класе
- фасцикле I и II класе
- све осим фасцикли II класе
- ништа
Обавештења о провери
Ваша адреса е-поште
Обавести у траци стања кад стигне пошта
@@ -361,27 +355,12 @@
последња 3 месеца
последњих 6 месеци
последње године
- Фасцикле за приказ
- све
- само фасцикле I класе
- фасцикле I и II класе
- све осим фасцикли II класе
- Фасцикле за проверу
- све
- само фасцикле I класе
- фасцикле I и II класе
- све осим фасцикли II класе
- ништа
Синхронизуј серверска брисања
Уклони поруке када су обрисане са сервера
Нема ОпенПГП апликације. Да није деинсталирана?
Поставке фасцикли
Прикажи у групи на врху
Прикажи при врху на листи фасцикли
- Класа приказа фасцикле
- без класе
- I класа
- II класа
Очисти локалне поруке
Долазни сервер
Подешавања долазног сервера поште
diff --git a/legacy/ui/legacy/src/main/res/values-sv/strings.xml b/legacy/ui/legacy/src/main/res/values-sv/strings.xml
index 27c9e3b372b..b05e73b89bd 100644
--- a/legacy/ui/legacy/src/main/res/values-sv/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-sv/strings.xml
@@ -50,7 +50,7 @@
Flytta till utkast
Återarkivera…
Klar
- Kassera
+ Släng
Spara som utkast
Kontrollera e-post
Skicka meddelanden
@@ -156,7 +156,7 @@
Till:
Kopia:
%s skrev:
- %2$s skrev: (%1$s)
+ Den %1$s, %2$s skrev:
Du måste ange minst en mottagare.
Mottagarfältet innehåller ofullständig inmatning!
Hittar ingen e-postadress för denna kontakt.
@@ -182,7 +182,7 @@
Hämta hela meddelandet
via %1$s
Mer från denna avsändare
- Meddelandet kasserades
+ Meddelandet har slängts
Meddelandet sparat som utkast
Visa stjärnor
Stjärnor indikerar flaggade meddelanden
@@ -205,7 +205,7 @@
Ta bort
Ta bort stjärnmarkerade (i meddelandevyn)
Skräppost
- Kassera meddelandet
+ Släng meddelande
Markera alla meddelanden som lästa
Ta bort (från avisering)
@@ -304,12 +304,6 @@
Avancerat
Kontoinställningar
Aviseringar vid ny e-post
- Aviseringsmappar
- Alla
- Endast första klassens mappar
- Första och 2:a klassens mappar
- Alla utom 2:a klassens mappar
- Inga
Avisering vid synkronisering
Din e-postadress
Visa avisering i statusraden vid ankomst av e-post
@@ -398,27 +392,12 @@
senaste 3 månaderna
senaste 6 månaderna
senaste året
- Mappar att visa
- Alla
- Endast 1:a klassens mappar
- 1:a och 2:a klassens mappar
- Alla utom 2:a klassens mappar
- Mappar att kontrollera
- Alla
- Endast 1:a klassens mappar
- 1:a och 2:a klassens mappar
- Alla utom 2:a klassens mappar
- Inga
Synkronisera fjärrborttagning
Ta bort meddelanden när de tas bort från servern
Saknade OpenPGP-app - har den avinstallerats?
Mappinställningar
Visa i toppgruppen
Visa nära toppen av mapplistan
- Visningsklass för mapp
- Ingen klassning
- 1:a klass
- 2:a klass
Rensa lokalt lagrade meddelanden
Inkommande server
Konfigurera servern för inkommande e-post
@@ -582,11 +561,11 @@
Störst
Hittade ingen passande applikation för denna åtgärd.
Det gick inte att skicka: %s
- Spara utkast?
- Spara eller kassera detta meddelande?
- Spara eller kassera ändringar?
- Kassera meddelandet?
- Är du säker på att du vill kassera detta meddelande?
+ Spara meddelandeutkast?
+ Spara eller släng detta meddelande?
+ Spara eller släng ändringar?
+ Släng meddelande?
+ Är du säker på att du vill slänga detta meddelande?
Rensa lokala meddelanden?
Detta tar bort alla lokala meddelanden från mappen. Inga meddelanden tas bort från servern.
Rensa meddelanden
@@ -700,10 +679,10 @@
Arbete
Annat
Mobil
- Ingen Utkast mapp konfigurerad för detta konto!
+ Ingen mapp för utkast inställd för detta konto!
Ingen nyckel konfigurerad för detta konto! Kontrollera dina inställningar.
Kryptoleverantören använder inkompatibel version. Kontrollera dina inställningar!
- Kan inte ansluta till kryptoleverantör, granska dina inställningar eller klicka på kryptoikonen för nytt försök.
+ Kan inte ansluta till kryptoleverantör, kontrollera dina inställningar eller klicka på kryptoikonen för att försöka igen!
Det gick inte att initiera ände-till-ände-kryptering, kontrollera dina inställningar
PGP/INLINE läge stöder inte bilagor!
Aktivera PGP/INLINE
@@ -765,7 +744,7 @@
Försök igen
Krypterat meddelande måste hämtas för dekryptering.
Fel vid dekryptering av e-post
- Symboler stöds för närvarande inte.
+ Specialtecken stöds för närvarande inte!
Kan inte tolka adressen!
Dölj okrypterade signaturer
Endast krypterade signaturer visas
@@ -827,10 +806,10 @@ Du kan behålla detta meddelande och använda det som en säkerhetskopia för di
Sover tills nätverket är tillgängligt
Tryck för att läsa mer.
Push-info
- Men Android låter dig också dölja aviseringen.
+ Däremot ger Android också möjligheten att dölja den aviseringen.
Lär dig mer
Anpassa avisering
- Om du inte behöver omedelbara meddelanden om nya meddelanden bör du inaktivera Push och använda Polling. Polling kontrollerar regelbundet efter ny post och behöver inte meddelandet.
+ Om du inte behöver omedelbara aviseringar om nya meddelanden bör du inaktivera Push och använda Polling. Polling kontrollerar regelbundet efter nya mejl och behöver inte en ständig avisering.
Inaktivera Push
Välj
@@ -912,4 +891,7 @@ Du kan behålla detta meddelande och använda det som en säkerhetskopia för di
Datainsamling
Användning och teknisk data
Delar prestanda, användning, hårdvara och anpassningsdata om denna app med Mozilla för att hjälpa oss att göra Thunderbird bättre
+ Visa mapp
+ Stötta %s
+ När Push-notiser används har %1$s en kontinuerlig anslutning till mejlservern. Android kräver då att en ständig avisering visas medan appen är aktiv i bakgrunden. %2$s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-ta-rIN/strings.xml b/legacy/ui/legacy/src/main/res/values-ta-rIN/strings.xml
index 39f67c4d032..6b1c8c4fb78 100644
--- a/legacy/ui/legacy/src/main/res/values-ta-rIN/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-ta-rIN/strings.xml
@@ -134,12 +134,9 @@
ஒருபொழுதும்
மேம்பட்ட
கணக்கு அமைப்புகள்
- அனைத்தும்
அஞ்சல் அனுப்புதல்
படித்த இரசீது
கோப்புறைகள்
- அனைத்தும்
- அனைத்தும்
கோப்புறை அமைப்பு
தற்காலிக செய்திகள் நீக்கு
சேமி
diff --git a/legacy/ui/legacy/src/main/res/values-tr/strings.xml b/legacy/ui/legacy/src/main/res/values-tr/strings.xml
index 7cb48c3f665..092235cc6cd 100644
--- a/legacy/ui/legacy/src/main/res/values-tr/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-tr/strings.xml
@@ -179,11 +179,11 @@
İleti taslak olarak kaydedildi
Yıldızları göster
Yıldızlar işaretlenmiş iletileri gösterir
- Önizleme hatları
- İlgili isimleri göster
- İlgili e-posta adresleri yerine isimlerini göster
- Yukarıdaki konuya uyan
- Yukarıda konu satırındaki uyan isimleri gösterir
+ Ön izleme satırları
+ Yazışanların isimlerini göster
+ Yazışanların e-posta adresleri yerine isimlerini göster
+ Yazışan konunun üzerinde
+ Yazışanların isimlerini konu satırının altında değil de üstünde göster
Kişi isimlerini göster
Mümkün olduğunda rehberdeki alıcı isimlerini kullan
Kişileri renklendir
@@ -192,8 +192,8 @@
Düz metin iletiler gösterilirken sabit genişlikli yazı tipi kullan
İletileri otomatik sığdır
İletileri ekrana sığacak şekilde küçült
- Eylemleri onaylayın
- Seçilmiş eylemleri yaptığınız zaman bir diyalog göster
+ İşlemleri onayla
+ Bu işlemleri yaptığım zaman bir iletişim kutusu göster
Sil
Yıldızlıları sil (ileti görünümünde)
Spam
@@ -238,28 +238,28 @@
Yeni ileti sayısı
İleti sayısı ve gönderenler
Ekran kilidi açıkken olduğu gibi
- Sessiz Zaman
+ Sessiz zaman
Zil sesi, titreşim ve flaşı devre dışı bırak
Bildirimleri devre dışı bırak
- Sessiz Saatte tüm uyarıları kapat
- Sessiz Zaman başlangıcı
- Sessiz Zaman bitişi
- Bir yeni hesap kurun
+ Sessiz zamanda bildirimleri tamamen devre bırak
+ Sessiz zaman başlangıcı
+ Sessiz zaman bitişi
+ Yeni hesap kur
Bir iletiyi sildiğimde
Sunucudan silme
Sunucudan sil
Sunucuda okundu olarak işaretle
Sunucudan silinen iletileri temizle
Hemen
- Bilgi çekme zamanı
- Elle
+ Sorgulama sırasında
+ Manuel
Taslaklar klasörü
Gönderilmiş klasörü
Çöp klasörü
Arşiv klasörü
Spam klasörü
Yalnızca abone olduğum klasörleri göster
- Otomatik genişleyen klasör
+ Otomatik genişleyecek klasör
Hiçbir zaman
15 dakikada bir
30 dakikada bir
@@ -293,25 +293,19 @@
Gelişmiş
Hesap ayarları
Yeni e-posta bildirimleri
- Bildirimler klasörü
- Tümü
- Yalnızca 1. sınıf klasörler
- 1. ve 2. sınıf klasörler
- 2. sınıf klasörler dışında tümü
- Hiçbiri
Eşitleme bildirimleri
E-posta adresiniz
E-posta geldiğinde durum çubuğunda bildir
E-posta denetlenirken durum çubuğunda bildir
- Giden postayı içersin
- Gönderdiğim iletiler için bir bildirim göster
- Yalnızca kişiler
+ Giden e-postaları dahil et
+ Gönderdiğim iletiler için bildirim göster
+ Yalnızca rehberden
Yalnızca bilinen kişilerden gelen iletiler için bildirim göster
Sohbet iletilerini yok say
- Açılan iletiyi okundu olarak işaretle
- İleti okunmak üzere açıldığında okundu olarak işaretle
+ Açılan iletileri okundu olarak işaretle
+ İleti açılıp görüntülendiğinde okundu olarak işaretle
Silindiğinde okundu olarak işaretle
- Bir ileti silindiğinde okundu olarak işaretlemek
+ Bir ileti silindiğinde iletiyi okundu olarak işaretle
Bildirim kategorileri
Yeni ileti bildirimlerini ayarla
Hata ve durum bildirimlerini ayarla
@@ -319,45 +313,45 @@
Hayır
Rehberimdeki kişilerden
Herkesten
- Posta gönderiliyor
- Yanıtlarken orijinal iletiyi alıntıla
- Yanıtınıza orijinal ileti de eklensin.
- Alıntı metinden sonra yanıtla
- Orijinal ileti yanıtınızın üzerinde görünsün.
- Alıntılı yanıtta imzayı kaldır
- İmzalar alıntılanan iletilerden kaldırılsın
+ Posta gönderme
+ Yanıtlarken asıl iletiyi alıntıla
+ Yanıtıma asıl iletiyi de dahil et.
+ Yanıt alıntılanan metnin altında
+ Asıl ileti, yanıtınızın üzerinde görünecektir.
+ Yanıtta imzaları kaldır
+ Alıntılanan iletilerdeki imzalar kaldırılacaktır
İleti Biçimi
- Düz Metin (resimler ve biçimler kaldırılacak)
- HTML (resimler ve biçimler korunacak)
+ Düz metin (resimleri ve biçimlendirmeyi kaldır)
+ HTML (resimleri ve biçimlendirmeyi koru)
Otomatik
Cc/Bcc\'yi her zaman göster
Okundu raporu
Her zaman okundu raporu iste
- Alıntı tarzında yanıtla
+ Yanıt alıntılama stili
Ön ek (Gmail gibi)
- Başlık (Outlook, Yahoo!, Hotmail gibi)
+ Üst bilgi (Outlook gibi)
Gönderilmiş iletileri karşıya yükle
İletileri gönderdikten sonra Gönderilmiş klasörüne yükle
Genel ayarlar
Posta okuma
Posta alma
Klasörler
- Alıntılanmış metin öneki
+ Alıntılanan metin öneki
Uçtan uca şifreleme
OpenPGP desteğini etkinleştir
OpenPGP uygulamasını seç
Uçtan uca anahtarını yapılandır
Yapılandırılmış OpenPGP uygulaması yok
- %s\'e bağlı
+ Bağlandı: %s
Yapılandırılıyor…
Tüm taslakları şifreli olarak sakla
Tüm taslaklar şifreli olarak saklanacak
Taslakları yalnızca şifreleme etkinse şifrele
- Klasör bilgi çekme sıklığı
+ Klasör sorgulama sıklığı
Hesap rengi
Klasör ve hesap listesinde bu hesap için kullanılacak renk
Yerel klasör boyutu
- Şu kadar ileti al
+ İndirilecek en büyük ileti boyutu
1 KiB
2 KiB
4 KiB
@@ -372,9 +366,9 @@
2 MiB
5 MiB
10 MiB
- Her boyutta (sınır yok)
- İletileri eşzamanlama sıklığı
- Her zaman (sınır yok)
+ tüm boyutlar (sınır yok)
+ Eşitlenecek en eski ileti
+ tüm zamanlar (sınır yok)
bugün
son 2 gün
son 3 gün
@@ -386,31 +380,16 @@
son 3 ay
son 6 ay
son bir yıl
- Görüntülenecek klasörler
- Tümü
- Yalnızca 1. Sınıf klasörler
- 1. ve 2. Sınıf klasörler
- 2. Sınıf klasörler dışında tümü
- Bilgi çekilecek klasörler
- Tümü
- Yalnızca 1. Sınıf klasörler
- 1. ve 2. Sınıf klasörler
- 2. Sınıf klasörler dışında tümü
- Hiçbiri
- Eşzamanlama sunucusu silme işlemleri
- Sunucudan silinen iletileri kaldır
- OpenPGP uygulaması eksik - kaldırıldı mı?
+ Sunucudan silinenleri eşitle
+ Sunucu üzerinden silinen iletileri kaldır
+ OpenPGP uygulaması eksik. Kaldırılmış olabilir mi?
Klasör ayarları
Üst grupta göster
Klasör listesinin üstüne yakın göster
- Klasör Görüntüleme Sınıfı
- Sınıflama yok
- 1. Sınıf
- 2. Sınıf
Yerel iletileri temizle
Gelen sunucusu
Gelen posta sunucusunu yapılandır
- Giden sunucu
+ Giden sunucusu
Giden posta (SMTP) sunucusunu yapılandır
Hesap adı
Adınız
@@ -435,18 +414,18 @@
Mavi
Sarı
Camgöbeği
- Macenta
+ Fuşya
İleti oluşturma seçenekleri
- Bileşen öntanımlıları
- Varsayılan Kimden, Bcc ve imzayı ayarlayın
+ Oluşturma varsayılanları
+ Varsayılan Kimden, Bcc ve imzayı ayarla
Kimlikleri yönet
- \\imden\' adreslerini ve imzaların alternatiflerini ayarlayın
+ Alternatif \'Kimden\' adreslerini ve imzaları ayarla
Kimlikleri yönet
- Kimlik yönetimi
- Kimlik düzenle
+ Kimliği yönet
+ Kimliği düzenle
Kaydet
Yeni kimlik
- Bütün iletiler için kullanılacak Gizli
+ Tüm iletilere Bcc ekle
Düzenle
Yukarı taşı
Aşağı taşı
@@ -458,7 +437,7 @@
(İsteğe bağlı)
E-posta adresi
(Gerekli)
- Yanıt adresi
+ Yanıt (reply-to) adresi
(İsteğe bağlı)
İmza
(İsteğe bağlı)
@@ -466,15 +445,15 @@
İmza
İlk kimlik
Kimlik seç
- Olarak gönderin
- Son kimliğinizi kaldıramazsınız
- Bir e-posta adressiz kimlik kullanamazsınız
+ Farklı gönderici
+ Tek kimliğinizi kaldıramazsınız
+ E-posta adresi olmadan kimlik kullanamazsınız
Önce ilk gelen iletiler
- Önce en son gelen iletiler
- Konuyu alfabetik sırala
- Konuyu ters alfabetik sırala
+ Önce son gelen iletiler
+ Konuya göre alfabetik
+ Konuya göre tersten alfabetik
Gönderene göre alfabetik
- Gönderene göre ters alfabetik
+ Gönderene göre tersten alfabetik
Önce yıldızlı iletiler
Önce yıldızsız iletiler
Önce okunmamış iletiler
@@ -483,7 +462,7 @@
Önce eksiz iletiler
Sırala…
Tarih
- Varış
+ Geliş
Konu
Gönderen
Yıldız
@@ -492,14 +471,14 @@
Hesabı Kaldır
Klasör adı içeriği
İmza konumu
- Saklanan metinden önce
- Alınan iletiden sonra
+ Alıntılanan iletiden önce
+ Alıntılanan iletiden sonra
Uygulama temasını kullan
Koyu
Açık
- Sistem öntanımlısını kullan
- Görüntü
- Genel
+ Sistem varsayılanını kullan
+ Görünüm
+ Global
Hata ayıklama
Gizlilik
Ağ
@@ -509,17 +488,17 @@
İletiler
Tema
İleti görünümü teması
- Besteci teması
+ Oluşturucu teması
Dil
Ayar bulunamadı
Sabit ileti teması
- İletiyi görüntülerken kullanılacak ileti görünüm temasını seçin
- Sabit ileti görüntüleme teması kullan
+ İleti görüntülenirken kullanılacak ileti görünüm temasını seçin
+ Sabit bir ileti görünüm teması kullan
Sistem varsayılanları
- Arka plan eşzamanlaması
+ Arka planda eşitleme
Hiçbir zaman
Her zaman
- \'Otomatik eşzamanlama\' işaretlendiğinde
+ \'Otomatik eşitle\' işaretlendiğinde
Tümünü seç
Anında ilet ile denetlenecek en fazla klasör sayısı
5 klasör
@@ -532,12 +511,12 @@
1000 klasör
Animasyon
Gösterişli görsel efektleri kullan
- Birleşik Gelen Kutusunu Göster
- Yıldızlanan sayısını göster
+ Birleşik gelen kutusunu göster
+ Yıldızlı sayısını göster
Birleşik Gelen Kutusu
- Bütün iletiler birleşik gelen kutusunda
+ Tüm iletiler birleşik klasörlerde
Birleştir
- Tüm iletiler Birleşik Gelen Kutusunda gösterilir
+ Tüm iletiler Birleşik Gelen Kutusu\'nda gösterilir
Hiçbiri
Otomatik (%s)
Yazı tipi noyutu
@@ -546,7 +525,7 @@
Konu
Gönderen
Tarih
- Önizleme
+ Ön izleme
İletiler
Hesap adı
@@ -564,11 +543,11 @@
Orta
Büyük
Daha büyük
- Bu eylem için uygun program bulunamadı.
+ Bu eylem için uygun uygulama bulunamadı.
Gönderilemedi: %s
İleti taslağı kaydedilsin mi?
- Bu ileti kaydedilsin veya silinsin mi\?
- Değişikliklerden vazgeç veya kaydet?
+ Bu ileti kaydedilsin mi yoksa silinsin mi?
+ Değişiklikler kaydedilsin mi yoksa silinsin mi?
İleti silinsin mi?
Bu iletiyi silmek istediğinizden emin misiniz?
Yerel iletiler temizlensin mi?
@@ -577,21 +556,21 @@
Silmeyi onayla
Bu iletiyi silmek istiyor musunuz?
- - Bu iletiyi silmek istiyor musunuz\?
- - %1$d iletiyi silmek istiyor musunuz\?
+ - Bu iletiyi silmek istediğinizden emin misiniz?
+ - %1$d iletiyi silmek istediğinizden emin misiniz?
Evet
Hayır
Tüm iletileri okundu olarak işaretlemeyi onayla
Tüm iletileri okundu olarak işaretlemek istiyor musunuz?
- Çöpü boşaltmayı onayla
- Çöp klasörünü boşaltmak istiyor musun?
+ Çöp kutusunu boşaltmayı onayla
+ Çöp kutusu klasörünü boşaltmak istediğinizden emin misiniz?
Evet
Hayır
Spam klasörüne taşımayı onayla
- - Bu iletiyi gerçekten istenmeyen klasörüne taşımak istiyor musunuz\?
- - %1$d iletiyi gerçekten istenmeyen klasörüne taşımak istiyor musunuz\?
+ - Bu iletiyi spam klasörüne taşımak istediğinizden emin misiniz?
+ - %1$d iletiyi spam klasörüne taşımak istediğinizden emin misiniz?
Evet
Hayır
@@ -623,7 +602,7 @@
Telefon numarası
E-posta gönder
Kişilere kaydet
- E-posta adresini panoya kopyala
+ Adresi panoya kopyala
E-posta adresi
Tümü
10
@@ -634,7 +613,7 @@
500
1000
Sunucu arama limiti
- İstek sunucuya gönderiliyor
+ Sorgu sunucuya gönderiliyor
- %d sonuç getiriliyor
- %d sonuç getiriliyor
@@ -643,114 +622,113 @@
- %2$d sonuçtan %1$d tanesi alınıyor
- %2$d sonuçtan %1$d tanesi alınıyor
- Başarısız uzaktan arama
+ Uzaktan arama başarısız
Ara
Sunucuda ileti ara
Sunucuda arama için ağ bağlantısı gereklidir.
Okunduğunda rengi değiştir
- İleti okunduğunda farklı bir arkaplan gösterilecek
- Konu görünümü
- İletileri konuşmaya göre gruplandır
- Veri tabanı güncelleniyor
- Veri tabanı güncelleniyor…
- \"%s\" hesabı veri tabanı güncelleniyor
- Bölünmüş ekran göster
+ İleti okunduğunda farklı bir arka plan gösterilecektir
+ Dizi görünümü
+ İletileri yazışmaya göre gruplandır
+ Veritabanları yükseltiliyor
+ Veritabanları yükseltiliyor…
+ \"%s\" hesabının veritabanı yükseltiliyor
+ Bölünmüş ekranı göster
Her zaman
Hiçbir zaman
Yatay çevrildiğinde
- Sol taraftan bir ileti seçin
+ Lütfen sol taraftan bir ileti seçin
Kişi resimlerini göster
İleti listesinde kişi resimlerini göster
- Tümünü okundu say
+ Tümünü okundu olarak işaretle
Kişi resimlerini renklendir
Eksik kişi resimlerini renklendir
- İleti eylemlerini görünür yap
- İleti görünüm menüsünde seçilen eylemleri göster
- Ekler yükleniyor…
+ Görünecek ileti işlemleri
+ İletilerin görünüm menüsünde seçilen işlemleri göster
+ Ek yükleniyor…
İleti gönderiliyor
Taslak kaydediliyor
- Ekler alınıyor…
+ Ek alınıyor…
*Şifreli*
- Kişilerden Ekle
- Kopya
- Gizli Kopya
+ Kişilerden ekle
+ Cc
+ Bcc
Kime
Kimden
- Yanıtla
+ Yanıt adresi
<Bilinmeyen Alıcı>
<Bilinmeyen Gönderici>
Ev
İş
Diğer
Mobil
- Bu hesap için Taslak klasörü ayarlanmamış!
- Bu hesap için bir anahtar yapılandırılmadı! Ayarlarınızı gözden geçirin.
- Şifreleme sağlayıcısı uyumsuz uyarlama kullanıyor.Lütfen ayarlarınızı gözden geçirin!
- Şifreleme sağlayıcısına bağlanılamadı, ayarlarınızı gözden geçirin veya yeniden denemek için şifreleme simgesine tıklayın!
- Uçtan uca şifreleme başlatılamadı, lütfen ayarlarınızı gözden geçirin
- PGP/INLINE kipi eklentileri desteklemez!
+ Bu hesap için Taslaklar klasörü yapılandırılmamış!
+ Bu hesap için anahtar yapılandırılmamış! Ayarlarınızı gözden geçirin.
+ Kripto sağlayıcısı uyumsuz bir sürüm kullanıyor. Lütfen ayarlarınızı gözden geçirin!
+ Kripto sağlayıcısına bağlanılamadı. Ayarlarınızı gözden geçirin veya yeniden denemek için şifreleme simgesine tıklayın.
+ Uçtan uca şifreleme başlatılamadı. Lütfen ayarlarınızı gözden geçirin
+ PGP/INLINE kipi dosya eklerini desteklemez!
PGP/INLINE\'ı etkinleştir
PGP/INLINE\'ı devre dışı bırak
PGP yalnızca imza etkin
PGP yalnızca imza devre dışı
PGP/INLINE kipi
- E-posta PGP/INLINE biçiminde gönderilir.
-\nBu yalnızca uyumluluk için kullanılmalıdır:
+ E-posta PGP/INLINE biçiminde gönderilir.\nBu yalnızca uyumluluk için kullanılmalıdır:
Bazı istemciler yalnızca bu biçimi destekler
- Geçiş sırasında imzalar bozulabilir
- Eklentiler desteklenmiyor
+ Aktarım sırasında imzalar bozulabilir
+ Dosya ekleri desteklenmez
Anladım!
- Devre dışı
- Koruma etkinleştirildi
+ Devre dışı bırak
+ Etkin halde tut
Anladım!
- Devre dışı
- Koruma etkinleştirildi
+ Devre dışı bırak
+ Etkin halde tut
PGP Yalnızca İmza Kipi
- Bu modda, PGP anahtarınız, şifrelenmemiş bir e-postanın şifreleme imzasını oluşturmak için kullanılacaktır.
- Bu, e-postayı şifreli yapmaz, fakat sizin anahtarınızdan gönderildiğini doğrular.
- İmzalar posta listelerine gönderildiğinde kırılabilir.
+ Bu modda PGP anahtarınız, şifrelenmemiş bir e-postanın kriptografik imzasını oluşturmak için kullanılacaktır.
+ Bu işlem e-postayı şifrelemez, sadece sizin anahtarınızdan gönderildiğini doğrular.
+ E-posta listelerine gönderilen imzalar bozulabilir.
İmzalar bazı istemcilerde \'signature.asc\' ekleri olarak görüntülenebilir.
Şifrelenmiş iletiler her zaman bir imza içerir.
Düz metin
uçtan uca imza bir hata içeriyor
- İmza işlemi için ileti tamamen indirilmelidir
+ imzayı işlemek için ileti tamamen indirilmelidir
desteklenmeyen uçtan uca imza içeriyor
İleti şifreli, fakat desteklenmeyen bir biçim içinde.
İleti şifreli, fakat şifre çözme iptal edildi.
Uçtan uca imzalanmış düz metin
doğrulanmış imzalayandan
- İmzalı metin
- uçtan uca anahtar gönderenle eşleşmedi
- uçtan uca anahtarın süresi doldu
- uçtan uca anahtar geçersiz kılındı
- uçtan uca anahtar güvenli sayılamaz
+ İmzalı düz metin
+ ama uçtan uca anahtar gönderenle eşleşmedi
+ ama uçtan uca anahtarın süresi doldu
+ ama uçtan uca anahtar iptal edildi
+ ama uçtan uca anahtar güvenli sayılmıyor
bilinmeyen uçtan uca anahtardan
Şifreli
- bir şifre çözme hatası var
- şifre çözümü için ileti tamamen indirilmelidir
- yapılandırılmış bir şifre uygulaması yok
- Şifreli
- uçtan uca değil
- Uçtan Uca şifreli
+ ama bir deşifre hatası oluştu
+ deşifre için ileti tamamen indirilmelidir
+ ama yapılandırılmış kripto uygulaması yok
+ Şifreli
+ ama uçtan uca değil
+ Uçtan uca şifreli
doğrulanmış göndericiden
Şifreli
bilinmeyen uçtan uca anahtardan
- uçtan uca anahtar gönderenle eşleşmedi
- uçtan uca anahtarın süresi doldu
- uçtan uca anahtar geçersiz kılındı
- uçtan uca anahtar güvenli sayılamaz
- uçtan uca veri hataları var
- ancak şifreleme güvenli olarak değerlendirilmedi
+ ama uçtan uca anahtar gönderenle eşleşmedi
+ ama uçtan uca anahtarın süresi doldu
+ ama uçtan uca anahtar iptal edilmiş
+ ama uçtan uca anahtar güvenli sayılmıyor
+ ama uçtan uca veri hataları var
+ ama şifreleme güvenli olarak değerlendirilmedi
Kilidi aç
Bu bölüm şifreli değil, güvensiz olabilir.
Korunmasız Eklenti
Yükleniyor…
Şifre çözme iptal edildi.
- Tekrar dene
+ Yeniden dene
Şifre çözümü için şifreli iletiler indirilmelidir.
E-posta şifre çözme hatası
- Var olan özgün karakterler desteklenmiyor!
+ Özel karakterler henüz desteklenmiyor!
Adres çözümleme hatası!
Şifrelenmemiş imzaları gizle
Yalnızca şifreli imzalar görüntülenecek
@@ -758,9 +736,8 @@
Yalnızca imza kipinde şifreleme kullanılamaz!
İmzasız Metin
Bu e-posta şifreli
- Bu e-posta OpenPGP ile şifrelendi.
-\nOkumak için uyumlu bir OpenPGP uygulaması kurup yapılandırmalısınız.
- Ayarlara Git
+ Bu e-posta OpenPGP ile şifrelendi.\nOkumak için uyumlu bir OpenPGP uygulaması yükleyip yapılandırmalısınız.
+ Ayarlara git
Şifreleme yapılamaz
@@ -779,9 +756,9 @@
İletiler normalde seçilerek veya şifrelenmiş bir iletiyi yanıtlarken şifrelenecektir.
Hem gönderen hem de alıcının karşılıklı kipi etkinse, şifreleme öntanımlı olarak etkinleştirilir.
Daha fazlasını öğrenmek için buraya tıkla .
- Genel Ayarlar
- Kurulu OpenPGP uygulaması yok
- Kur
+ Genel ayarlar
+ Yüklenmiş OpenPGP uygulaması yok
+ Yükle
İleti konularını şifrele
Bazı alıcılar tarafından desteklenmeyebilir
İç hata: Geçersiz hesap!
@@ -879,7 +856,7 @@
İttirme Bilgileri
Geniş
Göster
- Bir e-posta sohbetine ait iletiler için bildirim gösterme
+ E-posta sohbetlerine ait iletiler için bildirim gösterme
İleti ayrıntıları yüklenirken bir hata oluştu.
Kişilere ekle
Kompakt
@@ -888,7 +865,7 @@
Bir iletiyi sildikten veya taşıdıktan sonra
İttirmeyi Devre Dışı Bırak
Hesap kaldırılıyor…
- İleti görünümünde ses tuşu ile gezinti
+ İleti görünümünde ses seviyesi düğmesiyle gezinti
Yeni iletiler hakkında anlık bildirimlere ihtiyacınız yoksa, ittirmeyi devre dışı bırakmalı ve bilgi çekmeyi kullanmalısınız. Bilgi çekme, düzenli aralıklarla yeni e-posta olup olmadığını denetler ve bildirime ihtiyaç duymaz.
Uzak resimleri göster
Geçerli iletide kal
@@ -905,7 +882,9 @@
Kullanım verileri ve teknik veriler
Veri toplama
Thunderbird\'ü daha iyi hale getirebilmemiz için bu uygulama hakkındaki performans, kullanım, donanım ve özelleştirme verilerini Mozilla ile paylaşır
- İttirmeyi etkinleştir
- Eşzamanlamayı etkinleştir
+ Anlık bildirimleri etkinleştir
+ Eşitlemeyi etkinleştir
Gizli klasörleri göster
+ Klasörü göster
+ %s\'ü destekleyin
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-uk/strings.xml b/legacy/ui/legacy/src/main/res/values-uk/strings.xml
index 22014608b5c..bef44fd1167 100644
--- a/legacy/ui/legacy/src/main/res/values-uk/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-uk/strings.xml
@@ -7,7 +7,7 @@
The K-9 Dog Walkers
Програмний код
Ліцензія Apache версії 2.0
- Проект з відкритим кодом
+ Проєкт з відкритим кодом
Сайт
Отримати допомогу
Форум
@@ -17,27 +17,27 @@
Не вдалося завантажити список змін.
Версія %s
Що нового
- Показувати останні зміни при оновленні додатка
+ Показувати останні зміни після оновлення застосунку
- Дізнатися, що нового у цьому релізі
+ Дізнайтеся, що нового у цьому випуску
Показати
- Розробники
+ Автори
Облікові записи
- Написати новий лист
+ Написати
Відповісти
Відповісти всім
Переслати
Переслати як вкладення
Вибрати теку
- Посунути до…
+ Перемістити до…
Копіювати до…
- %d вибрано
+ Вибрано %d
Надіслати
- Не зазначено тему; натисніть знову, щоб відправити лист без теми
+ Не вказано тему, натисніть знову, щоб надіслати без неї
Відповісти
Відповісти всім
Видалити
@@ -50,21 +50,21 @@
Перемістити в Чернетки
Перемістити…
Готово
- Скасувати зміни
+ Відкинути
Зберегти як чернетку
Перевірити пошту
Надіслати повідомлення
Оновити список тек
Знайти теку
Додати обліковий запис
- Написати новий лист
+ Написати
Пошук
Шукати всюди
Результати пошуку
Нові повідомлення
- Керування теками
+ Керувати теками
Налаштування облікового запису
- Видалити обліковий запис
+ Вилучити обліковий запис
Позначити прочитаним
Поділитися
Вибрати відправника
@@ -74,10 +74,10 @@
Відписатися
Показати заголовки
- - Адресу скопійовано до комірки обміну
- - Адресу скопійовано до комірки обміну
- - Адреси скопійовано до комірки обміну
- - Адреси скопійовано до комірки обміну
+ - Адресу скопійовано до буфера обміну
+ - Адреси скопійовано до буфера обміну
+ - Адреси скопійовано до буфера обміну
+ - Адреси скопійовано до буфера обміну
Текст теми скопійовано в буфер обміну
Перемкнути на темну тему
@@ -89,24 +89,23 @@
Додати вкладення
Очистити Кошик
Остаточно видалити
- Про додаток
+ Про застосунок
Налаштування
- (Немає теми)
+ (Без теми)
Немає відправника
Завантаження повідомлень\u2026
Помилка з’єднання
Повідомлення не знайдено
Помилка завантаження повідомлення
- Завантажити
- ще %d листів
+ Завантажити \u0020ще %d наступних
%.1f ГБ
%.1f МБ
%.1f кБ
%d Б
- %d нове повідомлення
- - %d нових повідомлень
+ - %d нові повідомлення
- %d нових повідомлень
- %d нових повідомлень
@@ -119,57 +118,57 @@
Архівувати
Архівувати всі
Спам
- Помилка сертифікату
- Помилка сертифікату для %s
- Перевірте налаштування вашого серверу
- Помилка автентифікації
- Помилка автентифікації для %s. Змініть налаштування сервера.
+ Помилка сертифіката
+ Помилка сертифіката для %s
+ Перевірте налаштування вашого сервера
+ Не вдалося автентифікувати
+ Збій автентифікації для %s. Змініть налаштування сервера.
- Збій сповіщення
+ Помилка сповіщення
- Під час створення системного сповіщення щодо нового повідомлення виникла помилка. Найчастіше це стається через відсутність звуку для сповіщення.\n\nТоркніться для переходу до налаштування сповіщення.
+ Сталася помилка під час створення системного сповіщення про нове повідомлення. Найчастіше це стається через відсутність звуку сповіщення.\n\nТоркніться, щоб відкрити налаштування сповіщень.
Перевірка пошти: %1$s:%2$s
Перевірка пошти
Надсилання пошти: %s
Надсилання пошти
:
- Синхронізувати (пуш)
- Відображається під час очікування нових повідомлень
+ Синхронізація (Push)
+ Показується під час очікування нових повідомлень
Повідомлення
Сповіщення, пов\'язані з повідомленнями
Різне
- Різні сповіщення (про помилки тощо)
- Не вдалося надіслати деякі повідомлення
+ Різні сповіщення, наприклад, про помилки тощо.
+ Не вдалося надіслати повідомлення
Версія
Увімкнути ведення журналу налагодження
Записувати додаткову діагностичну інформацію
Записувати конфіденційну інформацію
- Може відображати паролі в журналах.
- Експортувати журнали
- Експорт успішний. Журнали можуть містити чутливі дані. Обачно обирайте адресата.
+ Може показувати паролі в журналах.
+ Експорт журналів
+ Експортовано. Журнали можуть містити конфіденційні дані. Будьте обачними щодо тих, кому їх надсилаєте.
Не вдалося експортувати.
Завантажити більше повідомлень
- До:%s
+ Кому:%s
Тема
Текст повідомлення
Підпис
- -------- Вихідне повідомлення --------
+ -------- Початкове повідомлення --------
Тема:
Надіслано:
Від:
Кому:
Копія:
- %s написав(-ла):
- %1$s, %2$s написав(-ла):
+ %s пише:
+ %1$s, %2$s пише:
Додайте принаймні одного адресата.
Поле адресата містить неповні дані!
- У цього контакту не знайдено жодної адреси електронної пошти.
- Деякі вкладення не можуть бути переслані, бо вони не завантажилися.
- Повідомлення не може бути переслане, тому що деякі вкладення не завантажені.
+ Не вдалося знайти адресу е-пошти для цього контакту.
+ Деякі вкладення не можуть бути переслані, оскільки їх не завантажено.
+ Повідомлення не може бути переслане, оскільки деякі вкладення не завантажені.
Включити цитоване повідомлення
- Видалити цитований текст
+ Вилучити цитований текст
Редагувати цитований текст
- Видалити вкладення
+ Вилучити вкладення
Кому:
Копія:
Прихована копія:
@@ -182,14 +181,14 @@
мені
Показати зображення
- Не знайдено додаток для перегляду %s.
- Завантажити усе повідомлення
+ Не знайдено переглядача %s.
+ Завантажити все повідомлення
за допомогою %1$s
Більше від цього відправника
- Повідомлення скасовано
+ Повідомлення відкинуто
Повідомлення збережено як чернетку
Показувати зірочки
- Зірочки показують відмічені повідомлення
+ Зірочки позначають обрані повідомлення
Рядки попереднього перегляду
Показувати імена відправників
Показувати імена відправників замість їх електронних адрес
@@ -197,35 +196,35 @@
Показувати імена відправників над темою, а не під нею
Показувати імена контактів
Використовувати імена одержувачів із Контактів, якщо це можливо
- Позначати контакти кольором
- Позначати кольором імена з вашого списку контактів
+ Забарвлювати контакти
+ Забарвлювати імена з вашого списку контактів
Колір імені контакту
Моноширинні шрифти
- Використовувати моноширинний шрифт для відображення звичайних текстових повідомлень
- Припасовувати текст повідомлень до ширини екрану
- Стискати повідомлення до ширини екрану
+ Використовувати моноширинний шрифт для показу звичайних текстових повідомлень
+ Допасовувати текст повідомлень до ширини екрана
+ Стискати текст повідомлень до ширини екрана
Підтвердження дій
- Показати діалогове вікно щоразу, коли ви виконуєте вибрані дії
+ Показувати діалогове вікно щоразу, коли виконується вибрана дія
Видалити
- Видалити позначене зірочкою (при перегляді повідомлення)
+ Видалити позначене зірочкою (під час перегляду повідомлення)
Спам
- Скасувати повідомлення
- Позначити всі повідомлення як прочитані
+ Відкинути повідомлення
+ Позначити всі повідомлення прочитаними
Видалити (зі сповіщення)
- Змахи
+ Жести
- Змах вправо
+ Посування вправо
- Змах вліво
+ Посування вліво
- Жодна
+ Нічого
- Перемкнути вибір
+ Вибрати лист
Позначити прочитаним/непрочитаним
- Додати/вилучити зірку
+ Додати/прибрати зірочку
Архівувати
@@ -238,21 +237,21 @@
Щільність
Компактна
Типова
- Розслаблена
- Приховати поштовий клієнт
- Прибрати K-9 User-Agent з поштових заголовків
- Приховати часову зону
- Використовувати UTC замість місцевого часу в заголовках листів та відповідей
+ Вільна
+ Сховати поштовий клієнт
+ Прибрати User-Agent з заголовків пошти
+ Сховати часовий пояс
+ Використовувати UTC замість місцевого часу в заголовках пошти та відповідей
Показувати кнопку \"Видалити\"
Ніколи
У сповіщенні з одним повідомленням
Завжди
Сповіщення на заблокованому екрані
Без сповіщень на заблокованому екрані
- Ім\'я додатку
+ Назва застосунку
Лічильник нових повідомлень
Кількість повідомлень і відправники
- Так само, як і при розблокованому екрані
+ Так само як на розблокованому екрані
Тиха Година
Вимкнути звук, вібрацію та блимання у нічний час
Вимкнути сповіщення
@@ -263,36 +262,36 @@
Коли я видаляю повідомлення
Не видаляти на сервері
Видаляти на сервері
- Позначити як прочитане на сервері
+ Позначати прочитаним на сервері
Стирати видалені повідомлення на сервері
Негайно
- При опитуванні сервера
+ Під час опитування сервером
Вручну
- Назва теки Чернеток
- Назва теки Надісланих
- Назва теки Кошику
- Назва теки Архіву
- Назва теки Спам
- Показувати лише теки, на які здійснено підписку
+ Тека «Чернетки»
+ Тека «Надіслані»
+ Тека «Кошик»
+ Тека «Архів»
+ Тека «Спам»
+ Показувати лише теки, на які ви підписані
Автоматично відкривати теку
Ніколи
- Кожні 15 хвилин
- Кожні 30 хвилин
- Кожної години
- Кожні 2 години
- Кожні 3 години
- Кожні 6 годин
- Кожні 12 годин
- Кожні 24 години
+ Що 15 хвилин
+ Що 30 хвилин
+ Щогодини
+ Що 2 години
+ Що 3 години
+ Що 6 годин
+ Що 12 годин
+ Щодоби
Оновлювати з’єднання IMAP IDLE
- Кожні 2 хвилини
- Кожні 3 хвилини
- Кожні 6 хвилин
- Кожні 12 хвилин
- Кожні 24 хвилини
- Кожні 36 хвилин
- Кожні 48 хвилин
- Кожні 60 хвилин
+ Що 2 хвилини
+ Що 3 хвилини
+ Що 6 хвилин
+ Що 12 хвилин
+ Що 24 хвилини
+ Що 36 хвилин
+ Що 48 хвилин
+ Що 60 хвилин
10 повідомлень
25 повідомлень
50 повідомлень
@@ -306,69 +305,63 @@
усі повідомлення
Не можна копіювати чи переміщувати повідомлення, не синхронізоване з сервером
Додатково
- Параметри облікового запису
+ Налаштування облікового запису
Сповіщення про нову пошту
- Теки, щодо яких показуються сповіщення
- Усі
- Лише теки 1-го класу
- Теки 1-го та 2-го класів
- Усі, крім тек 2-го класу
- Жодної
Сповіщення про синхронізацію
- Адреса вашої електронної пошти
+ Адреса вашої е-пошти
Сповіщати у рядку стану про нові листи
Сповіщати у рядку стану про перевірку пошти
Включити вихідні повідомлення
Показати сповіщення про надіслані мною повідомлення
Лише контактам
Показувати сповіщення лише для повідомлень від вже відомих контактів
- Нехтувати повідомленнями розмови
- Не показувати сповіщень про повідомлення поштової розмови
+ Ігнорувати повідомлення бесіди
+ Не показувати сповіщень про повідомлення поштової бесіди
Позначати повідомлення прочитаним після відкриття
Позначати повідомлення прочитаним після відкриття для перегляду
Позначити прочитаним після видалення
Позначити повідомлення прочитаним після видалення
Категорії сповіщень
Налаштуйте сповіщення для нових повідомлень
- Налаштуйте сповіщення про помилки та статуси
+ Налаштуйте сповіщення про помилки та стани
Завжди показувати зображення
Ні
Від контактів
Від усіх
Надсилання повідомлення
- Цитувати повідомлення при відповіді на нього
+ Цитувати повідомлення під час відповіді на нього
Включати оригінальне повідомлення у відповідь.
Текст відповіді після цитованого тексту
- Оригінальне повідомлення відобразиться над вашою відповіддю.
- Видаляти підписи з цитованого повідомлення при відповіді
- Підписи цитованого повідомлення будуть видалені при відповіді
+ Оригінальне повідомлення покажеться над вашою відповіддю.
+ Видаляти підписи у відповіді
+ Підписи вилучатимуться з цитованих повідомлень
Формат повідомлення
- Звичайний текст (видалити зображення та форматування)
+ Звичайний текст (вилучити зображення та форматування)
HTML (зберігати зображення та форматування)
Автоматичний (звичайний текст, якщо тільки не створюється відповідь на повідомлення HTML-формату)
Завжди показувати поля \"Копія\" / \"Прихована копія\"
Звіт про прочитання
Завжди запитувати звіт про прочитання
- Стиль цитування при відповіді
+ Стиль цитування відповіді
Префікс (наприклад, Gmail)
Заголовок (наприклад, Outlook)
Вивантажити надіслані повідомлення
Вивантажити повідомлення в теку \"Надіслані\" після надсилання
Загальні налаштування
- Читання повідомлення
+ Читання пошти
Отримання пошти
Теки
Префікс цитованого тексту
Наскрізне шифрування
Увімкнути підтримку OpenPGP
- Обрати додаток OpenPGP
+ Обрати застосунок OpenPGP
Налаштувати ключ наскрізного шифрування
- Не налаштовано жодного OpenPGP-додатку
- Підключено до %s
+ Не налаштовано OpenPGP-застосунку
+ Під\'єднано до %s
Налаштування…
- Зберігати усі чернетки зашифрованими
- Усі чернетки будуть зберігатися зашифрованими
- Шифрувати чернетки тільки якщо шифрування увімкнено
+ Зберігати всі чернетки зашифрованими
+ Усі чернетки зберігатимуться зашифрованими
+ Шифрувати чернетки лише якщо шифрування ввімкнено
Частота опитування тек
Колір облікового запису
Виберіть колір облікового запису для тек та списку облікових записів
@@ -402,34 +395,19 @@
останні 3 місяці
останні 6 місяців
останній рік
- Теки для відображення
- Усі
- Тільки теки 1-го класу
- Теки 1-го та 2-го класу
- Усі, крім тек 2-го класу
- Теки для опитування
- Усі
- Тільки теки 1-го класу
- Теки 1-го та 2-го класу
- Усі, крім тек 2-го класу
- Нічого
Синхронізація видалень на сервері
- Видаляти повідомлення синхронно з видаленням на сервері
- Немає OpenPGP-додатка - він був видалений?
+ Вилучати повідомлення, коли вони видаляються на сервері
+ Немає OpenPGP-застосунку — чи був він видалений?
Налаштування тек
Показувати у верхній групі
Показувати у верхній частині списку тек
- Клас відображення теки
- Без класу
- 1-ий клас
- 2-ий клас
- Видалити локальні повідомлення
+ Очистити локальні повідомлення
Сервер вхідної пошти
Налаштувати сервер вхідної пошти
Сервер вихідної пошти
Налаштувати сервер вихідної пошти (SMTP)
Ім’я облікового запису
- Ваше ім’я
+ Ваше ім\'я
Сповіщення
Вібрація
Вібрація
@@ -440,7 +418,7 @@
Ритм 3
Ритм 4
Ритм 5
- Повторити вібрацію
+ Повторення вібрації
Вимкнено
Звук сповіщення про новий лист
Спалах сповіщення
@@ -455,91 +433,91 @@
Бірюзовий
Рожевий
Параметри створення повідомлень
- Типові налаштування написання листів
+ Типові налаштування написання
Встановити типові значення полів \"Від\", \"Прихована копія\" і підпис
- Управління особами
- Встановити альтернативні адреси \"Від\" та підписи
- Управління особами
- Управління особою
- Редагувати особу
+ Керування особистостями
+ Установити альтернативні адреси \"Від\" та підписи
+ Керування особистостями
+ Керування особистістю
+ Змінити особистість
Зберегти
- Нова особа
- Прихована копія усіх повідомлень до
+ Нова особистість
+ Прихована копія всіх повідомлень до
Редагувати
Пересунути вище
Пересунути нижче
Пересунути на початок / зробити типовою
- Видалити
- Опис особи
- (Необов’язково)
- Ваше ім’я
- (Необов’язково)
- Адреса електронної пошти
+ Вилучити
+ Опис особистості
+ (Необов\'язково)
+ Ваше ім\'я
+ (Необов\'язково)
+ Адреса е-пошти
(Обов’язково)
Відповідати на адресу
- (Необов’язково)
+ (Необов\'язково)
Підпис
- (Обов’язково)
+ (Необов\'язково)
Використовувати підпис
Підпис
- Початкова особа
- Вибрати особу
+ Початкова особистість
+ Вибрати особистість
Надіслати як
- Не можна видалити останню особу
- Не можна використовувати особу без адреси електронної пошти
- Спершу старі повідомлення
- Спершу нові повідомлення
- Тема за алфавітом
- Тема за алфавітом у зворотньому порядку
- Відправники за алфавітом
- Відправники за алфавітом в зворотньому порядку
- Спершу повідомлення із зірочками
+ Не можна видалити останню особистість
+ Не можна використовувати особистість без адреси е-пошти
+ Спершу давніші повідомлення
+ Спершу новіші повідомлення
+ Тема за абеткою
+ Тема за абеткою у зворотному порядку
+ Відправники за абеткою
+ Відправники за абеткою у зворотному порядку
+ Спершу повідомлення з зірочками
Спершу повідомлення без зірочок
Спершу непрочитані повідомлення
Спершу прочитані повідомлення
Спершу повідомлення з вкладеннями
Спершу повідомлення без вкладень
Упорядкувати за…
- датою
- часом отримання
- темою
- відправником
- наявністю зірочки
- статусом прочитання
- наявністю вкладень
- Видалити обліковий запис
+ Датою
+ Часом отримання
+ Темою
+ Відправником
+ Наявністю зірочки
+ Станом прочитання
+ Наявністю вкладень
+ Вилучити обліковий запис
Назва теки містить
Розташування підпису
- перед цитованим повідомленням
- після цитованого повідомлення
- Використовувати тему додатку
+ Перед цитованим повідомленням
+ Після цитованого повідомлення
+ Використовувати тему застосунку
Темна
Світла
Типова системна
Екран
Глобальні
- Відлагодження
- Конфіденційність
+ Налагодження
+ Приватність
Мережа
Взаємодія
Список облікових записів
Списки повідомлень
Повідомлення
Тема
- Тема екрану перегляду повідомлення
- Тема екрану створення повідомлення
+ Тема екрана перегляду повідомлень
+ Тема екрана створення повідомлень
Мова
Налаштування не знайдені
Фіксована тема повідомлення
- Виберіть тему екрану перегляду повідомлення під час перегляду повідомлення
+ Виберіть тему екрана перегляду повідомлення під час перегляду повідомлення
Використовувати фіксовану тему перегляду повідомлення
- Системна (System default)
+ Типова системна
Фонова синхронізація
Ніколи
Завжди
- Коли \"Автосинхронізація\" увімкнена
- Вибрати усе
- Найбільша кількість тек для перевірки при надсиланні
+ Коли ввімкнена \"Автосинхронізація\"
+ Вибрати все
+ Найбільша кількість тек push-перевірки
5 тек
10 тек
25 тек
@@ -573,7 +551,7 @@
Отримувачі
Тема
Час і дата
- Тіло повідомлення
+ Вміст повідомлення
Створення повідомлення
Поля для вводу тексту
Типовий
@@ -584,17 +562,17 @@
Середній
Великий
Більший
- Для цієї дії не знайдено відповідного додатку.
- Помилка відправки: %s
+ Для цієї дії не знайдено відповідного застосунку.
+ Не вдалося надіслати: %s
Зберегти чернетку повідомлення?
- Зберегти чи Скасувати це повідомлення?
+ Зберегти чи Відкинути це повідомлення?
Зберегти чи Скасувати зміни?
- Скасувати повідомлення?
- Ви дійсно хочете скасувати це повідомлення?
+ Відкинути повідомлення?
+ Ви дійсно хочете відкинути це повідомлення?
Очистити локальні повідомлення?
- Це видалить всі локальні повідомлення з теки. Жодне повідомлення не буде видалене з сервера.
+ Це вилучить всі локальні повідомлення з теки. Жодне повідомлення не буде видалене з сервера.
Очистити повідомлення
- Підтвердіть видалення
+ Підтвердьте видалення
Ви хочете видалити це повідомлення?
- Ви дійсно хочете видалити це повідомлення?
@@ -604,18 +582,18 @@
Так
Ні
- Підтвердіть позначення усіх повідомлень прочитаними
- Хочете позначити усі повідомлення прочитаними?
- Підтвердіть очищення кошика
+ Підтвердьте позначення всіх повідомлень прочитаними
+ Хочете позначити всі повідомлення прочитаними?
+ Підтвердьте очищення кошика
Ви хочете очистити теку \"Кошик\"?
Так
Ні
- Підтвердіть переміщення в теку \"Спам\"
+ Підтвердьте переміщення в теку \"Спам\"
- Ви дійсно хочете перемістити це повідомлення в спам?
- - Ви дійсно хочете перемістити %1$d повідомлень у спам?
+ - Ви дійсно хочете перемістити %1$d повідомлення у спам?
- Ви дійсно хочете перемістити %1$d повідомлень у спам?
- - Ви дійсно хочете перемістити %1$d повідомлень у теку \"Спам\"?
+ - Ви дійсно хочете перемістити %1$d повідомлень у спам?
Так
Ні
@@ -625,8 +603,8 @@
Експорт налаштувань
Експорт
Поділитися
- Експортуються налаштування…
- Налаштування успішно експортовані
+ Налаштування експортуються…
+ Налаштування експортовані
Не вдалося експортувати налаштування
Нема тексту
Відкрити посилання
@@ -641,15 +619,15 @@
Завантажити зображення
Копіювати посилання на зображення до буфера обміну
Посилання на зображення
- Подзвонити за номером
+ Зателефонувати за номером
Зберегти до Контактів
- Копіювати телефонний номер до буфера обміну
- Телефонний номер
+ Копіювати номер телефону до буфера обміну
+ Номер телефону
Надіслати листа
Зберегти до Контактів
Копіювати електронну адресу до буфера обміну
- Електронна адреса
- Всі
+ Адреса е-пошти
+ Усі
10
25
50
@@ -671,27 +649,27 @@
- Отримання %1$d з %2$d результатів
- Отримання %1$d з %2$d результатів
- Віддалений пошук не вдався
+ Збій віддаленого пошуку
Пошук
Шукати повідомлення на сервері
Для пошуку на сервері необхідне з\'єднання з мережею.
- Змінювати колір при прочитанні
- Інший колір фону буде означати, що повідомлення прочитане
+ Змінювати колір після прочитання
+ Інший колір тла означатиме, що повідомлення прочитане
Групування повідомлень
Групувати повідомлення у діалоги
Оновлення баз даних
Оновлення баз даних…
- Оновлення баз даних облікового запису \"%s\"
+ Оновлення баз даних облікового запису \"%s\"
Перегляд на розділеному екрані
Завжди
Ніколи
Коли в альбомній орієнтації
Будь ласка, виберіть повідомлення зліва
Показувати зображення контактів
- Показувати зображення контактів в списку повідомлень
- Позначити усе прочитаним
- Позначати кольором зображення контактів
- Позначати кольором зображення відсутніх контактів
+ Показувати зображення контактів у списку повідомлень
+ Позначити все прочитаним
+ Забарвити зображення контактів
+ Забарвити зображення відсутніх контактів
Видимі дії над повідомленням
Показувати вибрані дії в меню перегляду повідомлень
Завантаження вкладення…
@@ -714,29 +692,29 @@
Мобільний
Теку \"Чернетки\" не налаштовано для цього облікового запису!
Ключ не налаштовано для цього облікового запису! Перевірте налаштування.
- Криптопровайдер використовує несумісну версію. Перевірте свої налаштування.
- Не можу з\'єднатися з провайдером шифрування; перевірте ваші налаштування або натисніть значок шифрування, щоб спробувати знову!
- Не вдалося ініціалізувати наскрізне шифрування. Перевірте свої налаштування.
+ Криптопровайдер використовує несумісну версію. Перевірте свої налаштування!
+ Не можу з\'єднатися з криптопровайдером, перевірте ваші налаштування або натисніть на піктограму шифрування, щоб спробувати знову!
+ Не вдалося ініціалізувати наскрізне шифрування. Перевірте свої налаштування
Режим PGP/INLINE не підтримує вкладення!
Увімкнути PGP/INLINE
Вимкнути PGP/INLINE
Увімкнути PGP Sign-Only
Вимкнути PGP Sign-Only
Режим PGP/INLINE
- Електронний лист буде відправлено в форматі PGP/INLINE.\nВикоритовуйте лише з метою забезпечення сумісності:
+ Електронний лист буде надіслано у форматі PGP/INLINE.\nВикористовуйте лише для сумісності:
Деякі клієнти підтримують лише цей формат
- Підписи можуть ламатися під час передачі
+ Підписи можуть ламатися під час передавання
Вкладення не підтримуються
Зрозуміло!
Вимкнути
- Залишити увімкненим
+ Залишити ввімкненим
Зрозуміло!
Вимкнути
- Залишити увімкненим
+ Залишити ввімкненим
Режим PGP Sign-Only
- У цьому режимі ваш PGP-ключ буде використаний для створення криптографічного підпису незашифрованого електронного листа.
+ У цьому режимі ваш PGP-ключ буде використаний для створення криптографічного підпису незашифрованої е-пошти.
Це не шифрує електронний лист, але засвідчує, що він був надісланий від вашого ключа.
- Підписи можуть бути пошкоджені при надсиланні листа у списки розсилки.
+ Підписи можуть бути пошкоджені під час надсилання листа у списки розсилки.
Деякі клієнти можуть відображати підписи як вкладення \'signature.asc\'.
Зашифровані листи завжди містять підпис.
Простий текст
@@ -748,23 +726,23 @@
Звичайний текст, підписаний наскрізним шифруванням
від перевіреного підписувача
Підписаний звичайний текст
- але ключ наскрізного шифрування не співпав з ключем відправника
- але термін дійсності ключа наскрізного шифрування минув
+ але ключ наскрізного шифрування не збігається з ключем відправника
+ але ключ наскрізного шифрування не чинний
але ключ наскрізного шифрування відкликано
але ключ наскрізного шифрування не вважається безпечним
від невідомого ключа наскрізного шифрування
Зашифровано
але виникла помилка розшифрування
- необхідно повністю завантажити повідомлення для розшифровки
- але не налаштовано жодного криптографічного додатку
+ необхідно повністю завантажити повідомлення для розшифрування
+ але не налаштовано жодного криптографічного застосунку
Зашифровано
- але не наскрізне
+ але не наскрізним шифруванням
Зашифровано наскрізним шифруванням
від перевіреного відправника
Зашифровано
від невідомого ключа наскрізного шифрування
- але ключ наскрізного шифрування не співпав з ключем відправника
- але термін дійсності ключа наскрізного шифрування минув
+ але ключ наскрізного шифрування не збігається з ключем відправника
+ але ключ наскрізного шифрування не чинний
але ключ наскрізного шифрування відкликано
але ключ наскрізного шифрування не вважається безпечним
але зашифрована наскрізним шифруванням інформація містить помилки
@@ -774,44 +752,44 @@
Незахищене вкладення
Завантаження…
Розшифровування скасовано.
- Спробувати знову
- Для розшифровування зашифроване повідомлення необхідно завантажити.
- Помилка під час розшифровування електронного листа
+ Повторити спробу
+ Щоб розшифрувати, зашифроване повідомлення потрібно завантажити.
+ Помилка розшифрування е-пошти
Спеціальні символи наразі не підтримуються!
Помилка розбору адреси!
- Приховати незашифровані підписи
- Тільки зашифровані підписи будуть відображені
- Усі підписи будуть відображені
- Шифрування недоступне у режимі PGP Sign-Only
+ Сховати незашифровані підписи
+ Будуть показані лише зашифровані підписи
+ Будуть показані всі підписи
+ Шифрування недоступне у режимі Лише підпис!
Непідписаний Текст
Цей електронний лист зашифровано
- Цей електронний лист було зашифровано за допомогою OpenPGP.\nЩоб його прочитати, необхідно встановити та налаштувати сумісний OpenPGP-додаток.
+ Цей електронний лист зашифровано за допомогою OpenPGP.\nЩоб його прочитати, необхідно встановити та налаштувати сумісний OpenPGP-застосунок.
Перейти до Налаштувань
Шифрування неможливе
- Деякі з вибраних адресатів не підтримують цю функцію.
+ Деякі з вибраних адресатів не підтримують цю функцію!
Увімкнути шифрування
Вимкнути шифрування
Шифрування повідомлень гарантує, що вони можуть бути прочитані адресатом, і ніким іншим.
- Можливість шифрування відображатиметься лише в тому випадку, якщо його підтримують усі адресати і якщо вони раніше надсилали вам електронного листа.
- Перемкніть шифрування цією піктограмою.
+ Можливість шифрування показуватиметься лише якщо його підтримують усі адресати, і якщо вони раніше надсилали вам е-пошту.
+ Перемкніть шифрування, натисканням на цю піктограму.
Зрозуміло
Назад
Вимкнути шифрування
Шифрування OpenPGP
Автоматичне шифрування у режимі взаємності
Автоматичне шифрування у режимі взаємності
- Повідомлення будуть шифруватися за вашим вибором або при відповіді на шифроване повідомлення.
+ Повідомлення шифруватимуться за вашим вибором або під час відповіді на зашифроване повідомлення.
Якщо і відправник, і адресат увімкнуть режим взаємності, шифрування типово буде увімкнене.
Ви можете перейти сюди, щоб дізнатися більше.
Загальні налаштування
- Не встановлено додатка OpenPGP
- Встановити
+ Не встановлено OpenPGP-застосунку
+ Установити
Шифрувати теми повідомлень
Може не підтримуватися деякими адресатами
Внутрішня помилка: Недійсний обліковий запис!
- Помилка підключення до %s!
+ Помилка під\'єднання до %s!
Надіслати Повідомлення з Налаштуваннями Автоматичного Шифрування
Безпечно поділитися налаштуваннями наскрізного шифрування з іншими пристроями
Повідомлення з Налаштуваннями Автоматичного Шифрування
@@ -829,21 +807,21 @@
Ви можете зберегти це повідомлення і використовувати його як резервну копію вашого секретного ключа. Якщо ви хочете це зробити, запишіть пароль і збережіть його у надійному місці.
- При надсиланні повідомлення сталася помилка. Перевірте підключення до мережі та налаштування вихідного сервера.
+ Сталася помилка під час надсилання повідомлення. Перевірте під\'єднання до мережі та налаштування вихідного сервера.
Увімкнено
Вимкнено
- Сталася помилка при завантаженні даних
+ Сталася помилка під час завантаження даних
Ініціалізація…
Очікування нових листів
Очікування дозволу на фонову синхронізацію
- Очікування наявності мережі
+ Очікування доступності мережі
Натисніть, щоб дізнатися більше.
- Інформація про сповіщення
- Тим не менш, Android також дозволяє приховати сповіщення.
- Дізнатися більше
+ Інформація про Push
+ Однак Android також дозволяє сховати сповіщення.
+ Докладніше
Налаштувати сповіщення
- Якщо вам не потрібне миттєве сповіщення про нові повідомлення, вам варто вимкнути Push і використовувати Polling. Polling перевіряє пошту з регулярними інтервалами і не потребує сповіщення.
- Вимкнути пуш-сповіщення
+ Якщо вам не потрібне миттєве сповіщення про нові повідомлення, вам варто вимкнути Push і використовувати Polling. Polling перевіряє пошту з регулярною частотою і не потребує сповіщення.
+ Вимкнути Push
Вибрати
@@ -865,19 +843,19 @@
Перемістити…
- Показати плаваючу кнопку створення повідомлення
+ Показати пливучу кнопку створення повідомлення
Помилка
- Папка не знайдена
+ Теку не знайдено
- Деталі повідомлення
+ Подробиці повідомлення
Відсутній заголовок \'Дата\'
Від
- відправником
+ Відправник
Відповісти до
@@ -887,28 +865,44 @@
Прихована копія
- Виникла помилка під час завантаження деталей повідомлення.
+ Виникла помилка під час завантаження подробиць повідомлення.
Додати до контактів
Написати лист
- Скопіювати адресу ел. пошти
+ Скопіювати адресу е-пошти
Скопіювати ім\'я та адресу ел. пошти
- Електронна адреса
+ Адреса е-пошти
- Ім\'я та адреса ел. пошти
+ Ім\'я та адреса е-пошти
- Видалення облікового запису…
+ Вилучення облікового запису…
- Непрочитані, %s
+ непрочитані, %s
Залишатися на поточному повідомленні
- Повернутися в список повідомлень
- Після позначання повідомлення як непрочитане
- Повернутися в список повідомлень
+ Повертатися до списку повідомлень
+ Після позначання повідомлення непрочитаним
+ Повертатися до списку повідомлень
Показувати попереднє повідомлення
Показувати наступне повідомлення
Після видалення або переміщення повідомлення
+ Команда Thunderbird Mobile
+ Сповіщення
+ Увімкнути Push
+ Збір даних
+ Про %s
+ Увімкнути синхронізацію
+ Показати приховані теки
+ Показати теку
+ Підтримка %s
+ Обліковий запис\"%s\" буде вилучено з %s.
+ Застосунок OpenKeychain необхідний для підтримки наскрізного шифрування.
+ Відсутній дозвіл на планування оповіщень
+ Торкніться, щоб надати дозвіл.
+ Коли використовується Push, %1$s підтримує з\'єднання з поштовим сервером. Android вимагає показу поточного сповіщення під час фонової роботи застосунку. %2$s
+ Використання та технічні дані
+ Обмінюється з Mozilla даними про швидкодію, використання, апаратне забезпечення та налаштування цього застосунку, щоб допомогти нам зробити Thunderbird кращим
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-vi/strings.xml b/legacy/ui/legacy/src/main/res/values-vi/strings.xml
index b3daee7feeb..7e40f4abf73 100644
--- a/legacy/ui/legacy/src/main/res/values-vi/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-vi/strings.xml
@@ -261,11 +261,9 @@
Không bao giờ
Nâng cao
Thiết lập tài khoản thư
- Không thiết đặt
Gửi thư
Xác nhận đã đọc
Thư mục
- Không thiết đặt
Cấu hình thư mục
Xóa sạch thư lưu cục bộ
Mặc định
@@ -394,14 +392,11 @@
Danh mục thông báo
Bao gồm tin nhắn gốc trong thư trả lời của bạn.
Thông báo trên thanh trạng thái khi thư được kiểm tra
- Tất cả ngoại trừ thư mục hạng 2
Đánh dấu thư là đã đọc khi nó bị xóa
Thông báo thư mới
Địa chỉ email của bạn
Đánh dấu tin nhắn là đã đọc khi nó được mở để xem
- Thư mục thông báo
Từ danh bạ
- Chỉ các thư mục hạng 1
Từ bất cứ ai
Trích dẫn tin nhắn khi trả lời
đến %s
@@ -411,13 +406,11 @@
Không hiển thị thông báo cho các tin nhắn thuộc cuộc trò chuyện qua email
Bao gồm thư đi
Đánh dấu là đã đọc khi xóa
- Tất cả
Thông báo trên thanh trạng thái khi có thư đến
Không
Luôn hiển thị hình ảnh
Khi đang thăm dò
Bỏ qua tin nhắn trò chuyện
- Thư mục hạng 1 và hạng 2
Đồng bộ hóa thông báo
Định cấu hình thông báo lỗi và trạng thái
Chỉ các liên hệ
@@ -426,15 +419,12 @@
512 KiB
năm ngoái
1 MiB
- Chỉ các thư mục Hạng 1
Hiển thị ở nhóm trên cùng
Tin nhắn gốc sẽ xuất hiện phía trên thư trả lời của bạn.
Thiết lập tổng quan
- Thư mục hạng 1 và hạng 2
Đã kết nối với %s
2 ngày qua
3 ngày qua
- Thư mục hạng 1 và hạng 2
3 tháng qua
Văn bản thuần túy (loại bỏ hình ảnh và định dạng)
Đồng bộ tin nhắn từ
@@ -456,41 +446,32 @@
Luôn yêu cầu biên nhận đã đọc
2 tuần qua
mọi kích thước (không giới hạn)
- Tất cả ngoại trừ thư mục Hạng 2
Luôn hiển thị Cc/Bcc
- Tất cả
Chọn ứng dụng OpenPGP
Tải lên tin nhắn đã gửi
Đang tìm nạp thư
Không có ứng dụng OpenPGP nào được định cấu hình
- Thư mục thăm dò
Tiền tố văn bản được trích dẫn
Đã xảy ra lỗi khi tải chi tiết tin nhắn.
Thiếu ứng dụng OpenPGP - nó đã được gỡ cài đặt chưa?
6 tháng qua
- Chỉ các thư mục Hạng 1
16 KiB
2 MiB
Định dạng tin nhắn
tuần trước
Thêm vào danh bạ
- Tất cả ngoại trừ thư mục Hạng 2
2 tháng qua
- Thư mục để hiển thị
Tần suất thăm dò thư mục
128 KiB
4 KiB
Loại bỏ tin nhắn khi bị xóa trên máy chủ
Mã hóa đầu cuối
Tự động
- Lớp hiển thị thư mục
Bỏ chữ ký khi trả lời
3 tuần qua
Tiêu đề (như Outlook)
2 KiB
- Không có lớp
32 KiB
- Tất cả
tháng trước
5 MiB
bất cứ lúc nào (không giới hạn)
@@ -679,8 +660,6 @@
Đang ngủ cho đến khi đồng bộ nền được cho phép
Đang ngủ đến khi có kết nối mạng
Thông tin Đẩy
- Hạng 1
- Hạng 2
Máy chủ thư đi
Kiểu mẫu 1
Kiểu mẫu 4
diff --git a/legacy/ui/legacy/src/main/res/values-zh-rCN/strings.xml b/legacy/ui/legacy/src/main/res/values-zh-rCN/strings.xml
index eef21c76d19..4500aabe63c 100644
--- a/legacy/ui/legacy/src/main/res/values-zh-rCN/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-zh-rCN/strings.xml
@@ -303,12 +303,6 @@
高级
账号设置
新邮件通知
- 通知文件夹
- 全部
- 仅 1 级文件夹
- 1 级和 2 级文件夹
- 除 2 级文件夹外的所有文件夹
- 无
同步通知
您的电子邮件地址
邮件到达时在状态栏中通知
@@ -397,27 +391,12 @@
最近 3 个月
最近 6 个月
最近 1 年
- 要显示的文件夹
- 全部
- 仅 1 级文件夹
- 1 级与 2 级文件夹
- 除 2 级文件夹外的所有文件夹
- 轮询文件夹
- 全部
- 仅 1 级文件夹
- 1 级与 2 级文件夹
- 除 2 级文件夹外的所有文件夹
- 无
同步服务器的删除
在服务器上删除邮件时移除邮件
缺少 OpenPGP 应用 - 是否已卸载?
文件夹设置
显示在置顶的组中
显示在文件夹列表的顶部附近
- 文件夹显示级别
- 无级别
- 1 级
- 2 级
清空本地邮件
收件服务器
配置收件服务器
@@ -905,4 +884,6 @@
启用推送
启用同步
显示隐藏的文件夹
+ 显示文件夹
+ 支持 %s
\ No newline at end of file
diff --git a/legacy/ui/legacy/src/main/res/values-zh-rTW/strings.xml b/legacy/ui/legacy/src/main/res/values-zh-rTW/strings.xml
index a50d4f8b92b..5521cb0acbf 100644
--- a/legacy/ui/legacy/src/main/res/values-zh-rTW/strings.xml
+++ b/legacy/ui/legacy/src/main/res/values-zh-rTW/strings.xml
@@ -301,12 +301,6 @@
進階
帳號設定
新郵件通知
- 通知信件匣
- 全部
- 僅第一類信件匣
- 第一類與第二類信件匣
- 不包括下層信件匣
- 無
同步通知
您的電子郵件地址
新郵件到達時在通知欄中顯示通知
@@ -395,27 +389,12 @@
三個月內
六個月內
一年內
- 顯示的信件匣
- 全部
- 僅第一類信件匣
- 第一類與第二類信件匣
- 不包括下層文件匣
- 檢查信件匣
- 全部
- 僅第一類信件匣
- 第一類與第二類信件匣
- 不包括下層信件匣
- 無
同步伺服器上的刪除
刪除在伺服器上被刪除的郵件的本地複製
未發現 OpenPGP 應用程式 - 它已被解除安裝了嗎?
信件匣設定
顯示在置頂的組中
顯示在置頂的組之後
- 信件匣顯示層別
- 不分類
- 第一類
- 下層
清除本地郵件
內送伺服器
設定內送伺服器
diff --git a/legacy/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml b/legacy/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml
index adb367239da..ec282660684 100644
--- a/legacy/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml
+++ b/legacy/ui/legacy/src/main/res/values/arrays_general_settings_strings.xml
@@ -45,6 +45,7 @@
- Nederlands
- Norsk
- Norsk Bokmål
+ - Norsk Nynorsk
- O\'zbek
- Polski
- Português
diff --git a/legacy/ui/legacy/src/main/res/values/styles.xml b/legacy/ui/legacy/src/main/res/values/styles.xml
index ae351b9daa1..c2ca8d0aca3 100644
--- a/legacy/ui/legacy/src/main/res/values/styles.xml
+++ b/legacy/ui/legacy/src/main/res/values/styles.xml
@@ -43,38 +43,6 @@
- ?attr/colorSurfaceContainer
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/legacy/ui/legacy/src/test/java/com/fsck/k9/ui/K9DrawerTest.kt b/legacy/ui/legacy/src/test/java/com/fsck/k9/ui/K9DrawerTest.kt
deleted file mode 100644
index fa5a3fb2f8d..00000000000
--- a/legacy/ui/legacy/src/test/java/com/fsck/k9/ui/K9DrawerTest.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.fsck.k9.ui
-
-import app.k9mail.core.android.testing.RobolectricTest
-import assertk.assertThat
-import assertk.assertions.isEqualTo
-import assertk.assertions.size
-import com.fsck.k9.core.R
-import org.junit.Test
-import org.robolectric.RuntimeEnvironment
-
-class K9DrawerTest : RobolectricTest() {
- @Test
- fun testAccountColorLengthEqualsDrawerColorLength() {
- val resources = RuntimeEnvironment.getApplication().resources
-
- val lightColors = resources.getIntArray(R.array.account_colors)
- val darkColors = resources.getIntArray(R.array.drawer_account_accent_color_dark_theme)
-
- assertThat(darkColors).size().isEqualTo(lightColors.size)
- }
-}
diff --git a/scripts/render-notes.py b/scripts/render-notes.py
new file mode 100644
index 00000000000..bcf2ae09b27
--- /dev/null
+++ b/scripts/render-notes.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python3
+
+import argparse
+import os
+import requests
+import yaml
+
+from jinja2 import Template
+
+
+def render_notes(
+ version,
+ versioncode,
+ application,
+ applicationid,
+ printonly=False,
+ notesrepo="thunderbird/thunderbird-notes",
+ notesbranch="master",
+):
+ """Update changelog files based on release notes from thunderbird-notes."""
+ tb_notes_filename = f"{version}.yml"
+ tb_notes_directory = "android_release"
+ if "0b" in version:
+ tb_notes_filename = f"{version[0:-1]}eta.yml"
+ tb_notes_directory = "android_beta"
+ tb_notes_url = os.path.join(
+ f"https://raw.githubusercontent.com/{notesrepo}/",
+ f"refs/heads/{notesbranch}",
+ tb_notes_directory,
+ tb_notes_filename,
+ )
+
+ response = requests.get(tb_notes_url)
+ response.raise_for_status()
+ yaml_content = yaml.safe_load(response.text)
+
+ render_data = {"releases": {}}
+ for release in reversed(yaml_content["release"]["releases"]):
+ vers = release["version"]
+ render_data["releases"][vers] = {}
+ render_data["releases"][vers]["version"] = vers
+ render_data["releases"][vers]["versioncode"] = int(versioncode)
+ render_data["releases"][vers]["application"] = application
+ render_data["releases"][vers]["date"] = release["release_date"]
+ render_data["releases"][vers]["changes"] = []
+ for note in yaml_content["notes"]:
+ if "0b" in version:
+ if note["group"] == int(vers[-1]):
+ render_data["releases"][vers]["changes"].append(note["note"])
+ else:
+ render_data["releases"][vers]["changes"].append(note["note"])
+
+ render_files = {
+ "changelog_master": {
+ "template": "./scripts/templates/changelog_master.xml",
+ "outfile": f"./app-{application}/src/main/res/raw/changelog_master.xml",
+ "render_data": render_data["releases"][version],
+ },
+ "changelog.txt": {
+ "template": "./scripts/templates/changelog.txt",
+ "outfile": f"./app-metadata/{applicationid}/en-US/changelogs/{versioncode}.txt",
+ "render_data": render_data["releases"][version],
+ },
+ }
+
+ for render_file in render_files:
+ with open(render_files[render_file]["template"], "r") as file:
+ template = file.read()
+ template = Template(template)
+ rendered = template.render(render_files[render_file]["render_data"])
+ if render_file == "changelog_master":
+ with open(render_files[render_file]["outfile"], "r") as file:
+ lines = file.readlines()
+ for index, line in enumerate(lines):
+ if "" in line:
+ if version in lines[index + 1]:
+ break
+ lines.insert(index + 1, rendered)
+ break
+ if not printonly:
+ with open(render_files[render_file]["outfile"], "w") as file:
+ file.writelines(lines)
+ elif render_file == "changelog.txt":
+ stripped = rendered.lstrip()
+ if not printonly:
+ with open(render_files[render_file]["outfile"], "x") as file:
+ file.write(stripped)
+ print(stripped)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--print",
+ "-p",
+ action="store_true",
+ help="Only print the processed release notes",
+ )
+ parser.add_argument(
+ "--repository",
+ "-r",
+ default="thunderbird/thunderbird-notes",
+ help="Repository to retrieve thunderbird-notes from",
+ )
+ parser.add_argument(
+ "--branch",
+ "-b",
+ default="master",
+ help="Branch to retrieve thunderbird-notes from",
+ )
+ parser.add_argument(
+ "applicationid",
+ type=str,
+ choices=[
+ "net.thunderbird.android",
+ "net.thunderbird.android.beta",
+ "com.fsck.k9",
+ ],
+ help="thunderbird or k9mail",
+ )
+ parser.add_argument("version", type=str, help="Version name for this release")
+ parser.add_argument("versioncode", type=str, help="Version code for this release")
+ args = parser.parse_args()
+
+ if args.applicationid == "com.fsck.k9":
+ application = "k9mail"
+ else:
+ application = "thunderbird"
+
+ render_notes(
+ args.version,
+ args.versioncode,
+ application,
+ args.applicationid,
+ printonly=args.print,
+ notesrepo=args.repository,
+ notesbranch=args.branch,
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/setup_release_automation b/scripts/setup_release_automation
index 55adc6beba9..60d0cb96f07 100644
--- a/scripts/setup_release_automation
+++ b/scripts/setup_release_automation
@@ -1,6 +1,7 @@
#!/usr/bin/env python
# See docs/CI/Release_Automation.md for more details
+# Run this from the .signing directory with all the keys and properties files in it.
# python -m venv venv; source venv/bin/activate; pip install requests, pynacl
@@ -22,15 +23,23 @@ CHANNEL_ENVIRONMENTS = {
"MATRIX_INCLUDE": [
{
"appName": "thunderbird",
+ "releaseTarget": "github",
"packageFormat": "apk",
"packageFlavor": "foss",
},
{
"appName": "thunderbird",
- "packageFormat": "bundle",
+ "releaseTarget": "play",
+ "playTargetTrack": "internal",
+ "packageFormat": "aab",
"packageFlavor": "full",
},
- {"appName": "k9mail", "packageFormat": "apk"},
+ {
+ "appName": "k9mail",
+ "releaseTarget": "github|play",
+ "playTargetTrack": "internal",
+ "packageFormat": "apk",
+ },
],
},
},
@@ -41,15 +50,23 @@ CHANNEL_ENVIRONMENTS = {
"MATRIX_INCLUDE": [
{
"appName": "thunderbird",
+ "releaseTarget": "github",
"packageFormat": "apk",
"packageFlavor": "foss",
},
{
"appName": "thunderbird",
- "packageFormat": "bundle",
+ "releaseTarget": "play",
+ "playTargetTrack": "internal",
+ "packageFormat": "aab",
"packageFlavor": "full",
},
- {"appName": "k9mail", "packageFormat": "apk"},
+ {
+ "appName": "k9mail",
+ "releaseTarget": "github|play",
+ "playTargetTrack": "internal",
+ "packageFormat": "apk",
+ },
],
},
},
@@ -65,7 +82,9 @@ CHANNEL_ENVIRONMENTS = {
},
{
"appName": "thunderbird",
- "packageFormat": "bundle",
+ "releaseTarget": "play",
+ "packageFormat": "aab",
+ "playTargetTrack": "internal",
"packageFlavor": "full",
},
],
@@ -75,46 +94,38 @@ CHANNEL_ENVIRONMENTS = {
SIGNING_ENVIRONMENTS = {
- "k9mail_release_default": [
- "k9.release.signing.properties",
- "k9-release-signing.jks",
- "release",
- ],
- "k9mail_beta_default": [
- "k9.release.signing.properties",
- "k9-release-signing.jks",
- "beta",
- ],
- "thunderbird_daily_foss": [
- "tb.daily.signing.properties",
- "tb-daily-signing.jks",
- "daily",
- ],
- "thunderbird_daily_full": [
- "tb.daily.upload.properties",
- "tb-daily-upload-01.jks",
- "daily",
- ],
- "thunderbird_beta_foss": [
- "tb.beta.signing.properties",
- "tb-beta-signing.jks",
- "beta",
- ],
- "thunderbird_beta_full": [
- "tb.beta.upload.properties",
- "tb-beta-upload-01.jks",
- "beta",
- ],
- "thunderbird_release_foss": [
- "tb.release.signing.properties",
- "tb-release-signing.jks",
- "release",
- ],
- "thunderbird_release_full": [
- "tb.release.upload.properties",
- "tb-release-upload-01.jks",
- "release",
- ],
+ "k9mail_release_default": {
+ "props": "k9.release.signing.properties",
+ "branch": "release",
+ },
+ "k9mail_beta_default": {
+ "props": "k9.release.signing.properties",
+ "branch": "beta",
+ },
+ "thunderbird_daily_foss": {
+ "props": "tb.daily.signing.properties",
+ "branch": "main",
+ },
+ "thunderbird_daily_full": {
+ "props": "tb.daily.upload.properties",
+ "branch": "main",
+ },
+ "thunderbird_beta_foss": {
+ "props": "tb.beta.signing.properties",
+ "branch": "beta",
+ },
+ "thunderbird_beta_full": {
+ "props": "tb.beta.upload.properties",
+ "branch": "beta",
+ },
+ "thunderbird_release_foss": {
+ "props": "tb.release.signing.properties",
+ "branch": "release",
+ },
+ "thunderbird_release_full": {
+ "props": "tb.release.upload.properties",
+ "branch": "release",
+ },
}
@@ -210,14 +221,14 @@ def set_github_environment_variable(repo, name, value, environment_name):
# Function to create GitHub environment if it doesn't exist
-def create_github_environment(repo, environment_name, branch=None, approvers=None):
+def create_github_environment(repo, environment_name, branches=None, approvers=None):
url = f"https://api.github.com/repos/{repo}/environments/{environment_name}"
headers = {
"Authorization": f"token {GITHUB_TOKEN}",
"Accept": "application/vnd.github.v3+json",
}
data = {}
- if branch:
+ if branches:
data["deployment_branch_policy"] = {
"custom_branch_policies": True,
"protected_branches": False,
@@ -243,22 +254,22 @@ def create_github_environment(repo, environment_name, branch=None, approvers=Non
f"Failed to create environment {environment_name}. Response: {response.status_code}, {response.text}"
)
- if branch:
+ for branch in branches or []:
url = f"https://api.github.com/repos/{repo}/environments/{environment_name}/deployment-branch-policies"
data = {"name": branch, "type": "branch"}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
print(
- f"\tEnvironment branch protection for {environment_name} created successfully."
+ f"\tBranch protection on {branch} for {environment_name} created successfully."
)
elif response.status_code == 409:
print(
- f"\tEnvironment branch protection for {environment_name} already exists."
+ f"\tBranch protection on {branch} for {environment_name} already exists."
)
else:
raise Exception(
- f"Failed to create environment {environment_name}. Response: {response.status_code}, {response.text}"
+ f"Failed to create branch protection for {branch} on {environment_name}. Response: {response.status_code}, {response.text}"
)
@@ -306,7 +317,7 @@ def create_approver_environment(repo, environment_name, approvers):
)
-def create_signing_environment(repo, environment, branch, props_file, jks_file):
+def create_signing_environment(repo, environment, branch, props_file):
# Read the key.properties file
key_props = read_key_properties(props_file)
@@ -321,10 +332,10 @@ def create_signing_environment(repo, environment, branch, props_file, jks_file):
return
# Base64 encode the JKS file to create SIGNING_KEY
- SIGNING_KEY = encode_jks_file(jks_file)
+ SIGNING_KEY = encode_jks_file(key_props.get("storeFile"))
# Create the environment if it doesn't exist
- create_github_environment(repo, environment, branch=branch)
+ create_github_environment(repo, environment, branches=[branch])
# Fetch the public key from GitHub for the specific environment
public_key_data = get_github_public_key(repo, environment)
@@ -351,22 +362,41 @@ def create_signing_environment(repo, environment, branch, props_file, jks_file):
)
+def create_release_environment(repo, branches):
+ environment = "publish_release"
+
+ create_github_environment(repo, environment, branches=branches)
+
+ public_key_data = get_github_public_key(repo, environment)
+ public_key = public_key_data["key"]
+ key_id = public_key_data["key_id"]
+
+ with open("play-store-account.json") as fp:
+ encrypted_play_account = encrypt_secret(public_key, fp.read())
+
+ set_github_environment_secret(
+ repo, "PLAY_STORE_ACCOUNT", encrypted_play_account, key_id, environment
+ )
+
+ with open("thunderbird-mobile-gh-releaser-bot.pem") as fp:
+ encrypted_releaser_key = encrypt_secret(public_key, fp.read())
+ with open("thunderbird-mobile-gh-releaser-bot.clientid.txt") as fp:
+ releaser_client_id = fp.read().strip()
+
+ set_github_environment_secret(
+ repo, "RELEASER_APP_PRIVATE_KEY", encrypted_releaser_key, key_id, environment
+ )
+
+ set_github_environment_variable(
+ repo, "RELEASER_APP_CLIENT_ID", releaser_client_id, environment
+ )
+
+
def main():
# Argument parsing for positional inputs and repo flag
parser = argparse.ArgumentParser(
description="Set GitHub environment secrets for specific or all environments."
)
- parser.add_argument(
- "--props",
- "-p",
- help="Path to the key.properties file (for single environment).",
- )
- parser.add_argument(
- "--jks", "-j", help="Path to the .jks keystore file (for single environment)."
- )
- parser.add_argument(
- "--environment", "-e", help="GitHub environment name (for single environment)."
- )
parser.add_argument(
"--repo",
"-r",
@@ -374,14 +404,10 @@ def main():
help="GitHub repository in the format 'owner/repo'.",
)
parser.add_argument(
- "--all-environments",
- "-a",
- action="store_true",
- help="Create all environments based on predefined paths and rules.",
+ "--skip", "-s", action="append", help="Skip this named environment"
)
- parser.add_argument("--branch", "-b", help="Branch to limit the environment to")
parser.add_argument(
- "--skip", "-s", action="append", help="In all mode, skip this environment", default=[]
+ "--only", "-o", action="append", help="Only include this named environment"
)
args = parser.parse_args()
@@ -393,62 +419,62 @@ def main():
"GITHUB_TOKEN environment variable is not set. Please set it before running the script."
)
- if args.all_environments:
- skipset = set(args.skip)
- # All environments creation mode
- if "publish_hold" in skipset:
- print("Skipping environment publish_hold")
- else:
- create_github_environment(
- args.repo, "publish_hold", approvers=PUBLISH_APPROVERS
- )
+ if args.skip and args.only:
+ print("Error: Cannot supply both skip and only")
+ return
- # Channel environments
- for environment_name, data in CHANNEL_ENVIRONMENTS.items():
- if environment_name in skipset:
- print(f"Skipping channel environment {environment_name}")
- continue
+ includeset = set(
+ list(CHANNEL_ENVIRONMENTS.keys())
+ + list(SIGNING_ENVIRONMENTS.keys())
+ + [
+ "publish_hold",
+ "publish_release",
+ ]
+ )
+ if args.skip:
+ for skip in args.skip:
+ includeset.remove(skip)
- create_github_environment(
- args.repo, environment_name, branch=data["branch"]
- )
+ if args.only:
+ includeset = set(args.only)
- for name, value in data["variables"].items():
- if isinstance(value, dict) or isinstance(value, list):
- value = json.dumps(value)
- set_github_environment_variable(
- args.repo, name, value, environment_name
- )
-
- # Signing environments
- for environment_name, paths in SIGNING_ENVIRONMENTS.items():
- if environment_name in skipset:
- print(f"Skipping signing environment {environment_name}")
- continue
-
- props_file, jks_file, branch = paths
-
- if not os.path.exists(props_file) or not os.path.exists(jks_file):
- print(
- f"Skipping {environment_name}: Missing key.properties or .jks file."
- )
- continue
-
- create_signing_environment(
- args.repo, environment_name, branch, props_file, jks_file
- )
- else:
- # Single environment creation mode
- if not all([args.props, args.jks, args.environment, args.branch]):
- print(
- "Error: You must provide --props, --jks, and --environment for single environment creation."
- )
- return
+ # Publish hold environment
+ if "publish_hold" in includeset:
+ create_github_environment(
+ args.repo, "publish_hold", approvers=PUBLISH_APPROVERS
+ )
+
+ # Channel environments
+ for environment_name, data in CHANNEL_ENVIRONMENTS.items():
+ if environment_name not in includeset:
+ continue
+
+ create_github_environment(
+ args.repo, environment_name, branches=[data["branch"]]
+ )
+
+ for name, value in data["variables"].items():
+ if isinstance(value, dict) or isinstance(value, list):
+ value = json.dumps(value)
+ set_github_environment_variable(args.repo, name, value, environment_name)
+
+ # Signing environments
+ for environment_name, data in SIGNING_ENVIRONMENTS.items():
+ if environment_name not in includeset:
+ continue
+
+ if not os.path.exists(data["props"]):
+ print(f"Skipping {environment_name}: Missing key .properties file")
+ continue
create_signing_environment(
- args.repo, args.environment, args.branch, args.props, args.jks
+ args.repo, environment_name, data["branch"], data["props"]
)
+ # Publish environment
+ if "publish_release" in includeset:
+ create_release_environment(args.repo, ["main", "beta", "release"])
+
if __name__ == "__main__":
main()
diff --git a/scripts/templates/changelog.txt b/scripts/templates/changelog.txt
new file mode 100644
index 00000000000..efa569e59ba
--- /dev/null
+++ b/scripts/templates/changelog.txt
@@ -0,0 +1,7 @@
+{%- if application == 'thunderbird' -%}
+Thunderbird for Android version {{ version }}, based on K-9 Mail. Changes include:
+{%- endif -%}
+{%- for note in changes %}
+- {{ note }}
+{%- endfor %}
+
diff --git a/scripts/templates/changelog_master.xml b/scripts/templates/changelog_master.xml
new file mode 100644
index 00000000000..ce2034375d5
--- /dev/null
+++ b/scripts/templates/changelog_master.xml
@@ -0,0 +1,6 @@
+
+{%- for note in changes %}
+ {{ note }}
+{%- endfor %}
+
+
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 29448a18885..a49d4994648 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -39,6 +39,9 @@ include(
":feature:onboarding:main",
":feature:onboarding:welcome",
":feature:onboarding:permissions",
+ ":feature:onboarding:migration:api",
+ ":feature:onboarding:migration:thunderbird",
+ ":feature:onboarding:migration:noop",
)
include(