Compare commits

...
25 Commits
Author SHA1 Message Date
d4rken-org-releaser[bot] fb104cbe61 Release: 5.1.2-rc0 2026-05-01 06:56:07 +00:00
darken 97cbca7a6e fix(ci): Resolve bot slug via action output to avoid JWT-only endpoint 2026-05-01 08:55:15 +02:00
darken 02278dab17 chore(ci): Use GitHub App token for release-prepare push 2026-05-01 08:50:32 +02:00
darken 2240bd7ae5 chore(ci): Drop env gate on release-prepare to keep two-click approval 2026-05-01 08:16:33 +02:00
darken bc4096cb57 chore(ci): Run bats + shellcheck on release tooling 2026-05-01 08:00:15 +02:00
darken 5a0ba1b0bd chore(ci): Move release process to GitHub Actions 2026-05-01 08:00:15 +02:00
darken d04abdf80c General: Fix translation issues across multiple locales
Targeted character / escape / vandalism fixes:

- tr: %80 -> 80%% (UnknownFormatConversionException crash risk)

- pt: replace Cyrillic 'не' with 'não' in autoconnect description

- sk: fix 'ladUciaho' -> 'ladiaceho' (corruption)

- ms: restore 'Discord' brand name

- ca: 'maxima' -> 'minima' for signal_quality_title; fix 'suprimrira' typo

- zh-rTW: fix homophones and Japanese-kanji variants (4 strings)

- zh-rHK: Simplified -> Traditional for press_action_fast_forward

- zu: remove spurious 'Zn' prefix in 2 strings (vandalism)

- lv: fix wrong cedilla character in 3 Bluetooth a11y descriptions

- kmr-rTR: fix 4 encoding artifacts (a-feminine-ordinal substituted for e-circumflex)

- ko: fix 2 Hangul typos (conversation_awareness, allow_off)

Garbled translations removed (fall back to English source):

- hy-rAM: 13 press_controls/press_action strings

- mn-rMN: 2 strings (aap_unavailable_description, listening_mode_cycle_minimum)

- lt: settings_popup_warning_manual_mode

- mk-rMK: device_settings_allow_off_description (Syriac char vandalism)

- lo-rLA: signal_badge_ble_cd (English fallback was effectively unchanged)

- km-rKH: device_settings_microphone_mode_label (Thai script in Khmer file)
2026-05-01 05:19:34 +02:00
darken 0609352cc9 General: Update app translations from Crowdin 2026-05-01 05:19:34 +02:00
darken abde0b7d6a feat(reactions): Add discovery hint and outline settings icon 2026-04-30 17:46:27 +02:00
darken b952aff38d fix(widget): Re-render widgets reactively after initial session start
Glance only calls provideGlance() once per widget session; subsequent update() calls recompose the existing composition without re-running provideGlance. The previous capture-once approach left widgets frozen at initial state because the composition had no reactive State to read.

Subscribe to a widgetDeviceFlow(profileId) inside provideContent that pre-filters by WidgetDeviceKey, so the composition recomposes on visible state changes without firing on every BLE advertisement. Replace updateAll() with explicit per-GlanceId update() calls in WidgetManager, with a platform-id fallback when Glance returns no IDs.
2026-04-30 16:44:57 +02:00
darken c8f5ceda34 fix(monitor): Auto-tune BLE scanner mode by foreground state and connections
Replaces the user-facing scanner mode setting with an automatic policy that picks LOW_LATENCY when a profile-paired device is connected, BALANCED in the foreground, and LOW_POWER in the background. The TroubleShooter scopes a temporary LOW_LATENCY override via a refcounted withTemporaryOverride block so overlapping callers stay correct.

Fixes a regression where the controller could block BLE scanning entirely if BLUETOOTH_CONNECT was missing or the HEADSET profile proxy stalled, and adds a reactive bondedDeviceAddresses flow so bond changes propagate without waiting for an unrelated input. Cleans up the now-dead scanner mode strings across all locales and unused ScannerMode fields.
2026-04-30 15:26:45 +02:00
darken e6dbd2d660 fix(reaction): Restore BLE-only autoplay and stop false reactions on app start
- Apply seenLastAt freshness to all unauthenticated BLE samples (worn and not-worn). The earlier scoping to not-worn-only collapsed the second worn sample for BLE-only autoplay confirmation, so the staged play never fired.

- Replace distinctUntilChangedBy with a manual filter so worn samples that need to reset an active pause debounce (count went up) can pass through even when the monitor key is otherwise identical.

