Compare commits

...
7 Commits
Author SHA1 Message Date
darken 71a060feb9 Release: 2.9.1-rc0 2023-04-05 16:19:46 +02:00
darken 25d643257c Update translations 2023-04-05 13:13:42 +02:00
darken 85900e5bff Improve final headphones checks and fix IllegalStateException if data changes between the final two checks. 2023-04-05 13:13:42 +02:00
darken d3257d6c5e Improve troubleshooting texts 2023-04-05 13:13:42 +02:00
darken afe1399f72 Release: 2.9.0-rc0 2023-04-02 22:25:17 +02:00
Matthias Urhahn 20ce2d3e22 A troubleshooter that automatically goes through different compatibility settings. (#125) 2023-04-02 22:22:15 +02:00
Matthias Urhahn cea8f2290d More IAP improvements (#121)
* More IAP improvements

* More refactoring

* More tolerance towards GPlay API issues.

* Bump billing dependency

* Migrate away from deprecated methods.
2023-03-20 08:21:54 +01:00
69 changed files with 1021 additions and 121 deletions
+1 -1
View File
@@ -1 +1 @@
2.8.4-rc0 20804000
2.9.1-rc0 20901000
@@ -32,9 +32,9 @@ class BleScanner @Inject constructor(
@SuppressLint("MissingPermission") fun scan(
filters: Set<ScanFilter>,
scannerMode: ScannerMode = ScannerMode.BALANCED,
disableOffloadFiltering: Boolean = true,
disableOffloadBatching: Boolean = true,
disableDirectScanCallback: Boolean = true,
disableOffloadFiltering: Boolean = false,
disableOffloadBatching: Boolean = false,
disableDirectScanCallback: Boolean = false,
): Flow<Collection<BleScanResult>> = callbackFlow {
log(TAG) { "scan(filters=$filters, scannerMode=$scannerMode)" }
@@ -14,6 +14,7 @@ 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.common.flow.throttleLatest
import eu.darken.capod.main.core.GeneralSettings
import eu.darken.capod.main.core.PermissionTool
import eu.darken.capod.pods.core.PodDevice
@@ -113,6 +114,7 @@ class PodMonitor @Inject constructor(
disableDirectCallback = useIndirectScanResultCallback,
)
}
.throttleLatest(1000)
.flatMapLatest { options ->
val filters = when {
options.showUnfiltered -> {
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">Невядомы стан</string>
<string name="last_seen_x">Апошні раз быў: %s</string>
<string name="first_seen_x">Упершыню быў: %s</string>
<string name="permission_post_notifications_label">Адлюстраванне апавяшчэнняў</string>
<string name="permission_post_notifications_description">"Дазволіць CAPod адлюстроўваць вам апавяшчэнні аб вашых AirPods: напрыклад, іх бягучы стан пры падключэнні."</string>
</resources>
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">Estat desconegut</string>
<string name="last_seen_x">Últim cop vist: %s</string>
<string name="first_seen_x">Primera vegada vist: %s</string>
<string name="permission_post_notifications_label">Publica notificacions</string>
<string name="permission_post_notifications_description">"Permet que el CAPod us mostri notificacions sobre els vostres AirPods, p. ex. el seu estat actual mentre estan connectats."</string>
</resources>
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">Neznámý stav</string>
<string name="last_seen_x">Naposledy spatřeno: %s</string>
<string name="first_seen_x">Poprvé spatřeno: %s</string>
<string name="permission_post_notifications_label">Posílat zprávy</string>
<string name="permission_post_notifications_description">"Povolte aplikaci CAPod zobrazovat oznámení o sluchátkách AirPods, např. o jejich aktuálním stavu během připojení."</string>
</resources>
@@ -7,7 +7,7 @@
<string name="general_error_label">Fehler</string>
<string name="general_grant_permission_action">Berechtigung erteilen</string>
<string name="overview_nomaindevice_label">Kein primäres Gerät</string>
<string name="overview_nomaindevice_description">Alle gefundenen Geräte sind unwahrscheinlich ihnen zu gehören. Verbinden sie ihr Gerät oder passen sie die Einstellungen an.</string>
<string name="overview_nomaindevice_description">Alle gefundenen Geräte gehören wahrscheinlich nicht dir. Schalte deine Kopfhörer ein oder passe die Einstellungen von CAPod an.</string>
<string name="overview_bluetooth_disabled_label">Bluetooth ist deaktiviert</string>
<string name="overview_bluetooth_disabled_description">Bluetooth ist deaktiviert, aktiviere es ;)</string>
<string name="permission_bluetooth_connect_label">Bluetooth verbinden</string>
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">Unbekannter Zustand</string>
<string name="last_seen_x">Zuletzt gesehen: %s</string>
<string name="first_seen_x">Zum ersten Mal gesehen: %s</string>
<string name="permission_post_notifications_label">Benachrichtigungen posten</string>
<string name="permission_post_notifications_description">"Erlauben Sie CAPod, Ihnen Benachrichtigungen über Ihre AirPods anzuzeigen, z.b. ihren aktuellen Status, während sie verbunden sind."</string>
</resources>
@@ -1,5 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="app_name">CAPod</string>
<string name="app_name_pro">Tasuline CAPod</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="general_value_not_available_label">Pole saadaval</string>
<string name="pods_dual_left_label">Vasak klapp</string>
<string name="pods_dual_right_label">Parem klapp</string>
<string name="permission_post_notifications_description">"Luba CAPodil näidata AirPodsi teateid, nt praegust olekut ühendatud olles."</string>
</resources>
@@ -55,4 +55,6 @@
<string name="pods_case_unknown_state">Keadaan tidak diketahui</string>
<string name="last_seen_x">Terakhir dilihat: %s</string>
<string name="first_seen_x">Pertama dilihat: %s</string>
<string name="permission_post_notifications_label">Siarkan pemberitahuan</string>
<string name="permission_post_notifications_description">"Benarkan CAPod menunjukkan pemberitahuan kepada anda tentang AirPods anda, mis. status semasa mereka semasa disambungkan."</string>
</resources>
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">Onbekende staat</string>
<string name="last_seen_x">Laatst gezien: %s</string>
<string name="first_seen_x">Eerst gezien: %s</string>
<string name="permission_post_notifications_label">Post notificaties</string>
<string name="permission_post_notifications_description">"Sta CAPod toe notificaties over je AirPods te tonen, b.v. de huidige verbindingsstatus."</string>
</resources>
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">Ukjent status</string>
<string name="last_seen_x">Sist sett: %s</string>
<string name="first_seen_x">Først sett: %s</string>
<string name="permission_post_notifications_label">Vis varsler</string>
<string name="permission_post_notifications_description">"La CAPod vise varsler om dine AirPods, f.eks. nåværende status under tilkobling."</string>
</resources>
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">Nieznany stan</string>
<string name="last_seen_x">Ostatnio widziane: %s</string>
<string name="first_seen_x">Widziane pierwszy raz: %s</string>
<string name="permission_post_notifications_label">Wysyłanie powiadomień</string>
<string name="permission_post_notifications_description">"Zezwól CAPod na wyświetlanie powiadomień o słuchawkach AirPods, np. ich aktualnym statusie podczas połączenia."</string>
</resources>
@@ -2,6 +2,8 @@
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">Fóssil CAPod</string>
<string name="general_value_not_available_label">N/A</string>
<string name="general_error_label">Erro</string>
<string name="general_grant_permission_action">Conceder permissão</string>
<string name="overview_nomaindevice_label">Nenhum dispositivo principal</string>
@@ -56,4 +58,6 @@
<string name="pods_case_unknown_state">Estado desconhecido</string>
<string name="last_seen_x">Visto pela última vez: %s</string>
<string name="first_seen_x">Visto pela primeira vez: %s</string>
<string name="permission_post_notifications_label">Post de notificações</string>
<string name="permission_post_notifications_description">"Permita que o CAPod mostre notificações sobre seus AirPods, por exemplo. seu status atual enquanto conectado."</string>
</resources>
@@ -58,4 +58,5 @@
<string name="pods_case_unknown_state">Неизвестное состояние</string>
<string name="last_seen_x">Последние: %s</string>
<string name="first_seen_x">Первые: %s</string>
<string name="permission_post_notifications_description">"Разрешить CAPod показывать уведомления о ваших AirPods, например текущий статус при подключении."</string>
</resources>
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">Neznámy stav</string>
<string name="last_seen_x">Naposledy videné: %s</string>
<string name="first_seen_x">Prvýkrát videné: %s</string>
<string name="permission_post_notifications_label">Zobraziť oznámenia</string>
<string name="permission_post_notifications_description">"Povoľte CAPod, aby vám zobrazoval upozornenia týkajúce sa vašich slúchadiel AirPods, napr. ich aktuálny stav počas pripojenia."</string>
</resources>
@@ -3,11 +3,11 @@
<string name="app_name">CAPod</string>
<string name="app_name_pro">CAPod Pro</string>
<string name="app_name_foss">CAPod FOSS</string>
<string name="general_value_not_available_label"></string>
<string name="general_value_not_available_label"></string>
<string name="general_error_label">錯誤</string>
<string name="general_grant_permission_action">授予權限</string>
<string name="overview_nomaindevice_label">無主要裝置</string>
<string name="overview_nomaindevice_description">所有偵測到的裝置似乎並不是您的。開啟並連線您的裝置,也可以調整設定。</string>
<string name="overview_nomaindevice_description">所有偵測到的裝置似乎並不是您的。開啟並連線您的裝置,也可以調整設定。</string>
<string name="overview_bluetooth_disabled_label">藍牙已停用</string>
<string name="overview_bluetooth_disabled_description">藍牙已停用,啟用它 ;)</string>
<string name="permission_bluetooth_connect_label">藍牙連線</string>
@@ -25,7 +25,7 @@
<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_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>
@@ -58,4 +58,6 @@
<string name="pods_case_unknown_state">未知狀態</string>
<string name="last_seen_x">最後連線:%s</string>
<string name="first_seen_x">首次連線:%s</string>
<string name="permission_post_notifications_label">張貼通知</string>
<string name="permission_post_notifications_description">"允許 CAPod 為您顯示關於您 AirPods 的通知,例如在連線時顯示它們的目前狀態。"</string>
</resources>
+2 -1
View File
@@ -146,7 +146,8 @@ dependencies {
addTesting()
"gplayImplementation"("com.android.billingclient:billing:4.0.0")
"gplayImplementation"("com.android.billingclient:billing:5.1.0")
"gplayImplementation"("com.android.billingclient:billing-ktx:5.1.0")
"gplayImplementation"("com.bugsnag:bugsnag-android:5.9.2")
"gplayImplementation"("com.getkeepsafe.relinker:relinker:1.4.3")
@@ -1,13 +0,0 @@
package eu.darken.capod.common.upgrade.core
import com.android.billingclient.api.Purchase
import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.upgrade.core.data.PurchasedSku
import eu.darken.capod.common.upgrade.core.data.Sku
fun Purchase.toPurchasedSku(): Collection<PurchasedSku> = skus.map {
PurchasedSku(Sku(it), this)
}
private val TAG: String = logTag("Upgrade", "Gplay", "Billing", "Extensions")
@@ -49,7 +49,7 @@ class UpgradeRepoGplay @Inject constructor(
lastProStateAt = now
Info(billingData = data)
}
(now - lastProStateAt) < 6 * 60 * 1000L -> { // 6 hours
(now - lastProStateAt) < 6 * 60 * 60 * 1000L -> { // 6 hours
log(TAG, VERBOSE) { "We are not pro, but were recently, did GPlay try annoy us again?" }
Info(gracePeriod = true, billingData = null)
}
@@ -62,7 +62,7 @@ class UpgradeRepoGplay @Inject constructor(
// Ignore Google Play errors if the last pro state was recent
val now = System.currentTimeMillis()
log(TAG) { "now=$now, lastProStateAt=$lastProStateAt, error=$it" }
if ((now - lastProStateAt) < 6 * 60 * 60 * 1000L) { // 6 hours
if ((now - lastProStateAt) < 24 * 60 * 60 * 1000L) { // 24 hours
log(TAG, VERBOSE) { "We are not pro, but were recently, and just and an error, what is GPlay doing???" }
emit(Info(gracePeriod = true, billingData = null))
} else {
@@ -123,7 +123,7 @@ class UpgradeRepoGplay @Inject constructor(
get() = UpgradeRepo.Type.GPLAY
override val isPro: Boolean
get() = billingData?.getProSku() != null
get() = billingData?.getProSku() != null || gracePeriod
override val upgradedAt: Instant?
get() = billingData
@@ -2,6 +2,7 @@ package eu.darken.capod.common.upgrade.core.client
import android.app.Activity
import com.android.billingclient.api.*
import eu.darken.capod.common.debug.logging.Logging.Priority.INFO
import eu.darken.capod.common.debug.logging.Logging.Priority.WARN
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
@@ -38,7 +39,7 @@ data class BillingClientConnection(
if (!result.isSuccess) {
log(TAG, WARN) { "queryPurchases() failed" }
throw BillingClientException(result)
throw BillingResultException(result)
} else {
requireNotNull(purchases)
}
@@ -47,34 +48,31 @@ data class BillingClientConnection(
return purchases
}
suspend fun acknowledgePurchase(purchase: Purchase): BillingResult {
suspend fun acknowledgePurchase(purchase: Purchase) {
val ack = AcknowledgePurchaseParams.newBuilder().apply {
setPurchaseToken(purchase.purchaseToken)
}.build()
val ackResult = suspendCoroutine<BillingResult> { continuation ->
val result = suspendCoroutine<BillingResult> { continuation ->
client.acknowledgePurchase(ack) { continuation.resume(it) }
}
log(TAG) {
"acknowledgePurchase(purchase=$purchase): code=${ackResult.responseCode}, message=${ackResult.debugMessage})"
}
if (!ackResult.isSuccess) {
throw BillingClientException(ackResult)
}
log(TAG, INFO) { "acknowledgePurchase($purchase): code=${result.responseCode} (${result.debugMessage})" }
return ackResult
if (!result.isSuccess) throw BillingResultException(result)
}
suspend fun querySku(sku: Sku): Sku.Details {
val skuParams = SkuDetailsParams.newBuilder().apply {
setType(BillingClient.SkuType.INAPP)
setSkusList(listOf(sku.id))
val productDetails = QueryProductDetailsParams.Product.newBuilder().apply {
setProductType(BillingClient.ProductType.INAPP)
setProductId(sku.id)
}.build()
val (result, details) = suspendCoroutine<Pair<BillingResult, Collection<SkuDetails>?>> { continuation ->
client.querySkuDetailsAsync(skuParams) { skuResult, skuDetails ->
continuation.resume(skuResult to skuDetails)
val params = QueryProductDetailsParams.newBuilder().setProductList(listOf(productDetails)).build()
val (result, details) = suspendCoroutine<Pair<BillingResult, Collection<ProductDetails>?>> { continuation ->
client.queryProductDetailsAsync(params) { result, skuDetails ->
continuation.resume(result to skuDetails)
}
}
@@ -82,7 +80,7 @@ data class BillingClientConnection(
"querySku(sku=$sku): code=${result.responseCode}, debug=${result.debugMessage}), skuDetails=$details"
}
if (!result.isSuccess) throw BillingClientException(result)
if (!result.isSuccess) throw BillingResultException(result)
if (details.isNullOrEmpty()) throw IllegalStateException("Unknown SKU, no details available.")
@@ -97,10 +95,16 @@ data class BillingClientConnection(
suspend fun launchBillingFlow(activity: Activity, skuDetails: Sku.Details): BillingResult {
log(TAG) { "launchBillingFlow(activity=$activity, skuDetails=$skuDetails)" }
return client.launchBillingFlow(
activity,
BillingFlowParams.newBuilder().setSkuDetails(skuDetails.details.single()).build()
)
val productParams = BillingFlowParams.ProductDetailsParams.newBuilder().apply {
setProductDetails(skuDetails.details.first())
}.build()
val billingFlowParams = BillingFlowParams.newBuilder().apply {
setProductDetailsParamsList(listOf(productParams))
}.build()
return client.launchBillingFlow(activity, billingFlowParams)
}
companion object {
@@ -72,7 +72,7 @@ class BillingClientConnectionProvider @Inject constructor(
}
}
else -> {
close(BillingClientException(result))
close(BillingResultException(result))
}
}
}
@@ -105,7 +105,7 @@ class BillingClientConnectionProvider @Inject constructor(
return@retryWhen false
}
if (cause is BillingClientException && cause.result.responseCode == BillingResponseCode.BILLING_UNAVAILABLE) {
if (cause is BillingResultException && cause.result.isGplayUnavailablePermanent) {
log(TAG) { "Got BILLING_UNAVAILABLE while trying to connect client." }
return@retryWhen false
}
@@ -4,4 +4,14 @@ import com.android.billingclient.api.BillingClient
import com.android.billingclient.api.BillingResult
internal val BillingResult.isSuccess: Boolean
get() = responseCode == BillingClient.BillingResponseCode.OK
get() = responseCode == BillingClient.BillingResponseCode.OK
internal val BillingResult.isGplayUnavailableTemporary: Boolean
get() = setOf(
BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE,
BillingClient.BillingResponseCode.SERVICE_DISCONNECTED,
BillingClient.BillingResponseCode.SERVICE_TIMEOUT
).contains(responseCode)
internal val BillingResult.isGplayUnavailablePermanent: Boolean
get() = responseCode == BillingClient.BillingResponseCode.BILLING_UNAVAILABLE
@@ -2,8 +2,8 @@ package eu.darken.capod.common.upgrade.core.client
import com.android.billingclient.api.BillingResult
class BillingClientException(val result: BillingResult) : BillingException(result.debugMessage) {
class BillingResultException(val result: BillingResult) : BillingException(result.debugMessage) {
override fun toString(): String =
"BillingClientException(code=${result.responseCode}, message=${result.debugMessage})"
"BillingResultException(code=${result.responseCode}, message=${result.debugMessage})"
}
@@ -7,13 +7,9 @@ import eu.darken.capod.common.error.LocalizedError
class GplayServiceUnavailableException(cause: Throwable) : Exception("Google Play services are unavailable.", cause),
HasLocalizedError {
override fun getLocalizedError(context: Context): LocalizedError {
return LocalizedError(
throwable = this,
label = "Google Play Services Unavailable",
description = context.getString(R.string.upgrades_gplay_unavailable_error)
)
}
override fun getLocalizedError(context: Context): LocalizedError = LocalizedError(
throwable = this,
label = "Google Play Services Unavailable",
description = context.getString(R.string.upgrades_gplay_unavailable_error)
)
}
@@ -1,11 +1,14 @@
package eu.darken.capod.common.upgrade.core.data
import com.android.billingclient.api.Purchase
import eu.darken.capod.common.upgrade.core.toPurchasedSku
data class BillingData(
val purchases: Collection<Purchase>
) {
val purchasedSkus: Collection<PurchasedSku>
get() = purchases.map { it.toPurchasedSku() }.flatten()
private fun Purchase.toPurchasedSku(): Collection<PurchasedSku> = skus.map {
PurchasedSku(Sku(it), this)
}
}
@@ -1,7 +1,6 @@
package eu.darken.capod.common.upgrade.core.data
import android.app.Activity
import com.android.billingclient.api.BillingClient.BillingResponseCode
import eu.darken.capod.common.coroutine.AppScope
import eu.darken.capod.common.debug.Bugs
import eu.darken.capod.common.debug.logging.Logging.Priority.*
@@ -10,9 +9,7 @@ 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.common.upgrade.core.client.BillingClientConnectionProvider
import eu.darken.capod.common.upgrade.core.client.BillingClientException
import eu.darken.capod.common.upgrade.core.client.GplayServiceUnavailableException
import eu.darken.capod.common.upgrade.core.client.*
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
@@ -53,37 +50,34 @@ class BillingDataRepo @Inject constructor(
}
.forEach {
log(TAG, INFO) { "Acknowledging purchase: $it" }
try {
client.acknowledgePurchase(it)
} catch (e: Exception) {
log(TAG, ERROR) { "Failed to ancknowledge purchase: $it\n${e.asLog()}" }
}
client.acknowledgePurchase(it)
}
}
.setupCommonEventHandlers(TAG) { "connection-acks" }
.retryWhen { cause, attempt ->
log(TAG, ERROR) { "Failed to acknowledge purchase: ${cause.asLog()}" }
if (cause is CancellationException) {
log(TAG) { "Ack was cancelled (appScope?) cancelled." }
return@retryWhen false
}
if (attempt > 5) {
log(TAG, WARN) { "Reached attempt limit: $attempt due to $cause" }
return@retryWhen false
}
if (cause !is BillingClientException) {
log(TAG, WARN) { "Unknown BillingClient exception type: $cause" }
if (cause !is BillingException) {
log(TAG, WARN) { "Unknown exception type: $cause" }
return@retryWhen false
} else {
log(TAG) { "BillingClient exception: $cause; ${cause.result}" }
}
if (cause.result.responseCode == BillingResponseCode.BILLING_UNAVAILABLE) {
if (cause is BillingResultException && cause.result.isGplayUnavailablePermanent) {
log(TAG) { "Got BILLING_UNAVAILABLE while trying to ACK purchase." }
return@retryWhen false
}
log(TAG) { "Will retry ACK" }
log(TAG) { "Will retry ACK (attempt=$attempt)" }
delay(3000 * attempt)
true
}
@@ -108,7 +102,7 @@ class BillingDataRepo @Inject constructor(
} catch (e: Exception) {
log(TAG, WARN) { "Failed to start IAP flow:\n${e.asLog()}" }
val ignoredCodes = listOf(3, 6)
if (e !is BillingClientException || !e.result.responseCode.let { ignoredCodes.contains(it) }) {
if (e !is BillingResultException || !e.result.responseCode.let { ignoredCodes.contains(it) }) {
Bugs.report(TAG, "IAP flow failed for $sku", e)
}
@@ -119,16 +113,14 @@ class BillingDataRepo @Inject constructor(
companion object {
val TAG: String = logTag("Upgrade", "Gplay", "Billing", "DataRepo")
internal fun Throwable.tryMapUserFriendly(): Throwable {
if (this !is BillingClientException) return this
return when (result.responseCode) {
BillingResponseCode.BILLING_UNAVAILABLE,
BillingResponseCode.SERVICE_UNAVAILABLE,
BillingResponseCode.SERVICE_DISCONNECTED,
BillingResponseCode.SERVICE_TIMEOUT -> GplayServiceUnavailableException(this)
else -> this
internal fun Throwable.tryMapUserFriendly(): Throwable = when {
this is BillingResultException && this.result.isGplayUnavailableTemporary -> {
GplayServiceUnavailableException(this)
}
this is BillingResultException && this.result.isGplayUnavailablePermanent -> {
GplayServiceUnavailableException(this)
}
else -> this
}
}
}
@@ -1,12 +1,12 @@
package eu.darken.capod.common.upgrade.core.data
import com.android.billingclient.api.SkuDetails
import com.android.billingclient.api.ProductDetails
data class Sku(
val id: String
) {
data class Details(
val sku: Sku,
val details: Collection<SkuDetails>,
val details: Collection<ProductDetails>,
)
}
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="upgrades_gplay_unavailable_error">Google Play 服務不可用。</string>
<string name="upgrades_gplay_unavailable_error">Google Play 服務無法使用。</string>
<string name="upgrades_no_purchases_found_check_account">未找到訂單,確定帳戶無誤?</string>
</resources>
@@ -123,7 +123,9 @@ class OverviewFragmentVM @Inject constructor(
if (!isBluetoothEnabled) {
items.add(0, BluetoothDisabledVH.Item)
} else if (mainPod == null) {
items.add(0, MissingMainDeviceVH.Item)
items.add(0, MissingMainDeviceVH.Item {
OverviewFragmentDirections.actionOverviewFragmentToTroubleShooterFragment().navVia(this)
})
}
}
@@ -21,10 +21,12 @@ class MissingMainDeviceVH(parent: ViewGroup) :
item: Item,
payloads: List<Any>
) -> Unit = binding(payload = true) { item ->
troubleshootAction.setOnClickListener { item.onTroubleShoot() }
}
object Item : OverviewAdapter.Item {
data class Item(
val onTroubleShoot: () -> Unit,
) : OverviewAdapter.Item {
override val stableId: Long = Item::class.hashCode().toLong()
override val payloadProvider: ((DifferItem, DifferItem) -> DifferItem?)
@@ -0,0 +1,80 @@
package eu.darken.capod.troubleshooter.ui
import android.os.Bundle
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.setupWithNavController
import dagger.hilt.android.AndroidEntryPoint
import eu.darken.capod.R
import eu.darken.capod.common.WebpageTool
import eu.darken.capod.common.navigation.popBackStack
import eu.darken.capod.common.uix.Fragment3
import eu.darken.capod.common.viewbinding.viewBinding
import eu.darken.capod.databinding.TroubleshooterFragmentBinding
import eu.darken.capod.troubleshooter.ui.TroubleShooterFragmentVM.BleState
import javax.inject.Inject
@AndroidEntryPoint
class TroubleShooterFragment : Fragment3(R.layout.troubleshooter_fragment) {
override val vm: TroubleShooterFragmentVM by viewModels()
override val ui: TroubleshooterFragmentBinding by viewBinding()
@Inject lateinit var webpageTool: WebpageTool
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
ui.toolbar.apply {
setupWithNavController(findNavController())
}
ui.bleIntroStartAction.setOnClickListener { vm.troubleShootBle() }
vm.bleState.observe2(ui) { state ->
bleIntroContainer.isVisible = state is BleState.Intro
bleProcessContainer.isVisible = state is BleState.Working
bleResultContainer.isVisible = state is BleState.Result
when (state) {
is BleState.Intro -> {}
is BleState.Working -> {
bleProcessHistory.apply {
text = ""
state.allSteps.forEachIndexed { index, s -> append("#$index: $s\n") }
}
}
is BleState.Result -> {
bleResultHistory.apply {
text = ""
state.history.forEachIndexed { index, s -> append("#$index: $s\n") }
}
when (state) {
is BleState.Result.Success -> {
bleResultAction.isVisible = false
bleResultTitle.text = getString(R.string.troubleshooter_ble_result_success_title)
bleResultBody.text = getString(R.string.troubleshooter_ble_result_success_body)
bleResultAction.text = getString(R.string.general_close_action)
bleResultAction.setOnClickListener { popBackStack() }
}
is BleState.Result.Failure -> {
bleResultTitle.text = getString(R.string.troubleshooter_ble_result_failure_title)
bleResultBody.text = when (state.failureType) {
BleState.Result.Failure.Type.PHONE -> getString(R.string.troubleshooter_ble_result_failure_phone_body)
BleState.Result.Failure.Type.HEADPHONES -> getString(R.string.troubleshooter_ble_result_failure_phone_headphones)
}
bleResultAction.text = getString(R.string.general_check_action)
bleResultAction.setOnClickListener { vm.troubleShootBle() }
}
}
}
}
}
super.onViewCreated(view, savedInstanceState)
}
}
@@ -0,0 +1,269 @@
package eu.darken.capod.troubleshooter.ui
import androidx.lifecycle.SavedStateHandle
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.DebugSettings
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.logging.logTag
import eu.darken.capod.common.uix.ViewModel3
import eu.darken.capod.main.core.GeneralSettings
import eu.darken.capod.monitor.core.PodMonitor
import eu.darken.capod.pods.core.PodDevice
import eu.darken.capod.pods.core.unknown.UnknownDevice
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.withTimeoutOrNull
import javax.inject.Inject
@HiltViewModel
class TroubleShooterFragmentVM @Inject constructor(
@Suppress("UNUSED_PARAMETER") handle: SavedStateHandle,
private val dispatcherProvider: DispatcherProvider,
private val generalSettings: GeneralSettings,
private val podMonitor: PodMonitor,
private val debugSettings: DebugSettings,
) : ViewModel3(dispatcherProvider = dispatcherProvider) {
private val _bleState = MutableStateFlow<BleState>(BleState.Intro())
val bleState = _bleState.asLiveData2()
init {
_bleState
.onEach { log(TAG) { "New BLE State: $it" } }
.launchIn(vmScope)
}
private fun progress(message: String) {
var state = _bleState.value
if (state !is BleState.Working) {
state = BleState.Working("Starting...")
}
_bleState.value = state.nextStep(message)
}
private fun success(message: String) {
var state = _bleState.value
if (state !is BleState.Working) {
state = BleState.Working("Starting...")
}
_bleState.value = state.toSuccess(message)
}
private fun failure(message: String, type: BleState.Result.Failure.Type) {
var state = _bleState.value
if (state !is BleState.Working) {
state = BleState.Working("Starting...")
}
_bleState.value = state.toFailure(message, type)
}
fun troubleShootBle() = launch(context = dispatcherProvider.IO) {
log(TAG) { "troubleShootBle()" }
generalSettings.scannerMode.value = ScannerMode.LOW_LATENCY
run {
progress("Checking for headphones...")
val mainDevice = withTimeoutOrNull(STEP_TIME) {
podMonitor.mainDevice.filterNotNull().firstOrNull()
}
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<PodDevice> = { 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.value = hardwareFilteringDisabled
generalSettings.isOffloadedBatchingDisabled.value = hardwareBatchingDisabled
generalSettings.useIndirectScanResultCallback.value = indirectCallback
debugSettings.showUnfiltered.value = unfiltered
val start = System.currentTimeMillis()
val devices = withTimeoutOrNull(STEP_TIME) {
podMonitor.devices
.take(10)
.takeWhile { System.currentTimeMillis() - 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.value = false
generalSettings.isOffloadedBatchingDisabled.value = false
generalSettings.useIndirectScanResultCallback.value = false
debugSettings.showUnfiltered.value = false
return@launch
}
progress("We received at least some BLE data.\n")
run {
progress("Checking for supported headphones.")
if (doScan(false, false, false, false).any { it !is UnknownDevice }) return@run
if (doScan(false, false, true, false).any { it !is UnknownDevice }) return@run
if (doScan(true, true, true, false).any { it !is UnknownDevice }) return@run
if (doScan(true, true, false, false).any { it !is UnknownDevice }) return@run
if (doScan(true, false, true, false).any { it !is UnknownDevice }) return@run
if (doScan(true, false, false, false).any { it !is UnknownDevice }) return@run
if (doScan(false, true, true, false).any { it !is UnknownDevice }) return@run
if (doScan(false, true, false, false).any { it !is UnknownDevice }) return@run
failure("No compatible headphones found", BleState.Result.Failure.Type.HEADPHONES)
generalSettings.isOffloadedFilteringDisabled.value = false
generalSettings.isOffloadedBatchingDisabled.value = false
generalSettings.useIndirectScanResultCallback.value = 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) {
podMonitor.mainDevice.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 = System.currentTimeMillis()
podMonitor.devices
.take(10)
.takeWhile { System.currentTimeMillis() - start < STEP_TIME - 1000 }
.toList()
.flatten()
.distinctBy { it.address }
} ?: emptyList()
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. Resetting filters.\n")
generalSettings.mainDeviceModel.value = PodDevice.Model.UNKNOWN
generalSettings.mainDeviceAddress.value = null
generalSettings.minimumSignalQuality.value = 0.25f
progress("Setting headphone with strongest signal as yours.")
generalSettings.mainDeviceModel.value = otherDevices.maxBy { it.signalQuality }.model
val mainDevice = withTimeoutOrNull(STEP_TIME) {
podMonitor.mainDevice.filterNotNull().firstOrNull()
}
if (mainDevice != null) {
generalSettings.mainDeviceModel.value = mainDevice.model
generalSettings.scannerMode.value = ScannerMode.BALANCED
success("Success! Detected your headphones.")
return@launch
}
failure("No headphones detected near your device.", BleState.Result.Failure.Type.HEADPHONES)
}
}
sealed class BleState {
class Intro : BleState()
data class Working(
val current: String,
val history: List<String> = emptyList(),
) : BleState() {
val allSteps: List<String>
get() = history + current
fun nextStep(message: String) = this.copy(
current = message,
history = history + current
)
fun toSuccess(message: String) = Result.Success(
history = history + message
)
fun toFailure(message: String, type: Result.Failure.Type) = Result.Failure(
failureType = type,
history = history + message,
)
}
sealed class Result : BleState() {
abstract val history: List<String>
data class Success(
override val history: List<String>,
) : Result()
data class Failure(
val failureType: Type,
override val history: List<String>,
) : Result() {
enum class Type {
PHONE,
HEADPHONES,
;
}
}
}
}
companion object {
const val STEP_TIME = 10 * 1000L // 6 scans per 30 seconds max
val TAG = logTag("TroubleShooter", "Fragment", "VM")
}
}
@@ -32,12 +32,22 @@
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="16dp"
android:text="@string/overview_nomaindevice_description"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@id/troubleshoot_action"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/permission_label" />
<com.google.android.material.button.MaterialButton
android:id="@+id/troubleshoot_action"
style="@style/Widget.Material3.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:text="@string/troubleshoot_action"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/permission_description" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
@@ -0,0 +1,186 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
style="@style/Widget.MaterialComponents.Toolbar.Primary"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:title="@string/troubleshooter_title" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.card.MaterialCardView
android:id="@+id/ble_card"
style="@style/Widget.Material3.CardView.Filled"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ble_intro_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<com.google.android.material.textview.MaterialTextView
style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/troubleshooter_ble_intro_title" />
<com.google.android.material.textview.MaterialTextView
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="@string/troubleshooter_ble_intro_body1" />
<com.google.android.material.button.MaterialButton
android:id="@+id/ble_intro_start_action"
style="@style/Widget.Material3.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/troubleshooter_ble_intro_start_action" />
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/ble_process_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar"
tools:visibility="visible">
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/ble_process_progress"
style="@style/Widget.Material3.CircularProgressIndicator.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
app:layout_constraintBottom_toBottomOf="@id/ble_process_secondary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/ble_process_primary" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/ble_process_primary"
style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/troubleshooter_ble_process_title"
app:layout_constraintBottom_toTopOf="@id/ble_process_secondary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/ble_process_progress"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/ble_process_secondary"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/troubleshooter_ble_process_subtile"
app:layout_constraintBottom_toTopOf="@id/ble_process_history"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/ble_process_primary"
app:layout_constraintTop_toBottomOf="@id/ble_process_primary" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/ble_process_history"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ble_process_secondary"
tools:text="Step 1\nStep 2\n\Step 3" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:id="@+id/ble_result_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar"
tools:visibility="visible">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/ble_result_title"
style="@style/TextAppearance.Material3.TitleMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/troubleshooter_ble_result_success_title" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/ble_result_body"
style="@style/TextAppearance.Material3.BodyMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="@string/troubleshooter_ble_result_success_body" />
<com.google.android.material.button.MaterialButton
android:id="@+id/ble_result_action"
style="@style/Widget.Material3.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/troubleshooter_ble_result_failure_action" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/ble_result_history"
style="@style/TextAppearance.Material3.BodySmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
tools:text="Step 1\nStep 2\n\Step 3" />
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -13,6 +13,9 @@
<action
android:id="@+id/action_overviewFragment_to_settingsFragment"
app:destination="@id/settingsFragment" />
<action
android:id="@+id/action_overviewFragment_to_troubleShooterFragment"
app:destination="@id/troubleShooterFragment" />
</fragment>
<fragment
@@ -20,5 +23,9 @@
android:name="eu.darken.capod.main.ui.settings.SettingsFragment"
android:label="SettingsFragment"
tools:layout="@layout/settings_fragment" />
<fragment
android:id="@+id/troubleShooterFragment"
android:name="eu.darken.capod.troubleshooter.ui.TroubleShooterFragment"
tools:layout="@layout/troubleshooter_fragment" />
</navigation>
+20
View File
@@ -32,6 +32,12 @@
<string name="settings_reaction_label">Рэакцыі</string>
<string name="settings_reaction_description">Рэакцыі на падзеі і дзеянні.</string>
<string name="settings_category_yourdevice_label">Ваша прылада</string>
<string name="settings_category_compatibility_options_title">Параметры сумяшчальнасці</string>
<string name="settings_category_compatibility_options_description">Не чапайце, калі ўсё працуе ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Адключыць апаратную фільтрацыю</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Не дэлегуйце фільтраванне даных сістэме, замест гэтага накіруйце ўсе даныя ў праграму і дэлегуйце ёй іх фільтраванне.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Адключыць апаратнае пакетаванне</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Не дазваляйце сістэме групаваць сабраныя даныя BLE перад тым, як адправіць іх нам.</string>
<string name="settings_maindevice_address_label">Адрас вашай прылады</string>
<string name="settings_maindevice_address_description">Адрас вашай звязанай прылады. Праграма выкарыстоўвае яго для вызначэння падключэння да вашага тэлефона.</string>
<string name="settings_maindevice_address_none">Няма</string>
@@ -76,4 +82,18 @@
<string name="help_translate_description">Дапамажыце перакласці гэту праграму на вашу мову.</string>
<string name="translators_thanks_title">Перакладчыкі</string>
<string name="translators_thanks_description">Goshaproject(goooosha@gmail.com)</string>
<string name="widget_description">Віджэт паказвае апошні вядомы стан прылады.</string>
<string name="settings_compat_indirectcallback_title">Ускосная дастаўка даных</string>
<string name="settings_compat_indirectcallback_summary">Выкарыстоўваць альтэрнатыўны метад для атрымання даных BLE з сістэмы (трансляцыя замест запытвання даных).</string>
<string name="troubleshooter_title">Сродак выпраўлення непаладак</string>
<string name="troubleshooter_ble_intro_title">Трансляцыя Bluetooth Low Energy</string>
<string name="troubleshooter_ble_intro_body1">AirPods (і падобныя навушнікі) транслююць інфармацыю аб сваім стане з дапамогай тэхналогіі BLE, якая інтэрпрэтуецца прыладамі як рэклама. У некаторых тэлефонах гэтая тэхналогія рэалізавана няправільна. CAPod можа паспрабаваць выправіць гэту памылку, выкарыстоўваючы розныя параметры сумяшчальнасці, пакуль даныя не будуць атрыманыя. Запусціце прайграванне музыкі ў навушніках і размясціце іх побач з тэлефонам, а затым пачніце працэс.</string>
<string name="troubleshooter_ble_intro_start_action">Пачаць выпраўленне непаладак</string>
<string name="troubleshooter_ble_process_title">Ідзе выпраўленне непаладак</string>
<string name="troubleshooter_ble_process_subtile">Кожны крок займае 5–10 секунд</string>
<string name="troubleshooter_ble_result_success_title">Паспяхова</string>
<string name="troubleshooter_ble_result_success_body">Трансляцыі даных BLE прымаюцца CAPod.</string>
<string name="troubleshooter_ble_result_failure_title">Безвынікова</string>
<string name="troubleshooter_ble_result_failure_body">Не ўдалося выправіць непаладку. Не дапамагла ніводная камбінацыя параметраў сумяшчальнасці.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Ваш тэлефон наогул не атрымаў ніякіх даных BLE. Вы можаце паўтарыць гэты тэст у шматлюдным месцы, каб даведацца, ці могуць быць атрыманыя даныя з іншых крыніц (акрамя вашых навушнікаў). Няма атрыманых даных, якія паказваюць на праблему з аперацыйнай сістэмай вашага тэлефона.</string>
</resources>
+23
View File
@@ -32,6 +32,12 @@
<string name="settings_reaction_label">Reaccions</string>
<string name="settings_reaction_description">Reacció davant esdeveniments i comportaments.</string>
<string name="settings_category_yourdevice_label">El vostre dispositiu</string>
<string name="settings_category_compatibility_options_title">Opcions de compatibilitat</string>
<string name="settings_category_compatibility_options_description">No ho toqueu si tot funciona ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Desactiva el filtratge de maquinari</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">No delegueu el filtratge de dades al sistema, obtingueu totes les dades i filtreu-les dins de l\'aplicació.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Desactiva el processament per lots de maquinari</string>
<string name="settings_compat_offloaded_batching_disabled_summary">No deixeu que el grup del sistema reculli dades BLE abans de reenviar-nos-les.</string>
<string name="settings_maindevice_address_label">L\'adreça del vostre dispositiu</string>
<string name="settings_maindevice_address_description">L\'adreça del dispositiu emparellat. L\'aplicació la fa servir per determinar quan està connectat al telèfon.</string>
<string name="settings_maindevice_address_none">Cap</string>
@@ -76,4 +82,21 @@
<string name="help_translate_description">Ajudeu a traduir aquesta aplicació al vostre idioma preferit.</string>
<string name="translators_thanks_title">Traductors</string>
<string name="translators_thanks_description">Jaime Muñoz(jmmartin_5@outlook.com)</string>
<string name="widget_description">Un giny que mostra l\'estat de l\'últim dispositiu conegut.</string>
<string name="settings_compat_indirectcallback_title">Lliurament indirecte de dades</string>
<string name="settings_compat_indirectcallback_summary">Utilitza un mètode alternatiu per rebre dades BLE del sistema (emissió en lloc de devolució de trucada).</string>
<string name="troubleshooter_title">Solucionador de problemes</string>
<string name="troubleshooter_ble_intro_title">Emissions Bluetooth de baixa energia</string>
<string name="troubleshooter_ble_intro_body1">Els AirPods (i auriculars similars) transmeten informació d\'estat mitjançant una tecnologia BLE anomenada «anuncis». Alguns telèfons no implementen aquesta tecnologia correctament. El CAPod pot intentar solucionar-ho provant diferents opcions de compatibilitat fins que es rebin les dades. Inicieu la reproducció de música als vostres auriculars i col·loqueu-los a prop del telèfon i, a continuació, inicieu el procés.</string>
<string name="troubleshooter_ble_intro_start_action">Inicia el solucionador de problemes</string>
<string name="troubleshooter_ble_process_title">Resolució de problemes en curs</string>
<string name="troubleshooter_ble_process_subtile">Cada pas dura entre 5 i 10 segons</string>
<string name="troubleshooter_ble_result_success_title">Correcte</string>
<string name="troubleshooter_ble_result_success_body">El CAPod està rebent emissions d\'anuncis BLE.</string>
<string name="troubleshooter_ble_result_failure_title">Incorrecte</string>
<string name="troubleshooter_ble_result_failure_body">La resolució de problemes ha fallat. No ha funcionat cap combinació d\'opcions de compatibilitat.</string>
<string name="troubleshooter_ble_result_failure_phone_body">El vostre telèfon no ha rebut cap dada BLE. Podeu tornar a provar aquesta prova en una zona plena de gent per veure si es poden rebre fonts de dades (que no siguin els vostres auriculars). No es reben dades que indiquen un problema amb el sistema operatiu del vostre telèfon.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">El vostre telèfon ha rebut dades BLE, però les dades no provenen de cap dispositiu compatible. Teniu els auriculars encesos? El CAPod és compatible amb els vostres auriculars?</string>
<string name="troubleshooter_ble_result_failure_action">Torna-ho a provar</string>
<string name="troubleshoot_action">Resolució de problemes</string>
</resources>
+23
View File
@@ -32,6 +32,12 @@
<string name="settings_reaction_label">Reakce</string>
<string name="settings_reaction_description">Reakce na události a chování.</string>
<string name="settings_category_yourdevice_label">Vaše zařízení</string>
<string name="settings_category_compatibility_options_title">Možnosti kompatibility</string>
<string name="settings_category_compatibility_options_description">Nedotýkejte se, pokud vše funguje ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Vypnout hardwarové filtrování</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Nesvěřujte filtrování dat systému, ale přijímejte a filtrujte všechna data v aplikaci.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Vypnout hardwarové dávkování</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Nedovolte, aby systém seskupil shromážděná data BLE předtím, než nám je předá.</string>
<string name="settings_maindevice_address_label">Adresa vašeho zařízení</string>
<string name="settings_maindevice_address_description">Adresa spárovaného zařízení. Podle toho aplikace určí, kdy je připojena k telefonu.</string>
<string name="settings_maindevice_address_none">Žádná</string>
@@ -76,4 +82,21 @@
<string name="help_translate_description">Pomozte přeložit tuto aplikaci do svého oblíbeného jazyka.</string>
<string name="translators_thanks_title">Překladatelé</string>
<string name="translators_thanks_description">novas78@xda; woytazzer</string>
<string name="widget_description">Widget zobrazující poslední známý stav zařízení.</string>
<string name="settings_compat_indirectcallback_title">Nepřímé poskytování dat</string>
<string name="settings_compat_indirectcallback_summary">Použijte alternativní metodu pro příjem dat BLE ze systému (vysílání namísto přijímání).</string>
<string name="troubleshooter_title">Řešení problémů</string>
<string name="troubleshooter_ble_intro_title">Vysílání Bluetooth Low Energy</string>
<string name="troubleshooter_ble_intro_body1">Sluchátka AirPods (a podobná sluchátka) vysílají informace o stavu pomocí technologie BLE zvané \"reklama\". Některé telefony tuto technologii neimplementují správně. CAPod se může pokusit o nápravu zkoušením různých možností kompatibility, dokud nebudou data přijata. Spusťte přehrávání hudby ve sluchátkách, přiložte je k telefonu a spusťte proces.</string>
<string name="troubleshooter_ble_intro_start_action">Spustit řešení problémů</string>
<string name="troubleshooter_ble_process_title">Probíhá řešení problémů</string>
<string name="troubleshooter_ble_process_subtile">Každý krok trvá 5-10 sekund</string>
<string name="troubleshooter_ble_result_success_title">Úspěch</string>
<string name="troubleshooter_ble_result_success_body">CAPod přijímá reklamní vysílání BLE.</string>
<string name="troubleshooter_ble_result_failure_title">Neúspěšné</string>
<string name="troubleshooter_ble_result_failure_body">Řešení problémů se nezdařilo. Žádná kombinace možností kompatibility nepomohla.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Telefon nepřijal vůbec žádná data BLE. Tento test můžete zopakovat v přelidněném prostoru, abyste zjistili, zda lze přijímat i jiné zdroje dat (než vaše sluchátka). Nepřijímání dat ukazuje na problém s operačním systémem telefonu.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">Telefon přijal data BLE, ale data nepocházejí z žádného podporovaného zařízení. Jsou sluchátka zapnutá? Podporuje CAPod vaše sluchátka?</string>
<string name="troubleshooter_ble_result_failure_action">Zkusit znovu</string>
<string name="troubleshoot_action">Vyřešit problém</string>
</resources>
+23
View File
@@ -32,6 +32,12 @@
<string name="settings_reaction_label">Reaktionen</string>
<string name="settings_reaction_description">Reagieren Sie auf Ereignisse und Verhaltensweisen.</string>
<string name="settings_category_yourdevice_label">Ihr Gerät</string>
<string name="settings_category_compatibility_options_title">Kompatibilitätsoptionen</string>
<string name="settings_category_compatibility_options_description">Nicht anfassen, wenn alles funktioniert ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Deaktivieren Sie die Hardwarefilterung</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Delegieren Sie die Datenfilterung nicht an das System, sondern erhalten Sie alle Daten und Filter innerhalb der App.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Hardware-Batching deaktivieren</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Lassen Sie nicht zu, dass die Systemgruppe BLE-Daten sammelt, bevor Sie sie an uns weiterleiten.</string>
<string name="settings_maindevice_address_label">Ihre Geräteadresse</string>
<string name="settings_maindevice_address_description">Die Adresse Ihres gekoppelten Geräts. Die App verwendet dies, um festzustellen, wann sie mit Ihrem Telefon verbunden ist.</string>
<string name="settings_maindevice_address_none">Keine</string>
@@ -76,4 +82,21 @@
<string name="help_translate_description">Hilf mit diese App in deine Lieblingssprache zu übersetzen.</string>
<string name="translators_thanks_title">Übersetzer</string>
<string name="translators_thanks_description">Gamechanger181</string>
<string name="widget_description">Ein Widget, das den letzten bekannten Gerätestatus anzeigt.</string>
<string name="settings_compat_indirectcallback_title">Indirekte Datenlieferung</string>
<string name="settings_compat_indirectcallback_summary">Verwenden Sie eine alternative Methode, um BLE-Daten vom System zu erhalten (Broadcast statt Callback).</string>
<string name="troubleshooter_title">Fehlerbehebung</string>
<string name="troubleshooter_ble_intro_title">Bluetooth Low Energy-Sendungen</string>
<string name="troubleshooter_ble_intro_body1">AirPods (und ähnliche Kopfhörer) übertragen Statusinformationen mithilfe einer BLE-Technologie namens „Werbung“. Einige Telefone implementieren diese Technologie nicht richtig. CAPod kann versuchen, dies zu beheben, indem verschiedene Kompatibilitätsoptionen ausprobiert werden, bis Daten empfangen werden. Starten Sie die Musikwiedergabe auf Ihren Kopfhörern und legen Sie sie in die Nähe Ihres Telefons, und starten Sie dann den Vorgang.</string>
<string name="troubleshooter_ble_intro_start_action">Beginnen Sie mit der Fehlerbehebung</string>
<string name="troubleshooter_ble_process_title">Fehlerbehebung läuft</string>
<string name="troubleshooter_ble_process_subtile">Jeder Schritt dauert 510 Sekunden</string>
<string name="troubleshooter_ble_result_success_title">Erfolg</string>
<string name="troubleshooter_ble_result_success_body">BLE-Werbesendungen werden von CAPod empfangen.</string>
<string name="troubleshooter_ble_result_failure_title">Erfolglos</string>
<string name="troubleshooter_ble_result_failure_body">Fehlerbehebung fehlgeschlagen. Keine Kombination von Kompatibilitätsoptionen hat geholfen.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Ihr Telefon hat überhaupt keine BLE-Daten empfangen. Sie können diesen Test in einem überfüllten Bereich wiederholen, um zu sehen, ob Datenquellen (außer Ihren Kopfhörern) empfangen werden können. Es werden keine Daten empfangen, was auf ein Problem mit dem Betriebssystem Ihres Telefons hindeutet.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">Ihr Telefon hat BLE-Daten empfangen, aber die Daten stammen von keinem unterstützten Gerät. Sind Ihre Kopfhörer eingeschaltet? Unterstützt CAPod Ihren Kopfhörer?</string>
<string name="troubleshooter_ble_result_failure_action">Versuchen Sie es erneut</string>
<string name="troubleshoot_action">Fehlerbehebung</string>
</resources>
+24 -1
View File
@@ -1,2 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation"></resources>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="settings_category_compatibility_options_title">Ühilduvuse valikud</string>
<string name="settings_category_compatibility_options_description">Las jääda, kui kõik toimib ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Keela riistvara filtreerimine</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Süsteemis andmete filtreerimise asemel saate seda teha rakenduses.</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Keelake süsteemil rühmitada kogutud andmeid madalama energiatarbimisega Bluetoothi kohta enne meile saatmist.</string>
<string name="widget_description">Viimast teadaolevat seadme seisu näitab vidin.</string>
<string name="settings_compat_indirectcallback_title">Kaudsete andmete edastamine</string>
<string name="settings_compat_indirectcallback_summary">Süsteemis vähem energiat tarbiva Bluetoothi andmete saamine muul viisil (edasta tagasi kutsumise asemel).</string>
<string name="troubleshooter_title">Abistaja</string>
<string name="troubleshooter_ble_intro_title">Madalama energiatarbimisega Bluetoothi edastused</string>
<string name="troubleshooter_ble_intro_body1">AirPodsid (ja sarnased kõrvakapid) edastavad oleku teavet madalama energiakuluga Bluetoothiga, mida nimetatakse \"reklaamideks\". Mõned telefonid ei kasuta seda tehnoloogiat õigesti. CAPod võib siin aidata, üritades andmeid saada erinevate ühilduvusvalikute kaudu. Esitage muusikat kõrvaklappides ja asetage need telefoni lähedale, seejärel edastage andmeid.</string>
<string name="troubleshooter_ble_intro_start_action">Lahendage probleeme</string>
<string name="troubleshooter_ble_process_title">Lahendamine</string>
<string name="troubleshooter_ble_process_subtile">Iga etapp kulutab 5-10 sekundit</string>
<string name="troubleshooter_ble_result_success_title">Õnnestus</string>
<string name="troubleshooter_ble_result_success_body">CAPod võtab vastu madalama energiakuluga Bluetoothi kaudu reklaame.</string>
<string name="troubleshooter_ble_result_failure_title">Nurjus</string>
<string name="troubleshooter_ble_result_failure_body">Parandamine nurjus. Ükski ühilduvuskombinatsioonidest ei toiminud.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Telefon ei võtnud vastu mingeid andmeid madalama energiakuluga Buetoothi kaudu. Üritage korrate rahvarohkes kohas, et näha, kas andmete allikaid (mis pole teie kõrvaklapid) saab kätte. Andmete saamise nurjumine viitab telefoni operatsioonisüsteemi veale.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">Telefoni saabusid andmed madalama energiakuluga Bluetoothi kaudu aga andmed ei pärine ühestki ühilduvast seadmest. Kas CAPod ühildub teie kõrvaklapiga?</string>
<string name="troubleshooter_ble_result_failure_action">Proovi uuesti</string>
<string name="troubleshoot_action">Lahendamine</string>
</resources>
+23
View File
@@ -32,6 +32,12 @@
<string name="settings_reaction_label">Reaksi</string>
<string name="settings_reaction_description">Bereaksi terhadap peristiwa dan tingkah laku.</string>
<string name="settings_category_yourdevice_label">Peranti anda</string>
<string name="settings_category_compatibility_options_title">Pilihan keserasian</string>
<string name="settings_category_compatibility_options_description">Jangan sentuh jika semuanya berfungsi ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Nyahdayakan penapisan perkakasan</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Jangan wakilkan penapisan data kepada sistem, sebaliknya dapatkan semua data dan penapis dalam apl.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Nyahdayakan pengumpulan perkakasan</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Jangan biarkan kumpulan sistem mengumpul data BLE sebelum dimajukannya kepada kami.</string>
<string name="settings_maindevice_address_label">Alamat peranti anda</string>
<string name="settings_maindevice_address_description">Alamat pasangan peranti anda. Apl menggunakan ini bagi menentukan bila ia disambungkan ke telefon anda.</string>
<string name="settings_maindevice_address_none">Tiada</string>
@@ -76,4 +82,21 @@
<string name="help_translate_description">Bantu terjemahkan apl ini ke dalam bahasa kegemaran anda.</string>
<string name="translators_thanks_title">Penterjemah</string>
<string name="translators_thanks_description">bob hasnul(bobhasnul@gmail. com)</string>
<string name="widget_description">Widget yang menunjukkan status peranti terakhir yang diketahui.</string>
<string name="settings_compat_indirectcallback_title">Penghantaran data tidak langsung</string>
<string name="settings_compat_indirectcallback_summary">Gunakan kaedah alternatif untuk menerima data BLE daripada sistem (siaran dan bukannya panggilan balik).</string>
<string name="troubleshooter_title">Penyelesai masalah</string>
<string name="troubleshooter_ble_intro_title">Siaran Bluetooth Tenaga Rendah</string>
<string name="troubleshooter_ble_intro_body1">AirPods (dan fon kepala yang serupa) menyiarkan maklumat status menggunakan teknologi BLE yang dipanggil \"iklan\". Sesetengah telefon tidak melaksanakan teknologi ini dengan betul. CAPod boleh cuba membetulkannya dengan mencuba pilihan keserasian yang berbeza sehingga data diterima. Mulakan main balik muzik pada fon kepala anda dan letakkannya dekat dengan telefon anda, kemudian mulakan proses.</string>
<string name="troubleshooter_ble_intro_start_action">Mulakan penyelesaian masalah</string>
<string name="troubleshooter_ble_process_title">Menyelesaikan masalah sedang berjalan</string>
<string name="troubleshooter_ble_process_subtile">Setiap langkah mengambil masa 510 saat</string>
<string name="troubleshooter_ble_result_success_title">Kejayaan</string>
<string name="troubleshooter_ble_result_success_body">Siaran iklan BLE sedang diterima oleh CAPod.</string>
<string name="troubleshooter_ble_result_failure_title">Tidak berjaya</string>
<string name="troubleshooter_ble_result_failure_body">Penyelesaian masalah gagal. Tiada gabungan pilihan keserasian dapat membantu.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Telefon anda tidak menerima sebarang data BLE sama sekali. Anda boleh mencuba semula ujian ini di kawasan yang sesak untuk melihat sama ada sumber data (selain fon kepala anda) boleh diterima. Tiada data yang diterima menunjukkan masalah dengan sistem pengendalian telefon anda.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">Telefon anda menerima data BLE, tetapi data itu tidak datang daripada mana-mana peranti yang disokong. Adakah fon kepala anda dihidupkan? Adakah CAPod menyokong fon kepala anda?</string>
<string name="troubleshooter_ble_result_failure_action">Cuba semula</string>
<string name="troubleshoot_action">Selesaikan masalah</string>
</resources>
+9
View File
@@ -32,6 +32,11 @@
<string name="settings_reaction_label">Reacties</string>
<string name="settings_reaction_description">Reageren op gebeurtenissen en gedragingen.</string>
<string name="settings_category_yourdevice_label">Uw apparaat</string>
<string name="settings_category_compatibility_options_title">Compatibiliteitsopties</string>
<string name="settings_category_compatibility_options_description">Niet aankomen als alles werkt ;-)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Hardware filtering uitzetten</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Data filtering niet aan het systeem toevertrouwen, in plaats daarvan alle data in de app ontvangen en filteren.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Hardware batching uitzetten</string>
<string name="settings_maindevice_address_label">Uw apparaatadres</string>
<string name="settings_maindevice_address_description">Het adres van uw gekoppelde apparaat. De app gebruikt dit om te bepalen wanneer deze is verbonden met uw telefoon.</string>
<string name="settings_maindevice_address_none">Geen</string>
@@ -76,4 +81,8 @@
<string name="help_translate_description">Help deze app te vertalen in uw favoriete taal.</string>
<string name="translators_thanks_title">Vertalers</string>
<string name="translators_thanks_description">darken</string>
<string name="widget_description">Een widget dat de laatst gekende apparaatstatus toont.</string>
<string name="settings_compat_indirectcallback_title">Onrechtstreekse data aflevering</string>
<string name="settings_compat_indirectcallback_summary">Gebruik een alternatieve methode om BLE data van het systeem (broadcast inplaats van callback).</string>
<string name="troubleshooter_title">Probleemoplossing</string>
</resources>
+23
View File
@@ -32,6 +32,12 @@
<string name="settings_reaction_label">Reaksjoner</string>
<string name="settings_reaction_description">Reager på hendelser og oppførsel.</string>
<string name="settings_category_yourdevice_label">Enheten din</string>
<string name="settings_category_compatibility_options_title">Kompatibilitets-alternativer</string>
<string name="settings_category_compatibility_options_description">Ikke rør hvis alt virker ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Deaktiver maskinvarefiltrering</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Ikke deleger datafiltrering til systemet, i stedet hent alle data og filtrere i appen.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Deaktiver maskinvare \"batching\"</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Ikke la systemet gruppere innsamlet BLE-data før du videresender det til oss.</string>
<string name="settings_maindevice_address_label">Enhetens adresse</string>
<string name="settings_maindevice_address_description">Adressen til den sammenkoblede enheten. Appen bruker denne til å finne ut når den er koblet til telefonen din.</string>
<string name="settings_maindevice_address_none">Ingen</string>
@@ -76,4 +82,21 @@
<string name="help_translate_description">Hjelp til med å oversette denne appen til ditt favorittspråk.</string>
<string name="translators_thanks_title">Oversettere</string>
<string name="translators_thanks_description">Kristoffer Vassbø(kristoffervassbo@gmail.com)</string>
<string name="widget_description">En widget som viser sist kjent enhetsstatus.</string>
<string name="settings_compat_indirectcallback_title">Indirekte datalevering</string>
<string name="settings_compat_indirectcallback_summary">Bruk en alternativ metode for å motta BLE-data fra systemet (kringkast i stedet for callback).</string>
<string name="troubleshooter_title">Feilsøker</string>
<string name="troubleshooter_ble_intro_title">Bluetooth Low Energy kringkastinger</string>
<string name="troubleshooter_ble_intro_body1">AirPods (og lignende hodetelefoner) kringkaster statusinformasjon ved bruk av en BLE-teknologi kalt \"advertisements\". Noen telefoner implementerer ikke denne teknologien riktig. CAPod kan prøve å fikse dette ved å prøve forskjellige kompatibilitets-alternativer til data er mottatt. Start musikkavspilling på hodetelefonene dine og legg dem nær telefonen din, og start deretter prosessen.</string>
<string name="troubleshooter_ble_intro_start_action">Start feilsøking</string>
<string name="troubleshooter_ble_process_title">Feilsøking pågår</string>
<string name="troubleshooter_ble_process_subtile">Hvert steg tar 510 sekunder</string>
<string name="troubleshooter_ble_result_success_title">Vellykket</string>
<string name="troubleshooter_ble_result_success_body">BLE advertisement kringkastinger blir mottatt av CAPod.</string>
<string name="troubleshooter_ble_result_failure_title">Mislykket</string>
<string name="troubleshooter_ble_result_failure_body">Feilsøking mislyktes. Ingen kombinasjoner av kompatibilitets-alternativer fungerte.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Telefonen din mottok ingen BLE-data i det hele tatt. Du kan prøve denne testen på nytt i et folksomt område for å se om datakilder (annet enn hodetelefonene dine) kan mottas. Ingen data mottatt peker mot et problem med telefonens operativsystem.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">Telefonen din mottok BLE-data, men dataene kommer ikke fra en støttet enhet. Er hodetelefonene dine slått på? Støtter CAPod din type hodetelefoner?</string>
<string name="troubleshooter_ble_result_failure_action">Prøv igjen</string>
<string name="troubleshoot_action">Feilsøk</string>
</resources>
+19
View File
@@ -32,6 +32,11 @@
<string name="settings_reaction_label">Reakcje</string>
<string name="settings_reaction_description">Reakcje na wydarzenia lub zachowania.</string>
<string name="settings_category_yourdevice_label">Twoje urządzenie</string>
<string name="settings_category_compatibility_options_title">Opcje kompatybilności</string>
<string name="settings_category_compatibility_options_description">Nie dotykaj, jeżeli wszystko działa ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Wyłącz sprzętowe filtrowanie</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Nie używaj systemu do filtrowania danych, zamiast tego pobieraj wszystkie dane i filtruj w aplikacji.</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Nie pozwól, aby grupa systemowa zebrała dane BLE przed przekazaniem ich do nas.</string>
<string name="settings_maindevice_address_label">Adres twojego urządzenia</string>
<string name="settings_maindevice_address_description">Adres twojego sparowanego urządzenia. Aplikacja korzysta z niego, aby ustalić czy jest połączone z twoim telefonem.</string>
<string name="settings_maindevice_address_none">Brak</string>
@@ -76,4 +81,18 @@
<string name="help_translate_description">Pomóż przetłumaczyć aplikację na twój ulubiony język.</string>
<string name="translators_thanks_title">Tłumacze</string>
<string name="translators_thanks_description">darken; K4r0lSz;</string>
<string name="widget_description">Widżet pokazujący ostatni znany stan urządzenia.</string>
<string name="settings_compat_indirectcallback_title">Pośrednie dostarczanie danych</string>
<string name="settings_compat_indirectcallback_summary">Użyj alternatywnej metody odbierania danych BLE z systemu (transmisja zamiast oddzwaniania).</string>
<string name="troubleshooter_title">Rozwiązywanie problemów</string>
<string name="troubleshooter_ble_intro_title">Transmisja Bluetooth Low Energy</string>
<string name="troubleshooter_ble_intro_start_action">Rozpocznij rozwiązywanie problemów</string>
<string name="troubleshooter_ble_process_title">Rozwiązywanie problemów w toku</string>
<string name="troubleshooter_ble_process_subtile">Każdy etap zajmuje 510 sekund</string>
<string name="troubleshooter_ble_result_success_title">Sukces</string>
<string name="troubleshooter_ble_result_success_body">Audycje reklamowe BLE są odbierane przez CAPod.</string>
<string name="troubleshooter_ble_result_failure_title">Niepowodzenie</string>
<string name="troubleshooter_ble_result_failure_body">Rozwiązywanie problemów nie powiodło się. Nie pomogła żadna kombinacja opcji kompatybilności.</string>
<string name="troubleshooter_ble_result_failure_action">Spróbuj ponownie</string>
<string name="troubleshoot_action">Rozwiązywanie problemów</string>
</resources>
@@ -4,6 +4,7 @@
<string name="general_done_action">Pronto</string>
<string name="general_copy_action">Copiar</string>
<string name="general_thank_you_label">Obrigado</string>
<string name="general_upgrade_action">Atualização</string>
<string name="general_check_action">Checar</string>
<string name="general_close_action">Fechar</string>
<string name="upgrade_capod_label">Atualizar CAPod</string>
@@ -31,6 +32,12 @@
<string name="settings_reaction_label">Reações</string>
<string name="settings_reaction_description">Reaja a eventos e comportamentos.</string>
<string name="settings_category_yourdevice_label">Seu dispositivo</string>
<string name="settings_category_compatibility_options_title">Opções de compatibilidade</string>
<string name="settings_category_compatibility_options_description">Não toque se tudo funcionar ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Desativar filtragem de hardware</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Não delegue a filtragem de dados ao sistema, em vez disso, obtenha todos os dados e filtre dentro do aplicativo.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Desabilitar lotes de hardware</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Não deixe que o grupo do sistema colete dados BLE antes de encaminhá-los para nós.</string>
<string name="settings_maindevice_address_label">Endereço do seu dispositivo</string>
<string name="settings_maindevice_address_description">O endereço do seu dispositivo emparelhado. O aplicativo usa isso para determinar quando está conectado ao seu telefone.</string>
<string name="settings_maindevice_address_none">Nenhum</string>
@@ -52,11 +59,13 @@
<string name="settings_support_description">Se você precisar de alguma ajuda.</string>
<string name="issue_tracker_label">Rastreador de problemas</string>
<string name="issue_tracker_description">Um rastreador de problemas público para relatórios de bugs e solicitações de recursos (somente em inglês).</string>
<string name="discord_label">Discord</string>
<string name="discord_description">Um lugar para conversar e tirar dúvidas.</string>
<string name="changelog_label">Registro de alterações</string>
<string name="settings_label">Configurações</string>
<string name="settings_privacy_policy_label">Política de Privacidade</string>
<string name="settings_privacy_policy_desc">Manipulação de dados com responsabilidade.</string>
<string name="settings_licenses_label">Licenças</string>
<string name="settings_category_other_label">Outros</string>
<string name="settings_general_label">Configurações</string>
<string name="settings_general_description">Ajustes gerais que afetam todo o aplicativo.</string>
@@ -73,4 +82,21 @@
<string name="help_translate_description">Ajude a traduzir este aplicativo para seu idioma favorito.</string>
<string name="translators_thanks_title">Tradutores</string>
<string name="translators_thanks_description">Igor Silva (ferrare42@gmail.com)</string>
<string name="widget_description">Um widget que mostra o último status conhecido do dispositivo.</string>
<string name="settings_compat_indirectcallback_title">Entrega indireta de dados</string>
<string name="settings_compat_indirectcallback_summary">Use um método alternativo para receber dados BLE do sistema (transmissão em vez de retorno de chamada).</string>
<string name="troubleshooter_title">Solucionador de problemas</string>
<string name="troubleshooter_ble_intro_title">Transmissões Bluetooth de baixa energia</string>
<string name="troubleshooter_ble_intro_body1">AirPods (e fones de ouvido semelhantes) transmitem informações de status usando uma tecnologia BLE chamada \"anúncios\". Alguns telefones não implementam essa tecnologia corretamente. O CAPod pode tentar corrigir isso tentando diferentes opções de compatibilidade até que os dados sejam recebidos. Inicie a reprodução de música em seus fones de ouvido e coloque-os perto do telefone e inicie o processo.</string>
<string name="troubleshooter_ble_intro_start_action">Iniciar solução de problemas</string>
<string name="troubleshooter_ble_process_title">Solução de problemas em andamento</string>
<string name="troubleshooter_ble_process_subtile">Cada passo leva de 5 a 10 segundos</string>
<string name="troubleshooter_ble_result_success_title">Sucesso</string>
<string name="troubleshooter_ble_result_success_body">As transmissões de anúncios BLE estão sendo recebidas pelo CAPod.</string>
<string name="troubleshooter_ble_result_failure_title">Sem sucesso</string>
<string name="troubleshooter_ble_result_failure_body">A solução de problemas falhou. Nenhuma combinação de opções de compatibilidade ajudou.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Seu telefone não recebeu nenhum dado BLE. Você pode repetir este teste em uma área lotada para ver se as fontes de dados (além dos fones de ouvido) podem ser recebidas. Nenhum dado recebido aponta para um problema com o sistema operacional do seu telefone.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">Seu telefone recebeu dados BLE, mas os dados não vêm de nenhum dispositivo compatível. Seus fones de ouvido estão ligados? O CAPod suporta seu fone de ouvido?</string>
<string name="troubleshooter_ble_result_failure_action">Tentar novamente</string>
<string name="troubleshoot_action">Solucionar problemas</string>
</resources>
+3
View File
@@ -32,6 +32,9 @@
<string name="settings_reaction_label">Реакции</string>
<string name="settings_reaction_description">Реакции на события и действия.</string>
<string name="settings_category_yourdevice_label">Ваше устройство</string>
<string name="settings_category_compatibility_options_title">Настройки совместимости</string>
<string name="settings_category_compatibility_options_description">Не трогать, если всё работает :)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Отключить аппаратную фильтрацию</string>
<string name="settings_maindevice_address_label">Адрес Вашего устройства</string>
<string name="settings_maindevice_address_description">Адрес Вашего сопряжённого устройства. Приложение использует его для определения подключения к Вашему телефону.</string>
<string name="settings_maindevice_address_none">Нет</string>
+23
View File
@@ -32,6 +32,12 @@
<string name="settings_reaction_label">Reakcie</string>
<string name="settings_reaction_description">Reakcia na udalosti a správanie.</string>
<string name="settings_category_yourdevice_label">Vaše zariadenie</string>
<string name="settings_category_compatibility_options_title">Možnosti kompatibility</string>
<string name="settings_category_compatibility_options_description">Nedotýkajte sa, ak všetko funguje ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">Vypnite hardvérové filtrovanie</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">Nedelegujte filtrovanie údajov na systém, namiesto toho získajte všetky údaje a filtrujte v rámci aplikácie.</string>
<string name="settings_compat_offloaded_batching_disabled_title">Vypnite hardvérové dávkovanie</string>
<string name="settings_compat_offloaded_batching_disabled_summary">Nedovoľte, aby systém zhromaždil údaje BLE, kým nám ich nepošle.</string>
<string name="settings_maindevice_address_label">Adresa vašeho zariadenia</string>
<string name="settings_maindevice_address_description">Adresa vášho spárovaného zariadenia. Aplikácia pomocou toho určí, kedy je pripojená k telefónu.</string>
<string name="settings_maindevice_address_none">Žiadna</string>
@@ -76,4 +82,21 @@
<string name="help_translate_description">Pomôžte preložiť túto aplikáciu do svojho obľúbeného jazyka.</string>
<string name="translators_thanks_title">Prekladatelia</string>
<string name="translators_thanks_description">dukelc</string>
<string name="widget_description">Miniaplikácia zobrazujúca posledný známy stav zariadenia.</string>
<string name="settings_compat_indirectcallback_title">Nepriame doručovanie dát</string>
<string name="settings_compat_indirectcallback_summary">Na príjem údajov BLE zo systému použite alternatívnu metódu (vysielanie namiesto spätného volania).</string>
<string name="troubleshooter_title">Riešenie problémov</string>
<string name="troubleshooter_ble_intro_title">Vysielanie Bluetooth s nízkou spotrebou energie</string>
<string name="troubleshooter_ble_intro_body1">AirPods (a podobné slúchadlá) vysielajú informácie o stave pomocou technológie BLE nazývanej „reklamy“. Niektoré telefóny túto technológiu neimplementujú správne. CAPod sa to môže pokúsiť vyriešiť skúšaním rôznych možností kompatibility, kým nebudú prijaté údaje. Spustite prehrávanie hudby na slúchadlách, umiestnite ich do blízkosti telefónu a potom spustite proces.</string>
<string name="troubleshooter_ble_intro_start_action">Spustiť riešenie problémov</string>
<string name="troubleshooter_ble_process_title">Prebieha riešenie problémov</string>
<string name="troubleshooter_ble_process_subtile">Každý krok trvá 5 - 10 sekúnd</string>
<string name="troubleshooter_ble_result_success_title">Úspech</string>
<string name="troubleshooter_ble_result_success_body">CAPod prijíma reklamné vysielanie BLE.</string>
<string name="troubleshooter_ble_result_failure_title">Neúspešné</string>
<string name="troubleshooter_ble_result_failure_body">Riešenie problémov zlyhalo. Nepomohla žiadna kombinácia možností kompatibility.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Váš telefón neprijal vôbec žiadne údaje BLE. Tento test môžete zopakovať v preplnenej oblasti a zistiť, či je možné prijímať zdroje údajov (iné ako vaše slúchadlá). Žiadne prijímané údaje neukazujú na problém s operačným systémom vášho telefónu.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">Váš telefón prijal údaje BLE, ale údaje nepochádzajú zo žiadneho podporovaného zariadenia. Máte zapnuté slúchadlá? Podporuje CAPod vaše slúchadlá?</string>
<string name="troubleshooter_ble_result_failure_action">Skúste znova</string>
<string name="troubleshoot_action">Riešiť problém</string>
</resources>
+27 -4
View File
@@ -22,7 +22,7 @@
<string name="settings_fake_data_label">假資料</string>
<string name="settings_fake_data_description">顯示假資料,模擬不存在的裝置。</string>
<string name="settings_debug_label">偵錯設定</string>
<string name="settings_debug_description">一個能協助這個應用程式故障檢修的附加設定。</string>
<string name="settings_debug_description">一個能協助這個應用程式疑難排解的附加設定。</string>
<string name="settings_signal_minimum_label">最低訊號品質</string>
<string name="settings_signal_minimum_description">可以被認為是您的裝置的最低訊號品質。</string>
<string name="settings_autoconnect_label">自動連線</string>
@@ -32,6 +32,12 @@
<string name="settings_reaction_label">反應</string>
<string name="settings_reaction_description">對事件和行為作出反應。</string>
<string name="settings_category_yourdevice_label">您的裝置</string>
<string name="settings_category_compatibility_options_title">相容性選項</string>
<string name="settings_category_compatibility_options_description">若一切如常,就不要觸碰 ;)</string>
<string name="settings_compat_offloaded_filtering_disabled_title">停用硬體過濾</string>
<string name="settings_compat_offloaded_filtering_disabled_summary">不要把資料過濾委派給系統,而是在應用程式中取得所有資料並進行過濾。</string>
<string name="settings_compat_offloaded_batching_disabled_title">停用硬體批次</string>
<string name="settings_compat_offloaded_batching_disabled_summary">在轉送給我們之前,不要讓系統將蒐集到的低功耗藍牙資料組成群組。</string>
<string name="settings_maindevice_address_label">您的裝置位址</string>
<string name="settings_maindevice_address_description">您的已配對裝置的位址,這個應用程式用此位址來確定何時連線到您的手機。</string>
<string name="settings_maindevice_address_none"></string>
@@ -67,13 +73,30 @@
<string name="settings_debug_autoreports_label">自動回報錯誤</string>
<string name="settings_debug_autoreports_description">自動報告問題,例如應用程式當機細節,我也可以指出如何修復。</string>
<string name="settings_debug_mode_label">偵錯模式</string>
<string name="settings_debug_mode_description">顯示附加資訊以檢修故障問題。</string>
<string name="settings_debug_mode_description">顯示附加資訊以疑難排解問題。</string>
<string name="settings_blescanner_unfiltered_label">未過濾的低功耗藍牙資料</string>
<string name="settings_blescanner_unfiltered_description">移除低功耗藍牙掃描器的任何過濾器,以顯示所有廣播的低功耗藍牙資料。對增加新耳機類型的支援很有用。</string>
<string name="settings_compatibility_mode_label">相容模式</string>
<string name="settings_compatibility_mode_description">停用最佳化以提高相容性請在未看到任何資料時開啟。</string>
<string name="settings_compatibility_mode_label">相容模式</string>
<string name="settings_compatibility_mode_description">停用電池效能最佳化以提高相容性請在未看到任何資料時開啟。</string>
<string name="help_translate_label">翻譯</string>
<string name="help_translate_description">協助翻譯為您的最愛語言。</string>
<string name="translators_thanks_title">翻譯人員</string>
<string name="translators_thanks_description">人工知能</string>
<string name="widget_description">顯示最後已知裝置狀態的小工具。</string>
<string name="settings_compat_indirectcallback_title">間接資料傳遞</string>
<string name="settings_compat_indirectcallback_summary">使用替代方法從系統中接收低功耗藍牙資料 (廣播而非回撥)。</string>
<string name="troubleshooter_title">疑難排解員</string>
<string name="troubleshooter_ble_intro_title">低功耗藍牙廣播</string>
<string name="troubleshooter_ble_intro_body1">AirPods (和類似的耳機) 使用一種叫做「廣告」的低功耗藍牙技術廣播狀態資訊。部分手機不能正確實作這項技術。CAPod 可以嘗試透過不同的相容性選項來修正這個問題,直到收到資料。在耳機上開始播放音樂,並把它們放在靠近手機的地方,然後啟動這個處理程序。</string>
<string name="troubleshooter_ble_intro_start_action">啟動疑難排解</string>
<string name="troubleshooter_ble_process_title">疑難排解正在執行</string>
<string name="troubleshooter_ble_process_subtile">每個步驟需要 510 秒</string>
<string name="troubleshooter_ble_result_success_title">成功</string>
<string name="troubleshooter_ble_result_success_body">CAPod 正在接收低功耗藍牙廣告廣播。</string>
<string name="troubleshooter_ble_result_failure_title">未成功</string>
<string name="troubleshooter_ble_result_failure_body">疑難排解失敗,相容性選項的組合都無濟於事。</string>
<string name="troubleshooter_ble_result_failure_phone_body">您的手機未收到任何低功耗藍牙資料。您可以在人多的地方重試這個測試,看看是否能收到資料來源 (除了您的耳機)。若未收到任何資料,則說明您的手機作業系統存在問題。</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">您的手機收到了低功耗藍牙資料,但此資料並非來自任何支援的裝置。您的耳機是否已開機?CAPod 是否支援您的耳機?</string>
<string name="troubleshooter_ble_result_failure_action">再試一次</string>
<string name="troubleshoot_action">疑難排解</string>
</resources>
+15
View File
@@ -102,4 +102,19 @@
<string name="widget_description">A widget showing the last known device status.</string>
<string name="settings_compat_indirectcallback_title">Indirect data delivery</string>
<string name="settings_compat_indirectcallback_summary">Use an alternative method to receive BLE data from the system (broadcast instead of callback).</string>
<string name="troubleshooter_title">Troubleshooter</string>
<string name="troubleshooter_ble_intro_title">Bluetooth Low Energy Broadcasts</string>
<string name="troubleshooter_ble_intro_body1">AirPods (and similar headphones) broadcast status information using a BLE technology called \"advertisements\". Some phones don\'t implement this technology correctly. CAPod can attempt to fix this by trying different compatibility options until data is received. Start music playback on your headphones and place them close to your phone, then start the process.</string>
<string name="troubleshooter_ble_intro_start_action">Start troubleshooting</string>
<string name="troubleshooter_ble_process_title">Troubleshoot in progress</string>
<string name="troubleshooter_ble_process_subtile">Each step takes 510 seconds</string>
<string name="troubleshooter_ble_result_success_title">Success</string>
<string name="troubleshooter_ble_result_success_body">BLE advertisement broadcasts are being received by CAPod.</string>
<string name="troubleshooter_ble_result_failure_title">Unsuccessful</string>
<string name="troubleshooter_ble_result_failure_body">Troubleshooting failed. No combination of compatibility options helped.</string>
<string name="troubleshooter_ble_result_failure_phone_body">Your phone didn\'t receive any BLE data at all. You can retry this test in a crowded area to see if data sources (other than your headphones) can be received. No data being received points towards an issue with your phones operating system.</string>
<string name="troubleshooter_ble_result_failure_phone_headphones">Your phone received BLE data, but the data does not come from any supported device. Are your headphones powered on? Does CAPod support your headphone?</string>
<string name="troubleshooter_ble_result_failure_action">Try again</string>
<string name="troubleshoot_action">Troubleshoot</string>
</resources>
@@ -10,6 +10,9 @@ CAPod — праграма-кампаньён для AirPods.
* Аўтаматычнае злучэнне тэлефона і AirPods.
* Адлюстраванне апавяшчэння пры адкрытым футляры.
У CAPod ёсць версія для Wear-OS, якая паказвае стан бліжэйшай да вас прылады.
CAPod для Wear-OS з'яўляецца аўтаномнай праграмай і не патрабуе наяўнасці тэлефона.
CAPod не змяшчае рэкламы. Некаторыя функцыі патрабуюць пакупак у праграме.
Падтрымліваюцца найбольш папулярныя мадэлі AirPods і Beats.
@@ -10,6 +10,9 @@ Característiques:
* Connecta automàticament el telèfon i els AirPods.
* Mostra una finestra emergent quan s'obre la funda.
El CAPod té una versió Wear-OS que mostra l'estat del dispositiu AirPod que està més a prop vostre.
El CAPod per al Wear-OS és una aplicació autònoma i no requereix un telèfon.
CAPod no inclou anuncis. Algunes funcions requereixen una compra des de l'aplicació.
Els dispositius AirPods i Beats més populars són compatibles.
@@ -10,6 +10,9 @@ Funkce:
* Automatické připojení telefonu a sluchátek AirPods.
* Zobrazení vyskakovacího okna při otevření pouzdra.
CAPod má verzi Wear-OS zobrazující stav sluchátek, která jsou nejblíže k vám.
CAPod pro Wear-OS je samostatná aplikace a nevyžaduje telefon.
CAPod je bez reklam. Některé funkce vyžadují nákup v aplikaci.
Podporována je většina oblíbených zařízení AirPods a Beats.
@@ -10,6 +10,9 @@ Funktionen:
* Telefon und AirPods automatisch verbinden.
* Zeigt Pop-Ups an, wenn das Case geöffnet wird.
CAPod hat eine Wear-OS-Version, die den Status des Pod-Geräts anzeigt, das Ihnen am nächsten ist.
CAPod für Wear-OS ist eine eigenständige App und erfordert kein Telefon.
CAPod ist werbefrei. Einige Funktionen erfordern einen In-App-Kauf.
Die beliebtesten AirPods und Beats Kopfhörer werden unterstützt.
@@ -0,0 +1,2 @@
Bugfixes and performance improvements.
¯\_(ツ)_/¯
@@ -0,0 +1,2 @@
Bugfixes and performance improvements.
¯\_(ツ)_/¯
@@ -1,18 +1,21 @@
CAPod is a companion app for AirPods.
CAPod on AirPodsite kasutamist hõlbustav rakendus.
Features:
Võimalused:
* Battery level for pods and cases.
* Charging status for pods and case.
* Additional infos about connection, microphone and case.
* Can receive and show all nearby devices.
* Ear detection with automatic play/pause.
* Automatically connect phone and AirPods.
* Show popup when case is opened.
* klappide ja kaante aku tase;
* klappide ja kaane laadimise olek;
* ühenduse, mikrofoni ja kaane lisateave;
* tuvastab ja näitab kõiki lähedal asuvaid seadmeid;
* kõrva tuvastamisel esitab/pausib ise;
* telefon ja AirPodsid ühenduvad ise;
* hüpikakna näitamine, kui kaas avatud.
CAPod is ad-free. Some features require an in-app purchase.
CAPodist on klapi lähimat olekut näitav Wear-OS versioon.
CAPod Wear-OS-ile on eraldi rakendus, mis ei vaja telefoni.
Most popular AirPods and Beats devices are supported.
If your device is similar to AirPods but not yet supported, send me a short mail.
CAPodis pole reklaame. Osa võimalusi saab osta rakendusest.
Got a cool idea for a new feature? Reach out!
Tuntuimad AirPodsid ja Beatsi seadmed on toetatud.
AirPodsile sarnaneva seadme puhul kirjutage mulle lühike meil.
Vaja uut ja ägedat võimalust? Kirjuta!
@@ -1 +1 @@
CAPod is a companion app for AirPods on Android.
CAPod on Androidis AirPodsite kasutamist hõlbustav rakendus.
+1 -1
View File
@@ -1 +1 @@
CAPod - Companion for AirPods
CAPod - AirPodside abiline
@@ -10,6 +10,9 @@ Features:
* Automatically connect phone and AirPods.
* Show popup when case is opened.
CAPod has a Wear-OS version that shows the status of the pod device that is closest to you.
CAPod for Wear-OS is a stand-alone app and does not require a phone.
CAPod is ad-free. Some features require an in-app purchase.
Most popular AirPods and Beats devices are supported.
+1 -1
View File
@@ -1 +1 @@
Az AirPods kísérőalkalmazása
CAPod - Companion for AirPods
@@ -10,6 +10,9 @@ Functies:
* Automatisch verbinding maken met telefoon en AirPods.
* Toont pop-up wanneer case wordt geopend.
CAPod heeft een Wear-OS versie die je de status van de dichtsbijzijnde pod toont.
CAPod voor Wear-OS is een standalone applicatie die ook zonder telefoon werkt.
CAPod is advertentievrij. Sommige extra functies vereisen een in-app aankoop.
De meeste populaire AirPods- en Beats-apparaten worden ondersteund.
@@ -1,4 +1,4 @@
CAPod er en følgesvenn for AirPods.
CAPod er en følgesvenn-app for AirPods.
Funksjoner:
@@ -10,6 +10,9 @@ Funksjoner:
* Koble telefonen til AirPods automatisk.
* Vis popup når dekselet åpnes.
CAPod har en Wear-OS-versjon som viser statusen til pod-enheten nærmest deg.
CAPod for Wear-OS er en frittstående app og krever ikke en telefon.
CAPod er reklamefri. Noen funksjoner krever et kjøp i appen.
De fleste populære AirPods og Beats-enheter støttes.
@@ -10,6 +10,9 @@ Funkcje:
* Automatyczne łączenie telefonu oraz AirPods.
* Wyświetlanie okienka, gdy obudowa jest otwarta.
CAPod ma wersję na Wear-OS, która pokazuje stan pod'ów znajdujących się najbliżej Ciebie.
CAPod dla Wear-OS to samodzielna aplikacja, która nie wymaga telefonu.
CAPod jest bez reklam. Niektóre funkcje wymagają zakupów wewnątrz aplikacji.
Większość popularnych urządzeń AirPods oraz Beats jest obsługiwana.
@@ -10,6 +10,9 @@ Recursos:
* Conecte automaticamente o smartphone e os AirPods.
* Mostrar pop-up quando o estojo é aberto.
O CAPod possui uma versão Wear-OS que mostra o status do dispositivo Airpod mais próximo de você.
O CAPod para Wear-OS é um aplicativo independente e não requer um telefone.
O CAPod é livre de anúncios. Alguns recursos exigem uma compra no aplicativo.
Os dispositivos AirPods e Beats mais populares são suportados.
+1 -1
View File
@@ -1 +1 @@
CAPod - Para AirPods
CAPod - Seu companheiro
@@ -10,6 +10,9 @@ CAPod - это приложение для AirPods.
* Автоматическое подключение телефона и AirPods.
* Отображение всплывающего окна при открытии футляра.
У CAPod есть версия для Wear-OS, она отображает статус ближайшего устройства.
CAPod для Wear-OS - независимое приложение, оно не требует телефона.
CAPod не содержит рекламы. Некоторые функции требуют покупок внутри приложения.
Поддерживаются наиболее популярные модели AirPods и Beats.
@@ -10,6 +10,9 @@ Funkcie:
* Automatické pripojenie telefónu a AirPods.
* Zobrazenie vyskakovacieho okna pri otvorení puzdra.
CAPod má verziu Wear-OS, ktorá zobrazuje stav pod-zariadenia, ktoré je najbližšie k vám.
CAPod pre Wear-OS je samostatná aplikácia, ktorá nevyžaduje telefón.
CAPod je bez reklám. Niektoré funkcie vyžadujú nákup v aplikácii.
Podporovaná je väčšina obľúbených zariadení AirPods a Beats.
@@ -10,7 +10,10 @@ CAPod 是一個能提供 AirPods 相關功能的應用程式。
* 自動連線手機和 AirPods。
* 開啟充電盒時顯示彈出式視窗。
CAPod 是無廣告的應用程式。 一些功能需要應用內購
CAPod 有一個 Wear-OS 版本,可以顯示離您最近的 Pod 裝置的狀態
CAPod 的 Wear-OS 版本是一個獨立的應用程式,不需要手機。
CAPod 是無廣告的應用程式。 一些功能需要應用程式內購。
支援大部分流行的 AirPods 和 Beats 裝置。
如果您的裝置和 AirPods 相似但並不支援,請寄給我一封郵件。
+2 -2
View File
@@ -1,6 +1,6 @@
### Updated by release.sh ###
project.versioning.major=2
project.versioning.minor=8
project.versioning.patch=4
project.versioning.minor=9
project.versioning.patch=1
project.versioning.build=0
#############################