mirror of
https://github.com/d4rken-org/capod.git
synced 2026-09-14 18:26:11 -04:00
Compare commits
25
Commits
v5.1.1-rc0
...
v5.1.2-rc0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb104cbe61 | ||
|
|
97cbca7a6e | ||
|
|
02278dab17 | ||
|
|
2240bd7ae5 | ||
|
|
bc4096cb57 | ||
|
|
5a0ba1b0bd | ||
|
|
d04abdf80c | ||
|
|
0609352cc9 | ||
|
|
abde0b7d6a | ||
|
|
b952aff38d | ||
|
|
c8f5ceda34 | ||
|
|
e6dbd2d660 | ||
|
|
228d7d1f0c | ||
|
|
67fead3589 | ||
|
|
d0aab583d2 | ||
|
|
367c8d28ff | ||
|
|
b04e1fe628 | ||
|
|
ea3ef1ff3b | ||
|
|
ff8b9cf6ed | ||
|
|
96bc3f5df7 | ||
|
|
1891a6d73a | ||
|
|
698415237d | ||
|
|
7ef672a11f | ||
|
|
f67e8aa7d1 | ||
|
|
bcb4bdff08 |
@@ -43,3 +43,4 @@ Detailed guidelines are in `.claude/rules/`:
|
||||
- `pull-requests.md` — PR title and description conventions
|
||||
- `agent-instructions.md` — Sub-agent delegation and critical thinking
|
||||
- `screenshots.md` — Play Store screenshot pipeline, commands, adding new screens
|
||||
- `release.md` — Release workflow (`Release prepare` dispatch), inputs, channel mapping, rollback
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
# Release Process
|
||||
|
||||
Releases are cut via the **Release prepare** workflow (`.github/workflows/release-prepare.yml`). It bumps `version.properties` and `VERSION`, commits to `main`, tags `v<version>`, pushes atomically, and dispatches `release-tag.yml` which builds, signs, and uploads.
|
||||
|
||||
## Dispatch
|
||||
|
||||
```bash
|
||||
# Plan only — no commit, no tag, no push.
|
||||
gh workflow run release-prepare.yml -f bump_kind=build -f dry_run=true
|
||||
|
||||
# Real cut.
|
||||
gh workflow run release-prepare.yml -f bump_kind=build -f dry_run=false
|
||||
```
|
||||
|
||||
After `dry_run=false`: Job 1 computes + writes the summary, then Job 2 immediately commits/tags/pushes/dispatches (no env gate — cancel the run between Job 1 and Job 2 if the summary looks wrong; you have ~seconds). `release-tag.yml` then runs `validate-tag` and the existing `release-github` (`foss-production` approval) + `release-gplay` (`gplay-production` approval) jobs — those are the two human checkpoints, matching the pre-migration UX.
|
||||
|
||||
## Inputs
|
||||
|
||||
| Input | Default | Notes |
|
||||
|---|---|---|
|
||||
| `bump_kind` | `build` | `build` \| `patch` \| `minor` \| `major` |
|
||||
| `version_type` | `keep-current` | Preserves current `rc`/`beta`. Set explicitly to switch. |
|
||||
| `version_override` | empty | e.g. `5.1.2-rc0`. Bypasses bump_kind/version_type. |
|
||||
| `expected_current` | empty | Optional: fail if `version.properties` ≠ this. Useful for tight coordination. |
|
||||
| `dry_run` | `true` | Default is plan-only. |
|
||||
|
||||
Bump rules: `build` increments build; `patch`/`minor`/`major` zero everything to the right of the bumped field. All numeric fields bounded `0..99` (the `versionCode` formula collapses at ≥100).
|
||||
|
||||
## Local
|
||||
|
||||
```bash
|
||||
./tools/release/bump.sh --mode=plan --bump-kind=build --version-type=keep-current
|
||||
./tools/release/bump.sh --mode=check
|
||||
bats tools/release/bump.bats
|
||||
```
|
||||
|
||||
## Channel mapping
|
||||
|
||||
| Tag suffix | FOSS APK | GitHub release | Fastlane lane | Play track | Rollout |
|
||||
|---|---|---|---|---|---|
|
||||
| `-beta*` | `assembleFossBeta` | pre-release | `beta` | `beta` | 10% |
|
||||
| `-rc*` (or anything else) | `assembleFossRelease` | full release | `production` | **`beta`** | 10% |
|
||||
|
||||
`lane :production` in `Fastfile` uploads to Play's **beta** track at 10% — manually promoted to production via Play Console.
|
||||
|
||||
## Rollback
|
||||
|
||||
| Stage reached | Steps |
|
||||
|---|---|
|
||||
| Bump on `main`, downstream not started | `git push origin :refs/tags/v<bad>`, `git revert <bump-sha>`, push |
|
||||
| GitHub release created | Above + `gh release delete v<bad> --yes --cleanup-tag` |
|
||||
| Play upload completed | Above + halt rollout in Play Console (or `bundle exec fastlane supply --track beta --rollout 0 --version-code <bad-code>`) |
|
||||
| Job 2 ran but downstream rejected at env approval | Treat as first row — bump+tag are public on `main` regardless of downstream outcome |
|
||||
|
||||
`bump.sh` enforces strict `versionCode` monotonicity, so re-using a code is impossible without manually editing `version.properties`.
|
||||
|
||||
## Auth setup
|
||||
|
||||
`release-prepare.yml` Job 2 uses a GitHub App token (not `GITHUB_TOKEN`) to push the bump commit and tag. The App identity is in the rulesets' bypass list, which is what allows the push to bypass branch protection + tag-creation restrictions.
|
||||
|
||||
Required org secrets (set on the d4rken-org organization, accessible to `capod`):
|
||||
|
||||
- `RELEASE_APP_ID` — numeric ID of the `d4rken-org-releaser` GitHub App
|
||||
- `RELEASE_APP_PRIVATE_KEY` — full `.pem` contents (including BEGIN/END lines)
|
||||
|
||||
The App is installed on this repo and added as a bypass actor to:
|
||||
- The main-branch ruleset (PR + status check requirements)
|
||||
- The tag ruleset (creation restriction on `v*`)
|
||||
|
||||
Other apps in the org can reuse the same App + secrets — just install the App on each repo and add it to that repo's rulesets' bypass lists.
|
||||
|
||||
## Defense in depth
|
||||
|
||||
`release-tag.yml` includes `validate-tag` which: (1) regex-checks `github.ref_name`, (2) runs `bump.sh --mode=check`, (3) asserts the parsed name matches the tag. Manual `gh workflow run release-tag.yml --ref vfoo` or hand-pushed tags fail before any build.
|
||||
|
||||
## Stuck-dispatch recovery
|
||||
|
||||
If Job 2's atomic push lands but `gh workflow run release-tag.yml` fails (rare — Job 1's auth precheck should prevent it), the tag is public but no pipeline runs. Re-dispatch: `gh workflow run release-tag.yml --ref v<new> -f dry_run=false`.
|
||||
@@ -30,13 +30,4 @@ runs:
|
||||
~/.gradle/caches
|
||||
key: ${{ runner.os }}-gradle-caches-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'buildSrc/**/*.kt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-gradle-caches-
|
||||
|
||||
- name: Cache Android Global Build-Cache
|
||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 #v5.0.3
|
||||
with:
|
||||
path: |
|
||||
~/.android/build-cache
|
||||
key: ${{ runner.os }}-android-build-cache-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-android-build-cache-
|
||||
${{ runner.os }}-gradle-caches-
|
||||
@@ -78,4 +78,27 @@ jobs:
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Validate metadata lengths
|
||||
run: bash fastlane/check_metadata_length.sh
|
||||
run: bash fastlane/check_metadata_length.sh
|
||||
|
||||
check-release-tooling:
|
||||
name: Release tooling
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Checkout source code
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install bats and shellcheck
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y bats shellcheck
|
||||
|
||||
- name: Shellcheck bump.sh
|
||||
run: shellcheck tools/release/bump.sh
|
||||
|
||||
- name: Run bump.sh unit tests
|
||||
run: bats tools/release/bump.bats
|
||||
|
||||
- name: Verify version.properties + VERSION are consistent
|
||||
run: ./tools/release/bump.sh --mode=check
|
||||
@@ -0,0 +1,58 @@
|
||||
name: Deploy GitHub Pages
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: pages
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build Jekyll site
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Checkout source code
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Configure Pages
|
||||
uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d #v6.0.0
|
||||
|
||||
- name: Build with Jekyll
|
||||
uses: actions/jekyll-build-pages@44a6e6beabd48582f863aeeb6cb2151cc1716697 #v1.0.13
|
||||
with:
|
||||
source: ./
|
||||
destination: ./_site
|
||||
env:
|
||||
JEKYLL_GITHUB_TOKEN: ${{ github.token }}
|
||||
|
||||
- name: Sanity-check Jekyll output
|
||||
run: test -f _site/index.html && test -f _site/CNAME
|
||||
|
||||
- name: Upload Pages artifact
|
||||
uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 #v5.0.0
|
||||
with:
|
||||
path: ./_site
|
||||
|
||||
deploy:
|
||||
name: Deploy to GitHub Pages
|
||||
needs: build
|
||||
if: github.ref == 'refs/heads/main'
|
||||
runs-on: ubuntu-22.04
|
||||
permissions:
|
||||
pages: write
|
||||
id-token: write
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
steps:
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 #v5.0.0
|
||||
@@ -0,0 +1,247 @@
|
||||
name: Release prepare
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
bump_kind:
|
||||
description: 'How to bump the version (ignored if version_override is set)'
|
||||
type: choice
|
||||
options: [build, patch, minor, major]
|
||||
default: build
|
||||
version_type:
|
||||
description: 'Channel for the new version (keep-current preserves current type)'
|
||||
type: choice
|
||||
options: [keep-current, rc, beta]
|
||||
default: keep-current
|
||||
version_override:
|
||||
description: 'Explicit version, e.g. 5.1.2-rc0 (overrides bump_kind/version_type)'
|
||||
type: string
|
||||
default: ''
|
||||
expected_current:
|
||||
description: 'Optional safety check: fail if current version.properties does not match (e.g. 5.1.1-rc0)'
|
||||
type: string
|
||||
default: ''
|
||||
dry_run:
|
||||
description: 'When true: compute and validate only. When false: commit, tag, push, dispatch release-tag.yml.'
|
||||
type: boolean
|
||||
default: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: release-prepare-main
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
compute-and-validate:
|
||||
name: Compute and validate
|
||||
runs-on: ubuntu-22.04
|
||||
permissions:
|
||||
contents: read
|
||||
actions: read
|
||||
outputs:
|
||||
new_name: ${{ steps.plan.outputs.new_name }}
|
||||
new_code: ${{ steps.plan.outputs.new_code }}
|
||||
current_name: ${{ steps.plan.outputs.current_name }}
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
INPUT_BUMP_KIND: ${{ inputs.bump_kind }}
|
||||
INPUT_VERSION_TYPE: ${{ inputs.version_type }}
|
||||
INPUT_VERSION_OVERRIDE: ${{ inputs.version_override }}
|
||||
INPUT_EXPECTED_CURRENT: ${{ inputs.expected_current }}
|
||||
steps:
|
||||
- name: Guard ref must be main
|
||||
run: |
|
||||
if [[ "${GITHUB_REF}" != "refs/heads/main" ]]; then
|
||||
echo "Must dispatch from main, got ${GITHUB_REF}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Checkout main
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
with:
|
||||
ref: main
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Verify gh auth and dispatch capability
|
||||
run: gh workflow view release-tag.yml > /dev/null
|
||||
|
||||
- name: Compute and validate
|
||||
id: plan
|
||||
run: |
|
||||
set -euo pipefail
|
||||
args=("--mode=plan")
|
||||
if [[ -n "${INPUT_VERSION_OVERRIDE}" ]]; then
|
||||
args+=("--version-override=${INPUT_VERSION_OVERRIDE}")
|
||||
else
|
||||
args+=("--bump-kind=${INPUT_BUMP_KIND}")
|
||||
args+=("--version-type=${INPUT_VERSION_TYPE}")
|
||||
fi
|
||||
if [[ -n "${INPUT_EXPECTED_CURRENT}" ]]; then
|
||||
args+=("--expected-current=${INPUT_EXPECTED_CURRENT}")
|
||||
fi
|
||||
./tools/release/bump.sh "${args[@]}" | tee plan.txt
|
||||
{
|
||||
grep -E '^current_name=' plan.txt
|
||||
grep -E '^new_name=' plan.txt
|
||||
grep -E '^new_code=' plan.txt
|
||||
} >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Tag collision check (local + remote)
|
||||
env:
|
||||
NEW_NAME: ${{ steps.plan.outputs.new_name }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if git rev-parse --verify "refs/tags/v${NEW_NAME}" >/dev/null 2>&1; then
|
||||
echo "Local tag v${NEW_NAME} already exists" >&2
|
||||
exit 1
|
||||
fi
|
||||
if git ls-remote --exit-code --tags origin "refs/tags/v${NEW_NAME}" >/dev/null; then
|
||||
echo "Remote tag v${NEW_NAME} already exists" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Write step summary
|
||||
env:
|
||||
CURRENT_NAME: ${{ steps.plan.outputs.current_name }}
|
||||
NEW_NAME: ${{ steps.plan.outputs.new_name }}
|
||||
NEW_CODE: ${{ steps.plan.outputs.new_code }}
|
||||
DRY_RUN: ${{ inputs.dry_run }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
{
|
||||
echo "## Release plan"
|
||||
echo
|
||||
echo "| | |"
|
||||
echo "|---|---|"
|
||||
echo "| Current | \`${CURRENT_NAME}\` |"
|
||||
echo "| New | \`${NEW_NAME}\` (code ${NEW_CODE}) |"
|
||||
echo "| Tag | \`v${NEW_NAME}\` |"
|
||||
echo "| Dry run | \`${DRY_RUN}\` |"
|
||||
echo
|
||||
echo "### bump.sh output"
|
||||
echo
|
||||
echo '```'
|
||||
cat plan.txt
|
||||
echo '```'
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
push-and-dispatch:
|
||||
name: Push and dispatch
|
||||
needs: compute-and-validate
|
||||
if: ${{ !inputs.dry_run }}
|
||||
runs-on: ubuntu-22.04
|
||||
permissions:
|
||||
contents: read
|
||||
env:
|
||||
INPUT_BUMP_KIND: ${{ inputs.bump_kind }}
|
||||
INPUT_VERSION_TYPE: ${{ inputs.version_type }}
|
||||
INPUT_VERSION_OVERRIDE: ${{ inputs.version_override }}
|
||||
NEW_NAME: ${{ needs.compute-and-validate.outputs.new_name }}
|
||||
NEW_CODE: ${{ needs.compute-and-validate.outputs.new_code }}
|
||||
CURRENT_NAME_AT_PLAN: ${{ needs.compute-and-validate.outputs.current_name }}
|
||||
steps:
|
||||
- name: Mint App token
|
||||
id: app-token
|
||||
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 #v3.1.1
|
||||
with:
|
||||
app-id: ${{ secrets.RELEASE_APP_ID }}
|
||||
private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Resolve bot identity
|
||||
id: bot
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||
APP_SLUG: ${{ steps.app-token.outputs.app-slug }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
user_id=$(gh api "/users/${APP_SLUG}%5Bbot%5D" --jq .id)
|
||||
echo "user_name=${APP_SLUG}[bot]" >> "$GITHUB_OUTPUT"
|
||||
echo "user_email=${user_id}+${APP_SLUG}[bot]@users.noreply.github.com" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Checkout main with credentials
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
with:
|
||||
ref: main
|
||||
fetch-depth: 0
|
||||
persist-credentials: true
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
|
||||
- name: Re-validate after approval wait
|
||||
run: |
|
||||
set -euo pipefail
|
||||
./tools/release/bump.sh --mode=check --expected-current="${CURRENT_NAME_AT_PLAN}"
|
||||
|
||||
- name: Re-check tag collision (state may have moved during approval)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if git rev-parse --verify "refs/tags/v${NEW_NAME}" >/dev/null 2>&1; then
|
||||
echo "Local tag v${NEW_NAME} already exists" >&2
|
||||
exit 1
|
||||
fi
|
||||
if git ls-remote --exit-code --tags origin "refs/tags/v${NEW_NAME}" >/dev/null; then
|
||||
echo "Remote tag v${NEW_NAME} already exists" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Apply bump
|
||||
run: |
|
||||
set -euo pipefail
|
||||
args=("--mode=write" "--expected-current=${CURRENT_NAME_AT_PLAN}")
|
||||
if [[ -n "${INPUT_VERSION_OVERRIDE}" ]]; then
|
||||
args+=("--version-override=${INPUT_VERSION_OVERRIDE}")
|
||||
else
|
||||
args+=("--bump-kind=${INPUT_BUMP_KIND}")
|
||||
args+=("--version-type=${INPUT_VERSION_TYPE}")
|
||||
fi
|
||||
./tools/release/bump.sh "${args[@]}"
|
||||
|
||||
- name: Verify post-write state matches plan
|
||||
run: |
|
||||
set -euo pipefail
|
||||
./tools/release/bump.sh --mode=check --expected-current="${NEW_NAME}"
|
||||
|
||||
- name: Configure git identity
|
||||
env:
|
||||
BOT_USER_NAME: ${{ steps.bot.outputs.user_name }}
|
||||
BOT_USER_EMAIL: ${{ steps.bot.outputs.user_email }}
|
||||
run: |
|
||||
git config user.name "${BOT_USER_NAME}"
|
||||
git config user.email "${BOT_USER_EMAIL}"
|
||||
|
||||
- name: Commit and tag
|
||||
run: |
|
||||
set -euo pipefail
|
||||
git add version.properties VERSION
|
||||
git commit -m "Release: ${NEW_NAME}"
|
||||
git tag -a "v${NEW_NAME}" -m "Release v${NEW_NAME}"
|
||||
|
||||
- name: Atomic push (commit + tag)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
git push --atomic origin "HEAD:refs/heads/main" "refs/tags/v${NEW_NAME}"
|
||||
|
||||
- name: Dispatch release-tag.yml
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
gh workflow run release-tag.yml --ref "v${NEW_NAME}" -f dry_run=false
|
||||
|
||||
- name: Write step summary
|
||||
run: |
|
||||
set -euo pipefail
|
||||
{
|
||||
echo "## Released"
|
||||
echo
|
||||
echo "| | |"
|
||||
echo "|---|---|"
|
||||
echo "| Tag | \`v${NEW_NAME}\` |"
|
||||
echo "| Version code | \`${NEW_CODE}\` |"
|
||||
echo "| Bump commit | on \`main\` |"
|
||||
echo "| Downstream | dispatched \`release-tag.yml\` |"
|
||||
echo
|
||||
echo "Watch the [Tagged releases](../../actions/workflows/release-tag.yml) workflow for the build + upload."
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
@@ -14,11 +14,54 @@ on:
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: release-${{ github.ref_name }}
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
validate-tag:
|
||||
name: Validate tag
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Check tag-name format
|
||||
env:
|
||||
REF_NAME: ${{ github.ref_name }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if [[ ! "${REF_NAME}" =~ ^v[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}-(rc|beta)[0-9]{1,2}$ ]]; then
|
||||
echo "Tag '${REF_NAME}' does not match v<M.m.p-(rc|beta)n>" >&2
|
||||
echo "Releases must be cut via the 'Release prepare' workflow." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Checkout source code
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
|
||||
with:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
|
||||
- name: Verify version.properties matches tag
|
||||
env:
|
||||
REF_NAME: ${{ github.ref_name }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# Strip leading 'v' to get the bare version name.
|
||||
tag_name="${REF_NAME#v}"
|
||||
# bump.sh in check mode emits current_name=...
|
||||
parsed=$(./tools/release/bump.sh --mode=check)
|
||||
current_name=$(echo "$parsed" | grep -E '^current_name=' | cut -d= -f2)
|
||||
if [[ "$current_name" != "$tag_name" ]]; then
|
||||
echo "Tag '${REF_NAME}' does not match version.properties name '$current_name'" >&2
|
||||
echo "version.properties + VERSION must equal the tag — releases must be cut via 'Release prepare'." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
release-github:
|
||||
needs: validate-tag
|
||||
name: Create GitHub release
|
||||
permissions:
|
||||
contents: write
|
||||
actions: write
|
||||
runs-on: ubuntu-22.04
|
||||
environment: foss-production
|
||||
steps:
|
||||
@@ -61,7 +104,7 @@ jobs:
|
||||
|
||||
- name: Create pre-release
|
||||
if: contains(github.ref_name, '-beta') && !(github.event_name == 'workflow_dispatch' && inputs.dry_run)
|
||||
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b #v2.5.0
|
||||
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda #v3.0.0
|
||||
with:
|
||||
prerelease: true
|
||||
tag_name: ${{ github.ref_name }}
|
||||
@@ -73,7 +116,7 @@ jobs:
|
||||
|
||||
- name: Create release
|
||||
if: "!contains(github.ref_name, '-beta') && !(github.event_name == 'workflow_dispatch' && inputs.dry_run)"
|
||||
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b #v2.5.0
|
||||
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda #v3.0.0
|
||||
with:
|
||||
prerelease: false
|
||||
tag_name: ${{ github.ref_name }}
|
||||
@@ -83,10 +126,19 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Trigger GitHub Pages deployment
|
||||
if: "!(github.event_name == 'workflow_dispatch' && inputs.dry_run)"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: gh workflow run pages.yml --ref main
|
||||
|
||||
release-gplay:
|
||||
needs: validate-tag
|
||||
name: Create Google Play release
|
||||
runs-on: ubuntu-22.04
|
||||
environment: gplay-production
|
||||
env:
|
||||
BUNDLE_GEMFILE: ${{ github.workspace }}/fastlane/Gemfile
|
||||
steps:
|
||||
- name: Decode Keystore
|
||||
env:
|
||||
@@ -122,6 +174,10 @@ jobs:
|
||||
with:
|
||||
ruby-version: 3.3.6
|
||||
bundler-cache: true
|
||||
working-directory: fastlane
|
||||
|
||||
- name: Verify fastlane Bundler wiring
|
||||
run: bundle exec fastlane --version
|
||||
|
||||
- name: Assemble beta and upload to Google Play
|
||||
if: contains(github.ref_name, '-beta') && !(github.event_name == 'workflow_dispatch' && inputs.dry_run)
|
||||
|
||||
+4
-1
@@ -18,4 +18,7 @@
|
||||
# Screenshot test reference images (ephemeral, regenerated on demand)
|
||||
app/src/screenshotTest*/reference/
|
||||
.codex
|
||||
protocol-research/
|
||||
protocol-research/
|
||||
_site/
|
||||
.jekyll-cache/
|
||||
vendor/bundle/
|
||||
@@ -20,9 +20,6 @@ exclude:
|
||||
- buildSrc
|
||||
- gradle/wrapper
|
||||
- fastlane
|
||||
- Gemfile
|
||||
- Gemfile.lock
|
||||
- crowdin*
|
||||
- app
|
||||
- app-common
|
||||
- CONTRIBUTING.md
|
||||
|
||||
@@ -29,6 +29,7 @@ import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
import javax.inject.Inject
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
@@ -45,17 +46,20 @@ open class App : Application() {
|
||||
super.onCreate()
|
||||
if (BuildConfig.DEBUG) Logging.install(LogCatLogger())
|
||||
|
||||
var foregroundExceptionHandled = false
|
||||
val foregroundExceptionHandled = AtomicBoolean(false)
|
||||
val oldHandler = Thread.getDefaultUncaughtExceptionHandler()
|
||||
Thread.setDefaultUncaughtExceptionHandler { thread, throwable ->
|
||||
if (throwable.isForegroundServiceTimingException() && !foregroundExceptionHandled) {
|
||||
foregroundExceptionHandled = true
|
||||
log(TAG, WARN) { "Suppressed foreground service timing exception: ${throwable.asLog()}" }
|
||||
Bugs.report(tag = TAG, "Foreground service timing exception suppressed", exception = throwable)
|
||||
val isTimingExc = throwable.isForegroundServiceTimingException()
|
||||
val isMain = thread === Looper.getMainLooper().thread
|
||||
if (isTimingExc && isMain && foregroundExceptionHandled.compareAndSet(false, true)) {
|
||||
runCatching {
|
||||
log(TAG, WARN) { "Suppressed foreground service timing exception: ${throwable.asLog()}" }
|
||||
Bugs.report(tag = TAG, "Foreground service timing exception suppressed", exception = throwable)
|
||||
}
|
||||
Looper.loop()
|
||||
return@setDefaultUncaughtExceptionHandler
|
||||
}
|
||||
log(TAG, ERROR) { "UNCAUGHT EXCEPTION: ${throwable.asLog()}" }
|
||||
runCatching { log(TAG, ERROR) { "UNCAUGHT EXCEPTION: ${throwable.asLog()}" } }
|
||||
if (oldHandler != null) oldHandler.uncaughtException(thread, throwable) else exitProcess(1)
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
package eu.darken.capod.common
|
||||
|
||||
import androidx.lifecycle.Lifecycle
|
||||
import androidx.lifecycle.LifecycleEventObserver
|
||||
import androidx.lifecycle.ProcessLifecycleOwner
|
||||
import eu.darken.capod.common.coroutine.AppScope
|
||||
import eu.darken.capod.common.coroutine.DispatcherProvider
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
|
||||
import eu.darken.capod.common.debug.logging.asLog
|
||||
import eu.darken.capod.common.debug.logging.log
|
||||
import eu.darken.capod.common.debug.logging.logTag
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.channels.awaitClose
|
||||
import kotlinx.coroutines.flow.catch
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class AppForegroundState @Inject constructor(
|
||||
@AppScope appScope: CoroutineScope,
|
||||
dispatcherProvider: DispatcherProvider,
|
||||
) {
|
||||
|
||||
val isForeground: StateFlow<Boolean> = callbackFlow {
|
||||
val lifecycle = runCatching { ProcessLifecycleOwner.get().lifecycle }
|
||||
.getOrElse {
|
||||
log(TAG, WARN) { "Failed to access process lifecycle, assuming background: ${it.asLog()}" }
|
||||
trySend(false)
|
||||
close()
|
||||
return@callbackFlow
|
||||
}
|
||||
|
||||
trySend(safeCurrentForegroundState())
|
||||
|
||||
val observer = LifecycleEventObserver { _, event ->
|
||||
when (event) {
|
||||
Lifecycle.Event.ON_START -> trySend(true)
|
||||
Lifecycle.Event.ON_STOP -> trySend(false)
|
||||
else -> Unit
|
||||
}
|
||||
}
|
||||
|
||||
runCatching { lifecycle.addObserver(observer) }
|
||||
.onFailure {
|
||||
log(TAG, WARN) { "Failed to observe process lifecycle, assuming background: ${it.asLog()}" }
|
||||
trySend(false)
|
||||
close()
|
||||
}
|
||||
|
||||
awaitClose {
|
||||
runCatching { lifecycle.removeObserver(observer) }
|
||||
.onFailure { log(TAG, WARN) { "Failed to remove process lifecycle observer: ${it.asLog()}" } }
|
||||
}
|
||||
}
|
||||
.flowOn(dispatcherProvider.MainImmediate)
|
||||
.catch {
|
||||
log(TAG, WARN) { "Foreground state flow failed, assuming background: ${it.asLog()}" }
|
||||
emit(false)
|
||||
}
|
||||
.distinctUntilChanged()
|
||||
.onEach { log(TAG) { "isForeground=$it" } }
|
||||
.stateIn(
|
||||
scope = appScope,
|
||||
started = SharingStarted.WhileSubscribed(stopTimeoutMillis = 5_000L),
|
||||
initialValue = safeCurrentForegroundState(),
|
||||
)
|
||||
|
||||
private fun safeCurrentForegroundState(): Boolean = runCatching {
|
||||
ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
|
||||
}.getOrElse {
|
||||
log(TAG, WARN) { "Failed to read process lifecycle state, assuming background: ${it.asLog()}" }
|
||||
false
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val TAG = logTag("App", "ForegroundState")
|
||||
}
|
||||
}
|
||||
@@ -318,6 +318,74 @@ class BluetoothManager2 @Inject constructor(
|
||||
emit(wrappedDevices)
|
||||
}
|
||||
|
||||
@android.annotation.SuppressLint("MissingPermission")
|
||||
private fun queryBondedAddresses(): Set<BluetoothAddress> =
|
||||
adapter?.bondedDevices?.map { it.address }?.toSet() ?: emptySet()
|
||||
|
||||
val bondedDeviceAddresses: Flow<Set<BluetoothAddress>> = callbackFlow {
|
||||
fun sendBondedAddresses(): Boolean = try {
|
||||
trySend(queryBondedAddresses())
|
||||
true
|
||||
} catch (e: Exception) {
|
||||
log(TAG, WARN) { "Error querying bonded device addresses: $e" }
|
||||
trySend(emptySet())
|
||||
close(e)
|
||||
false
|
||||
}
|
||||
|
||||
if (!sendBondedAddresses()) return@callbackFlow
|
||||
|
||||
val receiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
if (intent.action != BluetoothDevice.ACTION_BOND_STATE_CHANGED) return
|
||||
sendBondedAddresses()
|
||||
}
|
||||
}
|
||||
try {
|
||||
context.registerReceiver(receiver, IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED))
|
||||
} catch (e: Exception) {
|
||||
log(TAG, ERROR) { "Failed to register bond-state receiver: $e" }
|
||||
close(e)
|
||||
return@callbackFlow
|
||||
}
|
||||
|
||||
awaitClose {
|
||||
try {
|
||||
context.unregisterReceiver(receiver)
|
||||
} catch (e: Exception) {
|
||||
log(TAG, WARN) { "Error unregistering bond-state receiver: $e" }
|
||||
}
|
||||
}
|
||||
}
|
||||
.retryWhen { cause, attempt ->
|
||||
log(TAG, WARN) { "bondedDeviceAddresses Flow failed (attempt ${attempt + 1}): $cause" }
|
||||
when {
|
||||
cause is SecurityException -> {
|
||||
delay(3_000L)
|
||||
true
|
||||
}
|
||||
attempt < 3 -> {
|
||||
delay(1000 * (attempt + 1))
|
||||
true
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
.catch { e ->
|
||||
log(TAG, ERROR) { "bondedDeviceAddresses Flow failed after retries: $e" }
|
||||
emit(emptySet())
|
||||
}
|
||||
.distinctUntilChanged()
|
||||
.setupCommonEventHandlers(TAG) { "bondedDeviceAddresses" }
|
||||
.stateIn(
|
||||
scope = appScope + dispatcherProvider.IO,
|
||||
started = SharingStarted.WhileSubscribed(
|
||||
stopTimeoutMillis = 5_000L,
|
||||
replayExpirationMillis = 0L,
|
||||
),
|
||||
initialValue = emptySet(),
|
||||
)
|
||||
|
||||
private var _isNudgeAvailable: Boolean = true
|
||||
val isNudgeAvailable: Boolean get() = _isNudgeAvailable
|
||||
|
||||
|
||||
@@ -1,25 +1,11 @@
|
||||
package eu.darken.capod.common.bluetooth
|
||||
|
||||
import androidx.annotation.StringRes
|
||||
import eu.darken.capod.R
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
enum class ScannerMode(
|
||||
val identifier: String,
|
||||
@StringRes val labelRes: Int
|
||||
) {
|
||||
@SerialName("scanner.mode.lowpower") LOW_POWER(
|
||||
"scanner.mode.lowpower",
|
||||
R.string.settings_scanner_mode_lowpower_label
|
||||
),
|
||||
@SerialName("scanner.mode.balanced") BALANCED(
|
||||
"scanner.mode.balanced",
|
||||
R.string.settings_scanner_mode_balanced_label
|
||||
),
|
||||
@SerialName("scanner.mode.lowlatency") LOW_LATENCY(
|
||||
"scanner.mode.lowlatency",
|
||||
R.string.settings_scanner_mode_lowlatency_label
|
||||
),
|
||||
}
|
||||
enum class ScannerMode {
|
||||
@SerialName("scanner.mode.lowpower") LOW_POWER,
|
||||
@SerialName("scanner.mode.balanced") BALANCED,
|
||||
@SerialName("scanner.mode.lowlatency") LOW_LATENCY,
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ import androidx.datastore.preferences.preferencesDataStore
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import eu.darken.capod.common.BuildConfigWrap
|
||||
import eu.darken.capod.common.bluetooth.BluetoothAddress
|
||||
import eu.darken.capod.common.bluetooth.ScannerMode
|
||||
import eu.darken.capod.common.datastore.createValue
|
||||
import eu.darken.capod.common.serialization.ByteArrayBase64Serializer
|
||||
import eu.darken.capod.common.serialization.SerializationCapod
|
||||
@@ -44,8 +43,6 @@ class GeneralSettings @Inject constructor(
|
||||
val keepConnectedNotificationAfterDisconnect =
|
||||
dataStore.createValue("core.monitor.notification.connected.keepafterdisconnected", false)
|
||||
|
||||
val scannerMode = dataStore.createValue("core.scanner.mode", ScannerMode.BALANCED, json, onErrorFallbackToDefault = true)
|
||||
|
||||
val oldMinimumSignalQuality = dataStore.createValue("core.signal.minimum", 0.20f)
|
||||
|
||||
val oldMainDeviceAddress = dataStore.createValue<BluetoothAddress?>(
|
||||
@@ -79,6 +76,8 @@ class GeneralSettings @Inject constructor(
|
||||
|
||||
val isOnboardingDone = dataStore.createValue("core.onboarding.done", false)
|
||||
|
||||
val reactionsHintDismissed = dataStore.createValue("ui.hint.reactions_per_device.dismissed", false)
|
||||
|
||||
val themeMode = dataStore.createValue(
|
||||
"core.ui.theme.mode", ThemeMode.SYSTEM, json,
|
||||
onErrorFallbackToDefault = BuildConfigWrap.BUILD_TYPE != BuildConfigWrap.BuildType.DEV,
|
||||
|
||||
@@ -439,6 +439,11 @@ class DeviceSettingsViewModel @Inject constructor(
|
||||
fun navToPressControls() = launch {
|
||||
log(TAG, INFO) { "navToPressControls()" }
|
||||
val profileId = targetProfileId.value ?: return@launch
|
||||
val device = deviceMonitor.getDeviceForProfile(profileId)
|
||||
if (device?.isAapReady != true) {
|
||||
log(TAG, INFO) { "navToPressControls(): aborted, device not AAP-ready" }
|
||||
return@launch
|
||||
}
|
||||
navTo(Nav.Main.PressControls(profileId = profileId))
|
||||
}
|
||||
|
||||
|
||||
@@ -133,7 +133,10 @@ internal fun NoiseControlCard(
|
||||
text = stringResource(R.string.press_controls_long_press_anc_cycle_info),
|
||||
type = InfoBoxType.INFO,
|
||||
action = {
|
||||
TextButton(onClick = onPressControlsClick) {
|
||||
TextButton(
|
||||
onClick = onPressControlsClick,
|
||||
enabled = enabled,
|
||||
) {
|
||||
Text(stringResource(R.string.device_settings_noise_control_open_press_controls_action))
|
||||
}
|
||||
},
|
||||
|
||||
@@ -59,6 +59,7 @@ import eu.darken.capod.main.ui.overview.cards.DualPodsCard
|
||||
import eu.darken.capod.main.ui.overview.cards.MonitoringActiveCard
|
||||
import eu.darken.capod.main.ui.overview.cards.NoProfilesCard
|
||||
import eu.darken.capod.main.ui.overview.cards.PermissionCard
|
||||
import eu.darken.capod.main.ui.overview.cards.ReactionsMovedHintCard
|
||||
import eu.darken.capod.main.ui.overview.cards.SinglePodsCard
|
||||
import eu.darken.capod.main.ui.overview.cards.UnknownPodDeviceCard
|
||||
import eu.darken.capod.main.ui.overview.cards.UnmatchedDevicesCard
|
||||
@@ -67,6 +68,22 @@ import eu.darken.capod.pods.core.apple.PodModel
|
||||
import eu.darken.capod.pods.core.apple.aap.protocol.AapSetting
|
||||
import java.time.Instant
|
||||
|
||||
internal fun profiledDeviceKey(
|
||||
device: PodDevice,
|
||||
index: Int,
|
||||
duplicateProfileIds: Set<String>,
|
||||
): String {
|
||||
val pid = requireNotNull(device.profileId)
|
||||
return if (pid !in duplicateProfileIds) {
|
||||
"profiled:$pid"
|
||||
} else {
|
||||
"profiled:$pid:${device.identifier ?: "idx:$index"}"
|
||||
}
|
||||
}
|
||||
|
||||
internal fun unmatchedDeviceKey(device: PodDevice, index: Int): String =
|
||||
"unmatched:${device.identifier ?: "idx:$index"}"
|
||||
|
||||
@Composable
|
||||
fun OverviewScreenHost(vm: OverviewViewModel = hiltViewModel()) {
|
||||
ErrorEventHandler(vm)
|
||||
@@ -158,7 +175,10 @@ fun OverviewScreenHost(vm: OverviewViewModel = hiltViewModel()) {
|
||||
onUpgrade = { vm.onUpgrade() },
|
||||
onToggleUnmatched = { vm.toggleUnmatchedDevices() },
|
||||
onAncModeChange = { device, mode -> vm.setAncMode(device, mode) },
|
||||
onDeviceSettings = { device -> vm.goToDeviceSettings(device) },
|
||||
onDeviceSettings = { device ->
|
||||
if (currentState.showReactionsHint) vm.dismissReactionsHint()
|
||||
vm.goToDeviceSettings(device)
|
||||
},
|
||||
onEditProfile = { device -> vm.goToEditProfile(device) },
|
||||
onToggleDeviceExpansion = { device ->
|
||||
device.profileId?.let { vm.toggleDeviceExpansion(it) }
|
||||
@@ -286,9 +306,21 @@ fun OverviewScreen(
|
||||
|
||||
// 4. Profiled device cards (limited to 1 for free users)
|
||||
if (!state.isScanBlocked && state.isBluetoothEnabled) {
|
||||
if (state.showReactionsHint && state.visibleProfiledDevices.isNotEmpty()) {
|
||||
item(key = "reactions_hint") {
|
||||
ReactionsMovedHintCard()
|
||||
}
|
||||
}
|
||||
|
||||
val duplicateProfileIds = state.visibleProfiledDevices
|
||||
.mapNotNull { it.profileId }
|
||||
.groupingBy { it }
|
||||
.eachCount()
|
||||
.filterValues { it > 1 }
|
||||
.keys
|
||||
itemsIndexed(
|
||||
items = state.visibleProfiledDevices,
|
||||
key = { _, device -> requireNotNull(device.profileId) },
|
||||
key = { index, device -> profiledDeviceKey(device, index, duplicateProfileIds) },
|
||||
) { index, device ->
|
||||
val isCollapsed = !state.isExpanded(device, index)
|
||||
val isToggleable = state.isToggleable(device, index)
|
||||
@@ -337,10 +369,10 @@ fun OverviewScreen(
|
||||
}
|
||||
|
||||
if (state.showUnmatchedDevices) {
|
||||
items(
|
||||
itemsIndexed(
|
||||
items = state.unmatchedDevices,
|
||||
key = { "unmatched_${it.identifier?.toString() ?: it.hashCode()}" },
|
||||
) { device ->
|
||||
key = { index, device -> unmatchedDeviceKey(device, index) },
|
||||
) { _, device ->
|
||||
PodDeviceCard(
|
||||
device = device,
|
||||
isPro = state.upgradeInfo.isPro,
|
||||
@@ -414,6 +446,7 @@ private fun OverviewScreenWithDevicesPreview() = PreviewWrapper {
|
||||
),
|
||||
upgradeInfo = MockPodDataProvider.fossInfo(),
|
||||
showUnmatchedDevices = false,
|
||||
showReactionsHint = true,
|
||||
),
|
||||
onRequestPermission = {},
|
||||
onBluetoothSettings = {},
|
||||
|
||||
@@ -4,6 +4,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import eu.darken.capod.common.TimeSource
|
||||
import eu.darken.capod.common.bluetooth.BluetoothManager2
|
||||
import eu.darken.capod.common.coroutine.DispatcherProvider
|
||||
import eu.darken.capod.common.datastore.value
|
||||
import eu.darken.capod.common.datastore.valueBlocking
|
||||
import eu.darken.capod.common.debug.DebugSettings
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.INFO
|
||||
@@ -130,7 +131,9 @@ class OverviewViewModel @Inject constructor(
|
||||
upgradeRepo.upgradeInfo,
|
||||
showUnmatchedDevices,
|
||||
userExpansionOverrides,
|
||||
) { _, permissions, devices, isDebugMode, isBluetoothEnabled, profiles, upgradeInfo, showUnmatched, expandedIds ->
|
||||
generalSettings.reactionsHintDismissed.flow,
|
||||
profilesRepo.hadLegacyReactionData,
|
||||
) { _, permissions, devices, isDebugMode, isBluetoothEnabled, profiles, upgradeInfo, showUnmatched, expandedIds, reactionsHintDismissed, hadLegacyReactionData ->
|
||||
// Prune stale overrides (profiles that no longer exist)
|
||||
val currentProfileIds = profiles.map { it.id }.toSet()
|
||||
val prunedExpandedIds = expandedIds.filter { it in currentProfileIds }.toSet()
|
||||
@@ -145,6 +148,7 @@ class OverviewViewModel @Inject constructor(
|
||||
upgradeInfo = upgradeInfo,
|
||||
showUnmatchedDevices = showUnmatched,
|
||||
userExpandedIds = prunedExpandedIds,
|
||||
showReactionsHint = hadLegacyReactionData && !reactionsHintDismissed,
|
||||
)
|
||||
}.asLiveState()
|
||||
|
||||
@@ -160,6 +164,7 @@ class OverviewViewModel @Inject constructor(
|
||||
val upgradeInfo: UpgradeRepo.Info,
|
||||
val showUnmatchedDevices: Boolean,
|
||||
val userExpandedIds: Set<String> = emptySet(),
|
||||
val showReactionsHint: Boolean = false,
|
||||
) {
|
||||
val isScanBlocked: Boolean get() = permissions.any { it.isScanBlocking }
|
||||
|
||||
@@ -252,6 +257,13 @@ class OverviewViewModel @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun dismissReactionsHint() {
|
||||
log(TAG, INFO) { "dismissReactionsHint()" }
|
||||
launch {
|
||||
generalSettings.reactionsHintDismissed.value(true)
|
||||
}
|
||||
}
|
||||
|
||||
fun requestPermission(permission: Permission) {
|
||||
log(TAG, INFO) { "requestPermission($permission)" }
|
||||
requestPermissionEvent.tryEmit(permission)
|
||||
|
||||
@@ -29,8 +29,8 @@ import androidx.compose.material3.CircularProgressIndicator
|
||||
import androidx.compose.material3.ElevatedCard
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.OutlinedIconButton
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -168,7 +168,7 @@ fun DualPodsCard(
|
||||
}
|
||||
|
||||
if (device.profileId != null && onDeviceSettings != null) {
|
||||
IconButton(onClick = onDeviceSettings) {
|
||||
OutlinedIconButton(onClick = onDeviceSettings) {
|
||||
Icon(
|
||||
imageVector = Icons.TwoTone.Tune,
|
||||
contentDescription = stringResource(R.string.device_settings_open_cd),
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
package eu.darken.capod.main.ui.overview.cards
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.IntrinsicSize
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxHeight
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.twotone.Tune
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import eu.darken.capod.R
|
||||
import eu.darken.capod.common.compose.Preview2
|
||||
import eu.darken.capod.common.compose.PreviewWrapper
|
||||
|
||||
@Composable
|
||||
fun ReactionsMovedHintCard(
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
Surface(
|
||||
color = MaterialTheme.colorScheme.surfaceContainerLow,
|
||||
shape = RoundedCornerShape(12.dp),
|
||||
modifier = modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 8.dp, vertical = 4.dp),
|
||||
) {
|
||||
Row(modifier = Modifier.height(IntrinsicSize.Min)) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.width(3.dp)
|
||||
.fillMaxHeight()
|
||||
.background(MaterialTheme.colorScheme.primary),
|
||||
)
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(start = 16.dp, end = 16.dp, top = 14.dp, bottom = 14.dp),
|
||||
verticalArrangement = Arrangement.spacedBy(6.dp),
|
||||
) {
|
||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||
Icon(
|
||||
imageVector = Icons.TwoTone.Tune,
|
||||
contentDescription = null,
|
||||
tint = MaterialTheme.colorScheme.primary,
|
||||
modifier = Modifier.size(20.dp),
|
||||
)
|
||||
Spacer(Modifier.width(10.dp))
|
||||
Text(
|
||||
text = stringResource(R.string.overview_reactions_hint_title),
|
||||
style = MaterialTheme.typography.titleMedium.copy(
|
||||
fontWeight = FontWeight.SemiBold,
|
||||
),
|
||||
color = MaterialTheme.colorScheme.onSurface,
|
||||
)
|
||||
}
|
||||
Text(
|
||||
text = stringResource(R.string.overview_reactions_hint_body),
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
lineHeight = 18.sp,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview2
|
||||
@Composable
|
||||
private fun ReactionsMovedHintCardPreview() = PreviewWrapper {
|
||||
ReactionsMovedHintCard()
|
||||
}
|
||||
@@ -28,8 +28,8 @@ import androidx.compose.material3.CardDefaults
|
||||
import androidx.compose.material3.CircularProgressIndicator
|
||||
import androidx.compose.material3.ElevatedCard
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.OutlinedIconButton
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -150,7 +150,7 @@ fun SinglePodsCard(
|
||||
}
|
||||
|
||||
if (device.profileId != null && onDeviceSettings != null) {
|
||||
IconButton(onClick = onDeviceSettings) {
|
||||
OutlinedIconButton(onClick = onDeviceSettings) {
|
||||
Icon(
|
||||
imageVector = Icons.TwoTone.Tune,
|
||||
contentDescription = stringResource(R.string.device_settings_open_cd),
|
||||
|
||||
@@ -23,6 +23,7 @@ import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
@@ -70,6 +71,18 @@ fun PressControlsScreenHost(
|
||||
val state by vm.state.collectAsStateWithLifecycle(initialValue = null)
|
||||
val currentState = state ?: return
|
||||
|
||||
val isAapConnected = currentState.device?.isAapConnected == true
|
||||
var hasSeenAapConnected by rememberSaveable(profileId) { mutableStateOf(false) }
|
||||
var didAutoNavigate by rememberSaveable(profileId) { mutableStateOf(false) }
|
||||
LaunchedEffect(profileId, isAapConnected) {
|
||||
if (isAapConnected) {
|
||||
hasSeenAapConnected = true
|
||||
} else if (hasSeenAapConnected && !didAutoNavigate) {
|
||||
didAutoNavigate = true
|
||||
vm.navUp()
|
||||
}
|
||||
}
|
||||
|
||||
PressControlsScreen(
|
||||
state = currentState,
|
||||
snackbarHostState = snackbarHostState,
|
||||
|
||||
@@ -19,7 +19,6 @@ import androidx.compose.material.icons.twotone.FilterList
|
||||
import androidx.compose.material.icons.automirrored.twotone.Message
|
||||
import androidx.compose.material.icons.twotone.Notifications
|
||||
import androidx.compose.material.icons.twotone.Palette
|
||||
import androidx.compose.material.icons.twotone.SettingsBluetooth
|
||||
import androidx.compose.material.icons.automirrored.twotone.ViewList
|
||||
import androidx.compose.material3.AlertDialog
|
||||
import androidx.compose.material3.Icon
|
||||
@@ -45,7 +44,6 @@ import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import eu.darken.capod.R
|
||||
import eu.darken.capod.common.compose.Preview2
|
||||
import eu.darken.capod.common.compose.PreviewWrapper
|
||||
import eu.darken.capod.common.bluetooth.ScannerMode
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import eu.darken.capod.common.error.ErrorEventHandler
|
||||
import eu.darken.capod.common.navigation.NavigationEventHandler
|
||||
@@ -70,7 +68,6 @@ fun GeneralSettingsScreenHost(vm: GeneralSettingsViewModel = hiltViewModel()) {
|
||||
state = it,
|
||||
onNavigateUp = { vm.navUp() },
|
||||
onMonitorModeSelected = { mode -> vm.setMonitorMode(mode) },
|
||||
onScannerModeSelected = { mode -> vm.setScannerMode(mode) },
|
||||
onShowConnectedNotificationChanged = { enabled -> vm.setShowConnectedNotification(enabled) },
|
||||
onKeepNotificationAfterDisconnectChanged = { enabled -> vm.setKeepNotificationAfterDisconnect(enabled) },
|
||||
onDebugSettings = { vm.goToDebugSettings() },
|
||||
@@ -90,7 +87,6 @@ fun GeneralSettingsScreen(
|
||||
state: GeneralSettingsViewModel.State,
|
||||
onNavigateUp: () -> Unit,
|
||||
onMonitorModeSelected: (MonitorMode) -> Unit,
|
||||
onScannerModeSelected: (ScannerMode) -> Unit,
|
||||
onShowConnectedNotificationChanged: (Boolean) -> Unit,
|
||||
onKeepNotificationAfterDisconnectChanged: (Boolean) -> Unit,
|
||||
onDebugSettings: () -> Unit,
|
||||
@@ -104,7 +100,6 @@ fun GeneralSettingsScreen(
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
var showMonitorModeDialog by remember { mutableStateOf(false) }
|
||||
var showScannerModeDialog by remember { mutableStateOf(false) }
|
||||
var showColorDialog by remember { mutableStateOf(false) }
|
||||
|
||||
val isMaterialYouActive = state.themeState.style == ThemeStyle.MATERIAL_YOU &&
|
||||
@@ -138,14 +133,6 @@ fun GeneralSettingsScreen(
|
||||
onClick = { showMonitorModeDialog = true },
|
||||
)
|
||||
}
|
||||
item {
|
||||
SettingsBaseItem(
|
||||
title = stringResource(R.string.settings_scanner_mode_label),
|
||||
subtitle = stringResource(state.scannerMode.labelRes),
|
||||
icon = Icons.TwoTone.SettingsBluetooth,
|
||||
onClick = { showScannerModeDialog = true },
|
||||
)
|
||||
}
|
||||
item {
|
||||
SettingsCategoryHeader(text = stringResource(R.string.settings_category_appearance_label))
|
||||
}
|
||||
@@ -313,20 +300,6 @@ fun GeneralSettingsScreen(
|
||||
)
|
||||
}
|
||||
|
||||
if (showScannerModeDialog) {
|
||||
ListPreferenceDialog(
|
||||
title = stringResource(R.string.settings_scanner_mode_label),
|
||||
entries = ScannerMode.entries,
|
||||
selectedEntry = state.scannerMode,
|
||||
onEntrySelected = {
|
||||
onScannerModeSelected(it)
|
||||
showScannerModeDialog = false
|
||||
},
|
||||
entryLabel = { stringResource(it.labelRes) },
|
||||
onDismiss = { showScannerModeDialog = false },
|
||||
)
|
||||
}
|
||||
|
||||
if (showColorDialog) {
|
||||
ThemeColorSelectorDialog(
|
||||
selectedColor = state.themeState.color,
|
||||
@@ -342,7 +315,6 @@ fun GeneralSettingsScreen(
|
||||
private fun previewGeneralState(isPro: Boolean) = GeneralSettingsViewModel.State(
|
||||
isPro = isPro,
|
||||
monitorMode = MonitorMode.AUTOMATIC,
|
||||
scannerMode = ScannerMode.BALANCED,
|
||||
showConnectedNotification = true,
|
||||
keepNotificationAfterDisconnect = false,
|
||||
isOffloadedFilteringDisabled = false,
|
||||
@@ -358,7 +330,6 @@ private fun GeneralSettingsScreenProPreview() = PreviewWrapper {
|
||||
state = previewGeneralState(isPro = true),
|
||||
onNavigateUp = {},
|
||||
onMonitorModeSelected = {},
|
||||
onScannerModeSelected = {},
|
||||
onShowConnectedNotificationChanged = {},
|
||||
onKeepNotificationAfterDisconnectChanged = {},
|
||||
onDebugSettings = {},
|
||||
@@ -375,7 +346,6 @@ private fun GeneralSettingsScreenNonProPreview() = PreviewWrapper {
|
||||
state = previewGeneralState(isPro = false),
|
||||
onNavigateUp = {},
|
||||
onMonitorModeSelected = {},
|
||||
onScannerModeSelected = {},
|
||||
onShowConnectedNotificationChanged = {},
|
||||
onKeepNotificationAfterDisconnectChanged = {},
|
||||
onDebugSettings = {},
|
||||
|
||||
+4
-13
@@ -1,7 +1,6 @@
|
||||
package eu.darken.capod.main.ui.settings.general
|
||||
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import eu.darken.capod.common.bluetooth.ScannerMode
|
||||
import eu.darken.capod.common.coroutine.DispatcherProvider
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.INFO
|
||||
import eu.darken.capod.common.debug.logging.log
|
||||
@@ -32,7 +31,6 @@ class GeneralSettingsViewModel @Inject constructor(
|
||||
data class State(
|
||||
val isPro: Boolean,
|
||||
val monitorMode: MonitorMode,
|
||||
val scannerMode: ScannerMode,
|
||||
val showConnectedNotification: Boolean,
|
||||
val keepNotificationAfterDisconnect: Boolean,
|
||||
val isOffloadedFilteringDisabled: Boolean,
|
||||
@@ -46,12 +44,11 @@ class GeneralSettingsViewModel @Inject constructor(
|
||||
val state = combine(
|
||||
combine(
|
||||
generalSettings.monitorMode.flow,
|
||||
generalSettings.scannerMode.flow,
|
||||
generalSettings.useExtraMonitorNotification.flow,
|
||||
generalSettings.keepConnectedNotificationAfterDisconnect.flow,
|
||||
) { monitorMode, scannerMode, showNotif, keepNotif ->
|
||||
) { monitorMode, showNotif, keepNotif ->
|
||||
@Suppress("USELESS_CAST")
|
||||
arrayOf<Any>(monitorMode as Any, scannerMode as Any, showNotif as Any, keepNotif as Any)
|
||||
arrayOf<Any>(monitorMode as Any, showNotif as Any, keepNotif as Any)
|
||||
},
|
||||
combine(
|
||||
generalSettings.isOffloadedFilteringDisabled.flow,
|
||||
@@ -67,9 +64,8 @@ class GeneralSettingsViewModel @Inject constructor(
|
||||
State(
|
||||
isPro = isPro,
|
||||
monitorMode = general[0] as MonitorMode,
|
||||
scannerMode = general[1] as ScannerMode,
|
||||
showConnectedNotification = general[2] as Boolean,
|
||||
keepNotificationAfterDisconnect = general[3] as Boolean,
|
||||
showConnectedNotification = general[1] as Boolean,
|
||||
keepNotificationAfterDisconnect = general[2] as Boolean,
|
||||
isOffloadedFilteringDisabled = compat[0] as Boolean,
|
||||
isOffloadedBatchingDisabled = compat[1] as Boolean,
|
||||
useIndirectScanResultCallback = compat[2] as Boolean,
|
||||
@@ -82,11 +78,6 @@ class GeneralSettingsViewModel @Inject constructor(
|
||||
generalSettings.monitorMode.valueBlocking = mode
|
||||
}
|
||||
|
||||
fun setScannerMode(mode: ScannerMode) {
|
||||
log(TAG, INFO) { "setScannerMode($mode)" }
|
||||
generalSettings.scannerMode.valueBlocking = mode
|
||||
}
|
||||
|
||||
fun setShowConnectedNotification(enabled: Boolean) {
|
||||
log(TAG, INFO) { "setShowConnectedNotification($enabled)" }
|
||||
generalSettings.useExtraMonitorNotification.valueBlocking = enabled
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.content.Context
|
||||
import androidx.annotation.Keep
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.glance.GlanceId
|
||||
import androidx.glance.LocalSize
|
||||
import androidx.glance.appwidget.GlanceAppWidget
|
||||
@@ -23,8 +24,9 @@ import eu.darken.capod.common.debug.logging.logTag
|
||||
import eu.darken.capod.common.upgrade.UpgradeRepo
|
||||
import eu.darken.capod.common.upgrade.isPro
|
||||
import eu.darken.capod.monitor.core.DeviceMonitor
|
||||
import eu.darken.capod.monitor.core.PodDevice
|
||||
import eu.darken.capod.profiles.core.DeviceProfilesRepo
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
class AncGlanceWidget : GlanceAppWidget() {
|
||||
|
||||
@@ -43,21 +45,15 @@ class AncGlanceWidget : GlanceAppWidget() {
|
||||
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||
val ep: AncWidgetEntryPoint
|
||||
val appWidgetId: Int
|
||||
val initialIsPro: Boolean
|
||||
val initialProfileId: String?
|
||||
val cachedDevice: PodDevice?
|
||||
|
||||
try {
|
||||
ep = EntryPointAccessors.fromApplication(context, AncWidgetEntryPoint::class.java)
|
||||
appWidgetId = GlanceAppWidgetManager(context).getAppWidgetId(id)
|
||||
log(TAG, VERBOSE) { "provideGlance(appWidgetId=$appWidgetId)" }
|
||||
initialIsPro = ep.upgradeRepo().isPro()
|
||||
ep.widgetSettings().migrateLegacyConfigIfNeeded(
|
||||
appWidgetId,
|
||||
AppWidgetManager.getInstance(context).getAppWidgetOptions(appWidgetId),
|
||||
)
|
||||
initialProfileId = ep.widgetSettings().getWidgetConfig(appWidgetId).profileId
|
||||
cachedDevice = initialProfileId?.let { ep.deviceMonitor().getDeviceForProfile(it) }
|
||||
} catch (e: Exception) {
|
||||
log(TAG, ERROR) { "provideGlance setup failed: ${e.asLog()}" }
|
||||
provideContent {
|
||||
@@ -77,25 +73,40 @@ class AncGlanceWidget : GlanceAppWidget() {
|
||||
}
|
||||
|
||||
provideContent {
|
||||
val devices by ep.deviceMonitor().devices.collectAsState(initial = emptyList())
|
||||
val profiles by ep.deviceProfilesRepo().profiles.collectAsState(initial = emptyList())
|
||||
val upgradeInfo by ep.upgradeRepo().upgradeInfo.collectAsState(initial = null)
|
||||
val widthDp = LocalSize.current.width
|
||||
val heightDp = LocalSize.current.height
|
||||
|
||||
val state = try {
|
||||
val config = ep.widgetSettings().getWidgetConfig(appWidgetId)
|
||||
val profileId = config.profileId
|
||||
val theme = config.theme
|
||||
// Glance keeps the content session alive and does not restart provideGlance()
|
||||
// for every update(). Observe a widget-key-deduped device flow so visible state
|
||||
// changes update active sessions without recomposing on every BLE advertisement.
|
||||
val config = runCatching { ep.widgetSettings().getWidgetConfig(appWidgetId) }
|
||||
.onFailure { e -> log(TAG, ERROR) { "getWidgetConfig failed: ${e.asLog()}" } }
|
||||
.getOrNull()
|
||||
|
||||
val isPro = upgradeInfo?.isPro ?: initialIsPro
|
||||
|
||||
val liveDevice = devices.firstOrNull { it.profileId == profileId }
|
||||
val device = liveDevice ?: cachedDevice?.takeIf { it.profileId == profileId }
|
||||
|
||||
val profileLabel = profileId?.let { pid ->
|
||||
profiles.firstOrNull { it.id == pid }?.label
|
||||
val state = if (config != null) {
|
||||
val isPro = runCatching { runBlocking { ep.upgradeRepo().isPro() } }
|
||||
.onFailure { e -> log(TAG, ERROR) { "isPro failed: ${e.asLog()}" } }
|
||||
.getOrDefault(false)
|
||||
val initialDevice = remember(config.profileId) {
|
||||
config.profileId?.let { pid ->
|
||||
runCatching { runBlocking { ep.deviceMonitor().getDeviceForProfile(pid) } }
|
||||
.onFailure { e -> log(TAG, ERROR) { "initial device lookup failed: ${e.asLog()}" } }
|
||||
.getOrNull()
|
||||
}
|
||||
}
|
||||
val device by config.profileId
|
||||
?.let { pid -> remember(pid) { ep.deviceMonitor().widgetDeviceFlow(pid) } }
|
||||
?.collectAsState(initial = initialDevice)
|
||||
?: remember(initialDevice) { androidx.compose.runtime.mutableStateOf(initialDevice) }
|
||||
val profileLabel = config.profileId?.let { pid ->
|
||||
runCatching {
|
||||
runBlocking { ep.deviceProfilesRepo().profiles.first().firstOrNull { it.id == pid }?.label }
|
||||
}
|
||||
.onFailure { e -> log(TAG, ERROR) { "profile label lookup failed: ${e.asLog()}" } }
|
||||
.getOrNull()
|
||||
}
|
||||
|
||||
log(TAG, VERBOSE) { "render(appWidgetId=$appWidgetId, deviceKey=${device?.toWidgetKey()})" }
|
||||
|
||||
val widthCells = getCellsForSize(widthDp.value.toInt())
|
||||
val heightCells = getCellsForSize(heightDp.value.toInt())
|
||||
@@ -111,14 +122,13 @@ class AncGlanceWidget : GlanceAppWidget() {
|
||||
AncWidgetRenderStateMapper.map(
|
||||
context = context,
|
||||
device = device,
|
||||
theme = theme,
|
||||
theme = config.theme,
|
||||
isPro = isPro,
|
||||
hasConfiguredProfile = profileId != null,
|
||||
hasConfiguredProfile = config.profileId != null,
|
||||
profileLabel = profileLabel,
|
||||
layout = layout,
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
log(TAG, ERROR) { "provideGlance failed: ${e.asLog()}" }
|
||||
} else {
|
||||
AncWidgetRenderState.Message(
|
||||
theme = WidgetTheme.DEFAULT,
|
||||
resolvedBgColor = WidgetRenderStateMapper.resolvedBgColor(context, WidgetTheme.DEFAULT),
|
||||
|
||||
@@ -5,7 +5,6 @@ import androidx.annotation.Keep
|
||||
import androidx.glance.GlanceId
|
||||
import androidx.glance.action.ActionParameters
|
||||
import androidx.glance.appwidget.action.ActionCallback
|
||||
import androidx.glance.appwidget.updateAll
|
||||
import dagger.hilt.EntryPoint
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.EntryPointAccessors
|
||||
@@ -30,6 +29,7 @@ class AncModeActionCallback : ActionCallback {
|
||||
fun aapConnectionManager(): AapConnectionManager
|
||||
fun widgetSettings(): WidgetSettings
|
||||
fun deviceMonitor(): DeviceMonitor
|
||||
fun widgetManager(): WidgetManager
|
||||
}
|
||||
|
||||
override suspend fun onAction(context: Context, glanceId: GlanceId, parameters: ActionParameters) {
|
||||
@@ -62,14 +62,14 @@ class AncModeActionCallback : ActionCallback {
|
||||
val device = ep.deviceMonitor().getDeviceForProfile(profileId)
|
||||
if (device == null) {
|
||||
log(TAG, ERROR) { "onAction: no device for profileId=$profileId" }
|
||||
AncGlanceWidget().updateAll(context)
|
||||
ep.widgetManager().refreshWidgets()
|
||||
return
|
||||
}
|
||||
|
||||
val address = device.address
|
||||
if (address == null) {
|
||||
log(TAG, ERROR) { "onAction: device has no address" }
|
||||
AncGlanceWidget().updateAll(context)
|
||||
ep.widgetManager().refreshWidgets()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ class AncModeActionCallback : ActionCallback {
|
||||
log(TAG, ERROR) { "onAction: sendCommand failed: ${e.asLog()}" }
|
||||
}
|
||||
|
||||
AncGlanceWidget().updateAll(context)
|
||||
ep.widgetManager().refreshWidgets()
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.content.Context
|
||||
import androidx.annotation.Keep
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.glance.GlanceId
|
||||
import androidx.glance.LocalSize
|
||||
import androidx.glance.appwidget.GlanceAppWidget
|
||||
@@ -23,8 +24,9 @@ import eu.darken.capod.common.debug.logging.logTag
|
||||
import eu.darken.capod.common.upgrade.UpgradeRepo
|
||||
import eu.darken.capod.common.upgrade.isPro
|
||||
import eu.darken.capod.monitor.core.DeviceMonitor
|
||||
import eu.darken.capod.monitor.core.PodDevice
|
||||
import eu.darken.capod.profiles.core.DeviceProfilesRepo
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
class BatteryGlanceWidget : GlanceAppWidget() {
|
||||
|
||||
@@ -43,21 +45,15 @@ class BatteryGlanceWidget : GlanceAppWidget() {
|
||||
override suspend fun provideGlance(context: Context, id: GlanceId) {
|
||||
val ep: WidgetEntryPoint
|
||||
val appWidgetId: Int
|
||||
val initialIsPro: Boolean
|
||||
val initialProfileId: String?
|
||||
val cachedDevice: PodDevice?
|
||||
|
||||
try {
|
||||
ep = EntryPointAccessors.fromApplication(context, WidgetEntryPoint::class.java)
|
||||
appWidgetId = GlanceAppWidgetManager(context).getAppWidgetId(id)
|
||||
log(TAG, VERBOSE) { "provideGlance(appWidgetId=$appWidgetId)" }
|
||||
initialIsPro = ep.upgradeRepo().isPro()
|
||||
ep.widgetSettings().migrateLegacyConfigIfNeeded(
|
||||
appWidgetId,
|
||||
AppWidgetManager.getInstance(context).getAppWidgetOptions(appWidgetId),
|
||||
)
|
||||
initialProfileId = ep.widgetSettings().getWidgetConfig(appWidgetId).profileId
|
||||
cachedDevice = initialProfileId?.let { ep.deviceMonitor().getDeviceForProfile(it) }
|
||||
} catch (e: Exception) {
|
||||
log(TAG, ERROR) { "provideGlance setup failed: ${e.asLog()}" }
|
||||
provideContent {
|
||||
@@ -78,38 +74,51 @@ class BatteryGlanceWidget : GlanceAppWidget() {
|
||||
}
|
||||
|
||||
provideContent {
|
||||
// Composable reads — must be outside try-catch
|
||||
val devices by ep.deviceMonitor().devices.collectAsState(initial = emptyList())
|
||||
val profiles by ep.deviceProfilesRepo().profiles.collectAsState(initial = emptyList())
|
||||
val upgradeInfo by ep.upgradeRepo().upgradeInfo.collectAsState(initial = null)
|
||||
val widthDp = LocalSize.current.width
|
||||
val layout = BatteryLayout.forCells(getCellsForSize(widthDp.value.toInt()))
|
||||
|
||||
val state = try {
|
||||
val config = ep.widgetSettings().getWidgetConfig(appWidgetId)
|
||||
val profileId = config.profileId
|
||||
val theme = config.theme
|
||||
// Glance keeps the content session alive and does not restart provideGlance()
|
||||
// for every update(). Observe a widget-key-deduped device flow so visible state
|
||||
// changes update active sessions without recomposing on every BLE advertisement.
|
||||
val config = runCatching { ep.widgetSettings().getWidgetConfig(appWidgetId) }
|
||||
.onFailure { e -> log(TAG, ERROR) { "getWidgetConfig failed: ${e.asLog()}" } }
|
||||
.getOrNull()
|
||||
|
||||
val isPro = upgradeInfo?.isPro ?: initialIsPro
|
||||
|
||||
val liveDevice = devices.firstOrNull { it.profileId == profileId }
|
||||
val device = liveDevice ?: cachedDevice?.takeIf { it.profileId == profileId }
|
||||
|
||||
val profileLabel = profileId?.let { pid ->
|
||||
profiles.firstOrNull { it.id == pid }?.label
|
||||
val state = if (config != null) {
|
||||
val isPro = runCatching { runBlocking { ep.upgradeRepo().isPro() } }
|
||||
.onFailure { e -> log(TAG, ERROR) { "isPro failed: ${e.asLog()}" } }
|
||||
.getOrDefault(false)
|
||||
val initialDevice = remember(config.profileId) {
|
||||
config.profileId?.let { pid ->
|
||||
runCatching { runBlocking { ep.deviceMonitor().getDeviceForProfile(pid) } }
|
||||
.onFailure { e -> log(TAG, ERROR) { "initial device lookup failed: ${e.asLog()}" } }
|
||||
.getOrNull()
|
||||
}
|
||||
}
|
||||
val device by config.profileId
|
||||
?.let { pid -> remember(pid) { ep.deviceMonitor().widgetDeviceFlow(pid) } }
|
||||
?.collectAsState(initial = initialDevice)
|
||||
?: remember(initialDevice) { androidx.compose.runtime.mutableStateOf(initialDevice) }
|
||||
val profileLabel = config.profileId?.let { pid ->
|
||||
runCatching {
|
||||
runBlocking { ep.deviceProfilesRepo().profiles.first().firstOrNull { it.id == pid }?.label }
|
||||
}
|
||||
.onFailure { e -> log(TAG, ERROR) { "profile label lookup failed: ${e.asLog()}" } }
|
||||
.getOrNull()
|
||||
}
|
||||
|
||||
log(TAG, VERBOSE) { "render(appWidgetId=$appWidgetId, deviceKey=${device?.toWidgetKey()})" }
|
||||
|
||||
WidgetRenderStateMapper.map(
|
||||
context = context,
|
||||
device = device,
|
||||
theme = theme,
|
||||
theme = config.theme,
|
||||
isPro = isPro,
|
||||
hasConfiguredProfile = profileId != null,
|
||||
hasConfiguredProfile = config.profileId != null,
|
||||
profileLabel = profileLabel,
|
||||
layout = layout,
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
log(TAG, ERROR) { "provideGlance failed: ${e.asLog()}" }
|
||||
} else {
|
||||
WidgetRenderState.Message(
|
||||
theme = WidgetTheme.DEFAULT,
|
||||
resolvedBgColor = WidgetRenderStateMapper.resolvedBgColor(context, WidgetTheme.DEFAULT),
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package eu.darken.capod.main.ui.widget
|
||||
|
||||
import eu.darken.capod.monitor.core.DeviceMonitor
|
||||
import eu.darken.capod.monitor.core.PodDevice
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.distinctUntilChangedBy
|
||||
import kotlinx.coroutines.flow.map
|
||||
|
||||
internal fun DeviceMonitor.widgetDeviceFlow(profileId: String): Flow<PodDevice?> = devices
|
||||
.map { devices -> devices.firstOrNull { it.profileId == profileId } }
|
||||
.distinctUntilChangedBy { it?.toWidgetKey() }
|
||||
@@ -1,16 +1,18 @@
|
||||
package eu.darken.capod.main.ui.widget
|
||||
|
||||
import eu.darken.capod.monitor.core.PodDevice
|
||||
import eu.darken.capod.monitor.core.visibleAncModes
|
||||
import eu.darken.capod.pods.core.apple.PodModel
|
||||
import eu.darken.capod.pods.core.apple.aap.protocol.AapSetting
|
||||
|
||||
/**
|
||||
* Snapshot of the [PodDevice] fields that affect widget rendering. Used to
|
||||
* gate widget refreshes so RSSI / reliability / scan-counter churn doesn't
|
||||
* cause a refresh on every BLE advertisement.
|
||||
* gate widget refreshes so RSSI / reliability / scan-counter / timestamp churn
|
||||
* doesn't cause a refresh on every BLE advertisement.
|
||||
*/
|
||||
internal data class WidgetDeviceKey(
|
||||
val profileId: String?,
|
||||
val profileLabel: String?,
|
||||
val model: PodModel,
|
||||
val batteryLeft: Float?,
|
||||
val batteryRight: Float?,
|
||||
@@ -20,12 +22,19 @@ internal data class WidgetDeviceKey(
|
||||
val isRightPodCharging: Boolean?,
|
||||
val isCaseCharging: Boolean?,
|
||||
val isHeadsetBeingCharged: Boolean?,
|
||||
val isLeftInEar: Boolean?,
|
||||
val isRightInEar: Boolean?,
|
||||
val isBeingWorn: Boolean?,
|
||||
val isAapConnected: Boolean,
|
||||
val isAapReady: Boolean,
|
||||
val ancMode: AapSetting.AncMode.Value?,
|
||||
val pendingAncMode: AapSetting.AncMode.Value?,
|
||||
val visibleAncModes: List<AapSetting.AncMode.Value>,
|
||||
)
|
||||
|
||||
internal fun PodDevice.toWidgetKey(): WidgetDeviceKey = WidgetDeviceKey(
|
||||
profileId = profileId,
|
||||
profileLabel = label,
|
||||
model = model,
|
||||
batteryLeft = batteryLeft,
|
||||
batteryRight = batteryRight,
|
||||
@@ -35,6 +44,12 @@ internal fun PodDevice.toWidgetKey(): WidgetDeviceKey = WidgetDeviceKey(
|
||||
isRightPodCharging = isRightPodCharging,
|
||||
isCaseCharging = isCaseCharging,
|
||||
isHeadsetBeingCharged = isHeadsetBeingCharged,
|
||||
isLeftInEar = isLeftInEar,
|
||||
isRightInEar = isRightInEar,
|
||||
isBeingWorn = isBeingWorn,
|
||||
isAapConnected = isAapConnected,
|
||||
isAapReady = isAapReady,
|
||||
ancMode = ancMode?.current,
|
||||
pendingAncMode = pendingAncMode,
|
||||
visibleAncModes = visibleAncModes,
|
||||
)
|
||||
|
||||
@@ -1,8 +1,18 @@
|
||||
package eu.darken.capod.main.ui.widget
|
||||
|
||||
import android.appwidget.AppWidgetManager
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import androidx.glance.appwidget.updateAll
|
||||
import androidx.glance.GlanceId
|
||||
import androidx.glance.appwidget.GlanceAppWidget
|
||||
import androidx.glance.appwidget.GlanceAppWidgetManager
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.ERROR
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
|
||||
import eu.darken.capod.common.debug.logging.asLog
|
||||
import eu.darken.capod.common.debug.logging.log
|
||||
import eu.darken.capod.common.debug.logging.logTag
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@@ -13,7 +23,66 @@ class WidgetManager @Inject constructor(
|
||||
) {
|
||||
|
||||
suspend fun refreshWidgets() {
|
||||
BatteryGlanceWidget().updateAll(context)
|
||||
AncGlanceWidget().updateAll(context)
|
||||
val manager = GlanceAppWidgetManager(context)
|
||||
refreshWidget(
|
||||
name = "battery",
|
||||
widget = BatteryGlanceWidget(),
|
||||
providerClass = BatteryGlanceWidget::class.java,
|
||||
receiverClass = WidgetProvider::class.java,
|
||||
manager = manager,
|
||||
)
|
||||
refreshWidget(
|
||||
name = "anc",
|
||||
widget = AncGlanceWidget(),
|
||||
providerClass = AncGlanceWidget::class.java,
|
||||
receiverClass = AncWidgetProvider::class.java,
|
||||
manager = manager,
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun <T : GlanceAppWidget> refreshWidget(
|
||||
name: String,
|
||||
widget: T,
|
||||
providerClass: Class<T>,
|
||||
receiverClass: Class<*>,
|
||||
manager: GlanceAppWidgetManager,
|
||||
) {
|
||||
val ids = manager.getGlanceIds(providerClass).ifEmpty {
|
||||
val appWidgetIds = AppWidgetManager.getInstance(context)
|
||||
.getAppWidgetIds(ComponentName(context, receiverClass))
|
||||
.toList()
|
||||
if (appWidgetIds.isNotEmpty()) {
|
||||
log(TAG, WARN) { "refresh($name): Glance IDs empty, falling back to platform ids=$appWidgetIds" }
|
||||
}
|
||||
appWidgetIds.mapNotNull { appWidgetId ->
|
||||
runCatching { manager.getGlanceIdBy(appWidgetId) }
|
||||
.onFailure { error ->
|
||||
log(TAG, ERROR) { "refresh($name): failed to resolve widgetId=$appWidgetId: ${error.asLog()}" }
|
||||
}
|
||||
.getOrNull()
|
||||
}
|
||||
}
|
||||
|
||||
log(TAG, VERBOSE) { "refresh($name): ids=${ids.toAppWidgetIds(manager)}" }
|
||||
|
||||
ids.forEach { id ->
|
||||
runCatching { widget.update(context, id) }
|
||||
.onFailure { error ->
|
||||
log(TAG, ERROR) { "refresh($name): update failed for id=${id.toAppWidgetId(manager)}: ${error.asLog()}" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun List<GlanceId>.toAppWidgetIds(manager: GlanceAppWidgetManager): List<Int> =
|
||||
map { it.toAppWidgetId(manager) }
|
||||
|
||||
private fun GlanceId.toAppWidgetId(manager: GlanceAppWidgetManager): Int = runCatching {
|
||||
manager.getAppWidgetId(this)
|
||||
}.getOrElse {
|
||||
AppWidgetManager.INVALID_APPWIDGET_ID
|
||||
}
|
||||
|
||||
companion object {
|
||||
val TAG = logTag("Widget", "Manager")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,18 +205,27 @@ data class PodDevice(
|
||||
}
|
||||
} ?: (ble as? DualApplePods)?.primaryPod
|
||||
|
||||
private fun AapSetting.EarDetection.PodPlacement.isInEar(): Boolean =
|
||||
this == AapSetting.EarDetection.PodPlacement.IN_EAR
|
||||
|
||||
private fun AapSetting.EarDetection.samePlacementInEarOrNull(): Boolean? =
|
||||
if (primaryPod == secondaryPod) primaryPod.isInEar() else null
|
||||
|
||||
// Ear detection — AAP preferred (lower latency), BLE fallback.
|
||||
// AAP reports primary/secondary; resolvedPrimaryPod tells us which physical pod is primary.
|
||||
val isLeftInEar: Boolean?
|
||||
get() {
|
||||
val earDetection = aap?.aapEarDetection
|
||||
val primary = resolvedPrimaryPod
|
||||
if (earDetection != null && primary != null) {
|
||||
return if (primary == DualBlePodSnapshot.Pod.LEFT) {
|
||||
earDetection.primaryPod == AapSetting.EarDetection.PodPlacement.IN_EAR
|
||||
} else {
|
||||
earDetection.secondaryPod == AapSetting.EarDetection.PodPlacement.IN_EAR
|
||||
if (earDetection != null) {
|
||||
if (primary != null) {
|
||||
return if (primary == DualBlePodSnapshot.Pod.LEFT) {
|
||||
earDetection.primaryPod.isInEar()
|
||||
} else {
|
||||
earDetection.secondaryPod.isInEar()
|
||||
}
|
||||
}
|
||||
earDetection.samePlacementInEarOrNull()?.let { return it }
|
||||
}
|
||||
return (ble as? HasEarDetectionDual)?.isLeftPodInEar
|
||||
}
|
||||
@@ -225,12 +234,15 @@ data class PodDevice(
|
||||
get() {
|
||||
val earDetection = aap?.aapEarDetection
|
||||
val primary = resolvedPrimaryPod
|
||||
if (earDetection != null && primary != null) {
|
||||
return if (primary == DualBlePodSnapshot.Pod.RIGHT) {
|
||||
earDetection.primaryPod == AapSetting.EarDetection.PodPlacement.IN_EAR
|
||||
} else {
|
||||
earDetection.secondaryPod == AapSetting.EarDetection.PodPlacement.IN_EAR
|
||||
if (earDetection != null) {
|
||||
if (primary != null) {
|
||||
return if (primary == DualBlePodSnapshot.Pod.RIGHT) {
|
||||
earDetection.primaryPod.isInEar()
|
||||
} else {
|
||||
earDetection.secondaryPod.isInEar()
|
||||
}
|
||||
}
|
||||
earDetection.samePlacementInEarOrNull()?.let { return it }
|
||||
}
|
||||
return (ble as? HasEarDetectionDual)?.isRightPodInEar
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ import javax.inject.Singleton
|
||||
class BlePodMonitor @Inject constructor(
|
||||
@AppScope private val appScope: CoroutineScope,
|
||||
private val bleScanner: BleScanner,
|
||||
private val bleScanModeController: BleScanModeController,
|
||||
private val podFactory: PodFactory,
|
||||
private val timeSource: TimeSource,
|
||||
private val generalSettings: GeneralSettings,
|
||||
@@ -128,7 +129,7 @@ class BlePodMonitor @Inject constructor(
|
||||
)
|
||||
|
||||
private fun createBleScanner() = combine(
|
||||
generalSettings.scannerMode.flow,
|
||||
bleScanModeController.scannerMode,
|
||||
debugSettings.showUnfiltered.flow,
|
||||
generalSettings.isOffloadedBatchingDisabled.flow,
|
||||
generalSettings.isOffloadedFilteringDisabled.flow,
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
package eu.darken.capod.monitor.core.ble
|
||||
|
||||
import eu.darken.capod.common.AppForegroundState
|
||||
import eu.darken.capod.common.bluetooth.BluetoothAddress
|
||||
import eu.darken.capod.common.bluetooth.BluetoothManager2
|
||||
import eu.darken.capod.common.bluetooth.ScannerMode
|
||||
import eu.darken.capod.common.coroutine.AppScope
|
||||
import eu.darken.capod.common.debug.logging.Logging
|
||||
import eu.darken.capod.common.debug.logging.log
|
||||
import eu.darken.capod.common.debug.logging.logTag
|
||||
import eu.darken.capod.common.flow.replayingShare
|
||||
import eu.darken.capod.common.flow.setupCommonEventHandlers
|
||||
import eu.darken.capod.profiles.core.DeviceProfilesRepo
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.catch
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import kotlinx.coroutines.flow.onStart
|
||||
import kotlinx.coroutines.flow.update
|
||||
import java.util.Locale
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class BleScanModeController @Inject constructor(
|
||||
@AppScope appScope: CoroutineScope,
|
||||
appForegroundState: AppForegroundState,
|
||||
profilesRepo: DeviceProfilesRepo,
|
||||
bluetoothManager: BluetoothManager2,
|
||||
) {
|
||||
|
||||
private val overrideCounts = MutableStateFlow<Map<ScannerMode, Int>>(emptyMap())
|
||||
private val activeOverride: Flow<ScannerMode?> = overrideCounts.map { it.topPriority() }
|
||||
|
||||
val scannerMode: Flow<ScannerMode> = combine(
|
||||
activeOverride,
|
||||
appForegroundState.isForeground,
|
||||
profilesRepo.profiles,
|
||||
bluetoothManager.connectedDevices
|
||||
.onStart { emit(emptyList()) }
|
||||
.catch {
|
||||
log(TAG, Logging.Priority.WARN) { "connectedDevices failed, treating as empty: $it" }
|
||||
emit(emptyList())
|
||||
},
|
||||
bluetoothManager.bondedDeviceAddresses,
|
||||
) { override, isForeground, profiles, connectedDevices, bondedAddresses ->
|
||||
resolveScannerMode(
|
||||
overrideMode = override,
|
||||
isForeground = isForeground,
|
||||
profileAddresses = profiles.mapNotNull { it.address }.toSet(),
|
||||
bondedAddresses = bondedAddresses,
|
||||
connectedAddresses = connectedDevices.map { it.address }.toSet(),
|
||||
)
|
||||
}
|
||||
.distinctUntilChanged()
|
||||
.onEach { log(TAG) { "Effective scanner mode: $it" } }
|
||||
.setupCommonEventHandlers(TAG) { "scannerMode" }
|
||||
.replayingShare(appScope)
|
||||
|
||||
suspend fun <T> withTemporaryOverride(mode: ScannerMode, block: suspend () -> T): T {
|
||||
log(TAG) { "withTemporaryOverride($mode) acquire" }
|
||||
overrideCounts.update { it.adjust(mode, +1) }
|
||||
try {
|
||||
return block()
|
||||
} finally {
|
||||
overrideCounts.update { it.adjust(mode, -1) }
|
||||
log(TAG) { "withTemporaryOverride($mode) release" }
|
||||
}
|
||||
}
|
||||
|
||||
private fun Map<ScannerMode, Int>.adjust(mode: ScannerMode, delta: Int): Map<ScannerMode, Int> {
|
||||
val current = this[mode] ?: 0
|
||||
val next = current + delta
|
||||
return when {
|
||||
next <= 0 -> this - mode
|
||||
else -> this + (mode to next)
|
||||
}
|
||||
}
|
||||
|
||||
private fun Map<ScannerMode, Int>.topPriority(): ScannerMode? = OVERRIDE_PRIORITY.firstOrNull { containsKey(it) }
|
||||
|
||||
companion object {
|
||||
private val TAG = logTag("Bluetooth", "ScannerMode")
|
||||
private val OVERRIDE_PRIORITY = listOf(ScannerMode.LOW_LATENCY, ScannerMode.BALANCED, ScannerMode.LOW_POWER)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun resolveScannerMode(
|
||||
overrideMode: ScannerMode?,
|
||||
isForeground: Boolean,
|
||||
profileAddresses: Set<BluetoothAddress>,
|
||||
bondedAddresses: Set<BluetoothAddress>,
|
||||
connectedAddresses: Set<BluetoothAddress>,
|
||||
): ScannerMode {
|
||||
if (overrideMode != null) return overrideMode
|
||||
|
||||
val connectedProfileAddresses = profileAddresses.normalized()
|
||||
.intersect(bondedAddresses.normalized())
|
||||
.intersect(connectedAddresses.normalized())
|
||||
|
||||
return when {
|
||||
connectedProfileAddresses.isNotEmpty() -> ScannerMode.LOW_LATENCY
|
||||
isForeground -> ScannerMode.BALANCED
|
||||
else -> ScannerMode.LOW_POWER
|
||||
}
|
||||
}
|
||||
|
||||
private fun Iterable<BluetoothAddress>.normalized(): Set<BluetoothAddress> = this
|
||||
.map { it.uppercase(Locale.US) }
|
||||
.toSet()
|
||||
@@ -65,6 +65,30 @@ class DeviceProfilesRepo @Inject constructor(
|
||||
if (!settings.reactionMigrationDone.valueBlocking) {
|
||||
migrateLegacyReactions()
|
||||
}
|
||||
|
||||
detectLegacyReactionData()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects whether this install ever wrote to the pre-migration global reaction DataStore.
|
||||
* The legacy reader is a read-only probe; the legacy keys persist on old installs even
|
||||
* after [migrateLegacyReactions] has run, so this check works retroactively for users who
|
||||
* already migrated. Used by the Overview hint to target only existing users who actually
|
||||
* configured reactions before the per-device move.
|
||||
*/
|
||||
private suspend fun detectLegacyReactionData() {
|
||||
val hadData = try {
|
||||
val legacy = LegacyReactionSettingsReader(context, json).read()
|
||||
legacy.autoPause || legacy.autoPlay || legacy.autoConnect ||
|
||||
legacy.showPopUpOnCaseOpen || legacy.showPopUpOnConnection ||
|
||||
legacy.onePodMode
|
||||
} catch (e: Exception) {
|
||||
log(TAG, WARN) { "Failed to detect legacy reaction data: ${e.message}" }
|
||||
false
|
||||
}
|
||||
if (hadData != settings.hadLegacyReactionData.valueBlocking) {
|
||||
settings.hadLegacyReactionData.valueBlocking = hadData
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,6 +130,8 @@ class DeviceProfilesRepo @Inject constructor(
|
||||
|
||||
val profiles: Flow<List<DeviceProfile>> = settings.profiles.flow.map { it.profiles }
|
||||
|
||||
val hadLegacyReactionData: Flow<Boolean> = settings.hadLegacyReactionData.flow
|
||||
|
||||
suspend fun addProfile(profile: DeviceProfile, addFirst: Boolean = false) = mutex.withLock {
|
||||
val currentContainer = settings.profiles.valueBlocking
|
||||
checkAddressUniqueness(profile, currentContainer.profiles)
|
||||
|
||||
@@ -34,5 +34,6 @@ class DeviceProfilesSettings @Inject constructor(
|
||||
val singleToMultiMigrationDone = dataStore.createValue("profiles.migration.v2.done", false)
|
||||
val defaultProfileCreated = dataStore.createValue("profiles.default.v2.created", false)
|
||||
val reactionMigrationDone = dataStore.createValue("profiles.reactions.migration.done", false)
|
||||
val hadLegacyReactionData = dataStore.createValue("profiles.reactions.had_legacy_data", false)
|
||||
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import androidx.compose.material3.Card
|
||||
import androidx.compose.material3.FloatingActionButton
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.OutlinedIconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.material3.Text
|
||||
@@ -261,7 +262,7 @@ private fun ProfileRow(
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
)
|
||||
}
|
||||
IconButton(onClick = onDeviceSettings) {
|
||||
OutlinedIconButton(onClick = onDeviceSettings) {
|
||||
Icon(
|
||||
imageVector = Icons.TwoTone.Tune,
|
||||
contentDescription = stringResource(R.string.device_settings_open_cd),
|
||||
|
||||
@@ -2,6 +2,8 @@ package eu.darken.capod.reaction.core.playpause
|
||||
|
||||
import eu.darken.capod.common.MediaControl
|
||||
import eu.darken.capod.common.bluetooth.BluetoothManager2
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.DEBUG
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.INFO
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE
|
||||
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
|
||||
import eu.darken.capod.common.debug.logging.log
|
||||
@@ -11,13 +13,15 @@ import eu.darken.capod.common.flow.withPrevious
|
||||
import eu.darken.capod.monitor.core.DeviceMonitor
|
||||
import eu.darken.capod.monitor.core.PodDevice
|
||||
import eu.darken.capod.monitor.core.primaryDevice
|
||||
import eu.darken.capod.pods.core.apple.ble.devices.ApplePods
|
||||
import eu.darken.capod.reaction.core.playpause.PlayPause.Companion.PAUSE_DEBOUNCE_SAMPLES
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.distinctUntilChangedBy
|
||||
import kotlinx.coroutines.flow.emptyFlow
|
||||
import kotlinx.coroutines.flow.filter
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import java.time.Instant
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@@ -30,6 +34,9 @@ class PlayPause @Inject constructor(
|
||||
|
||||
fun monitor() = run {
|
||||
var pendingPlayConfirmation: PendingPlayConfirmation? = null
|
||||
var pendingPauseDebounce: PendingPauseDebounce? = null
|
||||
var hasLastMonitorKey = false
|
||||
var lastMonitorKey: PlayPauseMonitorKey? = null
|
||||
|
||||
deviceMonitor.primaryDevice()
|
||||
.map { device -> device?.reactions?.let { it.autoPlay || it.autoPause } == true }
|
||||
@@ -39,12 +46,18 @@ class PlayPause @Inject constructor(
|
||||
bluetoothManager.connectedDevices
|
||||
} else {
|
||||
pendingPlayConfirmation = null
|
||||
pendingPauseDebounce = null
|
||||
hasLastMonitorKey = false
|
||||
lastMonitorKey = null
|
||||
emptyFlow()
|
||||
}
|
||||
}
|
||||
.flatMapLatest { connected ->
|
||||
if (connected.isEmpty()) {
|
||||
pendingPlayConfirmation = null
|
||||
pendingPauseDebounce = null
|
||||
hasLastMonitorKey = false
|
||||
lastMonitorKey = null
|
||||
log(TAG) { "No known devices connected." }
|
||||
emptyFlow()
|
||||
} else {
|
||||
@@ -53,9 +66,20 @@ class PlayPause @Inject constructor(
|
||||
}
|
||||
}
|
||||
// Cache persistence can update battery timestamps without changing any reaction-relevant state.
|
||||
.distinctUntilChangedBy { it?.toPlayPauseMonitorKey() }
|
||||
.filter { device ->
|
||||
val key = device?.toPlayPauseMonitorKey()
|
||||
val shouldEmit = !hasLastMonitorKey ||
|
||||
key != lastMonitorKey ||
|
||||
device?.isPauseDebounceResetCandidate(pendingPauseDebounce) == true
|
||||
|
||||
if (shouldEmit) {
|
||||
hasLastMonitorKey = true
|
||||
lastMonitorKey = key
|
||||
}
|
||||
shouldEmit
|
||||
}
|
||||
.onEach { device ->
|
||||
log(TAG, VERBOSE) { "Post-distinct: profileId=${device?.profileId}" }
|
||||
log(TAG, VERBOSE) { "Post-monitor-filter: profileId=${device?.profileId}" }
|
||||
}
|
||||
.withPrevious()
|
||||
.filter { (previous, current) ->
|
||||
@@ -63,7 +87,13 @@ class PlayPause @Inject constructor(
|
||||
// Use profileId (stable across BLE address rotations) rather than BLE identifier.
|
||||
// Only profiled devices reach this point (outer gate requires profile.autoPlay/autoPause).
|
||||
val match = previous.profileId != null && previous.profileId == current.profileId
|
||||
if (!match) log(TAG, WARN) { "Main device switched, skipping reaction." }
|
||||
if (!match) {
|
||||
log(TAG, WARN) { "Main device switched, skipping reaction." }
|
||||
if (pendingPauseDebounce != null) {
|
||||
log(TAG, DEBUG) { "Pause debounce reset: profile change" }
|
||||
pendingPauseDebounce = null
|
||||
}
|
||||
}
|
||||
match
|
||||
}
|
||||
.onEach { (previous, current) ->
|
||||
@@ -76,6 +106,26 @@ class PlayPause @Inject constructor(
|
||||
if (reactions == null) {
|
||||
log(TAG, VERBOSE) { "No reactions on current device, skipping reaction" }
|
||||
pendingPlayConfirmation = null
|
||||
if (pendingPauseDebounce != null) {
|
||||
log(TAG, DEBUG) { "Pause debounce reset: no reactions on device" }
|
||||
pendingPauseDebounce = null
|
||||
}
|
||||
return@onEach
|
||||
}
|
||||
|
||||
// Skip the reaction when previous was a no-live-evidence emission (cache-only
|
||||
// baseline emitted at process start, or after a >20s BLE gap that evicted the
|
||||
// device from the live cache). PodDevice.isBeingWorn returns null for those,
|
||||
// and toEarDetectionState() coerces null -> false, which would produce a
|
||||
// fake "not-worn -> worn" transition the moment live BLE arrives — firing
|
||||
// an unwanted autoPlay on app start while the user is wearing the pods.
|
||||
if (previous?.earDetectionSource() == EarDetectionSource.NO_LIVE_BLE) {
|
||||
log(TAG, VERBOSE) { "Previous emission has no live evidence; skipping reaction." }
|
||||
pendingPlayConfirmation = null
|
||||
if (pendingPauseDebounce != null) {
|
||||
log(TAG, DEBUG) { "Pause debounce reset: previous emission lacked live evidence" }
|
||||
pendingPauseDebounce = null
|
||||
}
|
||||
return@onEach
|
||||
}
|
||||
|
||||
@@ -109,6 +159,10 @@ class PlayPause @Inject constructor(
|
||||
else -> {
|
||||
log(TAG, VERBOSE) { "Device doesn't support ear detection: $current" }
|
||||
pendingPlayConfirmation = null
|
||||
if (pendingPauseDebounce != null) {
|
||||
log(TAG, DEBUG) { "Pause debounce reset: device lost ear detection" }
|
||||
pendingPauseDebounce = null
|
||||
}
|
||||
return@onEach
|
||||
}
|
||||
}
|
||||
@@ -116,6 +170,8 @@ class PlayPause @Inject constructor(
|
||||
val isCurrentlyPlaying = mediaControl.isPlaying
|
||||
val wasRecentlyPausedByUs = mediaControl.wasRecentlyPausedByCap
|
||||
|
||||
val source = current.earDetectionSource()
|
||||
|
||||
// Evaluate what action to take
|
||||
val rawDecision = evaluatePlayPauseAction(
|
||||
previous = prevState,
|
||||
@@ -125,11 +181,18 @@ class PlayPause @Inject constructor(
|
||||
wasRecentlyPausedByUs = wasRecentlyPausedByUs,
|
||||
)
|
||||
|
||||
// BLE-only autoplay confirmation only applies to UNAUTHENTICATED sources.
|
||||
// Trusted sources (AAP, BLE_IRK_MATCH) skip staging — symmetric to the
|
||||
// pause debounce, which also skips for these sources. Without this gate,
|
||||
// an IRK-matched device with no live AAP would stage a BLE-only confirmation
|
||||
// that never confirms (the second worn sample has no freshness on the
|
||||
// monitor key for IRK_MATCH so it gets collapsed).
|
||||
val shouldStageBleOnlyPlay = rawDecision.shouldPlay &&
|
||||
reactions.autoPlay &&
|
||||
!reactions.onePodMode &&
|
||||
current.hasDualPods &&
|
||||
current.aap?.aapEarDetection == null
|
||||
(source == EarDetectionSource.BLE_PROFILE_FALLBACK ||
|
||||
source == EarDetectionSource.BLE_ANONYMOUS)
|
||||
|
||||
val confirmation = applyBleOnlyPlayConfirmation(
|
||||
pending = pendingPlayConfirmation,
|
||||
@@ -151,7 +214,36 @@ class PlayPause @Inject constructor(
|
||||
log(TAG, VERBOSE) { "BLE-only autoplay confirmed by a follow-up state update" }
|
||||
}
|
||||
|
||||
val decision = confirmation.decision
|
||||
val debounceResult = applyPauseDebounce(
|
||||
pending = pendingPauseDebounce,
|
||||
profileId = current.profileId,
|
||||
source = source,
|
||||
rawDecision = confirmation.decision,
|
||||
currentState = currState,
|
||||
autoPauseEnabled = reactions.autoPause,
|
||||
)
|
||||
pendingPauseDebounce = debounceResult.pending
|
||||
|
||||
when (debounceResult.event) {
|
||||
PauseDebounceEvent.STARTED -> log(TAG, DEBUG) {
|
||||
"Pause debounce started: source=$source, initialPodCount=${debounceResult.pending?.initialPodCount}, " +
|
||||
"remaining=${debounceResult.pending?.confirmationsRemaining}"
|
||||
}
|
||||
PauseDebounceEvent.ADVANCED -> log(TAG, DEBUG) {
|
||||
"Pause debounce advanced: remaining=${debounceResult.pending?.confirmationsRemaining}, " +
|
||||
"currentPodCount=${currState.podCount}"
|
||||
}
|
||||
PauseDebounceEvent.RESET -> log(TAG, DEBUG) {
|
||||
"Pause debounce reset: source=$source, currentPodCount=${currState.podCount}, " +
|
||||
"rawShouldPlay=${confirmation.decision.shouldPlay}"
|
||||
}
|
||||
PauseDebounceEvent.COMMITTED -> log(TAG, DEBUG) {
|
||||
"Pause debounce committed: source=$source confirmed pause"
|
||||
}
|
||||
PauseDebounceEvent.NONE -> {}
|
||||
}
|
||||
|
||||
val decision = debounceResult.decision
|
||||
if (decision.usedRecentCapPauseOverride) {
|
||||
log(TAG, VERBOSE) {
|
||||
"Resume override: recent CAP pause window is active, allowing play despite playing=true"
|
||||
@@ -171,8 +263,15 @@ class PlayPause @Inject constructor(
|
||||
}
|
||||
|
||||
decision.shouldPause && reactions.autoPause -> {
|
||||
log(TAG) { "autoPause is triggered, sendPause() - ${decision.reason}" }
|
||||
mediaControl.sendPause()
|
||||
val pauseSent = mediaControl.sendPause()
|
||||
log(TAG, INFO) {
|
||||
"autoPause triggered: source=$source, " +
|
||||
"wasWorn=${prevState.bothInEar}, isWorn=${currState.bothInEar}, " +
|
||||
"podCount=${prevState.podCount}->${currState.podCount}, " +
|
||||
"aapEar=${current.aap?.aapEarDetection != null}, " +
|
||||
"aapConn=${current.aap?.connectionState}, " +
|
||||
"pauseSent=$pauseSent, reason=${decision.reason}"
|
||||
}
|
||||
}
|
||||
|
||||
decision.shouldPause && !reactions.autoPause -> {
|
||||
@@ -319,6 +418,144 @@ class PlayPause @Inject constructor(
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Sample-count debounce for pause decisions when the ear-detection source is an
|
||||
* unauthenticated BLE advertisement.
|
||||
*
|
||||
* RF interference can produce a single corrupt advert that decodes as not-worn,
|
||||
* triggering a false pause. With [PAUSE_DEBOUNCE_SAMPLES] = 2, a pause requires
|
||||
* 3 consecutive not-worn samples before firing.
|
||||
*
|
||||
* The helper advances [pending] from [currentState], NOT from [rawDecision.shouldPause]
|
||||
* — subsequent samples after the initial detection are not-worn → not-worn, and
|
||||
* [evaluateNormalMode] returns no action for those.
|
||||
*
|
||||
* Confirmation rule: a sample with `currentState.podCount <= pending.initialPodCount`
|
||||
* counts as a confirmation. An *increase* (pod returned) clears pending.
|
||||
*
|
||||
* Trusted sources ([EarDetectionSource.AAP], [EarDetectionSource.BLE_IRK_MATCH]) skip
|
||||
* debounce and pass through [rawDecision] unchanged; any active [pending] is cleared.
|
||||
*/
|
||||
internal fun applyPauseDebounce(
|
||||
pending: PendingPauseDebounce?,
|
||||
profileId: String?,
|
||||
source: EarDetectionSource,
|
||||
rawDecision: PlayPauseDecision,
|
||||
currentState: EarDetectionState,
|
||||
autoPauseEnabled: Boolean,
|
||||
): PauseDebounceResult {
|
||||
val needsDebounce = source == EarDetectionSource.BLE_PROFILE_FALLBACK ||
|
||||
source == EarDetectionSource.BLE_ANONYMOUS
|
||||
|
||||
val activePending = pending?.takeIf { it.profileId == profileId }
|
||||
|
||||
// NO_LIVE_BLE: no fresh evidence anywhere (ble == null, aap absent or no EarDetection).
|
||||
// Suppress shouldPause — a worn → not-worn transition derived from null/cached state is
|
||||
// not real removal evidence. Also clears any active pending since stale samples must not
|
||||
// advance confirmations.
|
||||
if (source == EarDetectionSource.NO_LIVE_BLE) {
|
||||
val event = if (activePending != null) PauseDebounceEvent.RESET else PauseDebounceEvent.NONE
|
||||
return PauseDebounceResult(
|
||||
decision = rawDecision.copy(
|
||||
shouldPause = false,
|
||||
reason = "${rawDecision.reason} (suppressed: no live BLE evidence)",
|
||||
),
|
||||
pending = null,
|
||||
event = event,
|
||||
)
|
||||
}
|
||||
|
||||
// Non-debounce-eligible trusted sources (AAP / BLE_IRK_MATCH) and disabled debounce:
|
||||
// pass raw decision through and clear any active pending. Special case: if a
|
||||
// pending was active and the trusted source still shows the not-worn condition
|
||||
// (currentState.podCount <= initialPodCount and no play decision), commit the
|
||||
// pause now — the trusted source corroborates what BLE-debounce was waiting on.
|
||||
if (!needsDebounce || !autoPauseEnabled || profileId == null) {
|
||||
if (activePending != null && autoPauseEnabled &&
|
||||
currentState.podCount <= activePending.initialPodCount &&
|
||||
!rawDecision.shouldPlay
|
||||
) {
|
||||
return PauseDebounceResult(
|
||||
decision = PlayPauseDecision(
|
||||
shouldPlay = false,
|
||||
shouldPause = true,
|
||||
reason = "Pause confirmed by trusted source ($source) after BLE-debounce",
|
||||
),
|
||||
pending = null,
|
||||
event = PauseDebounceEvent.COMMITTED,
|
||||
)
|
||||
}
|
||||
val event = if (activePending != null) PauseDebounceEvent.RESET else PauseDebounceEvent.NONE
|
||||
return PauseDebounceResult(decision = rawDecision, pending = null, event = event)
|
||||
}
|
||||
|
||||
// First detection: no active pending, raw decision wants to pause → start debounce.
|
||||
if (activePending == null) {
|
||||
if (!rawDecision.shouldPause) {
|
||||
return PauseDebounceResult(decision = rawDecision, pending = null, event = PauseDebounceEvent.NONE)
|
||||
}
|
||||
if (PAUSE_DEBOUNCE_SAMPLES <= 0) {
|
||||
return PauseDebounceResult(decision = rawDecision, pending = null, event = PauseDebounceEvent.NONE)
|
||||
}
|
||||
return PauseDebounceResult(
|
||||
decision = rawDecision.copy(
|
||||
shouldPause = false,
|
||||
reason = "${rawDecision.reason} (debouncing, $PAUSE_DEBOUNCE_SAMPLES confirmation(s) needed)",
|
||||
),
|
||||
pending = PendingPauseDebounce(
|
||||
profileId = profileId,
|
||||
initialPodCount = currentState.podCount,
|
||||
confirmationsRemaining = PAUSE_DEBOUNCE_SAMPLES,
|
||||
),
|
||||
event = PauseDebounceEvent.STARTED,
|
||||
)
|
||||
}
|
||||
|
||||
// Confirmation phase: pending exists.
|
||||
// Reset cases — checked in order of authority:
|
||||
// 1. Raw decision wants to play → genuine play signal, reset immediately.
|
||||
// 2. Pod count went up → tolerate one rebound sample (corrupt count-up
|
||||
// protection), reset only on the second consecutive count-up.
|
||||
if (rawDecision.shouldPlay) {
|
||||
return PauseDebounceResult(decision = rawDecision, pending = null, event = PauseDebounceEvent.RESET)
|
||||
}
|
||||
if (currentState.podCount > activePending.initialPodCount) {
|
||||
if (activePending.resetTolerance > 0) {
|
||||
return PauseDebounceResult(
|
||||
decision = rawDecision.copy(
|
||||
shouldPause = false,
|
||||
reason = "Debouncing pause (rebound tolerated)",
|
||||
),
|
||||
pending = activePending.copy(resetTolerance = activePending.resetTolerance - 1),
|
||||
event = PauseDebounceEvent.ADVANCED,
|
||||
)
|
||||
}
|
||||
return PauseDebounceResult(decision = rawDecision, pending = null, event = PauseDebounceEvent.RESET)
|
||||
}
|
||||
|
||||
// Confirmation: count <= initialPodCount, decrement remaining.
|
||||
val remaining = activePending.confirmationsRemaining - 1
|
||||
if (remaining <= 0) {
|
||||
return PauseDebounceResult(
|
||||
decision = PlayPauseDecision(
|
||||
shouldPlay = false,
|
||||
shouldPause = true,
|
||||
reason = "Debounced pause confirmed (initial count: ${activePending.initialPodCount}, current: ${currentState.podCount})",
|
||||
),
|
||||
pending = null,
|
||||
event = PauseDebounceEvent.COMMITTED,
|
||||
)
|
||||
}
|
||||
return PauseDebounceResult(
|
||||
decision = rawDecision.copy(
|
||||
shouldPause = false,
|
||||
reason = "Debouncing pause ($remaining confirmation(s) remaining)",
|
||||
),
|
||||
pending = activePending.copy(confirmationsRemaining = remaining),
|
||||
event = PauseDebounceEvent.ADVANCED,
|
||||
)
|
||||
}
|
||||
|
||||
data class EarDetectionState(
|
||||
val leftInEar: Boolean?, // null for single pod devices
|
||||
val rightInEar: Boolean?, // null for single pod devices
|
||||
@@ -389,6 +626,46 @@ class PlayPause @Inject constructor(
|
||||
val stagedConfirmation: Boolean,
|
||||
)
|
||||
|
||||
/**
|
||||
* Trust classification for the source of the current ear-detection reading.
|
||||
*
|
||||
* - [AAP]: EarDetection setting from an active AAP (L2CAP) session — error-corrected,
|
||||
* identity-authenticated. Trusted; debounce skipped.
|
||||
* - [BLE_IRK_MATCH]: BLE advertisement whose RPA was verified against this profile's
|
||||
* identity key. Identity-authenticated; debounce skipped.
|
||||
* - [BLE_PROFILE_FALLBACK]: BLE advertisement assigned to a profile via signal-quality
|
||||
* fallback (no IRK match). Could be a stray advert from a nearby pair. Debounced.
|
||||
* - [BLE_ANONYMOUS]: BLE advertisement with no profile match. Filtered out by
|
||||
* [primaryDevice] in production (devices without profileId are dropped before
|
||||
* reaching the reaction layer); kept here defensively in case the upstream filter
|
||||
* changes. Note: [PendingPauseDebounce] is profile-keyed, so a null profileId can
|
||||
* never sustain pending state even if this branch is hit.
|
||||
* - [NO_LIVE_BLE]: No live BLE snapshot at all (cache-only or empty). Not debounced —
|
||||
* the cached state is not "fresh evidence" so it must not advance the debounce counter.
|
||||
* Any active pending is cleared.
|
||||
*/
|
||||
enum class EarDetectionSource { AAP, BLE_IRK_MATCH, BLE_PROFILE_FALLBACK, BLE_ANONYMOUS, NO_LIVE_BLE }
|
||||
|
||||
data class PendingPauseDebounce(
|
||||
val profileId: String,
|
||||
val initialPodCount: Int,
|
||||
val confirmationsRemaining: Int,
|
||||
// Tolerates one count-up rebound sample before the pending is reset. Mirrors the
|
||||
// count-down debounce on the pause side: a single corrupt advert that briefly
|
||||
// shows a pod returning shouldn't kill the pending, since the next sample may
|
||||
// confirm the pods are still out.
|
||||
val resetTolerance: Int = 1,
|
||||
)
|
||||
|
||||
/** Discrete event produced by [applyPauseDebounce] for diagnostic logging. */
|
||||
enum class PauseDebounceEvent { NONE, STARTED, ADVANCED, RESET, COMMITTED }
|
||||
|
||||
data class PauseDebounceResult(
|
||||
val decision: PlayPauseDecision,
|
||||
val pending: PendingPauseDebounce?,
|
||||
val event: PauseDebounceEvent = PauseDebounceEvent.NONE,
|
||||
)
|
||||
|
||||
internal data class PlayPauseMonitorKey(
|
||||
val profileId: String?,
|
||||
val autoPlay: Boolean,
|
||||
@@ -402,10 +679,44 @@ class PlayPause @Inject constructor(
|
||||
val isEitherPodInEar: Boolean?,
|
||||
val hasAapEarDetection: Boolean,
|
||||
val hasBleSnapshot: Boolean,
|
||||
val source: EarDetectionSource,
|
||||
// Set only for debounce-eligible sources (BLE_PROFILE_FALLBACK / BLE_ANONYMOUS) so
|
||||
// that monitor distinct filtering doesn't collapse repeated identical not-worn samples
|
||||
// and the debounce counter can advance.
|
||||
//
|
||||
// Caveat: BlePodMonitor.preferCaseContextPod can keep an existing case-context
|
||||
// snapshot in place over an incoming non-case-context snapshot, preserving the old
|
||||
// seenLastAt. This is fail-closed (delays a legitimate unauthenticated-BLE pause
|
||||
// rather than firing a false one), so accepted as a trade-off.
|
||||
val debounceFreshness: Instant?,
|
||||
)
|
||||
|
||||
internal fun PodDevice.toPlayPauseMonitorKey(): PlayPauseMonitorKey =
|
||||
PlayPauseMonitorKey(
|
||||
internal fun PodDevice.earDetectionSource(): EarDetectionSource {
|
||||
if (aap?.aapEarDetection != null) return EarDetectionSource.AAP
|
||||
if (ble == null) return EarDetectionSource.NO_LIVE_BLE
|
||||
val applePod = ble as? ApplePods
|
||||
return when {
|
||||
applePod?.meta?.isIRKMatch == true -> EarDetectionSource.BLE_IRK_MATCH
|
||||
ble.meta.profile != null -> EarDetectionSource.BLE_PROFILE_FALLBACK
|
||||
else -> EarDetectionSource.BLE_ANONYMOUS
|
||||
}
|
||||
}
|
||||
|
||||
internal fun PodDevice.toPlayPauseMonitorKey(): PlayPauseMonitorKey {
|
||||
val source = earDetectionSource()
|
||||
// Freshness applies to all unauthenticated samples (both worn and not-worn) so
|
||||
// that monitor distinct filtering doesn't collapse repeated identical samples:
|
||||
// - not-worn samples must pass through to advance the pause debounce counter
|
||||
// - worn samples must pass through to satisfy applyBleOnlyPlayConfirmation,
|
||||
// which requires a 2nd identical worn sample to confirm a staged play
|
||||
// (see commit 6825abaa "Guard BLE-only autoplay")
|
||||
// The 2-sample autoplay confirmation IS the debounce on the play side, mirroring
|
||||
// the pause debounce. isPauseDebounceResetCandidate() remains as a defense-in-depth
|
||||
// backstop for the rare case where seenLastAt doesn't advance between samples
|
||||
// (e.g. BlePodMonitor.preferCaseContextPod preserves the prior snapshot).
|
||||
val needsFreshness = source == EarDetectionSource.BLE_PROFILE_FALLBACK ||
|
||||
source == EarDetectionSource.BLE_ANONYMOUS
|
||||
return PlayPauseMonitorKey(
|
||||
profileId = profileId,
|
||||
autoPlay = reactions.autoPlay,
|
||||
autoPause = reactions.autoPause,
|
||||
@@ -418,20 +729,45 @@ class PlayPause @Inject constructor(
|
||||
isEitherPodInEar = isEitherPodInEar,
|
||||
hasAapEarDetection = aap?.aapEarDetection != null,
|
||||
hasBleSnapshot = ble != null,
|
||||
source = source,
|
||||
debounceFreshness = if (needsFreshness) ble?.seenLastAt else null,
|
||||
)
|
||||
}
|
||||
|
||||
private fun PodDevice.isPauseDebounceResetCandidate(pending: PendingPauseDebounce?): Boolean {
|
||||
val activePending = pending?.takeIf { it.profileId == profileId } ?: return false
|
||||
val source = earDetectionSource()
|
||||
val needsDebounce = source == EarDetectionSource.BLE_PROFILE_FALLBACK ||
|
||||
source == EarDetectionSource.BLE_ANONYMOUS
|
||||
|
||||
if (!needsDebounce || !hasEarDetection) return false
|
||||
|
||||
return toEarDetectionState().podCount > activePending.initialPodCount
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a dual-pod [PodDevice] to [EarDetectionState] for reaction evaluation.
|
||||
* Prefers per-side values (left/right) when available, falls back to AAP aggregate
|
||||
* state (isBeingWorn/isEitherPodInEar) when per-side mapping is unknown.
|
||||
*
|
||||
* When AAP EarDetection is present, prefers AAP aggregate state — even if per-side
|
||||
* (left/right) values are non-null via BLE fallback. This avoids letting BLE per-side
|
||||
* bits drive the decision when AAP has authoritative aggregate state but
|
||||
* resolvedPrimaryPod is unknown (cmd 0x0008 not received or cleared by role swap).
|
||||
*
|
||||
* When AAP is absent, prefers per-side values (BLE) when available, falling back to
|
||||
* AAP aggregate as a last resort (which is identical to BLE aggregate in this case).
|
||||
*/
|
||||
private fun PodDevice.toEarDetectionState(): EarDetectionState {
|
||||
internal fun PodDevice.toEarDetectionState(): EarDetectionState {
|
||||
if (aap?.aapEarDetection != null) {
|
||||
return EarDetectionState.fromAapAggregate(
|
||||
isBeingWorn = isBeingWorn ?: false,
|
||||
isEitherPodInEar = isEitherPodInEar ?: false,
|
||||
)
|
||||
}
|
||||
val left = isLeftInEar
|
||||
val right = isRightInEar
|
||||
if (left != null && right != null) {
|
||||
return EarDetectionState.fromDualPod(left = left, right = right)
|
||||
}
|
||||
// Per-side unavailable (resolvedPrimaryPod is null) — use aggregate AAP state.
|
||||
return EarDetectionState.fromAapAggregate(
|
||||
isBeingWorn = isBeingWorn ?: false,
|
||||
isEitherPodInEar = isEitherPodInEar ?: false,
|
||||
@@ -440,5 +776,11 @@ class PlayPause @Inject constructor(
|
||||
|
||||
companion object {
|
||||
private val TAG = logTag("Reaction", "PlayPause")
|
||||
|
||||
/**
|
||||
* Number of additional confirmations required before an unauthenticated-BLE pause
|
||||
* decision is dispatched. With 2, a pause needs 3 consecutive not-worn samples total.
|
||||
*/
|
||||
internal const val PAUSE_DEBOUNCE_SAMPLES = 2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ import eu.darken.capod.common.uix.ViewModel4
|
||||
import eu.darken.capod.main.core.GeneralSettings
|
||||
import eu.darken.capod.monitor.core.DeviceMonitor
|
||||
import eu.darken.capod.monitor.core.ble.BlePodMonitor
|
||||
import eu.darken.capod.monitor.core.ble.BleScanModeController
|
||||
import eu.darken.capod.monitor.core.primaryDevice
|
||||
import eu.darken.capod.pods.core.apple.ble.BlePodSnapshot
|
||||
import eu.darken.capod.pods.core.unknown.UnknownSnapshotBle
|
||||
@@ -40,6 +41,7 @@ class TroubleShooterViewModel @Inject constructor(
|
||||
private val generalSettings: GeneralSettings,
|
||||
private val profilesRepo: DeviceProfilesRepo,
|
||||
private val blePodMonitor: BlePodMonitor,
|
||||
private val bleScanModeController: BleScanModeController,
|
||||
private val deviceMonitor: DeviceMonitor,
|
||||
private val debugSettings: DebugSettings,
|
||||
private val timeSource: TimeSource,
|
||||
@@ -84,39 +86,119 @@ class TroubleShooterViewModel @Inject constructor(
|
||||
fun troubleShootBle() = launch(context = dispatcherProvider.IO) {
|
||||
log(TAG, INFO) { "troubleShootBle()" }
|
||||
|
||||
generalSettings.scannerMode.valueBlocking = ScannerMode.LOW_LATENCY
|
||||
|
||||
run {
|
||||
progress("Checking for headphones...")
|
||||
val mainDevice = withTimeoutOrNull(STEP_TIME) {
|
||||
deviceMonitor.primaryDevice().filterNotNull().firstOrNull()
|
||||
bleScanModeController.withTemporaryOverride(ScannerMode.LOW_LATENCY) override@{
|
||||
run {
|
||||
progress("Checking for headphones...")
|
||||
val mainDevice = withTimeoutOrNull(STEP_TIME) {
|
||||
deviceMonitor.primaryDevice().filterNotNull().firstOrNull()
|
||||
}
|
||||
if (mainDevice != null) {
|
||||
success("Headphones found, nothing to troubleshoot.")
|
||||
return@override
|
||||
} else {
|
||||
progress("Headphones not detected.\n")
|
||||
}
|
||||
}
|
||||
if (mainDevice != null) {
|
||||
success("Headphones found, nothing to troubleshoot.")
|
||||
return@launch
|
||||
} else {
|
||||
progress("Headphones not detected.\n")
|
||||
|
||||
val doScan: suspend (Boolean, Boolean, Boolean, Boolean) -> Collection<BlePodSnapshot> =
|
||||
{ hardwareFilteringDisabled,
|
||||
hardwareBatchingDisabled,
|
||||
indirectCallback,
|
||||
unfiltered ->
|
||||
val sb = StringBuilder("SCAN - Settings: ")
|
||||
sb.append("hardwareFilteringDisabled=$hardwareFilteringDisabled, ")
|
||||
sb.append("hardwareBatchingDisabled=$hardwareBatchingDisabled, ")
|
||||
sb.append("indirectCallback=$indirectCallback, ")
|
||||
sb.append("unfiltered=$unfiltered")
|
||||
progress(sb.toString())
|
||||
generalSettings.isOffloadedFilteringDisabled.valueBlocking = hardwareFilteringDisabled
|
||||
generalSettings.isOffloadedBatchingDisabled.valueBlocking = hardwareBatchingDisabled
|
||||
generalSettings.useIndirectScanResultCallback.valueBlocking = indirectCallback
|
||||
debugSettings.showUnfiltered.valueBlocking = unfiltered
|
||||
|
||||
val start = timeSource.elapsedRealtime()
|
||||
val devices = withTimeoutOrNull(STEP_TIME) {
|
||||
blePodMonitor.devices
|
||||
.take(10)
|
||||
.takeWhile { timeSource.elapsedRealtime() - start < STEP_TIME - 1000 }
|
||||
.toList()
|
||||
.flatten()
|
||||
.distinctBy { it.address }
|
||||
} ?: emptyList()
|
||||
log(TAG) { "SCAN: BLE Devices: $devices" }
|
||||
if (devices.isNotEmpty()) {
|
||||
progress("SCAN: Received data from ${devices.size} BLE devices")
|
||||
devices
|
||||
} else {
|
||||
progress("SCAN: No data received")
|
||||
devices
|
||||
}
|
||||
}
|
||||
|
||||
run {
|
||||
progress("Checking if we can receive BLE data at all.")
|
||||
if (doScan(false, false, false, true).isNotEmpty()) return@run
|
||||
if (doScan(false, false, true, true).isNotEmpty()) return@run
|
||||
if (doScan(true, true, true, true).isNotEmpty()) return@run
|
||||
if (doScan(true, true, false, true).isNotEmpty()) return@run
|
||||
if (doScan(true, false, true, true).isNotEmpty()) return@run
|
||||
if (doScan(true, false, false, true).isNotEmpty()) return@run
|
||||
if (doScan(false, true, true, true).isNotEmpty()) return@run
|
||||
if (doScan(false, true, false, true).isNotEmpty()) return@run
|
||||
|
||||
failure("Phone is not receiving BLE data.", BleState.Result.Failure.Type.PHONE)
|
||||
|
||||
generalSettings.isOffloadedFilteringDisabled.valueBlocking = false
|
||||
generalSettings.isOffloadedBatchingDisabled.valueBlocking = false
|
||||
generalSettings.useIndirectScanResultCallback.valueBlocking = false
|
||||
debugSettings.showUnfiltered.valueBlocking = false
|
||||
|
||||
return@override
|
||||
}
|
||||
}
|
||||
|
||||
val doScan: suspend (Boolean, Boolean, Boolean, Boolean) -> Collection<BlePodSnapshot> =
|
||||
{ hardwareFilteringDisabled,
|
||||
hardwareBatchingDisabled,
|
||||
indirectCallback,
|
||||
unfiltered ->
|
||||
val sb = StringBuilder("SCAN - Settings: ")
|
||||
sb.append("hardwareFilteringDisabled=$hardwareFilteringDisabled, ")
|
||||
sb.append("hardwareBatchingDisabled=$hardwareBatchingDisabled, ")
|
||||
sb.append("indirectCallback=$indirectCallback, ")
|
||||
sb.append("unfiltered=$unfiltered")
|
||||
progress(sb.toString())
|
||||
generalSettings.isOffloadedFilteringDisabled.valueBlocking = hardwareFilteringDisabled
|
||||
generalSettings.isOffloadedBatchingDisabled.valueBlocking = hardwareBatchingDisabled
|
||||
generalSettings.useIndirectScanResultCallback.valueBlocking = indirectCallback
|
||||
debugSettings.showUnfiltered.valueBlocking = unfiltered
|
||||
progress("We received at least some BLE data.\n")
|
||||
|
||||
val start = timeSource.elapsedRealtime()
|
||||
val devices = withTimeoutOrNull(STEP_TIME) {
|
||||
run {
|
||||
progress("Checking for supported headphones.")
|
||||
|
||||
if (doScan(false, false, false, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(false, false, true, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(true, true, true, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(true, true, false, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(true, false, true, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(true, false, false, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(false, true, true, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(false, true, false, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
|
||||
failure("No compatible headphones found", BleState.Result.Failure.Type.HEADPHONES)
|
||||
|
||||
generalSettings.isOffloadedFilteringDisabled.valueBlocking = false
|
||||
generalSettings.isOffloadedBatchingDisabled.valueBlocking = false
|
||||
generalSettings.useIndirectScanResultCallback.valueBlocking = false
|
||||
|
||||
return@override
|
||||
}
|
||||
|
||||
progress("Found some headphones that are supported by CAPod.\n")
|
||||
|
||||
run {
|
||||
progress("Checking for your headphones with new BLE settings...")
|
||||
val mainDevice = withTimeoutOrNull(STEP_TIME) {
|
||||
deviceMonitor.primaryDevice().filterNotNull().firstOrNull()
|
||||
}
|
||||
if (mainDevice != null) {
|
||||
success("Found your headphones, new BLE settings worked :)!")
|
||||
return@override
|
||||
}
|
||||
}
|
||||
|
||||
progress("Still no headphones detected that count as yours.\n")
|
||||
|
||||
run {
|
||||
progress("Checking all closeby headphones.")
|
||||
|
||||
val otherDevices = withTimeoutOrNull(STEP_TIME) {
|
||||
val start = timeSource.elapsedRealtime()
|
||||
blePodMonitor.devices
|
||||
.take(10)
|
||||
.takeWhile { timeSource.elapsedRealtime() - start < STEP_TIME - 1000 }
|
||||
@@ -124,122 +206,40 @@ class TroubleShooterViewModel @Inject constructor(
|
||||
.flatten()
|
||||
.distinctBy { it.address }
|
||||
} ?: emptyList()
|
||||
log(TAG) { "SCAN: BLE Devices: $devices" }
|
||||
if (devices.isNotEmpty()) {
|
||||
progress("SCAN: Received data from ${devices.size} BLE devices")
|
||||
devices
|
||||
} else {
|
||||
progress("SCAN: No data received")
|
||||
devices
|
||||
|
||||
otherDevices.forEachIndexed { index, dev -> log(TAG) { "Device #$index: $dev" } }
|
||||
|
||||
if (otherDevices.isEmpty()) {
|
||||
failure("No supported headphones found near your device.", BleState.Result.Failure.Type.HEADPHONES)
|
||||
return@override
|
||||
}
|
||||
}
|
||||
|
||||
run {
|
||||
progress("Checking if we can receive BLE data at all.")
|
||||
if (doScan(false, false, false, true).isNotEmpty()) return@run
|
||||
if (doScan(false, false, true, true).isNotEmpty()) return@run
|
||||
if (doScan(true, true, true, true).isNotEmpty()) return@run
|
||||
if (doScan(true, true, false, true).isNotEmpty()) return@run
|
||||
if (doScan(true, false, true, true).isNotEmpty()) return@run
|
||||
if (doScan(true, false, false, true).isNotEmpty()) return@run
|
||||
if (doScan(false, true, true, true).isNotEmpty()) return@run
|
||||
if (doScan(false, true, false, true).isNotEmpty()) return@run
|
||||
progress("Headphones found nearby, but not detected as yours.\n")
|
||||
progress("Creating profile for closest headphones.")
|
||||
|
||||
failure("Phone is not receiving BLE data.", BleState.Result.Failure.Type.PHONE)
|
||||
val candidate = otherDevices
|
||||
.filter { it !is UnknownSnapshotBle }
|
||||
.maxBy { it.signalQuality }
|
||||
|
||||
generalSettings.isOffloadedFilteringDisabled.valueBlocking = false
|
||||
generalSettings.isOffloadedBatchingDisabled.valueBlocking = false
|
||||
generalSettings.useIndirectScanResultCallback.valueBlocking = false
|
||||
debugSettings.showUnfiltered.valueBlocking = false
|
||||
log(TAG, INFO) { "Candidate is $candidate" }
|
||||
|
||||
return@launch
|
||||
}
|
||||
profilesRepo.addProfile(
|
||||
profile = AppleDeviceProfile(
|
||||
label = context.getString(R.string.troubleshooter_title),
|
||||
model = candidate.model,
|
||||
),
|
||||
addFirst = true,
|
||||
)
|
||||
|
||||
progress("We received at least some BLE data.\n")
|
||||
val mainDevice = withTimeoutOrNull(STEP_TIME) {
|
||||
deviceMonitor.primaryDevice().filterNotNull().firstOrNull()
|
||||
}
|
||||
|
||||
run {
|
||||
progress("Checking for supported headphones.")
|
||||
|
||||
if (doScan(false, false, false, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(false, false, true, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(true, true, true, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(true, true, false, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(true, false, true, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(true, false, false, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(false, true, true, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
if (doScan(false, true, false, false).any { it !is UnknownSnapshotBle }) return@run
|
||||
|
||||
failure("No compatible headphones found", BleState.Result.Failure.Type.HEADPHONES)
|
||||
|
||||
generalSettings.isOffloadedFilteringDisabled.valueBlocking = false
|
||||
generalSettings.isOffloadedBatchingDisabled.valueBlocking = false
|
||||
generalSettings.useIndirectScanResultCallback.valueBlocking = false
|
||||
|
||||
return@launch
|
||||
}
|
||||
|
||||
progress("Found some headphones that are supported by CAPod.\n")
|
||||
|
||||
run {
|
||||
progress("Checking for your headphones with new BLE settings...")
|
||||
val mainDevice = withTimeoutOrNull(STEP_TIME) {
|
||||
deviceMonitor.primaryDevice().filterNotNull().firstOrNull()
|
||||
}
|
||||
if (mainDevice != null) {
|
||||
success("Found your headphones, new BLE settings worked :)!")
|
||||
return@launch
|
||||
}
|
||||
}
|
||||
|
||||
progress("Still no headphones detected that count as yours.\n")
|
||||
|
||||
run {
|
||||
progress("Checking all closeby headphones.")
|
||||
|
||||
val otherDevices = withTimeoutOrNull(STEP_TIME) {
|
||||
val start = timeSource.elapsedRealtime()
|
||||
blePodMonitor.devices
|
||||
.take(10)
|
||||
.takeWhile { timeSource.elapsedRealtime() - start < STEP_TIME - 1000 }
|
||||
.toList()
|
||||
.flatten()
|
||||
.distinctBy { it.address }
|
||||
} ?: emptyList()
|
||||
|
||||
otherDevices.forEachIndexed { index, dev -> log(TAG) { "Device #$index: $dev" } }
|
||||
|
||||
if (otherDevices.isEmpty()) {
|
||||
failure("No supported headphones found near your device.", BleState.Result.Failure.Type.HEADPHONES)
|
||||
return@launch
|
||||
}
|
||||
|
||||
progress("Headphones found nearby, but not detected as yours.\n")
|
||||
progress("Creating profile for closest headphones.")
|
||||
|
||||
val candidate = otherDevices
|
||||
.filter { it !is UnknownSnapshotBle }
|
||||
.maxBy { it.signalQuality }
|
||||
|
||||
log(TAG, INFO) { "Candidate is $candidate" }
|
||||
|
||||
profilesRepo.addProfile(
|
||||
profile = AppleDeviceProfile(
|
||||
label = context.getString(R.string.troubleshooter_title),
|
||||
model = candidate.model,
|
||||
),
|
||||
addFirst = true,
|
||||
)
|
||||
|
||||
val mainDevice = withTimeoutOrNull(STEP_TIME) {
|
||||
deviceMonitor.primaryDevice().filterNotNull().firstOrNull()
|
||||
}
|
||||
|
||||
generalSettings.scannerMode.valueBlocking = ScannerMode.BALANCED
|
||||
|
||||
if (mainDevice != null) {
|
||||
success("Success! Detected your headphones.")
|
||||
} else {
|
||||
failure("No headphones detected near your device.", BleState.Result.Failure.Type.HEADPHONES)
|
||||
if (mainDevice != null) {
|
||||
success("Success! Detected your headphones.")
|
||||
} else {
|
||||
failure("No headphones detected near your device.", BleState.Result.Failure.Type.HEADPHONES)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Wys \'n ekstra kennisgewing wanneer \'n toestel gekoppel is. Dit laat jou toe om die permanente \"Geen toestelle\" kennisgewing te versteek deur die \"Toestelstatus\" kanaal te deaktiveer.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Hou kennisgewing ná ontkoppeling</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Hou aan om die laaste bekende batteryvlakke te wys selfs nadat jou AirPods ontkoppel.</string>
|
||||
<string name="settings_scanner_mode_label">Skandeerdermodus</string>
|
||||
<string name="settings_scanner_mode_description">Moet die Bluetooth Lae Energie-dataskandeerder werkverrigting prioritiseer of energie bespaar?</string>
|
||||
<string name="settings_autopause_label">Outo-pouse</string>
|
||||
<string name="settings_autopause_description">Pouseer oudio wanneer die toestel uit jou oor verwyder word.</string>
|
||||
<string name="settings_autopplay_label">Outo-speel</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Die volgende toestemming is vereis:</string>
|
||||
<string name="permission_system_alert_window_label">Stelselwaarskuwingsvenster</string>
|
||||
<string name="permission_system_alert_window_description">Laat CAPod toe om oor ander toepassings te teken om die kenmerk Wys opspringer moontlik te maak.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Lae krag</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Gebalanseer</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Lae latensie</string>
|
||||
<string name="settings_monitor_mode_manual_label">Wanneer toepassing oop is</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Wanneer toestel gekoppel is</string>
|
||||
<string name="settings_monitor_mode_always_label">Altyd</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dubbel druk om oproep te beëindig</string>
|
||||
<string name="device_settings_open_cd">Maak toestel-instellings oop</string>
|
||||
<string name="overview_card_missing_paired_device">Hierdie profiel het geen gekoppelde Bluetooth-toestel nie.</string>
|
||||
<string name="overview_reactions_hint_title">Reaksies is per toestel</string>
|
||||
<string name="overview_reactions_hint_body">Outo-speel, outo-pouse en opspringers word nou per toestel gekonfigureer. Tik op die instellings-ikoon op \'n kaart terwyl jou kopfone verbind is.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Algemeen</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofoon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">አንድ መሣሪያ ሲገናኝ ተጨማሪ ማሳወቂያ ያሳያል። ይህ የ \"የመሣሪያ ሁኔታ\" ቻናልን በማሰናከል ቋሚውን \"ምንም መሣሪያዎች የሉም\" የሚለውን ማሳወቂያ እንዲደብቁ ያስችልዎታል።</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">ከተነተቀ በኋላ ማሳወቂያውን ይያዙ</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">AirPods ከተነተቁ በኋላም የመጨረሻውን የታወቀ የባትሪ ደረጃ ማሳየቱን ይቀጥሉ</string>
|
||||
<string name="settings_scanner_mode_label">የቃኚ ሁነታ</string>
|
||||
<string name="settings_scanner_mode_description">የብሉቱዝ ዝቅተኛ ኃይል ዳታ ቃኚው አፈጻጸምን ቅድሚያ መስጠት አለበት ወይስ ኃይል መቆጠብ አለበት?</string>
|
||||
<string name="settings_autopause_label">ራስ-ሰር ለአፍታ ማቆም</string>
|
||||
<string name="settings_autopause_description">መሳሪያውን ከጆሮዎ ሲያወጡ ድምጽን ለአፍታ ያቁሙ።</string>
|
||||
<string name="settings_autopplay_label">ራስ-ሰር አጫውት</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">የሚከተለው ፈቃድ ያስፈልጋል:</string>
|
||||
<string name="permission_system_alert_window_label">የስርዓት ማስጠንቀቂያ መስኮት</string>
|
||||
<string name="permission_system_alert_window_description">\"ብቅ-ባይ አሳይ\" ባህሪውን ለማስቻል CAPod በሌሎች መተግበሪያዎች ላይ እንዲሳል ፍቀድ።</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">ዝቅተኛ ኃይል</string>
|
||||
<string name="settings_scanner_mode_balanced_label">ሚዛናዊ</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">ዝቅተኛ መዘግየት</string>
|
||||
<string name="settings_monitor_mode_manual_label">መተግበሪያው ሲከፈት</string>
|
||||
<string name="settings_monitor_mode_automatic_label">መሣሪያ ሲገናኝ</string>
|
||||
<string name="settings_monitor_mode_always_label">ሁልጊዜ</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ጥሪን ለመጨረስ ሁለት ጊዜ ጀን</string>
|
||||
<string name="device_settings_open_cd">የመሣሪያ ቅንብሮችን ክፈት</string>
|
||||
<string name="overview_card_missing_paired_device">ይህ መገለጫ የጋራ ብሉቱዝ መሳሪያ የለውም።</string>
|
||||
<string name="overview_reactions_hint_title">ምላሾች በእያንዳንዱ መሳሪያ ናቸው</string>
|
||||
<string name="overview_reactions_hint_body">የራስ-ማጫወት፣ የራስ-ማቆም እና ብቅ-ባይ መስኮቶች አሁን በእያንዳንዱ መሳሪያ ይዋቀራሉ። ጆሮ ማዳመጫዎ ሲገናኙ ካርዱ ላይ ያለውን የቅንብሮች አዶ መታ ያድርጉ።</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">አጠቃላይ</string>
|
||||
<string name="device_settings_microphone_mode_label">ማይክሮፎን</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">يعرض إشعارًا إضافيًا عند توصيل جهاز. يتيح لك هذا إخفاء الإشعار الدائم \"لا توجد أجهزة\" عن طريق تعطيل قناة \"حالة الجهاز\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">الاحتفاظ بالإشعار بعد قطع الاتصال</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">الاستمرار في عرض مستويات البطارية المعروفة الأخيرة حتى بعد قطع اتصال AirPods</string>
|
||||
<string name="settings_scanner_mode_label">وضع الماسح الضوئي</string>
|
||||
<string name="settings_scanner_mode_description">هل يجب أن يعطي ماسح بيانات البلوتوث منخفض الطاقة الأولوية للأداء أم يحافظ على الطاقة؟</string>
|
||||
<string name="settings_autopause_label">إيقاف مؤقت تلقائي</string>
|
||||
<string name="settings_autopause_description">إيقاف الصوت مؤقتًا عند إزالة الجهاز من أذنك.</string>
|
||||
<string name="settings_autopplay_label">تشغيل تلقائي</string>
|
||||
@@ -230,9 +228,6 @@
|
||||
<string name="permission_required_title">الإذن التالي مطلوب:</string>
|
||||
<string name="permission_system_alert_window_label">نافذة تنبيه النظام</string>
|
||||
<string name="permission_system_alert_window_description">السماح لـ CAPod بالرسم فوق التطبيقات الأخرى لتمكين ميزة \"إظهار النافذة المنبثقة\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">طاقة منخفضة</string>
|
||||
<string name="settings_scanner_mode_balanced_label">متوازن</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">تأخير منخفض</string>
|
||||
<string name="settings_monitor_mode_manual_label">عند فتح التطبيق</string>
|
||||
<string name="settings_monitor_mode_automatic_label">عند اتصال الجهاز</string>
|
||||
<string name="settings_monitor_mode_always_label">دائمًا</string>
|
||||
@@ -490,6 +485,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ضغطة مزدوجة لإنهاء المكالمة</string>
|
||||
<string name="device_settings_open_cd">فتح إعدادات الجهاز</string>
|
||||
<string name="overview_card_missing_paired_device">هذا الملف الشخصي لا يحتوي على جهاز بلوتوث مقترن.</string>
|
||||
<string name="overview_reactions_hint_title">ردود الفعل خاصة بكل جهاز</string>
|
||||
<string name="overview_reactions_hint_body">يتم الآن تهيئة التشغيل التلقائي والإيقاف التلقائي والنوافذ المنبثقة لكل جهاز على حدة. انقر على أيقونة الإعدادات على البطاقة أثناء توصيل سماعاتك.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">عام</string>
|
||||
<string name="device_settings_microphone_mode_label">ميكروفون</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Cihaz qoşulduqda əlavə bildiriş göstərir. Bu, \"Cihaz statusu\" kanalını deaktiv etməklə daimi \"Cihaz yoxdur\" bildirişini gizlətməyə imkan verir.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Ayrıldıqdan sonra bildirişi saxla</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">AirPods ayrıldıqdan sonra belə sonuncu bilinən batareya səviyyələrini göstərməyə davam et</string>
|
||||
<string name="settings_scanner_mode_label">Skaner rejimi</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Aşağı Enerji məlumat skaneri performansa üstünlük verməli, yoxsa enerjiyə qənaət etməlidir?</string>
|
||||
<string name="settings_autopause_label">Avtomatik fasilə</string>
|
||||
<string name="settings_autopause_description">Cihazı qulağınızdan çıxardıqda səsi dayandırın.</string>
|
||||
<string name="settings_autopplay_label">Avtomatik oxutma</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Aşağıdakı icazə tələb olunur:</string>
|
||||
<string name="permission_system_alert_window_label">Sistem xəbərdarlıq pəncərəsi</string>
|
||||
<string name="permission_system_alert_window_description">\"Pop-up göstər\" xüsusiyyətini mümkün etmək üçün CAPod-a digər tətbiqlərin üzərində çəkməyə icazə verin.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Aşağı güc</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Balanslaşdırılmış</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Aşağı gecikmə</string>
|
||||
<string name="settings_monitor_mode_manual_label">Tətbiq açıq olduqda</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Cihaz qoşulduqda</string>
|
||||
<string name="settings_monitor_mode_always_label">Həmişə</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Zəngi bitirmək üçün iki dəfə basın</string>
|
||||
<string name="device_settings_open_cd">Cihaz parametrlərini açın</string>
|
||||
<string name="overview_card_missing_paired_device">Bu profilin cütləşdirilmiş Bluetooth cihazı yoxdur.</string>
|
||||
<string name="overview_reactions_hint_title">Reaksiyalar hər cihaz üçün ayrıdır</string>
|
||||
<string name="overview_reactions_hint_body">Avtomatik oxutma, avtomatik dayandırma və açılan pəncərələr artıq hər cihaz üçün ayrıca konfiqurasiya edilir. Qulaqlıqlarınız qoşulu olarkən kartdakı parametrlər ikonasına toxunun.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Ümumi</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Паказвае дадатковае апавяшчэнне пры падключэнні прылады. Гэта дазваляе схаваць пастаяннае апавяшчэнне \"Няма прылад\" шляхам адключэння канала \"Стан прылады\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Захаваць апавяшчэнне пасля адключэння</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Працягваць паказваць апошнія вядомыя ўзроўні зарадкі нават пасля адключэння вашых AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Рэжым сканера</string>
|
||||
<string name="settings_scanner_mode_description">Ці павінен сканер даных Bluetooth Low Energy аддаваць перавагу прадукцыйнасці або эканоміць энергію?</string>
|
||||
<string name="settings_autopause_label">Аўтаматычная паўза</string>
|
||||
<string name="settings_autopause_description">Прыпыняць аўдыя пры выманні прылады з вуха.</string>
|
||||
<string name="settings_autopplay_label">Аўтаматычнае прайграванне</string>
|
||||
@@ -226,9 +224,6 @@
|
||||
<string name="permission_required_title">Патрабуецца наступны дазвол:</string>
|
||||
<string name="permission_system_alert_window_label">Сістэмнае акно папярэджання</string>
|
||||
<string name="permission_system_alert_window_description">Дазвольце CAPod маляваць паверх іншых праграм, каб зрабіць магчымай функцыю \"Паказаць усплывальнае акно\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Нізкае энергаспажыванне</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Збалансавана</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Нізкая затрымка</string>
|
||||
<string name="settings_monitor_mode_manual_label">Калі праграма адкрыта</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Калі прылада падключана</string>
|
||||
<string name="settings_monitor_mode_always_label">Заўсёды</string>
|
||||
@@ -480,6 +475,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Двайны націск для завяршэння выкліку</string>
|
||||
<string name="device_settings_open_cd">Адкрыць налады прылады</string>
|
||||
<string name="overview_card_missing_paired_device">З гэтым профілем не сапалучана прылада Bluetooth.</string>
|
||||
<string name="overview_reactions_hint_title">Рэакцыі ўстаноўлены для кожнай прылады</string>
|
||||
<string name="overview_reactions_hint_body">Аўтаўзнаўленне, аўтапаўза і ўсплывальныя вокны цяпер наладжваюцца для кожнай прылады. Націсніце значок налад на картцы, пакуль вашы навушнікі падключаны.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Агульныя</string>
|
||||
<string name="device_settings_microphone_mode_label">Мікрафон</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Показва допълнително известие, когато устройство е свързано. Това ви позволява да скриете постоянното известие \"Няма устройства\" чрез деактивиране на канала \"Състояние на устройството\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Запази известието след прекъсване</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Продължавай да показваш последните известни нива на батерията дори след прекъсване на връзката с AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Режим на скенер</string>
|
||||
<string name="settings_scanner_mode_description">Трябва ли скенерът за данни с ниска енергия на Bluetooth да даде приоритет на производителността или да пести енергия?</string>
|
||||
<string name="settings_autopause_label">Автоматична пауза</string>
|
||||
<string name="settings_autopause_description">Поставяне на аудио на пауза при премахване на устройството от ухото ви.</string>
|
||||
<string name="settings_autopplay_label">Автоматично възпроизвеждане</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Необходимо е следното разрешение:</string>
|
||||
<string name="permission_system_alert_window_label">Системен изскачащ прозорец</string>
|
||||
<string name="permission_system_alert_window_description">Позволете на CAPod да рисува върху други приложения, за да направи функцията \"Покажи изскачащ прозорец\" възможна.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Ниска мощност</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Балансиран</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Ниска латентност</string>
|
||||
<string name="settings_monitor_mode_manual_label">Когато приложението е отворено</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Когато устройството е свързано</string>
|
||||
<string name="settings_monitor_mode_always_label">Винаги</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Двойно натискане за прекратяване на разговора</string>
|
||||
<string name="device_settings_open_cd">Отворете настройките на устройството</string>
|
||||
<string name="overview_card_missing_paired_device">Този профил няма сдвоено Bluetooth устройство.</string>
|
||||
<string name="overview_reactions_hint_title">Реакциите са за всяко устройство поотделно</string>
|
||||
<string name="overview_reactions_hint_body">Автоматичното възпроизвеждане, паузирането и изскачащите прозорци вече се конфигурират за всяко устройство поотделно. Натиснете иконата с настройки на картата, докато слушалките ви са свързани.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Общи</string>
|
||||
<string name="device_settings_microphone_mode_label">Микрофон</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">একটি ডিভাইস সংযুক্ত হলে একটি অতিরিক্ত বিজ্ঞপ্তি দেখায়। এটি আপনাকে \"ডিভাইস স্ট্যাটাস\" চ্যানেল নিষ্ক্রিয় করে স্থায়ী \"কোনো ডিভাইস নেই\" বিজ্ঞপ্তি লুকাতে দেয়।</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">সংযোগ বিচ্ছিন্নের পরে বিজ্ঞপ্তি রাখুন</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">আপনার AirPods সংযোগ বিচ্ছিন্ন হওয়ার পরেও সর্বশেষ জানা ব্যাটারি স্তর দেখাতে থাকুন</string>
|
||||
<string name="settings_scanner_mode_label">স্ক্যানার মোড</string>
|
||||
<string name="settings_scanner_mode_description">ব্লুটুথ লো এনার্জি ডেটা স্ক্যানার কি কর্মক্ষমতাকে অগ্রাধিকার দেবে নাকি শক্তি সংরক্ষণ করবে?</string>
|
||||
<string name="settings_autopause_label">স্বয়ংক্রিয় বিরতি</string>
|
||||
<string name="settings_autopause_description">আপনার কান থেকে ডিভাইসটি সরানোর সময় অডিওতে বিরতি দিন।</string>
|
||||
<string name="settings_autopplay_label">স্বয়ংক্রিয় প্লে</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">নিম্নলিখিত অনুমতি প্রয়োজন:</string>
|
||||
<string name="permission_system_alert_window_label">সিস্টেম অ্যালার্ট উইন্ডো</string>
|
||||
<string name="permission_system_alert_window_description">\"পপআপ দেখান\" বৈশিষ্ট্যটি সম্ভব করতে CAPod-কে অন্যান্য অ্যাপের উপরে আঁকতে অনুমতি দিন।</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">কম শক্তি</string>
|
||||
<string name="settings_scanner_mode_balanced_label">ভারসাম্যপূর্ণ</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">কম বিলম্ব</string>
|
||||
<string name="settings_monitor_mode_manual_label">অ্যাপ খোলা থাকলে</string>
|
||||
<string name="settings_monitor_mode_automatic_label">ডিভাইস সংযুক্ত থাকলে</string>
|
||||
<string name="settings_monitor_mode_always_label">সর্বদা</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">কল শেষ করতে দুবার চাপুন</string>
|
||||
<string name="device_settings_open_cd">ডিভাইস সেটিংস খুলুন</string>
|
||||
<string name="overview_card_missing_paired_device">এই প্রোফাইলে কোনো পেয়ার করা ব্লুটুথ ডিভাইস নেই।</string>
|
||||
<string name="overview_reactions_hint_title">প্রতিক্রিয়াগুলি প্রতিটি ডিভাইসের জন্য আলাদা</string>
|
||||
<string name="overview_reactions_hint_body">অটো-প্লে, অটো-পজ এবং পপ-আপগুলি এখন প্রতিটি ডিভাইসের জন্য আলাদাভাবে কনফিগার করা হয়েছে। আপনার হেডফোন সংযুক্ত থাকাকালীন একটি কার্ডে সেটিংস আইকনে ট্যাপ করুন।</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">সাধারণ</string>
|
||||
<string name="device_settings_microphone_mode_label">মাইক্রোফোন</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Mostra una notificació addicional quan hi ha un dispositiu connectat. Això permet ocultar la notificació permanent «Sense dispositius» desactivant el canal «Estat del dispositiu».</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mantén les notificacions després de la desconnexió</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Continua mostrant els últims nivells de bateria coneguts fins i tot després que els AirPods es desconnectin</string>
|
||||
<string name="settings_scanner_mode_label">Mode escàner</string>
|
||||
<string name="settings_scanner_mode_description">L\'escàner de dades Bluetooth de baix consum hauria de prioritzar el rendiment o estalviar energia?</string>
|
||||
<string name="settings_autopause_label">Pausa automàtica</string>
|
||||
<string name="settings_autopause_description">Pausa l\'àudio quan ús tragueu el dispositiu de l\'orella.</string>
|
||||
<string name="settings_autopplay_label">Reproducció automàtica</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Cal el permís següent:</string>
|
||||
<string name="permission_system_alert_window_label">Finestra d\'alerta del sistema</string>
|
||||
<string name="permission_system_alert_window_description">Permet que el CAPod dibuixi sobre altres aplicacions per fer possible la característica «Mostra emergent».</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Baixa potència</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Equilibrat</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Baixa latència</string>
|
||||
<string name="settings_monitor_mode_manual_label">Quan l\'aplicació està oberta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Quan el dispositiu està connectat</string>
|
||||
<string name="settings_monitor_mode_always_label">Sempre</string>
|
||||
@@ -294,7 +289,7 @@
|
||||
<string name="profiles_delete_action">Elimina</string>
|
||||
<string name="profiles_basic_info_title">Informació del dispositiu</string>
|
||||
<string name="profiles_basic_info_description">Configureu el nom del dispositiu, el model i l\'emparellament Bluetooth opcional.</string>
|
||||
<string name="profiles_signal_quality_title">Qualitat de senyal màxima</string>
|
||||
<string name="profiles_signal_quality_title">Qualitat de senyal mínima</string>
|
||||
<string name="profiles_signal_quality_description">Només es detecten dispositius amb una intensitat de senyal superior a aquest llindar. Els valors més baixos augmenten el rang de detecció, però poden causar falsos positius. No configureu aquest valor massa alt: la recepció Bluetooth generalment és deficient i varia segons la distància i els obstacles.</string>
|
||||
<string name="profiles_identitykey_label">Clau d\'identitat</string>
|
||||
<string name="profilessettings_maindevice_identitykey_description">La clau de resolució d\'identitat (IRK) del dispositiu ajuda al CAPod a identificar-lo entre els dispositius propers.</string>
|
||||
@@ -396,7 +391,7 @@
|
||||
<string name="support_contact_send_action">Obre l\'aplicació de correu</string>
|
||||
<string name="support_contact_no_email_app">No s\'ha trobat cap aplicació de correu en aquest dispositiu.</string>
|
||||
<string name="support_contact_debuglog_delete_title">Voleu suprimir el registre de depuració?</string>
|
||||
<string name="support_contact_debuglog_delete_message">Aquest registre de depuració se suprimrirà permanentment.</string>
|
||||
<string name="support_contact_debuglog_delete_message">Aquest registre de depuració se suprimirà permanentment.</string>
|
||||
<!-- Post-share confirmation -->
|
||||
<string name="support_debuglog_sent_title">S\'ha enviat el registre?</string>
|
||||
<string name="support_debuglog_sent_message">El registre de depuració s\'ha enviat correctament? El registre s\'eliminarà.</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Doble toc per acabar la trucada</string>
|
||||
<string name="device_settings_open_cd">Obre la configuració del dispositiu</string>
|
||||
<string name="overview_card_missing_paired_device">Aquest perfil no té cap dispositiu Bluetooth emparellat.</string>
|
||||
<string name="overview_reactions_hint_title">Les reaccions són per dispositiu</string>
|
||||
<string name="overview_reactions_hint_body">La reproducció automàtica, la pausa automàtica i les finestres emergents ara es configuren per dispositiu. Toqueu la icona de configuració d\'una targeta mentre els vostres auriculars estan connectats.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">General</string>
|
||||
<string name="device_settings_microphone_mode_label">Micròfon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Zobrazí dodatečné oznámení, když je zařízení připojeno. To umožňuje skrýt trvalé oznámení \"Žádné zařízení\" vypnutím kanálu \"Stav zařízení\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Uchovat oznámení po odpojení</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Pokračovat v zobrazování poslední známé úrovně nabití baterie i po odpojení AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Režim skenování</string>
|
||||
<string name="settings_scanner_mode_description">Má skenování Bluetooth Low Energy upřednostnit výkon, nebo úsporu energie?</string>
|
||||
<string name="settings_autopause_label">Autom. pozastavení</string>
|
||||
<string name="settings_autopause_description">Pozastavení zvuku při vyjmutí zařízení z ucha.</string>
|
||||
<string name="settings_autopplay_label">Autom. přehrávání</string>
|
||||
@@ -226,9 +224,6 @@
|
||||
<string name="permission_required_title">Je vyžadováno následující oprávnění:</string>
|
||||
<string name="permission_system_alert_window_label">Okno systémových upozornění</string>
|
||||
<string name="permission_system_alert_window_description">Aby bylo možné použít unkci \"Zobrazit vyskakovací okno\", je nutné umožnit aplikaci CAPod vykreslení přes jiné aplikace.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Nízký výkon</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Vyvážený</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Nízká latence</string>
|
||||
<string name="settings_monitor_mode_manual_label">Při otevření aplikace</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Při připojení zařízení</string>
|
||||
<string name="settings_monitor_mode_always_label">Vždy</string>
|
||||
@@ -480,6 +475,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dvojitý stisk pro ukončení hovoru</string>
|
||||
<string name="device_settings_open_cd">Otevřít nastavení zařízení</string>
|
||||
<string name="overview_card_missing_paired_device">Tento profil nemá spárované zařízení Bluetooth.</string>
|
||||
<string name="overview_reactions_hint_title">Reakce jsou nastaveny pro každé zařízení</string>
|
||||
<string name="overview_reactions_hint_body">Automatické přehrávání, automatické pozastavení a vyskakovací okna jsou nyní konfigurována pro každé zařízení. Klepněte na ikonu nastavení na kartě, když jsou vaše sluchátka připojena.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Obecné</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Viser en ekstra notifikation, når en enhed er tilsluttet. Dette lader dig skjule den permanente \"Ingen enheder\"-notifikation ved at deaktivere \"Enhedsstatus\"-kanalen.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Behold notifikation efter afbrydelse</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Fortsæt med at vise de sidst kendte batteriniveauer, selv efter dine AirPods afbrydes</string>
|
||||
<string name="settings_scanner_mode_label">Scannertilstand</string>
|
||||
<string name="settings_scanner_mode_description">Skal Bluetooth Low Energy-datascanneren prioritere ydeevne eller spare på energien?</string>
|
||||
<string name="settings_autopause_label">Auto-pause</string>
|
||||
<string name="settings_autopause_description">Sæt lyd på pause, når du fjerner enheden fra dit øre.</string>
|
||||
<string name="settings_autopplay_label">Auto-afspilning</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Følgende tilladelse er påkrævet:</string>
|
||||
<string name="permission_system_alert_window_label">Systemalarmvindue</string>
|
||||
<string name="permission_system_alert_window_description">Tillad CAPod at tegne over andre apps for at gøre funktionen \"Vis pop op\" mulig.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Lavt strømforbrug</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Balanceret</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Lav latens</string>
|
||||
<string name="settings_monitor_mode_manual_label">Når appen er åben</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Når enheden er tilsluttet</string>
|
||||
<string name="settings_monitor_mode_always_label">Altid</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dobbelt tryk for at afslutte opkald</string>
|
||||
<string name="device_settings_open_cd">Åbn enhedsindstillinger</string>
|
||||
<string name="overview_card_missing_paired_device">Denne profil har ingen parret Bluetooth-enhed.</string>
|
||||
<string name="overview_reactions_hint_title">Reaktioner er per enhed</string>
|
||||
<string name="overview_reactions_hint_body">Automatisk afspilning, automatisk pause og pop-ups er nu konfigureret per enhed. Tryk på indstillingsikonet på et kort, mens dine hovedtelefoner er tilsluttet.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Generel</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Zeigt eine zusätzliche Benachrichtigung an, wenn ein Gerät verbunden ist. Dadurch kannst du die permanente Benachrichtigung „Keine Geräte“ ausblenden, indem du den Kanal „Gerätestatus“ deaktivierst.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Benachrichtigung nach Trennung beibehalten</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Zeigt weiterhin den letzten bekannten Akkustand an, auch wenn die Verbindung zu deinen AirPods getrennt wurde</string>
|
||||
<string name="settings_scanner_mode_label">Scan-Modus</string>
|
||||
<string name="settings_scanner_mode_description">Soll die Bluetooth Low Energy Überwachung Leistung priorisieren oder Energie sparen?</string>
|
||||
<string name="settings_autopause_label">Automatische Pause</string>
|
||||
<string name="settings_autopause_description">Musik pausieren, wenn der Kopfhörer vom Ohr entfernt wird.</string>
|
||||
<string name="settings_autopplay_label">Automatisches abspielen</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Die folgende Genehmigung ist erforderlich:</string>
|
||||
<string name="permission_system_alert_window_label">Systemwarnungsfenster</string>
|
||||
<string name="permission_system_alert_window_description">Erlaube CAPod, PopUp Benachrichtigungen über anderen Apps anzuzeigen.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Geringer Strom</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Ausgewogen</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Geringe Latenz</string>
|
||||
<string name="settings_monitor_mode_manual_label">Wenn die App geöffnet ist</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Wenn das Gerät verbunden ist</string>
|
||||
<string name="settings_monitor_mode_always_label">Immer</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Zweimaliges Drücken zum Beenden des Anrufs</string>
|
||||
<string name="device_settings_open_cd">Geräteeinstellungen öffnen</string>
|
||||
<string name="overview_card_missing_paired_device">Dieses Profil hat kein gekoppeltes Bluetooth-Gerät.</string>
|
||||
<string name="overview_reactions_hint_title">Reaktionen sind gerätespezifisch</string>
|
||||
<string name="overview_reactions_hint_body">Auto-Play, Auto-Pause und Pop-ups werden jetzt pro Gerät konfiguriert. Tippe auf das Einstellungssymbol einer Karte, während deine Kopfhörer verbunden sind.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Allgemein</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Εμφανίζει μια επιπλέον ειδοποίηση όταν μια συσκευή είναι συνδεδεμένη. Αυτό σας επιτρέπει να αποκρύψετε τη μόνιμη ειδοποίηση \"Δεν υπάρχουν συσκευές\" απενεργοποιώντας το κανάλι \"Κατάσταση συσκευής\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Διατήρηση ειδοποίησης μετά την αποσύνδεση</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Συνεχίστε να εμφανίζετε τα τελευταία γνωστά επίπεδα μπαταρίας ακόμα και μετά την αποσύνδεση των AirPods σας</string>
|
||||
<string name="settings_scanner_mode_label">Λειτουργία σαρωτή</string>
|
||||
<string name="settings_scanner_mode_description">Ο σαρωτής δεδομένων Bluetooth Low Energy θα πρέπει να δώσει προτεραιότητα στην απόδοση ή στην εξοικονόμηση ενέργειας;</string>
|
||||
<string name="settings_autopause_label">Αυτόματη παύση</string>
|
||||
<string name="settings_autopause_description">Παύση ήχου κατά την αφαίρεση της συσκευής από το αυτί σας.</string>
|
||||
<string name="settings_autopplay_label">Αυτόματη αναπαραγωγή</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Απαιτείται η ακόλουθη άδεια:</string>
|
||||
<string name="permission_system_alert_window_label">Παράθυρο ειδοποίησης συστήματος</string>
|
||||
<string name="permission_system_alert_window_description">Επιτρέψτε στο CAPod να σχεδιάζει πάνω από άλλες εφαρμογές για να καταστεί δυνατή η λειτουργία \"Εμφάνιση αναδυόμενου\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Χαμηλή ισχύς</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Ισορροπημένο</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Χαμηλή καθυστέρηση</string>
|
||||
<string name="settings_monitor_mode_manual_label">Όταν η εφαρμογή είναι ανοιχτή</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Όταν η συσκευή είναι συνδεδεμένη</string>
|
||||
<string name="settings_monitor_mode_always_label">Πάντα</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Διπλή πίεση για τερματισμό κλήσης</string>
|
||||
<string name="device_settings_open_cd">Άνοιγμα ρυθμίσεων συσκευής</string>
|
||||
<string name="overview_card_missing_paired_device">Αυτό το προφίλ δεν έχει συζευγμένη συσκευή Bluetooth.</string>
|
||||
<string name="overview_reactions_hint_title">Οι αντιδράσεις είναι ανά συσκευή</string>
|
||||
<string name="overview_reactions_hint_body">Η αυτόματη αναπαραγωγή, η αυτόματη παύση και τα αναδυόμενα παράθυρα διαμορφώνονται πλέον ανά συσκευή. Πατήστε το εικονίδιο ρυθμίσεων σε μια κάρτα ενώ τα ακουστικά σας είναι συνδεδεμένα.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Γενικά</string>
|
||||
<string name="device_settings_microphone_mode_label">Μικρόφωνο</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Muestra una notificación extra cuando un dispositivo está conectado. Esto te permite ocultar la notificación permanente \"Sin dispositivos\" desactivando el canal \"Estado del dispositivo\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mantener la notificación después de la desconexión</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Seguir mostrando los últimos niveles de batería conocidos incluso después de que tus AirPods se desconecten</string>
|
||||
<string name="settings_scanner_mode_label">Modo escáner</string>
|
||||
<string name="settings_scanner_mode_description">¿Debería el escáner de datos de Bluetooth de baja energía priorizar el rendimiento o conservar energía?</string>
|
||||
<string name="settings_autopause_label">Pausa automática</string>
|
||||
<string name="settings_autopause_description">Pausar el audio al quitar el dispositivo de tu oreja.</string>
|
||||
<string name="settings_autopplay_label">Reproducción automática</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Se requiere el siguiente permiso:</string>
|
||||
<string name="permission_system_alert_window_label">Ventana emergente</string>
|
||||
<string name="permission_system_alert_window_description">Permite que CAPod se superponga a otras aplicaciones para que la función «Mostrar ventana emergente».</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Baja energía</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Equilibrado</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Baja latencia</string>
|
||||
<string name="settings_monitor_mode_manual_label">Cuando la aplicación está abierta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Cuando el dispositivo está conectado</string>
|
||||
<string name="settings_monitor_mode_always_label">Siempre</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Doble pulsación para finalizar la llamada</string>
|
||||
<string name="device_settings_open_cd">Abrir configuración del dispositivo</string>
|
||||
<string name="overview_card_missing_paired_device">Este perfil no tiene ningún dispositivo Bluetooth emparejado.</string>
|
||||
<string name="overview_reactions_hint_title">Las reacciones son por dispositivo</string>
|
||||
<string name="overview_reactions_hint_body">La reproducción automática, la pausa automática y las ventanas emergentes ahora se configuran por dispositivo. Tocá el ícono de configuración en una tarjeta mientras tus auriculares estén conectados.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">General</string>
|
||||
<string name="device_settings_microphone_mode_label">Micrófono</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Muestra una notificación adicional cuando un dispositivo está conectado. Esto te permite ocultar la notificación permanente \"Sin dispositivos\" desactivando el canal \"Estado del dispositivo\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mantener la notificación después de la desconexión</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Seguir mostrando los últimos niveles de batería conocidos incluso después de que tus AirPods se desconecten</string>
|
||||
<string name="settings_scanner_mode_label">Modo escáner</string>
|
||||
<string name="settings_scanner_mode_description">¿Debería el escáner de datos de Bluetooth de baja energía priorizar el rendimiento o conservar energía?</string>
|
||||
<string name="settings_autopause_label">Pausa automática</string>
|
||||
<string name="settings_autopause_description">Pausar el audio al quitar el dispositivo de tu oreja.</string>
|
||||
<string name="settings_autopplay_label">Reproducción automática</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Se requiere el siguiente permiso:</string>
|
||||
<string name="permission_system_alert_window_label">Ventana emergente</string>
|
||||
<string name="permission_system_alert_window_description">Permite que CAPod se superponga a otras aplicaciones para que la función «Mostrar ventana emergente».</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Baja energía</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Equilibrado</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Baja latencia</string>
|
||||
<string name="settings_monitor_mode_manual_label">Cuando la aplicación está abierta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Cuando el dispositivo está conectado</string>
|
||||
<string name="settings_monitor_mode_always_label">Siempre</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Pulsación doble para terminar la llamada</string>
|
||||
<string name="device_settings_open_cd">Abrir ajustes del dispositivo</string>
|
||||
<string name="overview_card_missing_paired_device">Este perfil no tiene ningún dispositivo Bluetooth vinculado.</string>
|
||||
<string name="overview_reactions_hint_title">Las reacciones son por dispositivo</string>
|
||||
<string name="overview_reactions_hint_body">La reproducción automática, la pausa automática y las ventanas emergentes ahora se configuran por dispositivo. Toca el ícono de configuración en una tarjeta mientras tus auriculares estén conectados.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">General</string>
|
||||
<string name="device_settings_microphone_mode_label">Micrófono</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Muestra una notificación adicional cuando un dispositivo está conectado. Esto le permite ocultar la notificación permanente \"Sin dispositivos\" deshabilitando el canal \"Estado del dispositivo\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mantener la notificación después de la desconexión</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Seguir mostrando los últimos niveles de batería conocidos incluso después de que tus AirPods se desconecten</string>
|
||||
<string name="settings_scanner_mode_label">Modo escáner</string>
|
||||
<string name="settings_scanner_mode_description">¿Debería el escáner de datos de Bluetooth de baja energía priorizar el rendimiento o conservar energía?</string>
|
||||
<string name="settings_autopause_label">Pausa automática</string>
|
||||
<string name="settings_autopause_description">Pausar el audio al quitar el dispositivo de tu oído.</string>
|
||||
<string name="settings_autopplay_label">Reproducción automática</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Se requiere el siguiente permiso:</string>
|
||||
<string name="permission_system_alert_window_label">Ventana emergente</string>
|
||||
<string name="permission_system_alert_window_description">Permite que CAPod se superponga a otras aplicaciones para que la función «Mostrar ventana emergente».</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Baja energía</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Equilibrado</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Baja latencia</string>
|
||||
<string name="settings_monitor_mode_manual_label">Cuando la aplicación está abierta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Cuando el dispositivo está conectado</string>
|
||||
<string name="settings_monitor_mode_always_label">Siempre</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Doble pulsación para finalizar llamada</string>
|
||||
<string name="device_settings_open_cd">Abrir configuración del dispositivo</string>
|
||||
<string name="overview_card_missing_paired_device">Este perfil no tiene ningún dispositivo Bluetooth emparejado.</string>
|
||||
<string name="overview_reactions_hint_title">Las reacciones son por dispositivo</string>
|
||||
<string name="overview_reactions_hint_body">La reproducción automática, la pausa automática y las ventanas emergentes ahora se configuran por dispositivo. Toca el icono de configuración en una tarjeta mientras tus auriculares están conectados.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">General</string>
|
||||
<string name="device_settings_microphone_mode_label">Micrófono</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Kuvab seadme ühendumisel lisateavituse. See peidab pidevalt nähtava „Seadmed puuduvad“ teate, selleks keelates „Seadme olek“ kanali.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Kuva teadet ka pärast eemaldamist</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Jätkake viimase teadaoleva akutaseme kuvamist isegi pärast AirPodside eemaldamist</string>
|
||||
<string name="settings_scanner_mode_label">Skannimisrežiim</string>
|
||||
<string name="settings_scanner_mode_description">Kas Bluetooth madalama energiatarbimisega andmete skanner eelistab jõudlust või mõõdukat energiahaldust?</string>
|
||||
<string name="settings_autopause_label">Automaatne peatamine</string>
|
||||
<string name="settings_autopause_description">Seadme kõrvast eemaldamisel peata esitamine.</string>
|
||||
<string name="settings_autopplay_label">Automaatne esitamine</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Vaja on järgmist luba:</string>
|
||||
<string name="permission_system_alert_window_label">Süsteemi teate aken</string>
|
||||
<string name="permission_system_alert_window_description">Luba CAPodil toimetada teiste rakenduste kohal, et näha hüpikaknaid.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Madal võimsus</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Tasakaalustatud</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Madal latents</string>
|
||||
<string name="settings_monitor_mode_manual_label">Kui rakendus on avatud</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Kui seade on ühendatud</string>
|
||||
<string name="settings_monitor_mode_always_label">Alati</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Kahe vajutusega lõpeta kõne</string>
|
||||
<string name="device_settings_open_cd">Ava seadme seaded</string>
|
||||
<string name="overview_card_missing_paired_device">Sellel profiilil puudub seotud Bluetoothi seade.</string>
|
||||
<string name="overview_reactions_hint_title">Reaktsioonid on seadmepõhised</string>
|
||||
<string name="overview_reactions_hint_body">Automaatne esitus, automaatne paus ja hüpikaknad on nüüd seadmepõhiselt seadistatud. Puudutage kaardi seadete ikooni, kui kõrvaklapid on ühendatud.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Üldine</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Gailu bat konektatuta dagoenean jakinarazpen gehigarri bat erakusten du. Honek \"Gailurik ez\" jakinarazpen iraunkorra ezkutatzeko aukera ematen dizu \"Gailuaren egoera\" kanala desgaituz.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mantendu jakinarazpena deskonektatu ondoren</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Jarraitu azken bateria-maila ezagunak erakusten zure AirPods-ak deskonektatu ondoren ere</string>
|
||||
<string name="settings_scanner_mode_label">Eskaner modua</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Energia Baxuko datuen eskanerrak errendimendua lehenetsi behar al du ala energia aurreztu?</string>
|
||||
<string name="settings_autopause_label">Pausatze automatikoa</string>
|
||||
<string name="settings_autopause_description">Pausatu audioa gailua belarritik kentzean.</string>
|
||||
<string name="settings_autopplay_label">Erreprodukzio automatikoa</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Hurrengo baimena beharrezkoa da:</string>
|
||||
<string name="permission_system_alert_window_label">Sistemaren alerta-leihoa</string>
|
||||
<string name="permission_system_alert_window_description">Baimendu CAPod-i beste aplikazioen gainean marraztea \"Erakutsi pop-up-a\" ezaugarria posible egiteko.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Potentzia baxua</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Orekatua</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Latentzia baxua</string>
|
||||
<string name="settings_monitor_mode_manual_label">Aplikazioa irekita dagoenean</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Gailua konektatuta dagoenean</string>
|
||||
<string name="settings_monitor_mode_always_label">Beti</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Bikoitz sakatu deia amaitzeko</string>
|
||||
<string name="device_settings_open_cd">Ireki gailuaren ezarpenak</string>
|
||||
<string name="overview_card_missing_paired_device">Profil honek ez du Bluetooth gailurik parekaturik.</string>
|
||||
<string name="overview_reactions_hint_title">Erreakzioak gailuka konfiguratuta daude</string>
|
||||
<string name="overview_reactions_hint_body">Erreprodukzio automatikoa, geldialdia automatikoa eta laster-leihoak orain gailuka konfiguratzen dira. Sakatu txarteleko ezarpenak ikonoa aurikularrak konektatuta dituzun bitartean.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Orokorra</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofonoa</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">هنگامی که یک دستگاه متصل است، یک اعلان اضافی نشان میدهد. این به شما امکان میدهد اعلان دائمی \"بدون دستگاه\" را با غیرفعال کردن کانال \"وضعیت دستگاه\" پنهان کنید.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">حفظ اعلان پس از قطع اتصال</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">نمایش آخرین سطوح شارژ شناختهشده حتی پس از قطع اتصال AirPods شما</string>
|
||||
<string name="settings_scanner_mode_label">حالت اسکنر</string>
|
||||
<string name="settings_scanner_mode_description">آیا اسکنر داده بلوتوث کممصرف باید عملکرد را در اولویت قرار دهد یا انرژی را ذخیره کند؟</string>
|
||||
<string name="settings_autopause_label">مکث خودکار</string>
|
||||
<string name="settings_autopause_description">هنگام برداشتن دستگاه از گوش، صدا را متوقف کنید.</string>
|
||||
<string name="settings_autopplay_label">پخش خودکار</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">مجوز زیر مورد نیاز است:</string>
|
||||
<string name="permission_system_alert_window_label">پنجره هشدار سیستم</string>
|
||||
<string name="permission_system_alert_window_description">به CAPod اجازه دهید روی سایر برنامهها نمایش دهد تا ویژگی \"نمایش پاپآپ\" ممکن شود.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">کممصرف</string>
|
||||
<string name="settings_scanner_mode_balanced_label">متعادل</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">تأخیر کم</string>
|
||||
<string name="settings_monitor_mode_manual_label">وقتی برنامه باز است</string>
|
||||
<string name="settings_monitor_mode_automatic_label">وقتی دستگاه متصل است</string>
|
||||
<string name="settings_monitor_mode_always_label">همیشه</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">دوبار فشار برای پایان دادن تماس</string>
|
||||
<string name="device_settings_open_cd">باز کردن تنظیمات دستگاه</string>
|
||||
<string name="overview_card_missing_paired_device">این پروفایل هیچ دستگاه بلوتوثی جفتشدهای ندارد.</string>
|
||||
<string name="overview_reactions_hint_title">واکنشها برای هر دستگاه جداگانه هستند</string>
|
||||
<string name="overview_reactions_hint_body">پخش خودکار، توقف خودکار و پنجرههای بازشو اکنون برای هر دستگاه پیکربندی میشوند. در حالی که هدفونهای شما متصل هستند، روی آیکون تنظیمات روی یک کارت ضربه بزنید.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">عمومی</string>
|
||||
<string name="device_settings_microphone_mode_label">میکروفون</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Näyttää lisäilmoituksen, kun laite on yhdistetty. Tämä antaa sinun piilottaa pysyvän \"Ei laitteita\" -ilmoituksen poistamalla \"Laitteen tila\" -kanavan käytöstä.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Säilytä ilmoitus yhteyden katkaisun jälkeen</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Jatka viimeisten tunnettujen akkutasojen näyttämistä senkin jälkeen, kun AirPodit katkaisevat yhteyden</string>
|
||||
<string name="settings_scanner_mode_label">Skanneritila</string>
|
||||
<string name="settings_scanner_mode_description">Pitäisikö Bluetooth Low Energy -dataskannerin priorisoida suorituskykyä vai säästää energiaa?</string>
|
||||
<string name="settings_autopause_label">Automaattinen tauko</string>
|
||||
<string name="settings_autopause_description">Keskeytä ääni, kun poistat laitteen korvastasi.</string>
|
||||
<string name="settings_autopplay_label">Automaattinen toisto</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Seuraava lupa vaaditaan:</string>
|
||||
<string name="permission_system_alert_window_label">Järjestelmän hälytysikkuna</string>
|
||||
<string name="permission_system_alert_window_description">Salli CAPod-sovelluksen piirtää muiden sovellusten päälle mahdollistaakseen \"Näytä ponnahdusikkuna\" -ominaisuuden.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Virransäästö</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Tasapainoinen</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Matala viive</string>
|
||||
<string name="settings_monitor_mode_manual_label">Kun sovellus on auki</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Kun laite on yhdistetty</string>
|
||||
<string name="settings_monitor_mode_always_label">Aina</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Kaksoispainallus lopettaa puhelun</string>
|
||||
<string name="device_settings_open_cd">Avaa laiteasetukset</string>
|
||||
<string name="overview_card_missing_paired_device">Tällä profiililla ei ole yhdistettyä Bluetooth-laitetta.</string>
|
||||
<string name="overview_reactions_hint_title">Reaktiot ovat laitekohtaisia</string>
|
||||
<string name="overview_reactions_hint_body">Automaattinen toisto, automaattinen tauko ja ponnahdusikkunat on nyt määritetty laitekohtaisesti. Napauta kortissa olevaa asetuskuvaketta, kun kuulokkeet ovat yhdistettynä.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Yleiset</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofoni</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Nagpapakita ng karagdagang notipikasyon kapag konektado ang isang device. Pinapayagan ka nitong itago ang permanenteng \"Walang mga device\" na notipikasyon sa pamamagitan ng pag-disable sa \"Katayuan ng device\" na channel.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Panatilihin ang notipikasyon pagkatapos mag-disconnect</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Ipagpatuloy ang pagpapakita ng huling kilalang mga antas ng baterya kahit pagkatapos mag-disconnect ang iyong AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Mode ng scanner</string>
|
||||
<string name="settings_scanner_mode_description">Dapat bang unahin ng Bluetooth Low Energy data scanner ang performance o magtipid ng enerhiya?</string>
|
||||
<string name="settings_autopause_label">Auto pause</string>
|
||||
<string name="settings_autopause_description">I-pause ang audio kapag inaalis ang device sa iyong tainga.</string>
|
||||
<string name="settings_autopplay_label">Auto play</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Kailangan ang sumusunod na pahintulot:</string>
|
||||
<string name="permission_system_alert_window_label">System Alert Window</string>
|
||||
<string name="permission_system_alert_window_description">Payagan ang CAPod na mag-draw sa ibabaw ng ibang mga app para maging posible ang feature na \"Ipakita ang PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Mababang enerhiya</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Balanse</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Mababang latency</string>
|
||||
<string name="settings_monitor_mode_manual_label">Kapag bukas ang app</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Kapag konektado ang device</string>
|
||||
<string name="settings_monitor_mode_always_label">Palagi</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dalawang pindutin para tapusin ang tawag</string>
|
||||
<string name="device_settings_open_cd">Buksan ang mga setting ng device</string>
|
||||
<string name="overview_card_missing_paired_device">Ang profile na ito ay walang naipares na Bluetooth device.</string>
|
||||
<string name="overview_reactions_hint_title">Ang mga reaksyon ay bawat device</string>
|
||||
<string name="overview_reactions_hint_body">Ang auto-play, auto-pause at mga pop-up ay naka-configure na ngayon bawat device. I-tap ang icon ng mga setting sa isang card habang nakakonekta ang iyong mga headphone.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Pangkalahatan</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikropono</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Affiche une notification supplémentaire si un appareil est connecté. Cela vous permet de masquer la notification permanente « Aucun appareil » en désactivant le canal « État de l’appareil ».</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Garder la notification après déconnexion</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Afficher les derniers niveaux de batterie connus même après déconnexion de vos AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Mode analyse</string>
|
||||
<string name="settings_scanner_mode_description">L’analyseur des données « basse énergie » de Bluetooth devrait-il prioriser les performances ou préserver l’énergie ?</string>
|
||||
<string name="settings_autopause_label">Pause automatique</string>
|
||||
<string name="settings_autopause_description">Mettre le son en pause si vous ôtez l’appareil de votre oreille.</string>
|
||||
<string name="settings_autopplay_label">Lecture automatique</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">L’autorisation suivante est nécessaire :</string>
|
||||
<string name="permission_system_alert_window_label">Fenêtre d’alerte système</string>
|
||||
<string name="permission_system_alert_window_description">Permettre à CAPod d’apparaître par-dessus les autres applis pour rendre la fonction « Afficher une fenêtre contextuelle » possible.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Puissance faible</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Équilibré</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Latence faible</string>
|
||||
<string name="settings_monitor_mode_manual_label">Si l’appli est ouverte</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Si l’appareil est connecté</string>
|
||||
<string name="settings_monitor_mode_always_label">Toujours</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Double appui pour terminer l’appel</string>
|
||||
<string name="device_settings_open_cd">Ouvrir les paramètres de l’appareil</string>
|
||||
<string name="overview_card_missing_paired_device">Ce profil n\'a aucun appareil Bluetooth associé.</string>
|
||||
<string name="overview_reactions_hint_title">Les réactions sont par appareil</string>
|
||||
<string name="overview_reactions_hint_body">La lecture automatique, la pause automatique et les fenêtres contextuelles sont désormais configurées par appareil. Appuyez sur l’icône des paramètres d’une carte lorsque vos écouteurs sont connectés.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Général</string>
|
||||
<string name="device_settings_microphone_mode_label">Microphone</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Mostra unha notificación adicional cando un dispositivo está conectado. Isto permíteche ocultar a notificación permanente de \"Sen dispositivos\" desactivando a canle \"Estado do dispositivo\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Manter notificación tras desconexión</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Seguir mostrando os últimos niveis de batería coñecidos mesmo despois de que os teus AirPods se desconecten</string>
|
||||
<string name="settings_scanner_mode_label">Modo de escáner</string>
|
||||
<string name="settings_scanner_mode_description">O escáner de datos Bluetooth de baixa enerxía debería priorizar o rendemento ou conservar enerxía?</string>
|
||||
<string name="settings_autopause_label">Pausa automática</string>
|
||||
<string name="settings_autopause_description">Pausar o son ao quitar o dispositivo da orella.</string>
|
||||
<string name="settings_autopplay_label">Reprodución automática</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">É necesario o seguinte permiso:</string>
|
||||
<string name="permission_system_alert_window_label">Xanela de alerta do sistema</string>
|
||||
<string name="permission_system_alert_window_description">Permitir que CAPod debuxe sobre outras aplicacións para facer posible a función \"Mostrar PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Baixo consumo</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Equilibrado</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Baixa latencia</string>
|
||||
<string name="settings_monitor_mode_manual_label">Cando a aplicación está aberta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Cando o dispositivo está conectado</string>
|
||||
<string name="settings_monitor_mode_always_label">Sempre</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Prema dúas veces para finalizar a chamada</string>
|
||||
<string name="device_settings_open_cd">Abrir a configuración do dispositivo</string>
|
||||
<string name="overview_card_missing_paired_device">Este perfil non ten ningún dispositivo Bluetooth emparellado.</string>
|
||||
<string name="overview_reactions_hint_title">As reaccións son por dispositivo</string>
|
||||
<string name="overview_reactions_hint_body">A reprodución automática, a pausa automática e as ventás emerxentes agora configúranse por dispositivo. Toca a icona de axustes nunha tarxeta mentres os teus auriculares estean conectados.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Xeral</string>
|
||||
<string name="device_settings_microphone_mode_label">Micrófono</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">जब कोई डिवाइस कनेक्ट होता है तो एक अतिरिक्त सूचना दिखाता है। यह आपको \"डिवाइस स्थिति\" चैनल को अक्षम करके स्थायी \"कोई डिवाइस नहीं\" सूचना को छिपाने की अनुमति देता है।</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">डिस्कनेक्ट होने के बाद सूचना बनाए रखें</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">आपके AirPods डिस्कनेक्ट होने के बाद भी अंतिम ज्ञात बैटरी स्तर दिखाना जारी रखें</string>
|
||||
<string name="settings_scanner_mode_label">स्कैनर मोड</string>
|
||||
<string name="settings_scanner_mode_description">क्या ब्लूटूथ लो एनर्जी डेटा स्कैनर को प्रदर्शन को प्राथमिकता देनी चाहिए या ऊर्जा बचानी चाहिए?</string>
|
||||
<string name="settings_autopause_label">ऑटो-पॉज़</string>
|
||||
<string name="settings_autopause_description">डिवाइस को अपने कान से हटाने पर ऑडियो रोकें।</string>
|
||||
<string name="settings_autopplay_label">ऑटो-प्ले</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">निम्नलिखित अनुमति आवश्यक है:</string>
|
||||
<string name="permission_system_alert_window_label">सिस्टम अलर्ट विंडो</string>
|
||||
<string name="permission_system_alert_window_description">CAPod को अन्य ऐप्स के ऊपर ड्रॉ करने की अनुमति दें ताकि \"पॉपअप दिखाएं\" सुविधा संभव हो सके।</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">कम बिजली</string>
|
||||
<string name="settings_scanner_mode_balanced_label">संतुलित</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">कम विलंब</string>
|
||||
<string name="settings_monitor_mode_manual_label">जब ऐप खुला हो</string>
|
||||
<string name="settings_monitor_mode_automatic_label">जब डिवाइस कनेक्ट हो</string>
|
||||
<string name="settings_monitor_mode_always_label">हमेशा</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">कॉल समाप्त करने के लिए दो बार दबाएं</string>
|
||||
<string name="device_settings_open_cd">डिवाइस सेटिंग्स खोलें</string>
|
||||
<string name="overview_card_missing_paired_device">इस प्रोफ़ाइल में कोई पेयर किया गया Bluetooth डिवाइस नहीं है।</string>
|
||||
<string name="overview_reactions_hint_title">रिएक्शन प्रति डिवाइस हैं</string>
|
||||
<string name="overview_reactions_hint_body">ऑटो-प्ले, ऑटो-पॉज़ और पॉप-अप अब प्रति डिवाइस कॉन्फ़िगर किए गए हैं। जब आपके हेडफ़ोन कनेक्ट हों, तो कार्ड पर सेटिंग आइकन टैप करें।</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">सामान्य</string>
|
||||
<string name="device_settings_microphone_mode_label">माइक्रोफ़ोन</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Prikazuje dodatnu obavijest kada je uređaj povezan. To vam omogućuje da sakrijete trajnu obavijest \"Nema uređaja\" onemogućavanjem kanala \"Status uređaja\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Zadrži obavijest nakon prekida veze</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Nastavi prikazivati zadnje poznate razine baterije i nakon što se vaši AirPods odspoje</string>
|
||||
<string name="settings_scanner_mode_label">Način skeniranja</string>
|
||||
<string name="settings_scanner_mode_description">Treba li Bluetooth Low Energy skener podataka dati prednost performansama ili štedjeti energiju?</string>
|
||||
<string name="settings_autopause_label">Automatska pauza</string>
|
||||
<string name="settings_autopause_description">Pauzirajte zvuk kada uklonite uređaj iz uha.</string>
|
||||
<string name="settings_autopplay_label">Automatska reprodukcija</string>
|
||||
@@ -224,9 +222,6 @@
|
||||
<string name="permission_required_title">Sljedeća dozvola je potrebna:</string>
|
||||
<string name="permission_system_alert_window_label">Prozor sistemskog upozorenja</string>
|
||||
<string name="permission_system_alert_window_description">Dopustite CAPod-u crtanje preko drugih aplikacija kako bi omogućili značajku \"Prikaži skočni prozor\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Niska potrošnja</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Uravnoteženo</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Niska latencija</string>
|
||||
<string name="settings_monitor_mode_manual_label">Kada je aplikacija otvorena</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Kada je uređaj povezan</string>
|
||||
<string name="settings_monitor_mode_always_label">Uvijek</string>
|
||||
@@ -475,6 +470,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dvostruki pritisak za završetak poziva</string>
|
||||
<string name="device_settings_open_cd">Otvori postavke uređaja</string>
|
||||
<string name="overview_card_missing_paired_device">Ovaj profil nema uparenog Bluetooth uređaja.</string>
|
||||
<string name="overview_reactions_hint_title">Reakcije su po uređaju</string>
|
||||
<string name="overview_reactions_hint_body">Automatska reprodukcija, automatska pauza i skočni prozori sada se konfiguriraju po uređaju. Dodirnite ikonu postavki na kartici dok su vaše slušalice spojene.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Općenito</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Extra értesítést jelenít meg, amikor egy eszköz csatlakozik. Ez lehetővé teszi az állandó \"Nincs eszköz\" értesítés elrejtését az \"Eszköz állapota\" csatorna letiltásával.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Értesítés megőrzése lecsatlakozás után</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Az utolsó ismert akkumulátorszintek megjelenítésének folytatása az AirPods lecsatlakozása után is</string>
|
||||
<string name="settings_scanner_mode_label">Szkenner mód</string>
|
||||
<string name="settings_scanner_mode_description">A Bluetooth Low Energy szkenner a teljesítményt vagy az energiatakarékosságot részesítse előnyben?</string>
|
||||
<string name="settings_autopause_label">Automatikus szünet</string>
|
||||
<string name="settings_autopause_description">Zene leállítása, amikor kiveszi a füléből az eszközt.</string>
|
||||
<string name="settings_autopplay_label">Automatikus lejátszás</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">A következő engedély szükséges:</string>
|
||||
<string name="permission_system_alert_window_label">Rendszer figyelmeztető ablak</string>
|
||||
<string name="permission_system_alert_window_description">Engedélyezze a CAPod-nak, hogy más alkalmazások fölé rajzoljon az \"Előugró ablak megjelenítése\" funkció lehetővé tételéhez.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Alacsony fogyasztás</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Kiegyensúlyozott</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Alacsony késleltetés</string>
|
||||
<string name="settings_monitor_mode_manual_label">Amikor az alkalmazás nyitva van</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Amikor az eszköz csatlakozik</string>
|
||||
<string name="settings_monitor_mode_always_label">Mindig</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dupla nyomás a hívás befejezéséhez</string>
|
||||
<string name="device_settings_open_cd">Eszközbeállítások megnyitása</string>
|
||||
<string name="overview_card_missing_paired_device">Ehhez a profilhoz nincs párosított Bluetooth-eszköz.</string>
|
||||
<string name="overview_reactions_hint_title">A reakciók eszközönként vannak beállítva</string>
|
||||
<string name="overview_reactions_hint_body">Az automatikus lejátszás, automatikus szünet és felugró ablakok mostantól eszközönként konfigurálhatók. Koppints a beállítások ikonra egy kártyán, miközben a fejhallgatód csatlakoztatva van.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Általános</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Ցուցադրում է լրացուցիչ ծանուցում, երբ սարքը միացված է։ Սա թույլ է տալիս թաքցնել մշտական \"Սարքեր չկան\" ծանուցումը՝ անջատելով \"Սարքի կարգավիճակը\" ալիքը։</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Պահել ծանուցումը անջատումից հետո</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Շարունակել ցուցադրել վերջին հայտնի մարտկոցի մակարդակները նույնիսկ ձեր AirPods-ների անջատումից հետո</string>
|
||||
<string name="settings_scanner_mode_label">Սկաների ռեժիմ</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Low Energy տվյալների սկաները պետք է առաջնահերթություն տա արդյունավետությանը, թե՞ խնայի էներգիան։</string>
|
||||
<string name="settings_autopause_label">Ինքնադադար</string>
|
||||
<string name="settings_autopause_description">Դադարեցրեք ձայնը, երբ սարքը հանում եք ականջից։</string>
|
||||
<string name="settings_autopplay_label">Ինքնանվագարկում</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Հետևյալ թույլտվությունն անհրաժեշտ է՝</string>
|
||||
<string name="permission_system_alert_window_label">Համակարգային զգուշացման պատուհան</string>
|
||||
<string name="permission_system_alert_window_description">Թույլ տվեք CAPod-ին նկարել այլ հավելվածների վերևում՝ \"Ցուցադրել բացվող պատուհան\" գործառույթը հնարավոր դարձնելու համար։</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Ցածր էներգիա</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Հավասարակշռված</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Ցածր ուշացում</string>
|
||||
<string name="settings_monitor_mode_manual_label">Երբ հավելվածը բաց է</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Երբ սարքը միացված է</string>
|
||||
<string name="settings_monitor_mode_always_label">Միշտ</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Կրկնակի սեղմում զանգը ավարտելու համար</string>
|
||||
<string name="device_settings_open_cd">Բացել սառքի կառավարումները</string>
|
||||
<string name="overview_card_missing_paired_device">Այս պրոֆիլը չունի զուգակցված Bluetooth սարք:</string>
|
||||
<string name="overview_reactions_hint_title">Ռեակցիաները կարգավորվում են ըստ սարքի</string>
|
||||
<string name="overview_reactions_hint_body">Ավտոնվագարկումը, ավտոդադարը և բացվող պատուհանները այժմ կարգավորվում են ըստ սարքի: Կտտացրեք կարգավորումների պատկերակին քարտի վրա, մինչ ձեր ականջակալները միացված են:</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Ընդհանուր</string>
|
||||
<string name="device_settings_microphone_mode_label">Խոսափող</string>
|
||||
@@ -518,29 +515,16 @@
|
||||
<!-- Press Controls -->
|
||||
<string name="press_controls_title">Սեղմումների կառավարում</string>
|
||||
<string name="press_controls_nav_description">Կարգավորել սեղմումների վարքը և կապել սեղմումները գործողություններին</string>
|
||||
<string name="press_controls_description">Կարգավորել, թև ինչպես են հայտնաբերվում սեղմումները, ընտրել կոչկի կոթակի վարկաբանություն և կապել սեղմումները գործություններին: Կապվախ գործությունները կիրառկվում են այս սարքին միայն և հավելվախին ինկնություն տալինը նևրկայլլու սեղմումը, այլ ոչ AirPods-ը կառավարի այն բնականորևն:</string>
|
||||
<string name="press_controls_single_press">Մեկ սեղմում</string>
|
||||
<string name="press_controls_double_press">Կրկնակի սեղմում</string>
|
||||
<string name="press_controls_triple_press">Եռակի սեղմում</string>
|
||||
<string name="press_controls_long_press">Երկար սեղմում</string>
|
||||
<string name="press_controls_long_press_anc_cycle_info">Երկար սեղմում գործություն նշանակելը կժբի ժառկելում և Աղմուկի կառավարման ռեժիմների շրջանը AirPods-ի կառուն բռնելու և պահելու:</string>
|
||||
<string name="press_controls_mappings_section_title">Սեղմումների կապակցություն</string>
|
||||
<string name="press_controls_left">Ձախ</string>
|
||||
<string name="press_controls_right">Աջ</string>
|
||||
<string name="press_action_none">Լռացինիչի</string>
|
||||
<string name="press_action_no_action">Գործություն չկա</string>
|
||||
<string name="press_action_play_pause">Նվագարկել/դադարել</string>
|
||||
<string name="press_action_next_track">Հաջորդ երգիժ</string>
|
||||
<string name="press_action_previous_track">Նախին երգիժ</string>
|
||||
<string name="press_action_volume_up">Բարկրացկել ծռագարկությունը</string>
|
||||
<string name="press_action_volume_down">Իլ ծռագարկությունը</string>
|
||||
<string name="press_action_mute_toggle">Լղարել երաժկիկը</string>
|
||||
<string name="press_action_stop">Կանգնել</string>
|
||||
<string name="press_action_fast_forward">Արագ վածել</string>
|
||||
<string name="press_action_rewind">Հևտ վախել</string>
|
||||
<string name="press_action_cycle_anc">Աղմուկի կառավարումի շրջան</string>
|
||||
<string name="press_action_toggle_anc_transparency">Թափանցիկության անլջարել</string>
|
||||
<string name="press_controls_reset_label">վևրականգալ կարգավորումներին</string>
|
||||
<string name="press_controls_reset_confirm_message">վևրականգալ բոլոր սեղմումների կապակցությունները</string>
|
||||
<string name="device_settings_noise_control_open_press_controls_action">Բացել Սեղմումների կառավարումը</string>
|
||||
</resources>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Menampilkan notifikasi tambahan ketika perangkat terhubung. Ini memungkinkan Anda menyembunyikan notifikasi permanen \"Tidak ada perangkat\" dengan menonaktifkan saluran \"Status perangkat\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Pertahankan notifikasi setelah terputus</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Terus menampilkan level baterai terakhir yang diketahui bahkan setelah AirPods terputus</string>
|
||||
<string name="settings_scanner_mode_label">Mode pemindai</string>
|
||||
<string name="settings_scanner_mode_description">Haruskah pemindai data Bluetooth Hemat Energi memprioritaskan kinerja atau menghemat energi?</string>
|
||||
<string name="settings_autopause_label">Jeda otomatis</string>
|
||||
<string name="settings_autopause_description">Jeda audio saat melepas perangkat dari telinga Anda.</string>
|
||||
<string name="settings_autopplay_label">Putar otomatis</string>
|
||||
@@ -220,9 +218,6 @@
|
||||
<string name="permission_required_title">Izin berikut diperlukan:</string>
|
||||
<string name="permission_system_alert_window_label">Jendela Peringatan Sistem</string>
|
||||
<string name="permission_system_alert_window_description">Izinkan CAPod menggambar di atas aplikasi lain untuk memungkinkan fitur \"Tampilkan PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Hemat daya</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Seimbang</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Latensi rendah</string>
|
||||
<string name="settings_monitor_mode_manual_label">Saat aplikasi terbuka</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Saat perangkat terhubung</string>
|
||||
<string name="settings_monitor_mode_always_label">Selalu</string>
|
||||
@@ -465,6 +460,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Tekan dua kali untuk mengakhiri panggilan</string>
|
||||
<string name="device_settings_open_cd">Buka pengaturan perangkat</string>
|
||||
<string name="overview_card_missing_paired_device">Profil ini tidak memiliki Perangkat Bluetooth yang dipasangkan.</string>
|
||||
<string name="overview_reactions_hint_title">Reaksi berlaku per perangkat</string>
|
||||
<string name="overview_reactions_hint_body">Putar otomatis, jeda otomatis, dan pop-up kini dikonfigurasi per perangkat. Ketuk ikon pengaturan pada kartu saat headphone Anda terhubung.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Umum</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Sýnir auka tilkynningu þegar tæki er tengt. Þetta gerir þér kleift að fela varanlega \"Engin tæki\" tilkynninguna með því að slökkva á \"Staða tækis\" rásinni.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Halda tilkynningu eftir aftengi</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Halda áfram að sýna síðustu þekktu rafhlöðustöðu jafnvel eftir að AirPods tengjast af</string>
|
||||
<string name="settings_scanner_mode_label">Skannastilling</string>
|
||||
<string name="settings_scanner_mode_description">Ætti Bluetooth Low Energy gagnaskanninn að forgangsraða afköstum eða spara orku?</string>
|
||||
<string name="settings_autopause_label">Sjálfvirk hlé</string>
|
||||
<string name="settings_autopause_description">Gera hlé á hljóði þegar tækið er tekið úr eyranu.</string>
|
||||
<string name="settings_autopplay_label">Sjálfvirk spilun</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Eftirfarandi heimild er nauðsynleg:</string>
|
||||
<string name="permission_system_alert_window_label">Kerfisviðvörunargluggi</string>
|
||||
<string name="permission_system_alert_window_description">Leyfðu CAPod að teikna yfir önnur forrit til að gera eiginleikann \"Sýna upplýsingaglugga\" mögulegan.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Lágt afl</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Jafnvægi</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Lítil töf</string>
|
||||
<string name="settings_monitor_mode_manual_label">Þegar forrit er opið</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Þegar tæki er tengt</string>
|
||||
<string name="settings_monitor_mode_always_label">Alltaf</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Tvöföld þrýsting til að ljúka simátali</string>
|
||||
<string name="device_settings_open_cd">Opna tæki stillingar</string>
|
||||
<string name="overview_card_missing_paired_device">Þetta snið á sér ekkert tengt Bluetooth-tæki.</string>
|
||||
<string name="overview_reactions_hint_title">Viðbrögð eru per tæki</string>
|
||||
<string name="overview_reactions_hint_body">Sjálfvirk spilun, sjálfvirk pása og sprettigluggar eru nú stilltir per tæki. Ýttu á stillingatáknið á spjaldi á meðan heyrnartólið þitt er tengt.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Álmennt</string>
|
||||
<string name="device_settings_microphone_mode_label">Hljóðnemi</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Mostra una notifica aggiuntiva quando un dispositivo è connesso. Ciò consente di nascondere la notifica permanente \"Nessun dispositivo\" disabilitando il canale \"Stato del dispositivo\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mantieni notifica dopo la disconnessione</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Continua a mostrare gli ultimi livelli di batteria noti anche dopo la disconnessione dei tuoi AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Modalità scanner</string>
|
||||
<string name="settings_scanner_mode_description">Lo scanner di dati Bluetooth Low Energy deve dare priorità alle prestazioni o risparmiare energia?</string>
|
||||
<string name="settings_autopause_label">Pausa automatica</string>
|
||||
<string name="settings_autopause_description">Metti in pausa l\'audio quando rimuovi il dispositivo dall\'orecchio.</string>
|
||||
<string name="settings_autopplay_label">Riproduzione automatica</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">È richiesto il seguente permesso:</string>
|
||||
<string name="permission_system_alert_window_label">Finestra di avviso di sistema</string>
|
||||
<string name="permission_system_alert_window_description">Consenti a CAPod di disegnare sopra altre app per rendere possibile la funzionalità \"Mostra pop-up\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Basso consumo</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Bilanciato</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Bassa latenza</string>
|
||||
<string name="settings_monitor_mode_manual_label">Quando l\'app è aperta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Quando il dispositivo è connesso</string>
|
||||
<string name="settings_monitor_mode_always_label">Sempre</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Premere due volte per terminare la chiamata</string>
|
||||
<string name="device_settings_open_cd">Apri impostazioni dispositivo</string>
|
||||
<string name="overview_card_missing_paired_device">Questo profilo non ha nessun dispositivo Bluetooth associato.</string>
|
||||
<string name="overview_reactions_hint_title">Le reazioni sono per dispositivo</string>
|
||||
<string name="overview_reactions_hint_body">Riproduzione automatica, pausa automatica e pop-up sono ora configurati per dispositivo. Tocca l\'icona delle impostazioni su una scheda mentre le cuffie sono collegate.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Generale</string>
|
||||
<string name="device_settings_microphone_mode_label">Microfono</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">מציג התראה נוספת כאשר מכשיר מחובר. זה מאפשר לך להסתיר את ההתראה הקבועה \"אין מכשירים\" על ידי השבתת הערוץ \"סטטוס מכשיר\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">שמור התראה לאחר ניתוק</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">המשך להציג את רמות הסוללה האחרונות הידועות גם לאחר ניתוק ה-AirPods</string>
|
||||
<string name="settings_scanner_mode_label">מצב סורק</string>
|
||||
<string name="settings_scanner_mode_description">האם סורק ה-Bluetooth Low Energy צריך לתת עדיפות לביצועים או לחסוך באנרגיה?</string>
|
||||
<string name="settings_autopause_label">השהייה אוטומטית</string>
|
||||
<string name="settings_autopause_description">עצירת אודיו בהסרת המכשיר מהאוזן.</string>
|
||||
<string name="settings_autopplay_label">הפעלה אוטומטית</string>
|
||||
@@ -226,9 +224,6 @@
|
||||
<string name="permission_required_title">ההרשאה הבאה נדרשת:</string>
|
||||
<string name="permission_system_alert_window_label">חלון התראת מערכת</string>
|
||||
<string name="permission_system_alert_window_description">אפשר ל-CAPod לצייר מעל אפליקציות אחרות כדי לאפשר את תכונת \"הצג חלון קופץ\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">חיסכון באנרגיה</string>
|
||||
<string name="settings_scanner_mode_balanced_label">מאוזן</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">השהייה נמוכה</string>
|
||||
<string name="settings_monitor_mode_manual_label">כשהאפליקציה פתוחה</string>
|
||||
<string name="settings_monitor_mode_automatic_label">כשמכשיר מחובר</string>
|
||||
<string name="settings_monitor_mode_always_label">תמיד</string>
|
||||
@@ -480,6 +475,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">לחיצה כפולה לסיום שיחה</string>
|
||||
<string name="device_settings_open_cd">פתח הגדרות מכשיר</string>
|
||||
<string name="overview_card_missing_paired_device">לפרופיל זה אין התקן Bluetooth מקושר.</string>
|
||||
<string name="overview_reactions_hint_title">התגובות הן לפי מכשיר</string>
|
||||
<string name="overview_reactions_hint_body">הפעלה אוטומטית, השהייה אוטומטית וחלונות קופצים מוגדרים כעת לפי מכשיר. הקש על סמל ההגדרות בכרטיס כאשר האוזניות שלך מחוברות.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">כללי</string>
|
||||
<string name="device_settings_microphone_mode_label">מיקרופון</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">デバイスが接続されると追加の通知を表示します。これにより、「デバイスステータス」チャネルを無効にすることで、永続的な「デバイスなし」通知を非表示にできます。</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">切断後も通知を維持</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">AirPodsが切断された後も、最後に確認されたバッテリー残量を表示し続けます</string>
|
||||
<string name="settings_scanner_mode_label">スキャナーモード</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Low Energyデータスキャナーはパフォーマンスを優先すべきか、エネルギーを節約すべきか?</string>
|
||||
<string name="settings_autopause_label">自動一時停止</string>
|
||||
<string name="settings_autopause_description">デバイスを耳から外すとオーディオを一時停止します。</string>
|
||||
<string name="settings_autopplay_label">自動再生</string>
|
||||
@@ -220,9 +218,6 @@
|
||||
<string name="permission_required_title">次の権限が必要です:</string>
|
||||
<string name="permission_system_alert_window_label">システムアラートウィンドウ</string>
|
||||
<string name="permission_system_alert_window_description">「ポップアップを表示」機能を有効にするため、CAPodが他のアプリの上に表示できるようにします。</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">低消費電力</string>
|
||||
<string name="settings_scanner_mode_balanced_label">バランス</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">低遅延</string>
|
||||
<string name="settings_monitor_mode_manual_label">アプリを開いているとき</string>
|
||||
<string name="settings_monitor_mode_automatic_label">デバイス接続時</string>
|
||||
<string name="settings_monitor_mode_always_label">常に</string>
|
||||
@@ -465,6 +460,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ダブルプレスで通話を終了</string>
|
||||
<string name="device_settings_open_cd">デバイス設定を開く</string>
|
||||
<string name="overview_card_missing_paired_device">このプロファイルにはペアリングされたBluetoothデバイスがありません。</string>
|
||||
<string name="overview_reactions_hint_title">リアクションはデバイスごとに設定されます</string>
|
||||
<string name="overview_reactions_hint_body">自動再生、自動一時停止、ポップアップはデバイスごとに設定できるようになりました。ヘッドフォンを接続した状態でカードの設定アイコンをタップしてください。</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">一般</string>
|
||||
<string name="device_settings_microphone_mode_label">マイク</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">აჩვენებს დამატებით შეტყობინებას, როდესაც მოწყობილობა დაკავშირებულია. ეს საშუალებას გაძლევთ დამალოთ მუდმივი \"მოწყობილობები არ არის\" შეტყობინება \"მოწყობილობის სტატუსის\" არხის გამორთვით.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">შეტყობინების შენარჩუნება გათიშვის შემდეგ</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">განაგრძეთ ბოლო ცნობილი ბატარეის დონეების ჩვენება მაშინაც კი, როცა თქვენი AirPods გაითიშება</string>
|
||||
<string name="settings_scanner_mode_label">სკანერის რეჟიმი</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Low Energy მონაცემთა სკანერმა პრიორიტეტი უნდა მიანიჭოს შესრულებას თუ ენერგიის დაზოგვას?</string>
|
||||
<string name="settings_autopause_label">ავტომატური პაუზა</string>
|
||||
<string name="settings_autopause_description">აუდიოს დაპაუზება მოწყობილობის ყურიდან ამოღებისას.</string>
|
||||
<string name="settings_autopplay_label">ავტომატური დაკვრა</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">საჭიროა შემდეგი ნებართვა:</string>
|
||||
<string name="permission_system_alert_window_label">სისტემური გამაფრთხილებელი ფანჯარა</string>
|
||||
<string name="permission_system_alert_window_description">დაუშვით, რომ CAPod სხვა აპებზე ზემოდან გამოჩნდეს, რათა \"Show PopUp\" ფუნქცია შესაძლებელი გახდეს.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">დაბალი ენერგომოხმარება</string>
|
||||
<string name="settings_scanner_mode_balanced_label">ბალანსირებული</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">დაბალი დაყოვნება</string>
|
||||
<string name="settings_monitor_mode_manual_label">როცა აპი ღიაა</string>
|
||||
<string name="settings_monitor_mode_automatic_label">როცა მოწყობილობა დაკავშირებულია</string>
|
||||
<string name="settings_monitor_mode_always_label">ყოველთვის</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ორჯერ დაჭერით ზარის დასრულება</string>
|
||||
<string name="device_settings_open_cd">მოწყობილობის პარამეტრების გახსნა</string>
|
||||
<string name="overview_card_missing_paired_device">ამ პროფილს არ აქვს დაწყვილებული Bluetooth მოწყობილობა.</string>
|
||||
<string name="overview_reactions_hint_title">რეაქციები განსაზღვრულია თითოეული მოწყობილობისთვის</string>
|
||||
<string name="overview_reactions_hint_body">ავტომატური დაკვრა, ავტომატური პაუზა და ამომხტარი ფანჯრები ახლა კონფიგურირებულია თითოეული მოწყობილობისთვის. შეეხეთ პარამეტრების ხატულას ბარათზე, სანამ თქვენი ყურსასმენები დაკავშირებულია.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">ზოგადი</string>
|
||||
<string name="device_settings_microphone_mode_label">მიკროფონი</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">បង្ហាញការជូនដំណឹងបន្ថែមនៅពេលឧបករណ៍ត្រូវបានភ្ជាប់។ វាអនុញ្ញាតឱ្យអ្នកលាក់ការជូនដំណឹងអចិន្ត្រៃយ៍ \"គ្មានឧបករណ៍\" ដោយបិទឆានែល \"ស្ថានភាពឧបករណ៍\"។</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">រក្សាការជូនដំណឹងបន្ទាប់ពីផ្តាច់</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">បន្តបង្ហាញកម្រិតថ្មចុងក្រោយដែលស្គាល់ សូម្បីបន្ទាប់ពី AirPods របស់អ្នកផ្តាច់ក៏ដោយ</string>
|
||||
<string name="settings_scanner_mode_label">របៀបវិភាគ</string>
|
||||
<string name="settings_scanner_mode_description">តើម៉ាស៊ីនវិភាគទិន្នន័យ Bluetooth Low Energy គួរតែផ្តល់អាទិភាពដល់ដំណើរការ ឬសន្សំសំចៃថាមពល?</string>
|
||||
<string name="settings_autopause_label">ផ្អាកដោយស្វ័យប្រវត្តិ</string>
|
||||
<string name="settings_autopause_description">ផ្អាកសំឡេងនៅពេលដកឧបករណ៍ចេញពីត្រចៀករបស់អ្នក។</string>
|
||||
<string name="settings_autopplay_label">ចាក់ដោយស្វ័យប្រវត្តិ</string>
|
||||
@@ -220,9 +218,6 @@
|
||||
<string name="permission_required_title">ការអនុញ្ញាតខាងក្រោមត្រូវបានទាមទារ:</string>
|
||||
<string name="permission_system_alert_window_label">បង្អួចជូនដំណឹងប្រព័ន្ធ</string>
|
||||
<string name="permission_system_alert_window_description">អនុញ្ញាតឱ្យ CAPod គូរពីលើកម្មវិធីផ្សេងទៀតដើម្បីធ្វើឱ្យមុខងារ \"បង្ហាញផ្ទាំងលោត\" អាចធ្វើទៅបាន។</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">ថាមពលទាប</string>
|
||||
<string name="settings_scanner_mode_balanced_label">មានតុល្យភាព</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">ភាពយឺតយ៉ាវទាប</string>
|
||||
<string name="settings_monitor_mode_manual_label">នៅពេលកម្មវិធីបើក</string>
|
||||
<string name="settings_monitor_mode_automatic_label">នៅពេលឧបករណ៍បានភ្ជាប់</string>
|
||||
<string name="settings_monitor_mode_always_label">ជានិច្ច</string>
|
||||
@@ -465,9 +460,10 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ចុចពីរដងដើម្បិបញ្ចប់ការហឹល</string>
|
||||
<string name="device_settings_open_cd">បើកការកំណត់ឧបករណ៍</string>
|
||||
<string name="overview_card_missing_paired_device">គម្រោងនេះមិនមានឧបករណ៍ Bluetooth ដែលបានផ្គូផ្គងទេ។</string>
|
||||
<string name="overview_reactions_hint_title">ប្រតិកម្មគឺខុសគ្នាតាមឧបករណ៍</string>
|
||||
<string name="overview_reactions_hint_body">ការចាក់ស្វ័យប្រវត្តិ ការផ្អាកស្វ័យប្រវត្តិ និងបង្អួចលេចឡើង ឥឡូវនេះត្រូវបានកំណត់រៀងរាល់ឧបករណ៍។ ចុចលើរូបតំណាងការកំណត់នៅលើកាតខណៈពេលដែលកាស귀យន្តស្ដាប់របស់អ្នកភ្ជាប់។</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">ជាទូទៅ</string>
|
||||
<string name="device_settings_microphone_mode_label">ไมโครโฟน</string>
|
||||
<string name="device_settings_microphone_mode_description">AirPod ណាមួយដែលប្រើជាមីក្រូហ្វូន</string>
|
||||
<string name="device_settings_microphone_mode_auto">ស្វ័យប្រវត្តិ</string>
|
||||
<string name="device_settings_microphone_mode_right">ស្តាំ</string>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<string name="upgrade_benefit_popups">Popup dema vekirina qutiyê & girêdanê</string>
|
||||
<string name="upgrade_benefit_widgets">Widgetên ekrana malê</string>
|
||||
<string name="upgrade_benefit_device_settings">Mîhengen pêşkertî yên cîhazê</string>
|
||||
<string name="upgrade_benefit_device_controls">Kontrolên cîhazê — deng, stûn & zªtir</string>
|
||||
<string name="upgrade_benefit_device_controls">Kontrolên cîhazê — deng, stûn & zêdetir</string>
|
||||
<string name="upgrade_benefit_support">Pêşdebir piştgirî bike</string>
|
||||
<string name="upgrade_benefit_disclaimer">Hebûna taybet mendêyê bi kulaklîkên we û amûrê ve girêdayî ye.</string>
|
||||
<string name="upgrade_screen_options_description">Heman taybetmendî, bihayên cûda. Abonê ceribandineke belaş vedihewîne û her dem dikare were betal kirin.</string>
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Dema ku amûrek girêdayî ye agahdariyek zêde nîşan dide. Ev dihêle hûn agahdariya daîmî ya \"Amûr tune\" bi neçalakkirina kanala \"Rewşa amûrê\" veşêrin.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Piştî qutbûnê agahdariyê biparêze</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Piştî ku AirPods-ên te qut dibin jî asta dawîn a naskirî ya bataryayê nîşan bide</string>
|
||||
<string name="settings_scanner_mode_label">Moda skanerê</string>
|
||||
<string name="settings_scanner_mode_description">Gelo divê skanera daneyên Bluetooth Kêm Enerjiyê pêşî li performansê bigire an enerjiyê biparêze?</string>
|
||||
<string name="settings_autopause_label">Rawestandina otomatîk</string>
|
||||
<string name="settings_autopause_description">Dema ku amûrê ji guhê xwe derdixin, deng rawestînin.</string>
|
||||
<string name="settings_autopplay_label">Lîstina otomatîk</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Destûra jêrîn hewce ye:</string>
|
||||
<string name="permission_system_alert_window_label">Pencereya Hişyariya Pergalê</string>
|
||||
<string name="permission_system_alert_window_description">Destûrê bidin CAPod ku li ser sepanên din xêz bike da ku taybetmendiya \"Pop-Up Nîşan Bide\" gengaz bike.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Hêza kêm</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Hevseng</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Derengiya kêm</string>
|
||||
<string name="settings_monitor_mode_manual_label">Dema sepan vekirî ye</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Dema amûr girêdayî ye</string>
|
||||
<string name="settings_monitor_mode_always_label">Herdem</string>
|
||||
@@ -460,16 +455,18 @@
|
||||
<string name="device_settings_volume_swipe_length_label">Dema Rawestana Kaşkirina Dengê</string>
|
||||
<string name="device_settings_volume_swipe_length_description">Ji bo pêşîlêgirtina guherandina dengê ya bê mebest, hilbijêre çiqas li bendê bimînî di navbera kaşkirinan de.</string>
|
||||
<string name="device_settings_volume_swipe_length_default">Xwerû</string>
|
||||
<string name="device_settings_volume_swipe_length_longer">Dirªjtir</string>
|
||||
<string name="device_settings_volume_swipe_length_longer">Dirêjtir</string>
|
||||
<string name="device_settings_volume_swipe_length_longest">Herî Dirêj</string>
|
||||
<string name="device_settings_end_call_mute_mic_label">Kontrolên Bangê</string>
|
||||
<string name="device_settings_end_call_mute_mic_description">Hilbijêre ku pªtina stûnê di dema bangên çi dike</string>
|
||||
<string name="device_settings_end_call_mute_mic_description">Hilbijêre ku pêtina stûnê di dema bangên çi dike</string>
|
||||
<string name="device_settings_end_call_mute_mic_option_a_title">Yek pêtin ji bo bidawîkirina bangê</string>
|
||||
<string name="device_settings_end_call_mute_mic_option_a_subtitle">Du pêtin ji bo bîdengkirina mîkrofonê</string>
|
||||
<string name="device_settings_end_call_mute_mic_option_b_title">Yek pêtin ji bo bîdengkirina mîkrofonê</string>
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Du pêtin ji bo bidawîkirina bangê</string>
|
||||
<string name="device_settings_open_cd">Mîhengên cîhazê veke</string>
|
||||
<string name="overview_card_missing_paired_device">Ev profîl ti amûrek Bluetooth-ê ya hevgirtî tune.</string>
|
||||
<string name="overview_reactions_hint_title">Reaksyon ji bo her amûrê ne</string>
|
||||
<string name="overview_reactions_hint_body">Otomatîk-lêdan, otomatîk-rawestandin û pencereyên derkevtinê niha ji bo her amûrê hatine mîheng kirin. Li ser îkonê mîhengan li ser qertek bikirtînin dema guhdarvanên we ve girêdayî ne.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Giştî</string>
|
||||
<string name="device_settings_microphone_mode_label">Mîkrofon</string>
|
||||
@@ -491,7 +488,7 @@
|
||||
<string name="device_settings_allow_off_label">Destûrê bide Moda Venebûnê</string>
|
||||
<string name="device_settings_allow_off_description">Destûrê bide Venebûn wekî moda kontrola dengê ya bijartbar. Dema neçalak e, stem dema çerxkirinê Venebûn derbas dike.</string>
|
||||
<string name="device_settings_sleep_detection_label">Tespîtkirina Xewê</string>
|
||||
<string name="device_settings_sleep_detection_description">Dema ku dikªvî xewê, dengê medyayê bixweber rawes têne</string>
|
||||
<string name="device_settings_sleep_detection_description">Dema ku diketî xewê, dengê medyayê bixweber rawes têne</string>
|
||||
<string name="reaction_sleep_channel_label">Tespîtkirina Xewê</string>
|
||||
<string name="reaction_sleep_notification_title">Ji hêla Tespîtkirina Xewê ve hate rawestandin</string>
|
||||
<string name="reaction_sleep_notification_text">%1$s ragihand ku hûn xew çûn, ji ber vê yekê muzîka we hate rawestandin. Hûn dikarin vê di mîhengên amûrê de neçalak bikin.</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">ಸಾಧನ ಸಂಪರ್ಕಗೊಂಡಾಗ ಹೆಚ್ಚುವರಿ ಅಧಿಸೂಚನೆಯನ್ನು ತೋರಿಸುತ್ತದೆ. ಇದು \"ಸಾಧನ ಸ್ಥಿತಿ\" ಚಾನಲ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುವ ಮೂಲಕ ಶಾಶ್ವತ \"ಯಾವುದೇ ಸಾಧನಗಳಿಲ್ಲ\" ಅಧಿಸೂಚನೆಯನ್ನು ಮರೆಮಾಡಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">ಸಂಪರ್ಕ ಕಡಿತದ ನಂತರ ಅಧಿಸೂಚನೆ ಇರಿಸಿ</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">ನಿಮ್ಮ AirPods ಸಂಪರ್ಕ ಕಡಿತವಾದ ನಂತರವೂ ಕೊನೆಯ ತಿಳಿದಿರುವ ಬ್ಯಾಟರಿ ಮಟ್ಟವನ್ನು ತೋರಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</string>
|
||||
<string name="settings_scanner_mode_label">ಸ್ಕ್ಯಾನರ್ ಮೋಡ್</string>
|
||||
<string name="settings_scanner_mode_description">ಬ್ಲೂಟೂತ್ ಕಡಿಮೆ ಶಕ್ತಿಯ ಡೇಟಾ ಸ್ಕ್ಯಾನರ್ ಕಾರ್ಯಕ್ಷಮತೆಗೆ ಆದ್ಯತೆ ನೀಡಬೇಕೇ ಅಥವಾ ಶಕ್ತಿಯನ್ನು ಉಳಿಸಬೇಕೇ?</string>
|
||||
<string name="settings_autopause_label">ಸ್ವಯಂ-ವಿರಾಮ</string>
|
||||
<string name="settings_autopause_description">ನಿಮ್ಮ ಕಿವಿಯಿಂದ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿದಾಗ ಆಡಿಯೊವನ್ನು ವಿರಾಮಗೊಳಿಸಿ.</string>
|
||||
<string name="settings_autopplay_label">ಸ್ವಯಂ-ಪ್ಲೇ</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">ಕೆಳಗಿನ ಅನುಮತಿ ಅಗತ್ಯವಿದೆ:</string>
|
||||
<string name="permission_system_alert_window_label">ಸಿಸ್ಟಮ್ ಅಲರ್ಟ್ ವಿಂಡೋ</string>
|
||||
<string name="permission_system_alert_window_description">\"ಪಾಪ್ಅಪ್ ತೋರಿಸಿ\" ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಾಧ್ಯವಾಗಿಸಲು CAPod ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೇಲೆ ಚಿತ್ರಿಸಲು ಅನುಮತಿಸಿ.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">ಕಡಿಮೆ ಶಕ್ತಿ</string>
|
||||
<string name="settings_scanner_mode_balanced_label">ಸಮತೋಲಿತ</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">ಕಡಿಮೆ ವಿಳಂಬ</string>
|
||||
<string name="settings_monitor_mode_manual_label">ಅಪ್ಲಿಕೇಶನ್ ತೆರೆದಿರುವಾಗ</string>
|
||||
<string name="settings_monitor_mode_automatic_label">ಸಾಧನ ಸಂಪರ್ಕಗೊಂಡಾಗ</string>
|
||||
<string name="settings_monitor_mode_always_label">ಯಾವಾಗಲೂ</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ಕರೆ ಮುಗಿಸಲು ಎರಡು ಬಾರಿ ಬಗೆ ದಲ್ಲಿಸಿ</string>
|
||||
<string name="device_settings_open_cd">ಸಾಧನ ಸೆಟ್ಟಿಂಗ್ಸ್ ತೆರೆಯಿರಿ</string>
|
||||
<string name="overview_card_missing_paired_device">ಈ ಪ್ರೊಫೈಲ್ಗೆ ಯಾವುದೇ ಜೋಡಿಸಲಾದ ಬ್ಲೂಟೂತ್ ಸಾಧನವಿಲ್ಲ.</string>
|
||||
<string name="overview_reactions_hint_title">ಪ್ರತಿಕ್ರಿಯೆಗಳು ಪ್ರತಿ ಸಾಧನಕ್ಕೆ ಅನ್ವಯಿಸುತ್ತವೆ</string>
|
||||
<string name="overview_reactions_hint_body">ಆಟೋ-ಪ್ಲೇ, ಆಟೋ-ಪಾಸ್ ಮತ್ತು ಪಾಪ್-ಅಪ್ಗಳನ್ನು ಈಗ ಪ್ರತಿ ಸಾಧನಕ್ಕೆ ಪ್ರತ್ಯೇಕವಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ಹೆಡ್ಫೋನ್ಗಳು ಸಂಪರ್ಕಗೊಂಡಿರುವಾಗ ಕಾರ್ಡ್ನಲ್ಲಿ ಸೆಟ್ಟಿಂಗ್ಗಳ ಐಕಾನ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">ಸಾಮಾನ್ಯ</string>
|
||||
<string name="device_settings_microphone_mode_label">ಮೈಕ್ರೊಫೋನ್</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">기기가 연결되면 추가 알림을 표시합니다. 이렇게 하면 \"기기 상태\" 채널을 비활성화하여 영구적인 \"기기 없음\" 알림을 숨길 수 있습니다.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">연결 해제 후에도 알림 유지하기</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">AirPods이 연결 해제된 후에도 마지막으로 알려진 배터리 잔량 계속 표시하기</string>
|
||||
<string name="settings_scanner_mode_label">스캐너 모드</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Low Energy 데이터 스캐너가 성능을 우선시해야 할까요, 아니면 에너지를 절약해야 할까요?</string>
|
||||
<string name="settings_autopause_label">자동 일시 중지</string>
|
||||
<string name="settings_autopause_description">기기를 귀에서 빼면 오디오를 일시 중지합니다.</string>
|
||||
<string name="settings_autopplay_label">자동 재생</string>
|
||||
@@ -220,9 +218,6 @@
|
||||
<string name="permission_required_title">다음과 같은 권한이 필요합니다:</string>
|
||||
<string name="permission_system_alert_window_label">시스템 알림창</string>
|
||||
<string name="permission_system_alert_window_description">\"팝업 표시\" 기능을 사용하려면 다른 앱 위에 그리기를 허용해야 합니다.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">저전력</string>
|
||||
<string name="settings_scanner_mode_balanced_label">균형잡힌</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">저지연</string>
|
||||
<string name="settings_monitor_mode_manual_label">앱이 열려있을때</string>
|
||||
<string name="settings_monitor_mode_automatic_label">장치가 연결되었을때</string>
|
||||
<string name="settings_monitor_mode_always_label">항상</string>
|
||||
@@ -435,7 +430,7 @@
|
||||
<string name="device_settings_nc_one_airpod_description">AirPod 한 쪽만 착용 시 노이즈 캐슬링 유지</string>
|
||||
<string name="device_settings_personalized_volume_label">개인화된 음량</string>
|
||||
<string name="device_settings_personalized_volume_description">환경에 따라 미디어 볼륨 조정</string>
|
||||
<string name="device_settings_conversation_awareness_description">누군가 말할 때 미디어 볼륨 낙추고 소음 줄이기</string>
|
||||
<string name="device_settings_conversation_awareness_description">누군가 말할 때 미디어 볼륨 낮추고 소음 줄이기</string>
|
||||
<string name="device_settings_tone_volume_label">차임 볼륨</string>
|
||||
<string name="device_settings_tone_volume_description">확인음 및 벨소리 볼륨</string>
|
||||
<string name="device_settings_adaptive_noise_label">적응형 오디오 소음</string>
|
||||
@@ -467,6 +462,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">두 번 눌러 통화 종료</string>
|
||||
<string name="device_settings_open_cd">기기 설정 열기</string>
|
||||
<string name="overview_card_missing_paired_device">이 프로필에는 페어링된 Bluetooth 기기가 없습니다.</string>
|
||||
<string name="overview_reactions_hint_title">반응은 기기별로 설정됩니다</string>
|
||||
<string name="overview_reactions_hint_body">자동 재생, 자동 일시정지 및 팝업이 이제 기기별로 설정됩니다. 헤드폰이 연결된 상태에서 카드의 설정 아이콘을 탭하세요.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">일반</string>
|
||||
<string name="device_settings_microphone_mode_label">마이크</string>
|
||||
@@ -486,7 +483,7 @@
|
||||
<string name="device_settings_listening_mode_cycle_transparency">투명도</string>
|
||||
<string name="device_settings_listening_mode_cycle_adaptive">적응형</string>
|
||||
<string name="device_settings_allow_off_label">Off 모드 허용</string>
|
||||
<string name="device_settings_allow_off_description">Off를 선택 가능한 소음 제어 모드로 허용합니다. 비활성화되면 스템이 순환 중 Off를 건너마앙니다.</string>
|
||||
<string name="device_settings_allow_off_description">Off를 선택 가능한 소음 제어 모드로 허용합니다. 비활성화되면 스템이 순환 중 Off를 건너뜁니다.</string>
|
||||
<string name="device_settings_sleep_detection_label">수면 감지</string>
|
||||
<string name="device_settings_sleep_detection_description">잠들면 자동으로 오디오 일시 정지</string>
|
||||
<string name="reaction_sleep_channel_label">수면 감지</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Түзмөк туташканда кошумча билдирүү көрсөтүлөт. Бул \"Түзмөктүн абалы\" каналын өчүрүү менен туруктуу \"Түзмөктөр жок\" билдирүүсүн жашырууга мүмкүндүк берет.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Ажыратылгандан кийин билдирүүнү сактоо</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">AirPods ажыратылгандан кийин да акыркы белгилүү батарея деңгээлдерин көрсөтүүнү улантуу</string>
|
||||
<string name="settings_scanner_mode_label">Сканер режими</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Low Energy маалымат сканери өндүрүмдүүлүктү биринчи орунга коюшу керекпи же энергияны үнөмдөшү керекпи?</string>
|
||||
<string name="settings_autopause_label">Авто тыным</string>
|
||||
<string name="settings_autopause_description">Түзмөктү кулагыңыздан чыгарганда аудиону тындырыңыз.</string>
|
||||
<string name="settings_autopplay_label">Авто ойнотуу</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Төмөнкү уруксат талап кылынат:</string>
|
||||
<string name="permission_system_alert_window_label">Тутум эскертүү терезеси</string>
|
||||
<string name="permission_system_alert_window_description">\"Калкыма терезе көрсөтүү\" функциясын мүмкүн кылуу үчүн CAPod\'го башка колдонмолордун үстүнөн тартууга уруксат бериңиз.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Аз кубаттуулук</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Тең салмактуу</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Аз кечигүү</string>
|
||||
<string name="settings_monitor_mode_manual_label">Колдонмо ачык болгондо</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Түзмөк туташканда</string>
|
||||
<string name="settings_monitor_mode_always_label">Ар дайым</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Чалууну аяктоо үчүн эки жолу басыңыз</string>
|
||||
<string name="device_settings_open_cd">Түзмөк жөндөөлөрүн ачуу</string>
|
||||
<string name="overview_card_missing_paired_device">Бул профилде жупталган Bluetooth түзмөгү жок.</string>
|
||||
<string name="overview_reactions_hint_title">Реакциялар ар бир түзмөк үчүн жеке</string>
|
||||
<string name="overview_reactions_hint_body">Авто-ойноо, авто-тындыруу жана калкып чыгуучу терезелер азыр ар бир түзмөк үчүн жеке конфигурацияланган. Каргоочуларыңыз туташып турганда картадагы жөндөөлөр сүрөтчөсүнө тийиңиз.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Жалпы</string>
|
||||
<string name="device_settings_microphone_mode_label">Микрофон</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">ສະແດງການແຈ້ງເຕືອນເພີ່ມເຕີມເມື່ອອຸປະກອນເຊື່ອມຕໍ່ແລ້ວ. ນີ້ຊ່ວຍໃຫ້ທ່ານສາມາດເຊື່ອງການແຈ້ງເຕືອນຖາວອນ \"ບໍ່ມີອຸປະກອນ\" ໂດຍການປິດຊ່ອງ \"ສະຖານະອຸປະກອນ\" .</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">ຮັກສາການແຈ້ງເຕືອນຫຼັງຈາກຕັດການເຊື່ອມຕໍ່</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">ສືບຕໍ່ສະແດງລະດັບແບັດເຕີລີ້ທີ່ຮູ້ຈັກຫຼ້າສຸດແມ້ຫຼັງຈາກ AirPods ຕັດການເຊື່ອມຕໍ່</string>
|
||||
<string name="settings_scanner_mode_label">ໂໝດສະແກນ</string>
|
||||
<string name="settings_scanner_mode_description">ເຄື່ອງສະແກນຂໍ້ມູນ Bluetooth Low Energy ຄວນໃຫ້ຄວາມສຳຄັນກັບປະສິດທິພາບ ຫຼື ປະຢັດພະລັງງານ?</string>
|
||||
<string name="settings_autopause_label">ຢຸດອັດຕະໂນມັດ</string>
|
||||
<string name="settings_autopause_description">ຢຸດສຽງຊົ່ວຄາວເມື່ອຖອດອຸປະກອນອອກຈາກຫູຂອງທ່ານ.</string>
|
||||
<string name="settings_autopplay_label">ຫຼິ້ນອັດຕະໂນມັດ</string>
|
||||
@@ -220,9 +218,6 @@
|
||||
<string name="permission_required_title">ຕ້ອງການການອະນຸຍາດຕໍ່ໄປນີ້:</string>
|
||||
<string name="permission_system_alert_window_label">ໜ້າຕ່າງການແຈ້ງເຕືອນລະບົບ</string>
|
||||
<string name="permission_system_alert_window_description">ອະນຸຍາດໃຫ້ CAPod ແຕ້ມທັບແອັບອື່ນເພື່ອໃຫ້ຄຸນສົມບັດ \"ສະແດງປັອບອັບ\" ເປັນໄປໄດ້.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">ພະລັງງານຕໍ່າ</string>
|
||||
<string name="settings_scanner_mode_balanced_label">ສົມດູນ</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">ຄວາມຊັກຊ້າຕໍ່າ</string>
|
||||
<string name="settings_monitor_mode_manual_label">ເມື່ອແອັບເປີດ</string>
|
||||
<string name="settings_monitor_mode_automatic_label">ເມື່ອອຸປະກອນເຊື່ອມຕໍ່</string>
|
||||
<string name="settings_monitor_mode_always_label">ສະເໝີ</string>
|
||||
@@ -257,7 +252,6 @@
|
||||
<string name="anc_mode_transparency">ການໂປ່ງໃສ</string>
|
||||
<string name="anc_mode_adaptive">ການປັບຕົວ</string>
|
||||
<string name="conversation_awareness_label">ການຮັບຮູ້ການສົນທະນາ</string>
|
||||
<string name="signal_badge_ble_cd">BLE scan active</string>
|
||||
<string name="signal_badge_key_irk_cd">ຢືນຢັນຕົວຕົນແລ້ວ</string>
|
||||
<string name="signal_badge_key_encrypted_cd">ການເຊື່ອມຕໍ່ທີ່ເຂົ້າລະຫັດ</string>
|
||||
<string name="signal_badge_aap_cd">ການເຊື່ອມຕໍ່ໂດຍກົງທີ່ເຄື່ອນໄຫວ</string>
|
||||
@@ -465,6 +459,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ກດສອງຄັ້ງເພື່ອວາງສາຍການເຈຮາ</string>
|
||||
<string name="device_settings_open_cd">ເປີດການຕັ້ງຄ່າອຸປະກອນ</string>
|
||||
<string name="overview_card_missing_paired_device">ໂປຣໄຟລ໌ນີ້ບໍ່ມີອຸປະກອນ Bluetooth ທີ່ຈັບຄູ່ໄວ້.</string>
|
||||
<string name="overview_reactions_hint_title">ການຕອບສະໜອງແມ່ນຕໍ່ອຸປະກອນ</string>
|
||||
<string name="overview_reactions_hint_body">ການຫຼິ້ນອັດຕະໂນມັດ, ການຢຸດອັດຕະໂນມັດ ແລະປ໊ອບອັບໄດ້ຖືກຕັ້ງຄ່າຕໍ່ອຸປະກອນແລ້ວ. ແຕະໄອຄອນການຕັ້ງຄ່າໃນບັດຂະນະທີ່ຫູຟັງຂອງທ່ານເຊື່ອມຕໍ່ຢູ່.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">ທົ່ວໄປ</string>
|
||||
<string name="device_settings_microphone_mode_label">ໄມໂຄຣໂຟນ</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Rodo papildomą pranešimą, kai prijungiamas įrenginys. Tai leidžia paslėpti nuolatinį pranešimą \"Nėra įrenginių\" išjungiant kanalą \"Įrenginio būsena\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Palikti pranešimą atjungus</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Toliau rodyti paskutinį žinomą baterijos lygį net ir atjungus „AirPods\"</string>
|
||||
<string name="settings_scanner_mode_label">Skenavimo režimas</string>
|
||||
<string name="settings_scanner_mode_description">Ar „Bluetooth Low Energy\" duomenų skaitytuvas turėtų teikti pirmenybę našumui ar taupyti energiją?</string>
|
||||
<string name="settings_autopause_label">Automatinė pauzė</string>
|
||||
<string name="settings_autopause_description">Pristabdyti garsą išėmus įrenginį iš ausies.</string>
|
||||
<string name="settings_autopplay_label">Automatinis grojimas</string>
|
||||
@@ -82,7 +80,6 @@
|
||||
<string name="settings_popup_connected_label">Rodyti prisijungimo iškylantįjį langą</string>
|
||||
<string name="settings_popup_connected_description">Rodyti iškylantįjį langą, kai įrenginys prisijungia pirmą kartą.</string>
|
||||
<string name="settings_popup_info_not_in_app">Iskylantieji langai rodomi tik tada, kai nesate programoje.</string>
|
||||
<string name="settings_popup_warning_manual_mode">Iskylantieji langai reikalauja, kad monitorius veiktu. Jusu monitoriaus rezimas nustatytas i \"Kai programa atidaryta\", kas stabdo monitoiriu, kai paliekate programa.</string>
|
||||
<string name="general_fix_it_action">Sutaisyti</string>
|
||||
<string name="device_settings_experimental_title">Eksperimentinė funkcija</string>
|
||||
<string name="device_settings_experimental_description">Ši funkcija dar neišbandyta visuose įrenginiuose. Jei kažkas neveikia tinkamai, atidarykite problemų sąrašą su derinimo žurnalu.</string>
|
||||
@@ -226,9 +223,6 @@
|
||||
<string name="permission_required_title">Reikalingas šis leidimas:</string>
|
||||
<string name="permission_system_alert_window_label">Sistemos perspėjimo langas</string>
|
||||
<string name="permission_system_alert_window_description">Leiskite CAPod piešti virš kitų programų, kad būtų galima naudoti funkciją „Rodyti iškylantįjį langą\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Mažos galios</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Subalansuotas</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Mažas delsimas</string>
|
||||
<string name="settings_monitor_mode_manual_label">Kai programa atidaryta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Kai įrenginys prijungtas</string>
|
||||
<string name="settings_monitor_mode_always_label">Visada</string>
|
||||
@@ -480,6 +474,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dvigubas paspaudimas baigia skambučį</string>
|
||||
<string name="device_settings_open_cd">Atidaryti įrenginio nustatymus</string>
|
||||
<string name="overview_card_missing_paired_device">Šis profilis neturi susieto „Bluetooth“ įrenginio.</string>
|
||||
<string name="overview_reactions_hint_title">Reakcijos nustatomos kiekvienam įrenginiui</string>
|
||||
<string name="overview_reactions_hint_body">Automatinis paleidimas, automatinis pristabdymas ir iššokantys langai dabar konfigūruojami kiekvienam įrenginiui. Bakstelėkite nustatymų piktogramą kortelėje, kol jūsų ausinės yra prijungtos.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Bendrieji</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofonas</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Rāda papildu paziņojumu, kad ierīce ir pievienota. Tas ļauj paslēpt pastāvīgo paziņojumu \"Nav ierīču\", atspējojot kanālu \"Ierīces statuss\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Saglabāt paziņojumu pēc atvienošanas</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Turpināt rādīt pēdējos zināmos baterijas līmeņus arī pēc AirPods atvienošanas</string>
|
||||
<string name="settings_scanner_mode_label">Skenēšanas režīms</string>
|
||||
<string name="settings_scanner_mode_description">Vai Bluetooth Low Energy datu skenerim vajadzētu prioritizēt veiktspēju vai taupīt enerģiju?</string>
|
||||
<string name="settings_autopause_label">Automātiska pauze</string>
|
||||
<string name="settings_autopause_description">Pauzēt audio, noņemot ierīci no auss.</string>
|
||||
<string name="settings_autopplay_label">Automātiska atskaņošana</string>
|
||||
@@ -191,9 +189,9 @@
|
||||
<string name="general_manage_devices_action">Pārvaldīt ierīces</string>
|
||||
<string name="overview_nomaindevice_label">Neviena ierīce nav konfigurēta</string>
|
||||
<string name="overview_nomaindevice_description">Konfigurējiet savu ierīci, lai sāktu uzraudzīt baterijas līmeņus un iespējotu papildu funkcijas.</string>
|
||||
<string name="overview_bluetooth_disabled_icon_cd">Bluetooth atspējots, atvērt iestaţījumus</string>
|
||||
<string name="overview_bluetooth_nearby_icon_cd">Ierīce tuvā, atvērt Bluetooth iestaţījumus</string>
|
||||
<string name="overview_bluetooth_connected_icon_cd">Ierīce pievienota, atvērt Bluetooth iestaţījumus</string>
|
||||
<string name="overview_bluetooth_disabled_icon_cd">Bluetooth atspējots, atvērt iestatījumus</string>
|
||||
<string name="overview_bluetooth_nearby_icon_cd">Ierīce tuvā, atvērt Bluetooth iestatījumus</string>
|
||||
<string name="overview_bluetooth_connected_icon_cd">Ierīce pievienota, atvērt Bluetooth iestatījumus</string>
|
||||
<string name="overview_bluetooth_disabled_label">Bluetooth ir atspējots</string>
|
||||
<string name="overview_bluetooth_disabled_description">Bluetooth ir atspējots, iespējojiet to ;)</string>
|
||||
<string name="overview_monitoring_active_label">Ierīču uzraudzība</string>
|
||||
@@ -224,9 +222,6 @@
|
||||
<string name="permission_required_title">Nepieciešama šāda atļauja:</string>
|
||||
<string name="permission_system_alert_window_label">Sistēmas brīdinājuma logs</string>
|
||||
<string name="permission_system_alert_window_description">Atļaujiet CAPod zīmēt virs citām lietotnēm, lai iespējotu funkciju \"Rādīt uznirstošo logu\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Zema jauda</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Līdzsvarots</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Zema latence</string>
|
||||
<string name="settings_monitor_mode_manual_label">Kad lietotne ir atvērta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Kad ierīce ir savienota</string>
|
||||
<string name="settings_monitor_mode_always_label">Vienmēr</string>
|
||||
@@ -475,6 +470,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Divas reizes nospiežot, beidz zvanu</string>
|
||||
<string name="device_settings_open_cd">Atvērt ierīces iestatījumus</string>
|
||||
<string name="overview_card_missing_paired_device">Šim profilam nav savienota Bluetooth ierīce.</string>
|
||||
<string name="overview_reactions_hint_title">Reakcijas ir katrai ierīcei</string>
|
||||
<string name="overview_reactions_hint_body">Automātiskā atskaņošana, automātiskā pauzēšana un uznirstošie logi tagad tiek konfigurēti katrai ierīcei. Pieskarieties iestatījumu ikonai kartē, kamēr austiņas ir pievienotas.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Vispārīgi</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofons</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Прикажува дополнително известување кога уредот е поврзан. Ова ви овозможува да го скриете трајното известување \"Нема уреди\" со оневозможување на каналот \"Статус на уредот\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Задржи го известувањето по прекинување</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Продолжи да ги прикажуваш последните познати нивоа на батеријата дури и откако вашите AirPods ќе се исклучат</string>
|
||||
<string name="settings_scanner_mode_label">Режим на скенер</string>
|
||||
<string name="settings_scanner_mode_description">Дали скенерот за податоци со ниска енергија на Bluetooth треба да даде приоритет на перформансите или да заштеди енергија?</string>
|
||||
<string name="settings_autopause_label">Автоматска пауза</string>
|
||||
<string name="settings_autopause_description">Паузирајте го аудиото кога го отстранувате уредот од увото.</string>
|
||||
<string name="settings_autopplay_label">Автоматско репродуцирање</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Потребна е следната дозвола:</string>
|
||||
<string name="permission_system_alert_window_label">Системски прозорец за предупредување</string>
|
||||
<string name="permission_system_alert_window_description">Дозволете CAPod да црта преку други апликации за да ја овозможи функцијата \"Прикажи попап\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Ниска моќност</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Балансирано</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Ниска латенција</string>
|
||||
<string name="settings_monitor_mode_manual_label">Кога апликацијата е отворена</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Кога уредот е поврзан</string>
|
||||
<string name="settings_monitor_mode_always_label">Секогаш</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Двојно притискање за прекинување на повикот</string>
|
||||
<string name="device_settings_open_cd">Отворете ги поставките на уредот</string>
|
||||
<string name="overview_card_missing_paired_device">Овој профил нема спарен Bluetooth уред.</string>
|
||||
<string name="overview_reactions_hint_title">Реакциите се по уред</string>
|
||||
<string name="overview_reactions_hint_body">Автоматското пуштање, паузирање и скокачките прозорци сега се конфигурирани по уред. Допрете ја иконата за поставки на картичката додека слушалките се поврзани.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Генерално</string>
|
||||
<string name="device_settings_microphone_mode_label">Микрофон</string>
|
||||
@@ -489,7 +486,6 @@
|
||||
<string name="device_settings_listening_mode_cycle_transparency">Транспарентност</string>
|
||||
<string name="device_settings_listening_mode_cycle_adaptive">Адаптивно</string>
|
||||
<string name="device_settings_allow_off_label">Дозволете режим Исклучено</string>
|
||||
<string name="device_settings_allow_off_description">Дозволете Исклучено како изборлив режим на контрола на бучава. Кога е исклучено, дршките го прескочуваат ܿсклучено додека преминуваат.</string>
|
||||
<string name="device_settings_sleep_detection_label">Откривање сон</string>
|
||||
<string name="device_settings_sleep_detection_description">Автоматски паузирање на звукот кога заспиете</string>
|
||||
<string name="reaction_sleep_channel_label">Детекција на спиење</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">ഒരു ഉപകരണം കണക്റ്റുചെയ്യുമ്പോൾ ഒരു അധിക അറിയിപ്പ് കാണിക്കുന്നു. \"ഉപകരണ നില\" ചാനൽ പ്രവർത്തനരഹിതമാക്കി സ്ഥിരമായ \"ഉപകരണങ്ങളൊന്നുമില്ല\" അറിയിപ്പ് മറയ്ക്കാൻ ഇത് നിങ്ങളെ അനുവദിക്കുന്നു.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">വിച്ഛേദിച്ച ശേഷം അറിയിപ്പ് നിലനിർത്തുക</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">നിങ്ങളുടെ AirPods വിച്ഛേദിച്ചാലും അവസാനമായി അറിയപ്പെടുന്ന ബാറ്ററി ലെവലുകൾ കാണിക്കുന്നത് തുടരുക</string>
|
||||
<string name="settings_scanner_mode_label">സ്കാനർ മോഡ്</string>
|
||||
<string name="settings_scanner_mode_description">ബ്ലൂടൂത്ത് ലോ എനർജി ഡാറ്റ സ്കാനർ പ്രകടനത്തിന് മുൻഗണന നൽകണോ അതോ ഊർജ്ജം ലാഭിക്കണോ?</string>
|
||||
<string name="settings_autopause_label">യാന്ത്രികമായി താൽക്കാലികമായി നിർത്തുക</string>
|
||||
<string name="settings_autopause_description">നിങ്ങളുടെ ചെവിയിൽ നിന്ന് ഉപകരണം നീക്കം ചെയ്യുമ്പോൾ ഓഡിയോ താൽക്കാലികമായി നിർത്തുക.</string>
|
||||
<string name="settings_autopplay_label">യാന്ത്രികമായി പ്ലേ ചെയ്യുക</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">ഇനിപ്പറയുന്ന അനുമതി ആവശ്യമാണ്:</string>
|
||||
<string name="permission_system_alert_window_label">സിസ്റ്റം അലേർട്ട് വിൻഡോ</string>
|
||||
<string name="permission_system_alert_window_description">\"പോപ്പ്അപ്പ് കാണിക്കുക\" സവിശേഷത സാധ്യമാക്കാൻ മറ്റ് ആപ്പുകളുടെ മുകളിൽ വരയ്ക്കാൻ CAPod-നെ അനുവദിക്കുക.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">കുറഞ്ഞ പവർ</string>
|
||||
<string name="settings_scanner_mode_balanced_label">സന്തുലിതം</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">കുറഞ്ഞ ലേറ്റൻസി</string>
|
||||
<string name="settings_monitor_mode_manual_label">ആപ്പ് തുറന്നിരിക്കുമ്പോൾ</string>
|
||||
<string name="settings_monitor_mode_automatic_label">ഉപകരണം കണക്റ്റുചെയ്യുമ്പോൾ</string>
|
||||
<string name="settings_monitor_mode_always_label">എപ്പോഴും</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">കോൾ അവസാനിപ്പിക്കാൻ ഇരട്ട അമർത്തൽ</string>
|
||||
<string name="device_settings_open_cd">ഉപകരണ ക്രമീകരണങ്ങൾ തുറക്കുക</string>
|
||||
<string name="overview_card_missing_paired_device">ഈ പ്രൊഫൈലിൽ ജോടിയാക്കിയ ബ്ലൂടൂത്ത് ഉപകരണം ഇല്ല.</string>
|
||||
<string name="overview_reactions_hint_title">റിയാക്ഷനുകൾ ഓരോ ഉപകരണത്തിനും വ്യക്തിഗതമാണ്</string>
|
||||
<string name="overview_reactions_hint_body">ഓട്ടോ-പ്ലേ, ഓട്ടോ-പോസ്, പോപ്പ്-അപ്പുകൾ ഇപ്പോൾ ഓരോ ഉപകരണത്തിനും പ്രത്യേകം ക്രമീകരിക്കാം. നിങ്ങളുടെ ഹെഡ്ഫോൺ ബന്ധിപ്പിച്ചിരിക്കുമ്പോൾ കാർഡിലെ സെറ്റിംഗ്സ് ഐക്കൺ ടാപ്പ് ചെയ്യുക.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">പൊതുവായ</string>
|
||||
<string name="device_settings_microphone_mode_label">മൈക്രോഫോൺ</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Төхөөрөмж холбогдсон үед нэмэлт мэдэгдэл харуулна. Энэ нь \"Төхөөрөмжийн төлөв\" сувгийг идэвхгүй болгосноор \"Төхөөрөмж алга\" гэсэн байнгын мэдэгдлийг нуух боломжийг олгоно.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Салсны дараа мэдэгдлийг хадгалах</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Таны AirPods салсан ч хамгийн сүүлд мэдэгдэж буй батарейн түвшинг үргэлжлүүлэн харуулна</string>
|
||||
<string name="settings_scanner_mode_label">Сканнерын горим</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Low Energy өгөгдлийн сканнер нь гүйцэтгэлийг эсвэл эрчим хүчийг хэмнэхийг урьтал болгох ёстой юу?</string>
|
||||
<string name="settings_autopause_label">Автомат түр зогсоох</string>
|
||||
<string name="settings_autopause_description">Төхөөрөмжийг чихнээсээ салгахад дууг түр зогсооно.</string>
|
||||
<string name="settings_autopplay_label">Автомат тоглуулах</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Дараах зөвшөөрөл шаардлагатай:</string>
|
||||
<string name="permission_system_alert_window_label">Системийн анхааруулгын цонх</string>
|
||||
<string name="permission_system_alert_window_description">CAPod-д \"Попап харуулах\" боломжийг ажиллуулахын тулд бусад апп-уудын дээр зурах зөвшөөрөл олгоно уу.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Бага эрчим хүч</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Тэнцвэртэй</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Бага хоцрогдол</string>
|
||||
<string name="settings_monitor_mode_manual_label">Апп нээлттэй үед</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Төхөөрөмж холбогдсон үед</string>
|
||||
<string name="settings_monitor_mode_always_label">Үргэлж</string>
|
||||
@@ -430,7 +425,6 @@
|
||||
<string name="device_settings_not_nearby_label">Төхөөрөмж ойролцоо байхгүй</string>
|
||||
<string name="device_settings_not_nearby_description">Тохиргоо нь энэ төхөөрөмж ойролцоо байж, таны утастай холбогдсон үед л боломжтой.</string>
|
||||
<string name="device_settings_aap_unavailable_label">Нарийвчилсан тохиргоо боломжгүй</string>
|
||||
<string name="device_settings_aap_unavailable_description">Өннө AirPods тохиргоо энэ утасны утасны Bluetooth функций шаардаг. Таны утасны Android шинэчлэлтийн шинэчлэлт ирээдэнд энэ асуудал шийдвэрлэгдэж боломж тайлбыр.</string>
|
||||
<string name="device_settings_aap_unavailable_action">Нийцтэй байдлын хянагчийг үзэх</string>
|
||||
<string name="device_settings_category_sound_label">Дуу</string>
|
||||
<string name="device_settings_category_controls_label">Удирдлага</string>
|
||||
@@ -470,6 +464,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Дуудлага дуусгахын тулд хоёр дарна уу</string>
|
||||
<string name="device_settings_open_cd">Төхөөрөмжийн тохиргоо нээх</string>
|
||||
<string name="overview_card_missing_paired_device">Энэ профайл нь хосолсон Bluetooth төхөөрөмжгүй байна.</string>
|
||||
<string name="overview_reactions_hint_title">Урвал нь төхөөрөмж бүрт тохируулагддаг</string>
|
||||
<string name="overview_reactions_hint_body">Автоматаар тоглуулах, автоматаар зогсоох болон цонхнууд одоо төхөөрөмж бүрт тохируулагддаг. Чихэвч холбогдсон үед картан дээрх тохиргооны дүрс тэмдэг дээр дарна уу.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Ерөнхий</string>
|
||||
<string name="device_settings_microphone_mode_label">Микрофон</string>
|
||||
@@ -483,7 +479,6 @@
|
||||
<string name="device_settings_listening_mode_cycle_dialog_title">Урт даруулах мөчлөгийг тохиргоолах</string>
|
||||
<string name="device_settings_listening_mode_cycle_summary_helper">Иш даруулах болон быстран шилжих цэснэг ашиглахад ашиглагдагдана</string>
|
||||
<string name="device_settings_listening_mode_cycle_summary_helper_override">Быстран шилжих цэснэг ашиглахад ашиглагдагдана. Төхөөрөмжийн ишийн AirPods цикл эелэхийг орлана.</string>
|
||||
<string name="device_settings_listening_mode_cycle_minimum">Өороос 2 горим идэвхийлэер байх еес тай.</string>
|
||||
<string name="device_settings_listening_mode_cycle_off">Унтраалттай</string>
|
||||
<string name="device_settings_listening_mode_cycle_anc">Чимээ хаах</string>
|
||||
<string name="device_settings_listening_mode_cycle_transparency">Тунгалаг горим</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">जेव्हा एखादे डिव्हाइस कनेक्ट केलेले असते तेव्हा अतिरिक्त सूचना दर्शविते. हे आपल्याला \"डिव्हाइस स्थिती\" चॅनेल अक्षम करून कायमस्वरूपी \"कोणतेही डिव्हाइस नाही\" सूचना लपविण्यास अनुमती देते.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">डिस्कनेक्ट झाल्यानंतर सूचना ठेवा</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">तुमचे AirPods डिस्कनेक्ट झाल्यानंतरही शेवटचे ज्ञात बॅटरी स्तर दर्शवणे सुरू ठेवा</string>
|
||||
<string name="settings_scanner_mode_label">स्कॅनर मोड</string>
|
||||
<string name="settings_scanner_mode_description">ब्लूटूथ लो एनर्जी डेटा स्कॅनरने कार्यक्षमतेला प्राधान्य द्यावे की ऊर्जा वाचवावी?</string>
|
||||
<string name="settings_autopause_label">ऑटो-पॉज</string>
|
||||
<string name="settings_autopause_description">आपल्या कानातून डिव्हाइस काढताना ऑडिओ थांबवा.</string>
|
||||
<string name="settings_autopplay_label">ऑटो-प्ले</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">खालील परवानगी आवश्यक आहे:</string>
|
||||
<string name="permission_system_alert_window_label">सिस्टम अलर्ट विंडो</string>
|
||||
<string name="permission_system_alert_window_description">\"पॉपअप दर्शवा\" वैशिष्ट्य शक्य करण्यासाठी CAPod ला इतर अॅप्सवर चित्रे काढण्याची अनुमती द्या.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">कमी ऊर्जा</string>
|
||||
<string name="settings_scanner_mode_balanced_label">संतुलित</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">कमी विलंब</string>
|
||||
<string name="settings_monitor_mode_manual_label">अॅप उघडे असताना</string>
|
||||
<string name="settings_monitor_mode_automatic_label">डिव्हाइस कनेक्ट असताना</string>
|
||||
<string name="settings_monitor_mode_always_label">नेहमी</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">कॉल संपवण्यासाठी दोनदा दाबा</string>
|
||||
<string name="device_settings_open_cd">डिव्हाइस सेटिंग्ज उघडा</string>
|
||||
<string name="overview_card_missing_paired_device">या प्रोफाइलशी कोणतेही Bluetooth डिव्हाइस जोडलेले नाही.</string>
|
||||
<string name="overview_reactions_hint_title">प्रतिक्रिया प्रत्येक डिव्हाइससाठी आहेत</string>
|
||||
<string name="overview_reactions_hint_body">ऑटो-प्ले, ऑटो-पॉज आणि पॉप-अप आता प्रत्येक डिव्हाइससाठी कॉन्फिगर केले आहेत. तुमचे हेडफोन कनेक्ट असताना कार्डवरील सेटिंग्ज आयकॉनवर टॅप करा.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">सामान्य</string>
|
||||
<string name="device_settings_microphone_mode_label">मायक्रोफोन</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Memaparkan pemberitahuan tambahan apabila peranti disambungkan. Ini membolehkan anda menyembunyikan pemberitahuan kekal \"Tiada peranti\" dengan melumpuhkan saluran \"Status peranti\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Kekalkan pemberitahuan selepas nyahsambung</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Terus menunjukkan tahap bateri terakhir yang diketahui walaupun selepas AirPods anda nyahsambung</string>
|
||||
<string name="settings_scanner_mode_label">Mod pengimbas</string>
|
||||
<string name="settings_scanner_mode_description">Patutkah pengimbas data Bluetooth Tenaga Rendah mengutamakan prestasi atau menjimatkan tenaga?</string>
|
||||
<string name="settings_autopause_label">Jeda automatik</string>
|
||||
<string name="settings_autopause_description">Jeda audio apabila peranti dikeluarkan dari telinga anda.</string>
|
||||
<string name="settings_autopplay_label">Main automatik</string>
|
||||
@@ -109,7 +107,7 @@
|
||||
<string name="settings_wiki_description">Soalan Lazim & Panduan</string>
|
||||
<string name="issue_tracker_label">Penjejak isu</string>
|
||||
<string name="issue_tracker_description">Penjejak isu awam untuk laporan pepijat dan permintaan ciri (bahasa Inggeris sahaja).</string>
|
||||
<string name="discord_label">Perselisihan</string>
|
||||
<string name="discord_label">Discord</string>
|
||||
<string name="discord_description">Tempat untuk melepak dan bertanya soalan.</string>
|
||||
<string name="changelog_label">Log perubahan</string>
|
||||
<string name="settings_label">Tetapan</string>
|
||||
@@ -220,9 +218,6 @@
|
||||
<string name="permission_required_title">Kebenaran berikut diperlukan:</string>
|
||||
<string name="permission_system_alert_window_label">Tetingkap Amaran Sistem</string>
|
||||
<string name="permission_system_alert_window_description">Benarkan CAPod melukis di atas apl lain untuk membolehkan ciri \"Tunjukkan pop timbul\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Kuasa rendah</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Seimbang</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Kependaman rendah</string>
|
||||
<string name="settings_monitor_mode_manual_label">Apabila apl dibuka</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Apabila peranti disambungkan</string>
|
||||
<string name="settings_monitor_mode_always_label">Sentiasa</string>
|
||||
@@ -465,6 +460,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Tekan dua kali untuk tamatkan panggilan</string>
|
||||
<string name="device_settings_open_cd">Buka tetapan peranti</string>
|
||||
<string name="overview_card_missing_paired_device">Profil ini tiada peranti Bluetooth yang dipasangkan.</string>
|
||||
<string name="overview_reactions_hint_title">Reaksi adalah setiap peranti</string>
|
||||
<string name="overview_reactions_hint_body">Main-auto, jeda-auto dan pop-timbul kini dikonfigurasi setiap peranti. Ketik ikon tetapan pada kad semasa fon kepala anda disambungkan.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Umum</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">စက်ပစ္စည်းတစ်ခုချိတ်ဆက်သောအခါ အပိုအသိပေးချက်တစ်ခုပြသသည်။ ၎င်းသည် \"စက်ပစ္စည်းအခြေအနေ\" ချန်နယ်ကို ပိတ်ခြင်းဖြင့် အမြဲတမ်း \"စက်ပစ္စည်းမရှိပါ\" အသိပေးချက်ကို ဝှက်ထားနိုင်စေသည်။</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">ချိတ်ဆက်မှုပြတ်ပြီးနောက် အသိပေးချက်ကိုထားရှိပါ</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">သင့် AirPods ချိတ်ဆက်မှုပြတ်ပြီးနောက်ပင် နောက်ဆုံးသိရှိထားသော ဘက်ထရီအဆင့်များကို ဆက်လက်ပြသပါ</string>
|
||||
<string name="settings_scanner_mode_label">စကင်နာမုဒ်</string>
|
||||
<string name="settings_scanner_mode_description">Bluetooth Low Energy ဒေတာစကင်နာသည် စွမ်းဆောင်ရည်ကို ဦးစားပေးသင့်သလား သို့မဟုတ် စွမ်းအင်ချွေတာသင့်သလား။</string>
|
||||
<string name="settings_autopause_label">အလိုအလြှောက်ရပ်တန့်ခြင်း</string>
|
||||
<string name="settings_autopause_description">သင့်နားကြပ်ကို နားမှဖယ်ရှားသည့်အခါ အသံကိုခေတ္တရပ်ပါ။</string>
|
||||
<string name="settings_autopplay_label">အလိုအလြှောက်ဖွင့်ခြင်း</string>
|
||||
@@ -220,9 +218,6 @@
|
||||
<string name="permission_required_title">အောက်ပါခွင့်ပြုချက်လိုအပ်သည်:</string>
|
||||
<string name="permission_system_alert_window_label">စနစ်သတိပေးချက်ပြတင်းပေါက်</string>
|
||||
<string name="permission_system_alert_window_description">\"ပြတင်းပေါက်ပြသခြင်း\" အင်္ဂါရပ်ကိုဖြစ်နိုင်စေရန် CAPod အား အခြားအက်ပ်များပေါ်တွင် ပုံဆွဲခွင့်ပြုပါ။</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">စွမ်းအင်နည်း</string>
|
||||
<string name="settings_scanner_mode_balanced_label">ချိန်ညှိထားသော</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">နှောင့်နှေးမှုနည်း</string>
|
||||
<string name="settings_monitor_mode_manual_label">အက်ပ်ဖွင့်ထားသောအခါ</string>
|
||||
<string name="settings_monitor_mode_automatic_label">စက်ပစ္စည်းချိတ်ဆက်ထားသောအခါ</string>
|
||||
<string name="settings_monitor_mode_always_label">အမြဲတမ်း</string>
|
||||
@@ -465,6 +460,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ဖုန်းပြတ်ရန် နှစ်ကြိမ်နှိပ်ပါ</string>
|
||||
<string name="device_settings_open_cd">ကိရိယာ ဆက်တင်များ ဖွင့်ထားပါ</string>
|
||||
<string name="overview_card_missing_paired_device">ဤပရိုဖိုင်တွင် တွဲချိတ်ထားသော Bluetooth စက်ပစ္စည်း မရှိပါ။</string>
|
||||
<string name="overview_reactions_hint_title">Reactions များသည် စက်ပစ္စည်းတစ်ခုချင်းစီအတွက် ဖြစ်သည်</string>
|
||||
<string name="overview_reactions_hint_body">အလိုအလျောက် ဖွင့်ခြင်း၊ အလိုအလျောက် ရပ်ခြင်းနှင့် pop-up များကို ယခု စက်ပစ္စည်းတစ်ခုချင်းစီအတွက် သတ်မှတ်ထားသည်။ သင့် headphones ချိတ်ဆက်နေစဉ် ကတ်တစ်ခုပေါ်ရှိ settings အိုင်ကွန်ကို နှိပ်ပါ။</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">ယေဘူယျ</string>
|
||||
<string name="device_settings_microphone_mode_label">မိုက်ခရိုဖုန်း</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Viser en ekstra varsling når en enhet er tilkoblet. Dette lar deg skjule det permanente varselet \"Ingen enheter\" ved å deaktivere kanalen \"Enhetsstatus\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Behold varsling etter frakobling</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Fortsett å vise de sist kjente batterinivåene selv etter at AirPods kobler fra</string>
|
||||
<string name="settings_scanner_mode_label">Skannermodus</string>
|
||||
<string name="settings_scanner_mode_description">Skal Bluetooth Low Energy data-skanneren prioritere ytelse eller å spare energi?</string>
|
||||
<string name="settings_autopause_label">Sett på pause automatisk</string>
|
||||
<string name="settings_autopause_description">Sett lyden på pause når du fjerner enheten fra øret.</string>
|
||||
<string name="settings_autopplay_label">Spill av automatisk</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Følgende tillatelse er påkrevd:</string>
|
||||
<string name="permission_system_alert_window_label">Systemvarslingsvindu</string>
|
||||
<string name="permission_system_alert_window_description">Tillat CAPod å tegne over andre apper for å gjøre funksjonen \"Vis popup\" mulig.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Lavt strømforbruk</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Balansert</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Lav forsinkelse</string>
|
||||
<string name="settings_monitor_mode_manual_label">Når appen er åpen</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Når enheten er tilkoblet</string>
|
||||
<string name="settings_monitor_mode_always_label">Alltid</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dobbelttrykk for å avslutte samtale</string>
|
||||
<string name="device_settings_open_cd">Åpne enhetsinnstillinger</string>
|
||||
<string name="overview_card_missing_paired_device">Denne profilen har ingen sammenkoblet Bluetooth-enhet.</string>
|
||||
<string name="overview_reactions_hint_title">Reaksjoner er per enhet</string>
|
||||
<string name="overview_reactions_hint_body">Automatisk avspilling, automatisk pause og hurtigvisninger konfigureres nå per enhet. Trykk på innstillingsikonet på et kort mens hodetelefonene er tilkoblet.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Generelt</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">उपकरण जडान हुँदा अतिरिक्त सूचना देखाउँछ। यसले तपाईंलाई \"उपकरण स्थिति\" च्यानल असक्षम गरेर स्थायी \"कुनै उपकरण छैन\" सूचना लुकाउन अनुमति दिन्छ।</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">विच्छेद पछि सूचना राख्नुहोस्</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">तपाईंको AirPods विच्छेद भएपछि पनि अन्तिम ज्ञात ब्याट्री स्तर देखाउन जारी राख्नुहोस्</string>
|
||||
<string name="settings_scanner_mode_label">स्क्यानर मोड</string>
|
||||
<string name="settings_scanner_mode_description">ब्लुटुथ कम ऊर्जा डाटा स्क्यानरले प्रदर्शनलाई प्राथमिकता दिनुपर्छ वा ऊर्जा बचत गर्नुपर्छ?</string>
|
||||
<string name="settings_autopause_label">स्वत: पज</string>
|
||||
<string name="settings_autopause_description">आफ्नो कानबाट उपकरण हटाउँदा अडियो पज गर्नुहोस्।</string>
|
||||
<string name="settings_autopplay_label">स्वत: प्ले</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">निम्न अनुमति आवश्यक छ:</string>
|
||||
<string name="permission_system_alert_window_label">प्रणाली अलर्ट विन्डो</string>
|
||||
<string name="permission_system_alert_window_description">\"पपअप देखाउनुहोस्\" सुविधा सम्भव बनाउन CAPod लाई अन्य एपहरूमाथि कोर्न अनुमति दिनुहोस्।</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">कम ऊर्जा</string>
|
||||
<string name="settings_scanner_mode_balanced_label">सन्तुलित</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">कम विलम्बता</string>
|
||||
<string name="settings_monitor_mode_manual_label">एप खुला हुँदा</string>
|
||||
<string name="settings_monitor_mode_automatic_label">उपकरण जडान हुँदा</string>
|
||||
<string name="settings_monitor_mode_always_label">सधैं</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">कल समाप्त गर्न दुईपटक थिच्नुहोस्</string>
|
||||
<string name="device_settings_open_cd">उपकरण सेटिङहरू खोल्नुहोस्</string>
|
||||
<string name="overview_card_missing_paired_device">यस प्रोफाइलमा कुनै जोडिएको Bluetooth उपकरण छैन।</string>
|
||||
<string name="overview_reactions_hint_title">प्रतिक्रियाहरू प्रति यन्त्र छन्</string>
|
||||
<string name="overview_reactions_hint_body">अटो-प्ले, अटो-पज र पप-अपहरू अब प्रति यन्त्र कन्फिगर गरिएका छन्। आफ्नो हेडफोन जडान भएको बेला कार्डमा सेटिङ आइकनमा ट्याप गर्नुहोस्।</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">सामान्य</string>
|
||||
<string name="device_settings_microphone_mode_label">माइक्रोफोन</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Toont een extra melding wanneer een apparaat is verbonden. Hiermee kun je de permanente melding \"Geen apparaten\" verbergen door het kanaal \"Apparaatstatus\" uit te schakelen.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Melding behouden na verbreken verbinding</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Blijf de laatst bekende batterijniveaus weergeven, zelfs nadat je AirPods zijn losgekoppeld</string>
|
||||
<string name="settings_scanner_mode_label">Scannermodus</string>
|
||||
<string name="settings_scanner_mode_description">Moet de \'Bluetooth Low Energy\'-datascanner prioriteit geven aan prestaties of aan energiebesparing?</string>
|
||||
<string name="settings_autopause_label">Auto pauze</string>
|
||||
<string name="settings_autopause_description">Pauzeer de audio wanneer je het apparaat van je oor haalt.</string>
|
||||
<string name="settings_autopplay_label">Automatisch afspelen</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">De volgende toestemming is vereist:</string>
|
||||
<string name="permission_system_alert_window_label">Systeemwaarschuwingsvenster</string>
|
||||
<string name="permission_system_alert_window_description">Geef CAPod de mogelijkheid om over andere apps heen te tekenen, zodat de functie \"Pop-up weergeven\" mogelijk is.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Laag vermogen</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Evenwichtig</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Lage latentie</string>
|
||||
<string name="settings_monitor_mode_manual_label">Wanneer de app geopend is</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Wanneer het apparaat is aangesloten</string>
|
||||
<string name="settings_monitor_mode_always_label">Altijd</string>
|
||||
@@ -416,8 +411,8 @@
|
||||
<string name="device_settings_info_build_label">Build</string>
|
||||
<string name="device_settings_info_left_serial_label">Serienummer linker oordopje</string>
|
||||
<string name="device_settings_info_right_serial_label">Serienummer rechter oordopje</string>
|
||||
<string name="device_settings_info_left_bonded_label">Links gekoppeld</string>
|
||||
<string name="device_settings_info_right_bonded_label">Rechts gekoppeld</string>
|
||||
<string name="device_settings_info_left_bonded_label">Links Gekoppeld</string>
|
||||
<string name="device_settings_info_right_bonded_label">Rechts Gekoppeld</string>
|
||||
<string name="device_settings_info_details_label">Apparaatdetails</string>
|
||||
<string name="device_settings_info_details_action">Apparaatdetails weergeven</string>
|
||||
<string name="device_settings_info_status_label">Status</string>
|
||||
@@ -427,8 +422,8 @@
|
||||
<string name="device_settings_not_connected_description">Dit apparaat bevindt zich in de buurt, maar is niet verbonden met deze telefoon. Maak verbinding om toegang te krijgen tot de instellingen en bedieningsopties.</string>
|
||||
<string name="device_settings_not_connected_connect_action">Verbinden</string>
|
||||
<string name="device_settings_not_connected_open_settings_action">Bluetooth-instellingen Openen</string>
|
||||
<string name="device_settings_not_nearby_label">Apparaat is niet in de buurt</string>
|
||||
<string name="device_settings_not_nearby_description">Instellingen zijn alleen beschikbaar wanneer dit apparaat in de buurt is en verbonden is met uw telefoon.</string>
|
||||
<string name="device_settings_not_nearby_label">Apparaat niet in de buurt</string>
|
||||
<string name="device_settings_not_nearby_description">Instellingen zijn alleen beschikbaar wanneer dit apparaat in de buurt is en verbonden is met je telefoon.</string>
|
||||
<string name="device_settings_aap_unavailable_label">Geavanceerde instellingen niet beschikbaar</string>
|
||||
<string name="device_settings_aap_unavailable_description">Geavanceerde AirPods-instellingen vereisen een Bluetooth-functie die niet beschikbaar is op deze telefoon. Dit kan worden opgelost door een toekomstige Android-update van uw apparaatfabrikant.</string>
|
||||
<string name="device_settings_aap_unavailable_action">Laat de compatibele tracker zien</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dubbelklik om het gesprek te beëindigen</string>
|
||||
<string name="device_settings_open_cd">Apparaatinstellingen openen</string>
|
||||
<string name="overview_card_missing_paired_device">Dit profiel heeft geen verbonden bluetooth-apparaat.</string>
|
||||
<string name="overview_reactions_hint_title">Reacties zijn per apparaat</string>
|
||||
<string name="overview_reactions_hint_body">Automatisch afspelen, automatisch pauzeren en pop-ups zijn nu per apparaat geconfigureerd. Tik op het instellingenpictogram op een kaart terwijl je hoofdtelefoon verbonden is.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Algemeen</string>
|
||||
<string name="device_settings_microphone_mode_label">Microfoon</string>
|
||||
@@ -494,7 +491,7 @@
|
||||
<string name="device_settings_sleep_detection_description">Audio automatisch pauzeren wanneer je in slaap valt</string>
|
||||
<string name="reaction_sleep_channel_label">Slaapdetectie</string>
|
||||
<string name="reaction_sleep_notification_title">Gepauzeerd door slaapdetectie</string>
|
||||
<string name="reaction_sleep_notification_text">%1$s heeft gedetecteerd dat u in slaap bent gevallen, dus uw muziek is gepauzeerd. U kunt dit uitschakelen in de apparaatinstellingen.</string>
|
||||
<string name="reaction_sleep_notification_text">%1$s heeft gedetecteerd dat je in slaap bent gevallen, dus je muziek is gepauzeerd. Je kunt dit uitschakelen in de apparaatinstellingen.</string>
|
||||
<string name="device_settings_rename_label">Hernoemen</string>
|
||||
<string name="device_settings_rename_hint">Apparaatnaam</string>
|
||||
<string name="device_settings_rename_confirm">Hernoemen</string>
|
||||
@@ -505,9 +502,9 @@
|
||||
<string name="device_settings_send_failed">Instelling kon niet worden toegepast: %1$s</string>
|
||||
<string name="device_settings_anc_off_rejected_message">Uit-modus is niet ingeschakeld op dit apparaat. Schakel \"Uit-modus toestaan\" in onder Ruisonderdrukking.</string>
|
||||
<string name="device_settings_category_battery_label">Batterij</string>
|
||||
<string name="device_settings_charge_cap_label">Geoptimaliseerde oplaadlimiet</string>
|
||||
<string name="device_settings_charge_cap_description">Leert uw routine en pauzeert het opladen rond 80%% om de batterijlevensduur te verlengen, waarna de pods worden bijgeladen voordat u ze waarschijnlijk gebruikt.</string>
|
||||
<string name="device_settings_charge_cap_rejected_message">Geoptimaliseerde oplaadlimiet kon niet worden gewijzigd. Dit is een experimentele functie — meld het als dit blijft mislukken.</string>
|
||||
<string name="device_settings_charge_cap_label">Geoptimaliseerde Oplaadlimiet</string>
|
||||
<string name="device_settings_charge_cap_description">Leer je routine kennen en stop met opladen rond de 80%% om de batterijduur te verlengen. Laad de pods volledig op voordat je ze waarschijnlijk gaat gebruiken.</string>
|
||||
<string name="device_settings_charge_cap_rejected_message">De geoptimaliseerde laadlimiet kon niet worden gewijzigd. Dit is een experimentele functie; meld het als het probleem zich blijft voordoen.</string>
|
||||
<string name="device_settings_category_connections_label">Verbonden apparaten</string>
|
||||
<string name="device_settings_connected_devices_description">Andere apparaten die momenteel verbonden zijn met deze AirPods</string>
|
||||
<string name="device_settings_connected_device_label">Apparaat %d</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Wyświetl dodatkowe powiadomienie, gdy urządzenie jest podłączone. Pozwala to ukryć stałe powiadomienie \"Brak urządzeń\", wyłączając kanał \"Status urządzenia\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Zachowaj powiadomienie po rozłączeniu</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Kontynuuj wyświetlanie ostatniego znanego poziomu baterii nawet po rozłączeniu AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Tryb skanera</string>
|
||||
<string name="settings_scanner_mode_description">Czy skaner danych Bluetooth Low Energy ma priorytetowo działać w ramach wydajności, czy oszczędzania energii?</string>
|
||||
<string name="settings_autopause_label">Automatyczne wstrzymywanie</string>
|
||||
<string name="settings_autopause_description">Wstrzymaj odtwarzanie, gdy urządzenia jest wyciągane z ucha.</string>
|
||||
<string name="settings_autopplay_label">Automatyczne odtwarzanie</string>
|
||||
@@ -228,9 +226,6 @@ K4r0lSz;</string>
|
||||
<string name="permission_required_title">Następujące uprawnienie jest wymagane:</string>
|
||||
<string name="permission_system_alert_window_label">Okna alertów systemowych</string>
|
||||
<string name="permission_system_alert_window_description">Zezwól na wyświetlanie CAPod nad innymi aplikacjami, aby aktywować funkcję \"Wyświetlanie informacji\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Oszczędzanie energii</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Zrównoważone</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Małe opóźnienia</string>
|
||||
<string name="settings_monitor_mode_manual_label">Gdy aplikacja jest uruchomiona</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Gdy urządzenie jest podłączone</string>
|
||||
<string name="settings_monitor_mode_always_label">Zawsze</string>
|
||||
@@ -482,6 +477,8 @@ K4r0lSz;</string>
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Naciśnij dwukrotnie, aby zakończyć połączenie</string>
|
||||
<string name="device_settings_open_cd">Otwórz ustawienia urządzenia</string>
|
||||
<string name="overview_card_missing_paired_device">Ten profil nie ma sparowanego urządzenia Bluetooth.</string>
|
||||
<string name="overview_reactions_hint_title">Reakcje są przypisane do urządzenia</string>
|
||||
<string name="overview_reactions_hint_body">Automatyczne odtwarzanie, automatyczna pauza i wyskakujące okienka są teraz konfigurowane osobno dla każdego urządzenia. Dotknij ikony ustawień na karcie, gdy słuchawki są podłączone.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Ogólne</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
@@ -518,7 +515,7 @@ K4r0lSz;</string>
|
||||
<string name="device_settings_anc_off_rejected_message">Tryb wyłączony nie jest włączony na tym urządzeniu. Włącz „Zezwól na tryb wyłączony” w sekcji Kontrola hałasu.</string>
|
||||
<string name="device_settings_category_battery_label">Bateria</string>
|
||||
<string name="device_settings_charge_cap_label">Zoptymalizowany limit ładowania</string>
|
||||
<string name="device_settings_charge_cap_description">Uczy się Twojego harmonogramu i wstrzymuje ładowanie około 80%%, aby wydłużyć żywotność baterii, doładowując słuchawki przed prawdopodobnym ich użyciem.</string>
|
||||
<string name="device_settings_charge_cap_description">Uczy się twojego harmonogramu i wstrzymuje ładowanie około 80%%, aby wydłużyć żywotność baterii, doładowując słuchawki przed prawdopodobnym ich użyciem.</string>
|
||||
<string name="device_settings_charge_cap_rejected_message">Nie udało się zmienić zoptymalizowanego limitu ładowania. To funkcja eksperymentalna — prosimy o zgłoszenie, jeśli problem będzie się powtarzał.</string>
|
||||
<string name="device_settings_category_connections_label">Połączone urządzenia</string>
|
||||
<string name="device_settings_connected_devices_description">Inne urządzenia aktualnie podłączone do tych AirPodsów </string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Mostra uma notificação extra quando um dispositivo está conectado. Isso permite que você oculte a notificação permanente \"Nenhum dispositivo\" desativando o canal \"Status do dispositivo\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Manter notificação após desconectar</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Continuar mostrando os últimos níveis de bateria registrados mesmo após a desconexão do AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Modo de scanner</string>
|
||||
<string name="settings_scanner_mode_description">O scanner de dados Bluetooth de Baixo Consumo de Energia deve priorizar o desempenho ou economizar energia?</string>
|
||||
<string name="settings_autopause_label">Pausa automática</string>
|
||||
<string name="settings_autopause_description">Pause o áudio ao remover o dispositivo do ouvido.</string>
|
||||
<string name="settings_autopplay_label">Reprodução automática</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">A seguinte permissão é necessária:</string>
|
||||
<string name="permission_system_alert_window_label">Janela de Alerta do Sistema</string>
|
||||
<string name="permission_system_alert_window_description">Permitir que o CAPod desenhe sobre outros aplicativos para tornar possível o recurso \"Mostrar PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Baixa potência</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Balanceado</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Baixa latência</string>
|
||||
<string name="settings_monitor_mode_manual_label">Quando o aplicativo está aberto</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Quando o dispositivo está conectado</string>
|
||||
<string name="settings_monitor_mode_always_label">Sempre</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Pressionar duas vezes para encerrar a chamada</string>
|
||||
<string name="device_settings_open_cd">Abrir configurações do dispositivo</string>
|
||||
<string name="overview_card_missing_paired_device">Este perfil não tem nenhum dispositivo Bluetooth pareado.</string>
|
||||
<string name="overview_reactions_hint_title">As reações são por dispositivo</string>
|
||||
<string name="overview_reactions_hint_body">Reprodução automática, pausa automática e pop-ups agora são configurados por dispositivo. Toque no ícone de configurações em um cartão enquanto seus fones de ouvido estiverem conectados.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Gerais</string>
|
||||
<string name="device_settings_microphone_mode_label">Microfone</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Mostra uma notificação extra quando um dispositivo está ligado. Isto permite-lhe ocultar a notificação permanente \"Sem dispositivos\" desativando o canal \"Estado do dispositivo\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Manter notificação após desligar</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Continuar a mostrar os últimos níveis de bateria conhecidos mesmo após os AirPods desligarem</string>
|
||||
<string name="settings_scanner_mode_label">Modo de scanner</string>
|
||||
<string name="settings_scanner_mode_description">O scanner de dados Bluetooth de Baixo Consumo de Energia deve dar prioridade ao desempenho ou poupar energia?</string>
|
||||
<string name="settings_autopause_label">Pausa automática</string>
|
||||
<string name="settings_autopause_description">Colocar o áudio em pausa ao remover o dispositivo do ouvido.</string>
|
||||
<string name="settings_autopplay_label">Reprodução automática</string>
|
||||
@@ -61,7 +59,7 @@
|
||||
<string name="settings_signal_minimum_label">Qualidade mínima do sinal</string>
|
||||
<string name="settings_signal_minimum_description">A qualidade mínima do sinal que um dispositivo tem de ter para ser considerado seu.</string>
|
||||
<string name="settings_autoconnect_label">Ligar automaticamente</string>
|
||||
<string name="settings_autoconnect_description">Se o Android не ligar automaticamente, também podemos pedi-lo. Isto irá definir a definição do modo de monitorização para \"Sempre\".</string>
|
||||
<string name="settings_autoconnect_description">Se o Android não ligar automaticamente, também podemos pedi-lo. Isto irá definir a definição do modo de monitorização para \"Sempre\".</string>
|
||||
<string name="settings_autoconnect_info_android12">A ligação automática depende de uma funcionalidade do sistema que o Android 12 e versões mais recentes restringem. Pode não funcionar no seu dispositivo.</string>
|
||||
<string name="settings_autoconnect_condition_label">Condição de ligação automática</string>
|
||||
<string name="settings_autoconnect_condition_description">Quando é que devemos tentar ligar ao seu dispositivo?</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">A seguinte permissão é necessária:</string>
|
||||
<string name="permission_system_alert_window_label">Janela de alerta do sistema</string>
|
||||
<string name="permission_system_alert_window_description">Permitir que o CAPod desenhe sobre outras aplicações para tornar possível a funcionalidade \"Mostrar PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Baixo consumo</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Equilibrado</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Baixa latência</string>
|
||||
<string name="settings_monitor_mode_manual_label">Quando a aplicação está aberta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Quando o dispositivo está ligado</string>
|
||||
<string name="settings_monitor_mode_always_label">Sempre</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Pressão dupla para terminar chamada</string>
|
||||
<string name="device_settings_open_cd">Abrir definições do dispositivo</string>
|
||||
<string name="overview_card_missing_paired_device">Este perfil não tem nenhum dispositivo Bluetooth emparelhado.</string>
|
||||
<string name="overview_reactions_hint_title">As reações são por dispositivo</string>
|
||||
<string name="overview_reactions_hint_body">A reprodução automática, a pausa automática e os pop-ups são agora configurados por dispositivo. Toque no ícone de definições num cartão enquanto os seus auscultadores estão ligados.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Geral</string>
|
||||
<string name="device_settings_microphone_mode_label">Microfone</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Mussa ina notificaziun supplementara cura ch\'in apparat è connectà. Quai permetta da zoppar la notificaziun permanenta \"Nagins apparats\" cun deactivar il chanal \"Stadi da l\'apparat\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mantegnair la notificaziun suenter la deconnexiun</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Cuntinuar da mussar ils davos nivels da battaria enconuschents er suenter che Voss AirPods sa deconnectan</string>
|
||||
<string name="settings_scanner_mode_label">Modus da scanner</string>
|
||||
<string name="settings_scanner_mode_description">Duai il scanner da datas da Bluetooth Low Energy priorisar la prestaziun u spargnar energia?</string>
|
||||
<string name="settings_autopause_label">Pausa automata</string>
|
||||
<string name="settings_autopause_description">Interrumper l\'audio cura che l\'apparat vegn allontanà da l\'ureglia.</string>
|
||||
<string name="settings_autopplay_label">Play automatic</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">La suandanta permissiun è necessaria:</string>
|
||||
<string name="permission_system_alert_window_label">Fanestra d\'avis dal sistem</string>
|
||||
<string name="permission_system_alert_window_description">Permetter a CAPod da dessegnar sur autras apps per render pussaivla la funcziun \"Mussar PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Bassa energia</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Equilibrà</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Bassa latenza</string>
|
||||
<string name="settings_monitor_mode_manual_label">Cura che l\'app è averta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Cura che l\'apparat è connectà</string>
|
||||
<string name="settings_monitor_mode_always_label">Adina</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dupel presser per terminar il clom</string>
|
||||
<string name="device_settings_open_cd">Avrir ils parameters da l\'apparat</string>
|
||||
<string name="overview_card_missing_paired_device">Quest profil na ha nagin apparat Bluetooth copulà.</string>
|
||||
<string name="overview_reactions_hint_title">Las reacziuns èn per mintga apparat</string>
|
||||
<string name="overview_reactions_hint_body">Auto-play, auto-pausa e pop-ups vegnan ussa configurads per apparat. Tappa l\'icona da parameters sin ina carta cur che tias chascias d\'ureglia èn connectadas.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">General</string>
|
||||
<string name="device_settings_microphone_mode_label">Microfon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Afișează o notificare suplimentară atunci când un dispozitiv este conectat. Acest lucru vă permite să ascundeți notificarea permanentă \"Niciun dispozitiv\" prin dezactivarea canalului \"Stare dispozitiv\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Păstrează notificarea după deconectare</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Continuă să afișeze ultimele niveluri cunoscute ale bateriei chiar și după deconectarea AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Modul scanare</string>
|
||||
<string name="settings_scanner_mode_description">Scanerul de date Bluetooth Energie Scăzută (BLE) ar trebui să acorde prioritate performanței sau economiei de energie?</string>
|
||||
<string name="settings_autopause_label">Pauză automată</string>
|
||||
<string name="settings_autopause_description">Întrerupeți sunetul când scoateți dispozitivul din ureche.</string>
|
||||
<string name="settings_autopplay_label">Redare automată</string>
|
||||
@@ -224,9 +222,6 @@
|
||||
<string name="permission_required_title">Următoarea permisiune este necesară:</string>
|
||||
<string name="permission_system_alert_window_label">Fereastră alertă sistem</string>
|
||||
<string name="permission_system_alert_window_description">Permiteți CAPod să deseneze peste alte aplicații pentru a face posibilă funcția \"Afișare PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Consum redus</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Echilibrat</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Latență redusă</string>
|
||||
<string name="settings_monitor_mode_manual_label">Când aplicația este deschisă</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Când dispozitivul este conectat</string>
|
||||
<string name="settings_monitor_mode_always_label">Întotdeauna</string>
|
||||
@@ -475,6 +470,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dublă apăsare pentru a încheia apelul</string>
|
||||
<string name="device_settings_open_cd">Deschide setările dispozitivului</string>
|
||||
<string name="overview_card_missing_paired_device">Acest profil nu are niciun dispozitiv Bluetooth asociat.</string>
|
||||
<string name="overview_reactions_hint_title">Reacțiile sunt per dispozitiv</string>
|
||||
<string name="overview_reactions_hint_body">Redarea automată, pauza automată și ferestrele pop-up sunt acum configurate per dispozitiv. Apasă pictograma de setări de pe un card în timp ce căștile tale sunt conectate.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">General</string>
|
||||
<string name="device_settings_microphone_mode_label">Microfon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Показывать дополнительное уведомление, когда устройство подключено. Это позволяет скрыть постоянное уведомление «Нет устройств», отключая канал «Статус устройства».</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Оставить уведомление после отключения</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Продолжать показывать последний известный заряд батареи даже после отключения AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Режим сканера</string>
|
||||
<string name="settings_scanner_mode_description">Какой режим должен по умолчанию использовать сканер данных Bluetooth Low Energy - производительность или экономию энергии?</string>
|
||||
<string name="settings_autopause_label">Автопауза</string>
|
||||
<string name="settings_autopause_description">Приостановка аудио при удалении устройства из уха.</string>
|
||||
<string name="settings_autopplay_label">Автовоспроизведение</string>
|
||||
@@ -227,9 +225,6 @@ AL_Cool_T</string>
|
||||
<string name="permission_required_title">Требуется следующее разрешение:</string>
|
||||
<string name="permission_system_alert_window_label">Окно системных предупреждений</string>
|
||||
<string name="permission_system_alert_window_description">Позволить CAPod наложение поверх других приложений для работы функции \"Всплывающие сообщения\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Низкая мощность</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Сбалансированно</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Низкая задержка</string>
|
||||
<string name="settings_monitor_mode_manual_label">Когда приложение открыто</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Когда устройство подключено</string>
|
||||
<string name="settings_monitor_mode_always_label">Всегда</string>
|
||||
@@ -439,7 +434,7 @@ AL_Cool_T</string>
|
||||
<string name="device_settings_not_connected_connect_action">Подключить</string>
|
||||
<string name="device_settings_not_connected_open_settings_action">Открыть настройки Bluetooth</string>
|
||||
<string name="device_settings_not_nearby_label">Устройство не рядом</string>
|
||||
<string name="device_settings_not_nearby_description">Настройки доступны только когда это устройство находится рядом и подключено к вашему телефону.</string>
|
||||
<string name="device_settings_not_nearby_description">Настройки доступны только когда это устройство находится рядом и подключено к Вашему телефону.</string>
|
||||
<string name="device_settings_aap_unavailable_label">Расширенные настройки недоступны</string>
|
||||
<string name="device_settings_aap_unavailable_description">Расширенные настройки AirPods требуют функцию Bluetooth, недоступную на этом телефоне. Это может быть исправлено в будущем обновлении Android от производителя устройства.</string>
|
||||
<string name="device_settings_aap_unavailable_action">Просмотр трекера совместимости</string>
|
||||
@@ -481,6 +476,8 @@ AL_Cool_T</string>
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Двойное нажатие для завершения звонка</string>
|
||||
<string name="device_settings_open_cd">Открыть настройки устройства</string>
|
||||
<string name="overview_card_missing_paired_device">В этом профиле нет сопряженных устройств Bluetooth.</string>
|
||||
<string name="overview_reactions_hint_title">Реакции настраиваются для каждого устройства</string>
|
||||
<string name="overview_reactions_hint_body">Автовоспроизведение, автопауза и всплывающие окна теперь настраиваются для каждого устройства. Нажмите значок настроек на карточке, пока наушники подключены.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Общее</string>
|
||||
<string name="device_settings_microphone_mode_label">Микрофон</string>
|
||||
@@ -505,7 +502,7 @@ AL_Cool_T</string>
|
||||
<string name="device_settings_sleep_detection_description">Автоматическая пауза звука, когда Вы засыпаете</string>
|
||||
<string name="reaction_sleep_channel_label">Определение сна</string>
|
||||
<string name="reaction_sleep_notification_title">Приостановлено функцией обнаружения сна</string>
|
||||
<string name="reaction_sleep_notification_text">%1$s обнаружил, что вы уснули, поэтому музыка была приостановлена. Вы можете отключить это в настройках устройства.</string>
|
||||
<string name="reaction_sleep_notification_text">%1$s сообщает, что Вы уснули, поэтому музыка была приостановлена. Вы можете отключить это в настройках устройства.</string>
|
||||
<string name="device_settings_rename_label">Переименовать</string>
|
||||
<string name="device_settings_rename_hint">Имя устройства</string>
|
||||
<string name="device_settings_rename_confirm">Переименовать</string>
|
||||
@@ -517,7 +514,7 @@ AL_Cool_T</string>
|
||||
<string name="device_settings_anc_off_rejected_message">Режим «Отключено» не включён на этом устройстве. Включите «Разрешить режим Отключено» в разделе Управление шумом.</string>
|
||||
<string name="device_settings_category_battery_label">Батарея</string>
|
||||
<string name="device_settings_charge_cap_label">Оптимизированный лимит заряда</string>
|
||||
<string name="device_settings_charge_cap_description">Изучает ваш распорядок и приостанавливает зарядку около 80%%, чтобы продлить срок службы аккумулятора, дозаряжая наушники перед тем, как вы будете ими пользоваться.</string>
|
||||
<string name="device_settings_charge_cap_description">Изучает Ваш распорядок и приостанавливает зарядку около 80%%, чтобы продлить срок службы аккумулятора, дозаряжая наушники перед тем, как Вы будете ими пользоваться.</string>
|
||||
<string name="device_settings_charge_cap_rejected_message">Не удалось изменить оптимизированный лимит заряда. Это экспериментальная функция — пожалуйста, сообщите об ошибке, если это повторится.</string>
|
||||
<string name="device_settings_category_connections_label">Подключённые устройства</string>
|
||||
<string name="device_settings_connected_devices_description">Другие устройства, подключённые к этим AirPods</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Mustrat una notìfica extra cando unu dispositivu est cullegadu. Custu ti permitit de cuare sa notìfica permanente \"Perunu dispositivu\" disativende su canale \"Istadu de su dispositivu\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mantene sa notìfica a pustis de sa disconnexione</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Sighi a mustrare is ùrtimos livelos de bateria connotos fintzas a pustis chi is AirPods si disconnetint</string>
|
||||
<string name="settings_scanner_mode_label">Modalidade scanner</string>
|
||||
<string name="settings_scanner_mode_description">S\'iscaner de datos Bluetooth Low Energy depet dare prioridade a is prestatziones o aforrare energia?</string>
|
||||
<string name="settings_autopause_label">Pàusa automàtica</string>
|
||||
<string name="settings_autopause_description">Pone in pàusa s\'àudio cando bogas su dispositivu dae s\'origra.</string>
|
||||
<string name="settings_autopplay_label">Riprodutzione automàtica</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Su permissu in fata est netzessàriu:</string>
|
||||
<string name="permission_system_alert_window_label">Ventana de alerta de su sistema</string>
|
||||
<string name="permission_system_alert_window_description">Permiti a CAPod de disegnare subra àteras apps pro rèndere possìbile sa funtzione \"Mustra PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Consumu bàsciu</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Ecuilibradu</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Latèntzia bàscia</string>
|
||||
<string name="settings_monitor_mode_manual_label">Cando s\'app est aberta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Cando su dispositivu est cullegadu</string>
|
||||
<string name="settings_monitor_mode_always_label">Sèmper</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dòpia premida pro terminare sa chiamada</string>
|
||||
<string name="device_settings_open_cd">Abri sas impostatziones de su dispositivo</string>
|
||||
<string name="overview_card_missing_paired_device">Custu profilu non tenet perunu dispositibu Bluetooth abbinadu.</string>
|
||||
<string name="overview_reactions_hint_title">Is reatziones sunt po cada dispositibu</string>
|
||||
<string name="overview_reactions_hint_body">Su reprodutzione automàtica, sa pausa automàtica e is pop-up sunt impostados instare po ogni dispositibu. Tocca s\'ìcona de sa cunfiguratziones subra \'e una tàtula mentres is tùas cuffietas sunt connétidas.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Generale</string>
|
||||
<string name="device_settings_microphone_mode_label">Microfon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">උපාංගයක් සම්බන්ධ වූ විට අමතර දැනුම්දීමක් පෙන්වයි. \"උපාංග තත්ත්වය\" නාලිකාව අක්රීය කිරීමෙන් \"උපාංග නොමැත\" ස්ථිර දැනුම්දීම සැඟවීමට මෙය ඔබට ඉඩ සලසයි.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">විසන්ධි වූ පසු දැනුම්දීම තබන්න</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">ඔබගේ AirPods විසන්ධි වූ පසුවද අවසාන වරට දන්නා බැටරි මට්ටම් පෙන්වීම දිගටම කරන්න</string>
|
||||
<string name="settings_scanner_mode_label">ස්කෑනර් ප්රකාරය</string>
|
||||
<string name="settings_scanner_mode_description">බ්ලූටූත් අඩු ශක්ති දත්ත ස්කෑනරය කාර්ය සාධනයට ප්රමුඛත්වය දිය යුතුද නැතහොත් ශක්තිය සංරක්ෂණය කළ යුතුද?</string>
|
||||
<string name="settings_autopause_label">ස්වයංක්රීයව විරාම කරන්න</string>
|
||||
<string name="settings_autopause_description">ඔබේ කනෙන් උපාංගය ඉවත් කරන විට ශ්රව්ය විරාම කරන්න.</string>
|
||||
<string name="settings_autopplay_label">ස්වයංක්රීයව වාදනය කරන්න</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">පහත අවසරය අවශ්ය වේ:</string>
|
||||
<string name="permission_system_alert_window_label">පද්ධති ඇඟවුම් කවුළුව</string>
|
||||
<string name="permission_system_alert_window_description">\"පොප්-අප් පෙන්වන්න\" විශේෂාංගය හැකි කිරීමට CAPod හට වෙනත් යෙදුම් මත අඳින්නට ඉඩ දෙන්න.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">අඩු ශක්තිය</string>
|
||||
<string name="settings_scanner_mode_balanced_label">සමතුලිත</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">අඩු ප්රමාදය</string>
|
||||
<string name="settings_monitor_mode_manual_label">යෙදුම විවෘතව ඇති විට</string>
|
||||
<string name="settings_monitor_mode_automatic_label">උපාංගය සම්බන්ධ වූ විට</string>
|
||||
<string name="settings_monitor_mode_always_label">සෑමවිටම</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">ඇමතුම අවසන් කිරීමට දෙවරක් එබන්න</string>
|
||||
<string name="device_settings_open_cd">උපාංග සැකසීම් විවර්ත කරන්න</string>
|
||||
<string name="overview_card_missing_paired_device">මෙම පැතිකඩට යුගල කළ Bluetooth උපකරණයක් නොමැත.</string>
|
||||
<string name="overview_reactions_hint_title">ප්රතික්රියා උපාංගය අනුව වෙනස් වේ</string>
|
||||
<string name="overview_reactions_hint_body">ස්වයංක්රීය වාදනය, ස්වයංක්රීය විරාමය සහ පොප්-අප් දැන් සෑම උපාංගයක් සඳහාම වින්යාස කර ඇත. ඔබගේ ශිරස්ත්රාණ සම්බන්ධිත අතරතුර කාඩ්පතක් මත සැකසුම් නිරූපකය තට්ටු කරන්න.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">සාමාන්ය</string>
|
||||
<string name="device_settings_microphone_mode_label">ශබ්දවාහිනිය</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Zobrazí dodatočné oznámenie keď je zariadenie pripojené. To umožňuje skryť trvalé oznámenie \"Žiadne zariadenia\" vypnutím kanálu \"Stav zariadenia\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Ponechať oznámenie po odpojení</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Pokračovať v zobrazovaní posledných známych úrovní batérie aj po odpojení vašich AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Režim skenera</string>
|
||||
<string name="settings_scanner_mode_description">Mal by skener Bluetooth Low Energy uprednostňovať výkon alebo šetriť energiu?</string>
|
||||
<string name="settings_autopause_label">Automatické pozastavenie</string>
|
||||
<string name="settings_autopause_description">Pozastavte zvuk, keď si vyberiete zariadenie z ucha.</string>
|
||||
<string name="settings_autopplay_label">Automatické prehrávanie</string>
|
||||
@@ -226,9 +224,6 @@
|
||||
<string name="permission_required_title">Je vyžadované nasledujúce povolenie:</string>
|
||||
<string name="permission_system_alert_window_label">Systémové výstražné okno</string>
|
||||
<string name="permission_system_alert_window_description">Povoľte CAPodu kresliť cez iné aplikácie, aby bola možná funkcia \"Zobraziť vyskakovacie okno\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Nízka spotreba</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Vyvážený</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Nízka latencia</string>
|
||||
<string name="settings_monitor_mode_manual_label">Keď je aplikácia otvorená</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Keď je zariadenie pripojené</string>
|
||||
<string name="settings_monitor_mode_always_label">Vždy</string>
|
||||
@@ -402,7 +397,7 @@
|
||||
<string name="support_contact_debuglog_label">Ladiaci log</string>
|
||||
<string name="support_contact_debuglog_picker_hint">Priložte existujúci ladíaci záznam alebo nahrajte nový.</string>
|
||||
<string name="support_contact_debuglog_picker_empty">Žiadne ladíace záznamy sa nenašli. Najskôr nahraje jeden.</string>
|
||||
<string name="support_contact_debuglog_zip_error">Komprimovanie ladÚciaho záznamu zlyhalo</string>
|
||||
<string name="support_contact_debuglog_zip_error">Komprimovanie ladiaceho záznamu zlyhalo</string>
|
||||
<string name="support_contact_send_action">Otvoriť e-mailovú aplikáciu</string>
|
||||
<string name="support_contact_no_email_app">Na tomto zariadení sa nenašla žiadna e-mailová aplikácia.</string>
|
||||
<string name="support_contact_debuglog_delete_title">Odstrániť ladíaci záznam?</string>
|
||||
@@ -480,6 +475,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dvojité stlačenie na ukončenie hovoru</string>
|
||||
<string name="device_settings_open_cd">Otvoriť nastavenia zariadenia</string>
|
||||
<string name="overview_card_missing_paired_device">Tento profil nemá spárované Bluetooth zariadenie.</string>
|
||||
<string name="overview_reactions_hint_title">Reakcie sú nastavené pre každé zariadenie</string>
|
||||
<string name="overview_reactions_hint_body">Automatické prehrávanie, automatické pozastavenie a kontextové okná sú teraz nakonfigurované pre každé zariadenie. Klepnite na ikonu nastavení na karte, keď sú vaše slúchadlá pripojené.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Všeobecné</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofón</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Prikaže dodatno obvestilo, ko je naprava povezana. To vam omogoča, da skrijete trajno obvestilo \"Ni naprav\" tako, da onemogočite kanal \"Stanje naprave\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Ohrani obvestilo po prekinitvi povezave</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Nadaljuj s prikazovanjem zadnjih znanih ravni baterije tudi po prekinitvi povezave z vašimi AirPods</string>
|
||||
<string name="settings_scanner_mode_label">Način optičnega bralnika</string>
|
||||
<string name="settings_scanner_mode_description">Ali naj optični bralnik podatkov Bluetooth Low Energy daje prednost zmogljivosti ali varčuje z energijo?</string>
|
||||
<string name="settings_autopause_label">Samodejna prekinitev</string>
|
||||
<string name="settings_autopause_description">Začasno ustavi zvok, ko napravo odstranite iz ušesa.</string>
|
||||
<string name="settings_autopplay_label">Samodejno predvajanje</string>
|
||||
@@ -226,9 +224,6 @@
|
||||
<string name="permission_required_title">Zahtevano je naslednje dovoljenje:</string>
|
||||
<string name="permission_system_alert_window_label">Sistemsko opozorilno okno</string>
|
||||
<string name="permission_system_alert_window_description">Dovolite CAPod risanje čez druge aplikacije, da omogočite funkcijo \"Pokaži pojavno okno\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Nizka poraba</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Uravnoteženo</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Nizka zakasnitev</string>
|
||||
<string name="settings_monitor_mode_manual_label">Ko je aplikacija odprta</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Ko je naprava povezana</string>
|
||||
<string name="settings_monitor_mode_always_label">Vedno</string>
|
||||
@@ -480,6 +475,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Dvojni pritisk za končanje klica</string>
|
||||
<string name="device_settings_open_cd">Odpri nastavitve naprave</string>
|
||||
<string name="overview_card_missing_paired_device">Ta profil nima sparene naprave Bluetooth.</string>
|
||||
<string name="overview_reactions_hint_title">Reakcije so nastavljene po napravi</string>
|
||||
<string name="overview_reactions_hint_body">Samodejno predvajanje, samodejni premor in pojavna okna so zdaj nastavljena za vsako napravo posebej. Tapnite ikono nastavitev na kartici, medtem ko so slušalke povezane.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Splošno</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofon</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Shfaq një njoftim shtesë kur një pajisje lidhet. Kjo ju lejon të fshihni njoftimin e përhershëm \"Asnjë pajisje\" duke çaktivizuar kanalin \"Statusi i pajisjes\".</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Mbaj njoftimin pas shkëputjes</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Vazhdo të shfaqësh nivelet e fundit të njohura të baterisë edhe pasi AirPods tuaja shkëputen</string>
|
||||
<string name="settings_scanner_mode_label">Modaliteti i skanerit</string>
|
||||
<string name="settings_scanner_mode_description">A duhet skaneri i të dhënave Bluetooth Low Energy të prioritizojë performancën apo të kursejë energji?</string>
|
||||
<string name="settings_autopause_label">Pauzë automatike</string>
|
||||
<string name="settings_autopause_description">Vendos në pauzë audion kur hiqni pajisjen nga veshi.</string>
|
||||
<string name="settings_autopplay_label">Luaj automatikisht</string>
|
||||
@@ -222,9 +220,6 @@
|
||||
<string name="permission_required_title">Leja e mëposhtme kërkohet:</string>
|
||||
<string name="permission_system_alert_window_label">Dritare Alarmi Sistemi</string>
|
||||
<string name="permission_system_alert_window_description">Lejoni CAPod të vizatojë mbi aplikacionet e tjera për të mundësuar veçorinë \"Shfaq PopUp\".</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Energji e ulët</string>
|
||||
<string name="settings_scanner_mode_balanced_label">I balancuar</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Vonesë e ulët</string>
|
||||
<string name="settings_monitor_mode_manual_label">Kur aplikacioni është i hapur</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Kur pajisja është e lidhur</string>
|
||||
<string name="settings_monitor_mode_always_label">Gjithmonë</string>
|
||||
@@ -470,6 +465,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Shtypje e dyfishtë për të mbyllur thirrjen</string>
|
||||
<string name="device_settings_open_cd">Hap cilësimet e pajisjes</string>
|
||||
<string name="overview_card_missing_paired_device">Ky profil nuk ka asnjë pajisje Bluetooth të çiftuar.</string>
|
||||
<string name="overview_reactions_hint_title">Reagimet janë për çdo pajisje</string>
|
||||
<string name="overview_reactions_hint_body">Luajtja automatike, pauzimi automatik dhe dritaret kërcyese tani konfigurohen për çdo pajisje. Trokitni ikonën e cilësimeve në një kartë ndërkohë që kufjet tuaja janë të lidhura.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Gjenerik</string>
|
||||
<string name="device_settings_microphone_mode_label">Mikrofoni</string>
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
<string name="settings_monitor_connected_notification_description">Приказује додатно обавештење када је уређај повезан. Ово вам омогућава да сакријете трајно обавештење „Нема уређаја” онемогућавањем канала „Статус уређаја”.</string>
|
||||
<string name="settings_keep_notification_after_disconnect_label">Задржи обавештење након прекида везе</string>
|
||||
<string name="settings_keep_notification_after_disconnect_description">Настави да приказује последње познате нивое батерије чак и након што се AirPods искључе</string>
|
||||
<string name="settings_scanner_mode_label">Режим скенера</string>
|
||||
<string name="settings_scanner_mode_description">Да ли би скенер података Bluetooth Low Energy требало да да приоритет перформансама или да штеди енергију?</string>
|
||||
<string name="settings_autopause_label">Аутоматска пауза</string>
|
||||
<string name="settings_autopause_description">Паузирајте звук када уклоните уређај из ува.</string>
|
||||
<string name="settings_autopplay_label">Аутоматска репродукција</string>
|
||||
@@ -224,9 +222,6 @@
|
||||
<string name="permission_required_title">Потребна је следећа дозвола:</string>
|
||||
<string name="permission_system_alert_window_label">Приказ преко других апликација</string>
|
||||
<string name="permission_system_alert_window_description">Дозволите CAPod-у да се приказује преко других апликација да би функција \"Прикажи искачући прозор\" била могућа.</string>
|
||||
<string name="settings_scanner_mode_lowpower_label">Ниска потрошња</string>
|
||||
<string name="settings_scanner_mode_balanced_label">Уравнотежено</string>
|
||||
<string name="settings_scanner_mode_lowlatency_label">Ниска латенција</string>
|
||||
<string name="settings_monitor_mode_manual_label">Када је апликација отворена</string>
|
||||
<string name="settings_monitor_mode_automatic_label">Када је уређај повезан</string>
|
||||
<string name="settings_monitor_mode_always_label">Увек</string>
|
||||
@@ -475,6 +470,8 @@
|
||||
<string name="device_settings_end_call_mute_mic_option_b_subtitle">Двоструко притисак за завршавање позива</string>
|
||||
<string name="device_settings_open_cd">Отворите подешавања уређаја</string>
|
||||
<string name="overview_card_missing_paired_device">Овај профил нема упарен Bluetooth уређај.</string>
|
||||
<string name="overview_reactions_hint_title">Реакције су по уређају</string>
|
||||
<string name="overview_reactions_hint_body">Аутоматско пуштање, аутоматска пауза и искачући прозори сада се подешавају по уређају. Додирните икону подешавања на картици док су ваше слушалице повезане.</string>
|
||||
<!-- New device settings -->
|
||||
<string name="device_settings_category_general_label">Oпште</string>
|
||||
<string name="device_settings_microphone_mode_label">Микрофон</string>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user