- Skip BLE-only autoplay confirmation for trusted sources. With BLE_IRK_MATCH and AAP, autoplay now fires on the first not-worn -> worn transition, mirroring the pause-debounce skip on the same sources.

- Skip the reaction entirely when the previous emission had no live evidence (NO_LIVE_BLE). Prevents app-process-start from synthesising a fake not-worn -> worn transition and firing autoplay while the user is already wearing the pods. Same guard handles mid-session BLE gap recoveries.

- Add MonitorFlowTests covering process-start-worn, genuine-insertion-after-startup, mid-session BLE-gap recovery, IRK-matched immediate autoplay, BLE-only autoplay confirmation, 3-sample pause debounce, and rebound-tolerated debounce reset.
2026-04-29 18:14:51 +02:00
darken 228d7d1f0c fix(reaction): Tighten auto-pause debounce after review findings
- Commit pending pause when a trusted source (AAP / BLE_IRK_MATCH) corroborates the not-worn condition mid-debounce, instead of dropping pending silently.

- Scope debounceFreshness to not-worn samples only; identical both-in samples no longer pass distinctUntilChangedBy and can't accidentally trigger BLE-only auto-play confirmation.

- Add resetTolerance to PendingPauseDebounce so a single corrupt count-up advert no longer kills a legitimate pending pause; reorder reset checks so rawDecision.shouldPlay resets immediately.

- Drop bleKeyState from the INFO autoPause log; source already encodes trust without leaking key-configuration state to logcat.

- Add flow-level MonitorFlowTests verifying the distinctUntilChangedBy interaction with seenLastAt freshness, plus the #557-direction test (AAP-worn vs corrupt-BLE-not-worn) and rebound-tolerance test.

- Clarify in BLE_ANONYMOUS KDoc that the path is unreachable in production via DeviceMonitor.primaryDevice.
2026-04-29 18:14:51 +02:00
darken 67fead3589 fix(reaction): Debounce auto-pause for unauthenticated BLE sources
Classifies the ear-detection source (AAP / BLE_IRK_MATCH / BLE_PROFILE_FALLBACK / BLE_ANONYMOUS / NO_LIVE_BLE) and applies a 3-sample debounce only to unauthenticated BLE paths. AAP and IRK-authenticated BLE pass through unchanged.

Also tightens toEarDetectionState() to prefer AAP aggregate over BLE per-side bits whenever AAP EarDetection is present, and suppresses pause on NO_LIVE_BLE (cache-only state) to avoid firing without live evidence.
2026-04-29 18:14:51 +02:00
darken d0aab583d2 fix(presscontrols): Auto-exit when device disconnects 2026-04-28 22:39:42 +02:00
darken 367c8d28ff chore: Drop stale app-common exclude from _config.yml
app-common module was merged into app/ in be8f4919; the exclude has been a no-op since.
2026-04-28 12:08:23 +02:00
darken b04e1fe628 chore(ci): Also rebuild Pages on main pushes for content edits
Adds push: [main] alongside workflow_dispatch so edits to README.md, _config.yml, _layouts, or the CHANGELOG.md template publish without a manual dispatch. The chain step in release-tag.yml still runs after release publish to guarantee the new release is in site.github.releases by the time Pages rebuilds — concurrency: cancel-in-progress: false serialises the two runs.

Adds an if: github.ref == 'refs/heads/main' guard on the deploy job so workflow_dispatch from a non-main branch builds for verification but doesn't deploy.
2026-04-28 12:08:23 +02:00
darken ea3ef1ff3b chore: Drop dead Gemfile excludes and ignore Jekyll artifacts
After moving Gemfile/Gemfile.lock to fastlane/, the - Gemfile / - Gemfile.lock entries in _config.yml's exclude list are no-ops; the parent fastlane exclude already covers everything inside.

.gitignore picks up _site/, .jekyll-cache/, vendor/bundle/ so local Jekyll runs don't leave tracked artifacts.
2026-04-28 12:08:23 +02:00
darken ff8b9cf6ed chore(ci): Chain Pages deploy from release-tag.yml and adopt org refinements
release: published events triggered by secrets.GITHUB_TOKEN do not start new workflow runs (only workflow_dispatch and repository_dispatch are exceptions). The Pages workflow's release: published trigger would never have fired in production since release-tag.yml's softprops/action-gh-release uses GITHUB_TOKEN to publish.

Fix: drop the release: published trigger and have release-tag.yml's release-github job explicitly run gh workflow run pages.yml --ref main after the release is created. release-github gains actions: write to authorize the dispatch.

Also adopts refinements from sibling org PRs (permission-pilot#356, bluemusic#220):

- Top-level permissions reduced to contents: read; pages: write and id-token: write moved to the deploy job only (least privilege)

- JEKYLL_GITHUB_TOKEN on the build step so jekyll-github-metadata authenticates when fetching site.github.releases

- Sanity-check step (test -f _site/index.html && _site/CNAME) fails fast if Jekyll produced nothing

- Explicit upload-pages-artifact path: ./_site matches the build's destination

- Verify fastlane Bundler wiring step (bundle exec fastlane --version) lets workflow_dispatch dry_run=true exercise the relocated Gemfile before the next real release
2026-04-28 12:08:23 +02:00
darken 96bc3f5df7 chore(ci): Move Gemfile to fastlane/ for tidier layout
The root Gemfile only ever declared the fastlane gem and lived next to fastlane configuration anyway. Moving it under fastlane/ matches that ownership and keeps the repo root cleaner.

release-gplay job now sets BUNDLE_GEMFILE=fastlane/Gemfile and runs ruby/setup-ruby with working-directory=fastlane so bundler-cache resolves the moved Gemfile. fastlane lanes still run from the repo root.
2026-04-28 12:08:23 +02:00
darken 1891a6d73a chore(ci): Migrate Pages to custom workflow with Node 24 actions
Replaces the auto pages-build-deployment (which still uses Node-20 actions/checkout@v4 and actions/upload-artifact@v4) with a custom workflow using configure-pages@v6, jekyll-build-pages@v1.0.13, upload-pages-artifact@v5, deploy-pages@v5.

Triggered by release publication so the changelog Liquid template (which reads site.github.releases) only rebuilds when a release actually exists. workflow_dispatch is kept for manual rebuilds when debugging Pages content.
2026-04-28 12:08:23 +02:00
darken 698415237d chore(ci): Drop unused Android build-cache step 2026-04-28 12:08:23 +02:00
darken 7ef672a11f chore(ci): Bump action-gh-release to v3.0.0 (Node 24) 2026-04-28 12:08:23 +02:00
darken f67e8aa7d1 fix: Harden foreground service exception handler 2026-04-25 23:40:10 +02:00
darken bcb4bdff08 fix(overview): Prevent crash from duplicate LazyList keys 2026-04-25 23:39:59 +02:00
128 changed files with 4007 additions and 1225 deletions
+1
View File
@@ -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
+78
View File
@@ -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`.
+1 -10
View File
@@ -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-
+24 -1
View File
@@ -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
+58
View File
@@ -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
+247
View File
@@ -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"
+58 -2
View File
@@ -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
View File
@@ -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/
+1 -1
View File
@@ -1 +1 @@
5.1.1-rc0 50101000
5.1.2-rc0 50102000
-3
View File
@@ -20,9 +20,6 @@ exclude:
- buildSrc
- gradle/wrapper
- fastlane
- Gemfile
- Gemfile.lock
- crowdin*
- app
- app-common
- CONTRIBUTING.md
+10 -6
View File
@@ -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 = {},
@@ -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)
}
}
}
}
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+4 -7
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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 lappareil ».</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">Lanalyseur 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 lappareil de votre oreille.</string>
<string name="settings_autopplay_label">Lecture automatique</string>
@@ -222,9 +220,6 @@
<string name="permission_required_title">Lautorisation suivante est nécessaire :</string>
<string name="permission_system_alert_window_label">Fenêtre dalerte système</string>
<string name="permission_system_alert_window_description">Permettre à CAPod dapparaî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 lappli est ouverte</string>
<string name="settings_monitor_mode_automatic_label">Si lappareil 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 lappel</string>
<string name="device_settings_open_cd">Ouvrir les paramètres de lappareil</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 licône des paramètres dune 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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -18
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -6
View File
@@ -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>
+6 -9
View File
@@ -26,7 +26,7 @@
<string name="upgrade_benefit_popups">Popup dema vekirina qutiyê &amp; 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ê &#8212; deng, stûn &amp; zªtir</string>
<string name="upgrade_benefit_device_controls">Kontrolên cîhazê &#8212; deng, stûn &amp; 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>
+2 -5
View File
@@ -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>
+4 -7
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -6
View File
@@ -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>
+2 -6
View File
@@ -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>
+5 -8
View File
@@ -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>
+2 -6
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -7
View File
@@ -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>
+2 -5
View File
@@ -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>
+3 -6
View File
@@ -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 &amp; 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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+10 -13
View File
@@ -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>
+3 -6
View File
@@ -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>
+2 -5
View File
@@ -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>
+3 -6
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+5 -8
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+3 -6
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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>
+2 -5
View File
@@ -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