mirror of
https://github.com/d4rken-org/capod.git
synced 2026-09-14 18:26:11 -04:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c437decbbf | ||
|
|
1d36677ead | ||
|
|
542b69ca92 | ||
|
|
8547c9c396 |
@@ -103,6 +103,9 @@ interface PodDevice {
|
|||||||
@Json(name = "fakes.tws.i99999") TWS_I99999(
|
@Json(name = "fakes.tws.i99999") TWS_I99999(
|
||||||
"TWS i99999"
|
"TWS i99999"
|
||||||
),
|
),
|
||||||
|
@Json(name = "fakes.varunr.airpodspro") VARUNR_AIRPODS_PRO(
|
||||||
|
"Varunr AirPods Pro"
|
||||||
|
),
|
||||||
@Json(name = "unknown") UNKNOWN(
|
@Json(name = "unknown") UNKNOWN(
|
||||||
"Unknown"
|
"Unknown"
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import dagger.multibindings.IntoSet
|
|||||||
import eu.darken.capod.pods.core.apple.airpods.*
|
import eu.darken.capod.pods.core.apple.airpods.*
|
||||||
import eu.darken.capod.pods.core.apple.beats.*
|
import eu.darken.capod.pods.core.apple.beats.*
|
||||||
import eu.darken.capod.pods.core.apple.misc.Twsi99999
|
import eu.darken.capod.pods.core.apple.misc.Twsi99999
|
||||||
|
import eu.darken.capod.pods.core.apple.misc.VarunrAirPodsPro
|
||||||
|
|
||||||
@InstallIn(SingletonComponent::class)
|
@InstallIn(SingletonComponent::class)
|
||||||
@Module
|
@Module
|
||||||
@@ -28,4 +29,6 @@ abstract class AppleFactoryModule {
|
|||||||
@Binds @IntoSet abstract fun powerBeatsPro(factory: PowerBeatsPro.Factory): ApplePodsFactory<out ApplePods>
|
@Binds @IntoSet abstract fun powerBeatsPro(factory: PowerBeatsPro.Factory): ApplePodsFactory<out ApplePods>
|
||||||
|
|
||||||
@Binds @IntoSet abstract fun fakesTwsi999999(factory: Twsi99999.Factory): ApplePodsFactory<out ApplePods>
|
@Binds @IntoSet abstract fun fakesTwsi999999(factory: Twsi99999.Factory): ApplePodsFactory<out ApplePods>
|
||||||
|
@Binds @IntoSet
|
||||||
|
abstract fun fakesVarunrAirPodsPro(factory: VarunrAirPodsPro.Factory): ApplePodsFactory<out ApplePods>
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
package eu.darken.capod.pods.core.apple.misc
|
||||||
|
|
||||||
|
import eu.darken.capod.common.bluetooth.BleScanResult
|
||||||
|
import eu.darken.capod.common.debug.logging.log
|
||||||
|
import eu.darken.capod.common.debug.logging.logTag
|
||||||
|
import eu.darken.capod.common.isBitSet
|
||||||
|
import eu.darken.capod.common.lowerNibble
|
||||||
|
import eu.darken.capod.common.upperNibble
|
||||||
|
import eu.darken.capod.pods.core.DualPodDevice
|
||||||
|
import eu.darken.capod.pods.core.HasCase
|
||||||
|
import eu.darken.capod.pods.core.HasDualMicrophone
|
||||||
|
import eu.darken.capod.pods.core.PodDevice
|
||||||
|
import eu.darken.capod.pods.core.apple.ApplePods
|
||||||
|
import eu.darken.capod.pods.core.apple.ApplePodsFactory
|
||||||
|
import eu.darken.capod.pods.core.apple.protocol.ProximityPairing
|
||||||
|
import java.time.Instant
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AirPods Pro clone similar to Twsi999999.
|
||||||
|
* Shorter data structure.
|
||||||
|
*/
|
||||||
|
data class VarunrAirPodsPro constructor(
|
||||||
|
override val identifier: PodDevice.Id = PodDevice.Id(),
|
||||||
|
override val seenLastAt: Instant = Instant.now(),
|
||||||
|
override val seenFirstAt: Instant = Instant.now(),
|
||||||
|
override val seenCounter: Int = 1,
|
||||||
|
override val scanResult: BleScanResult,
|
||||||
|
override val proximityMessage: ProximityPairing.Message,
|
||||||
|
override val confidence: Float = PodDevice.BASE_CONFIDENCE,
|
||||||
|
private val rssiAverage: Int? = null,
|
||||||
|
private val cachedBatteryPercentage: Float? = null,
|
||||||
|
) : ApplePods, DualPodDevice, HasDualMicrophone, HasCase {
|
||||||
|
|
||||||
|
override val model: PodDevice.Model = PodDevice.Model.VARUNR_AIRPODS_PRO
|
||||||
|
|
||||||
|
override val rssi: Int
|
||||||
|
get() = rssiAverage ?: super<ApplePods>.rssi
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normally values for the left pod are in the lower nibbles, if the left pod is primary (microphone)
|
||||||
|
* If the right pod is the primary, the values are flipped.
|
||||||
|
*/
|
||||||
|
val areValuesFlipped: Boolean
|
||||||
|
get() = !rawStatus.isBitSet(5)
|
||||||
|
|
||||||
|
override val batteryLeftPodPercent: Float?
|
||||||
|
get() {
|
||||||
|
val value = when (areValuesFlipped) {
|
||||||
|
true -> rawPodsBattery.upperNibble.toInt()
|
||||||
|
false -> rawPodsBattery.lowerNibble.toInt()
|
||||||
|
}
|
||||||
|
return when (value) {
|
||||||
|
15 -> null
|
||||||
|
else -> if (value > 10) {
|
||||||
|
log { "Left pod: Above 100% battery: $value" }
|
||||||
|
1.0f
|
||||||
|
} else {
|
||||||
|
(value / 10f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override val batteryRightPodPercent: Float?
|
||||||
|
get() {
|
||||||
|
val value = when (areValuesFlipped) {
|
||||||
|
true -> rawPodsBattery.lowerNibble.toInt()
|
||||||
|
false -> rawPodsBattery.upperNibble.toInt()
|
||||||
|
}
|
||||||
|
return when (value) {
|
||||||
|
15 -> null
|
||||||
|
else -> if (value > 10) {
|
||||||
|
log { "Right pod: Above 100% battery: $value" }
|
||||||
|
1.0f
|
||||||
|
} else {
|
||||||
|
value / 10f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val isThisPodInThecase: Boolean
|
||||||
|
get() = rawStatus.isBitSet(6)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The data flip bit is set if the left pod is primary.
|
||||||
|
* For the pod that is in the case, this is flipped again though.
|
||||||
|
*/
|
||||||
|
override val isLeftPodMicrophone: Boolean
|
||||||
|
get() = rawStatus.isBitSet(5) xor isThisPodInThecase
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The data flip bit is UNset if the right pod is primary.
|
||||||
|
* For the pod that is in the case, this is flipped again though.
|
||||||
|
*/
|
||||||
|
override val isRightPodMicrophone: Boolean
|
||||||
|
get() = !rawStatus.isBitSet(5) xor isThisPodInThecase
|
||||||
|
|
||||||
|
override val batteryCasePercent: Float?
|
||||||
|
get() = when (val value = rawCaseBattery.toInt()) {
|
||||||
|
15 -> cachedBatteryPercentage
|
||||||
|
else -> if (value > 10) {
|
||||||
|
log { "Case: Above 100% battery: $value" }
|
||||||
|
1.0f
|
||||||
|
} else {
|
||||||
|
value / 10f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override val isCaseCharging: Boolean
|
||||||
|
get() = rawFlags.isBitSet(2)
|
||||||
|
|
||||||
|
class Factory @Inject constructor() : ApplePodsFactory<VarunrAirPodsPro>(TAG) {
|
||||||
|
|
||||||
|
override fun isResponsible(message: ProximityPairing.Message): Boolean = message.run {
|
||||||
|
// Official message length is 19HEX, i.e. binary 25, did they copy this wrong?
|
||||||
|
getModelInfo().full == DEVICE_CODE && length == 19
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun create(scanResult: BleScanResult, message: ProximityPairing.Message): ApplePods {
|
||||||
|
var basic = VarunrAirPodsPro(scanResult = scanResult, proximityMessage = message)
|
||||||
|
val result = searchHistory(basic)
|
||||||
|
|
||||||
|
if (result != null) basic = basic.copy(identifier = result.id)
|
||||||
|
updateHistory(basic)
|
||||||
|
|
||||||
|
if (result == null) return basic
|
||||||
|
|
||||||
|
return basic.copy(
|
||||||
|
identifier = result.id,
|
||||||
|
seenFirstAt = result.seenFirstAt,
|
||||||
|
seenCounter = result.seenCounter,
|
||||||
|
confidence = result.confidence,
|
||||||
|
cachedBatteryPercentage = result.getLatestCaseBattery(),
|
||||||
|
rssiAverage = result.averageRssi(basic.rssi),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val DEVICE_CODE = 0x0E20.toUShort()
|
||||||
|
private val TAG = logTag("PodDevice", "Apple", "Varunr", "AirPodsPro")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -81,6 +81,7 @@
|
|||||||
<string name="settings_monitor_mode_label">Mode surveillance</string>
|
<string name="settings_monitor_mode_label">Mode surveillance</string>
|
||||||
<string name="settings_monitor_mode_description">Les circonstances de surveillance des données Bluetooth par l’appli.</string>
|
<string name="settings_monitor_mode_description">Les circonstances de surveillance des données Bluetooth par l’appli.</string>
|
||||||
<string name="settings_scanner_mode_label">Mode analyse</string>
|
<string name="settings_scanner_mode_label">Mode analyse</string>
|
||||||
|
<string name="settings_scanner_mode_description">L’analyseur des données « basse énergie » de Bluetooth devrait-il prioriser les performances ou préserver l’énergie ?</string>
|
||||||
<string name="settings_monitor_mode_manual_label">Si l’appli est en fonction</string>
|
<string name="settings_monitor_mode_manual_label">Si l’appli est en fonction</string>
|
||||||
<string name="settings_monitor_mode_automatic_label">Si l’appareil est connecté</string>
|
<string name="settings_monitor_mode_automatic_label">Si l’appareil est connecté</string>
|
||||||
<string name="settings_monitor_mode_always_label">Toujours</string>
|
<string name="settings_monitor_mode_always_label">Toujours</string>
|
||||||
@@ -88,10 +89,13 @@
|
|||||||
<string name="settings_scanner_mode_balanced_label">Équilibré</string>
|
<string name="settings_scanner_mode_balanced_label">Équilibré</string>
|
||||||
<string name="settings_scanner_mode_lowlatency_label">Faible latence</string>
|
<string name="settings_scanner_mode_lowlatency_label">Faible latence</string>
|
||||||
<string name="settings_autopause_label">Pause automatique</string>
|
<string name="settings_autopause_label">Pause automatique</string>
|
||||||
|
<string name="settings_autopause_description">Mettre le son en pause si vous ôtez l’appareil de votre oreille.</string>
|
||||||
<string name="settings_showall_label">Afficher tous les appareils</string>
|
<string name="settings_showall_label">Afficher tous les appareils</string>
|
||||||
<string name="settings_showall_description">Afficher les appareils d’autres personnes à proximité.</string>
|
<string name="settings_showall_description">Afficher les appareils d’autres personnes à proximité.</string>
|
||||||
<string name="settings_autopplay_label">Lecture automatique</string>
|
<string name="settings_autopplay_label">Lecture automatique</string>
|
||||||
|
<string name="settings_autoplay_description">Démarrer la lecture du son quand l’appareil est porté.</string>
|
||||||
<string name="settings_fake_data_label">Fausses données</string>
|
<string name="settings_fake_data_label">Fausses données</string>
|
||||||
|
<string name="settings_fake_data_description">Afficher les fausses données, c.-à-d. simuler les appareils qui n’existent pas.</string>
|
||||||
<string name="settings_debug_label">Paramètres de débogage</string>
|
<string name="settings_debug_label">Paramètres de débogage</string>
|
||||||
<string name="settings_debug_description">Autres paramètres pour aider à diagnostiquer les problèmes de l’appli.</string>
|
<string name="settings_debug_description">Autres paramètres pour aider à diagnostiquer les problèmes de l’appli.</string>
|
||||||
<string name="settings_signal_minimum_label">Qualité minimale du signal</string>
|
<string name="settings_signal_minimum_label">Qualité minimale du signal</string>
|
||||||
@@ -118,6 +122,7 @@
|
|||||||
<string name="overview_bluetooth_disabled_label">Le Bluetooth est désactivé</string>
|
<string name="overview_bluetooth_disabled_label">Le Bluetooth est désactivé</string>
|
||||||
<string name="overview_bluetooth_disabled_description">Le Bluetooth est désactivé, activez-le ;)</string>
|
<string name="overview_bluetooth_disabled_description">Le Bluetooth est désactivé, activez-le ;)</string>
|
||||||
<string name="help_translate_label">Traduction</string>
|
<string name="help_translate_label">Traduction</string>
|
||||||
|
<string name="help_translate_description">Aider à traduire cette appli dans votre langue préférée.</string>
|
||||||
<string name="settings_onepod_mode_label">Mode à un seul AirPod</string>
|
<string name="settings_onepod_mode_label">Mode à un seul AirPod</string>
|
||||||
<string name="settings_onepod_mode_description">Il n’est pas nécessaire de porter deux AirPods, en porter un seul suffit à déclencher les réactions.</string>
|
<string name="settings_onepod_mode_description">Il n’est pas nécessaire de porter deux AirPods, en porter un seul suffit à déclencher les réactions.</string>
|
||||||
<string name="permission_system_alert_window_label">Fenêtre d’alerte système</string>
|
<string name="permission_system_alert_window_label">Fenêtre d’alerte système</string>
|
||||||
@@ -127,4 +132,6 @@
|
|||||||
<string name="settings_blescanner_unfiltered_label">Données BÉB non filtrées</string>
|
<string name="settings_blescanner_unfiltered_label">Données BÉB non filtrées</string>
|
||||||
<string name="settings_blescanner_unfiltered_description">Supprimer tous les filtres de l’analyseur BÉB pour afficher toutes les données BÉB diffusées. Utile pour prendre en charge les nouveaux types de casques-micros.</string>
|
<string name="settings_blescanner_unfiltered_description">Supprimer tous les filtres de l’analyseur BÉB pour afficher toutes les données BÉB diffusées. Utile pour prendre en charge les nouveaux types de casques-micros.</string>
|
||||||
<string name="permission_required_title">L’autorisation suivante est nécessaire :</string>
|
<string name="permission_required_title">L’autorisation suivante est nécessaire :</string>
|
||||||
|
<string name="settings_compatibility_mode_label">Mode de compatibilité</string>
|
||||||
|
<string name="settings_compatibility_mode_description">Désactiver les optimisations pour améliorer la compatibilité. À essayer si vous ne voyez aucune donnée.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -81,6 +81,7 @@
|
|||||||
<string name="settings_monitor_mode_label">Mode monitor</string>
|
<string name="settings_monitor_mode_label">Mode monitor</string>
|
||||||
<string name="settings_monitor_mode_description">Dalam keadaan apa aplikasi ini memonitor data Bluetooth.</string>
|
<string name="settings_monitor_mode_description">Dalam keadaan apa aplikasi ini memonitor data Bluetooth.</string>
|
||||||
<string name="settings_scanner_mode_label">Modus memindai</string>
|
<string name="settings_scanner_mode_label">Modus memindai</string>
|
||||||
|
<string name="settings_scanner_mode_description">Haruskah pemindai data Bluetooth Hemat Energi memprioritaskan kinerja atau menghemat energi?</string>
|
||||||
<string name="settings_monitor_mode_manual_label">Saat aplikasi terbuka</string>
|
<string name="settings_monitor_mode_manual_label">Saat aplikasi terbuka</string>
|
||||||
<string name="settings_monitor_mode_automatic_label">Saat perangkat terhubung</string>
|
<string name="settings_monitor_mode_automatic_label">Saat perangkat terhubung</string>
|
||||||
<string name="settings_monitor_mode_always_label">Selalu</string>
|
<string name="settings_monitor_mode_always_label">Selalu</string>
|
||||||
@@ -88,10 +89,13 @@
|
|||||||
<string name="settings_scanner_mode_balanced_label">Seimbang</string>
|
<string name="settings_scanner_mode_balanced_label">Seimbang</string>
|
||||||
<string name="settings_scanner_mode_lowlatency_label">Latemsi rendah</string>
|
<string name="settings_scanner_mode_lowlatency_label">Latemsi rendah</string>
|
||||||
<string name="settings_autopause_label">Jeda otomatis</string>
|
<string name="settings_autopause_label">Jeda otomatis</string>
|
||||||
|
<string name="settings_autopause_description">Jeda audio saat melepaskan perangkat dari telinga anda.</string>
|
||||||
<string name="settings_showall_label">Tampilkan semua perangkat</string>
|
<string name="settings_showall_label">Tampilkan semua perangkat</string>
|
||||||
<string name="settings_showall_description">Tampilkan perangkat orang lain yang ada di dekat anda.</string>
|
<string name="settings_showall_description">Tampilkan perangkat orang lain yang ada di dekat anda.</string>
|
||||||
<string name="settings_autopplay_label">Putar otomatis</string>
|
<string name="settings_autopplay_label">Putar otomatis</string>
|
||||||
|
<string name="settings_autoplay_description">Mulai pemutaran audio saat perangkat dipakai.</string>
|
||||||
<string name="settings_fake_data_label">Data palsu</string>
|
<string name="settings_fake_data_label">Data palsu</string>
|
||||||
|
<string name="settings_fake_data_description">Tampilkan data palsu, yaitu, mensimulasikan perangkat yang tidak ada.</string>
|
||||||
<string name="settings_debug_label">Pengaturan debug</string>
|
<string name="settings_debug_label">Pengaturan debug</string>
|
||||||
<string name="settings_debug_description">Pengaturan tambahan untuk membantu memecahkan masalah dengan aplikasi.</string>
|
<string name="settings_debug_description">Pengaturan tambahan untuk membantu memecahkan masalah dengan aplikasi.</string>
|
||||||
<string name="settings_signal_minimum_label">Kualitas sinyal minimum</string>
|
<string name="settings_signal_minimum_label">Kualitas sinyal minimum</string>
|
||||||
@@ -118,6 +122,7 @@
|
|||||||
<string name="overview_bluetooth_disabled_label">Bluetooth dinonaktifkan</string>
|
<string name="overview_bluetooth_disabled_label">Bluetooth dinonaktifkan</string>
|
||||||
<string name="overview_bluetooth_disabled_description">Bluetooth dinonaktifkan, aktifkan terlebih dahulu ;)</string>
|
<string name="overview_bluetooth_disabled_description">Bluetooth dinonaktifkan, aktifkan terlebih dahulu ;)</string>
|
||||||
<string name="help_translate_label">Terjemahan</string>
|
<string name="help_translate_label">Terjemahan</string>
|
||||||
|
<string name="help_translate_description">Bantu terjemahkan applikasi ini ke bahasa favorit anda.</string>
|
||||||
<string name="settings_onepod_mode_label">Mode satu pod</string>
|
<string name="settings_onepod_mode_label">Mode satu pod</string>
|
||||||
<string name="settings_onepod_mode_description">Menggunakan kedua pod tidak diperlukan, memakai satu pod sudah cukup untuk memicu reaksi.</string>
|
<string name="settings_onepod_mode_description">Menggunakan kedua pod tidak diperlukan, memakai satu pod sudah cukup untuk memicu reaksi.</string>
|
||||||
<string name="permission_system_alert_window_label">Jendela Peringatan Sistem</string>
|
<string name="permission_system_alert_window_label">Jendela Peringatan Sistem</string>
|
||||||
@@ -127,4 +132,6 @@
|
|||||||
<string name="settings_blescanner_unfiltered_label">Data BLE yang tidak difilter</string>
|
<string name="settings_blescanner_unfiltered_label">Data BLE yang tidak difilter</string>
|
||||||
<string name="settings_blescanner_unfiltered_description">Hapus semua filter dari pemindai BLE untuk menampilkan semua data BLE yang disiarkan. Berguna untuk menambahkan dukungan pada jenis headphone baru.</string>
|
<string name="settings_blescanner_unfiltered_description">Hapus semua filter dari pemindai BLE untuk menampilkan semua data BLE yang disiarkan. Berguna untuk menambahkan dukungan pada jenis headphone baru.</string>
|
||||||
<string name="permission_required_title">Izin berikut diperlukan:</string>
|
<string name="permission_required_title">Izin berikut diperlukan:</string>
|
||||||
|
<string name="settings_compatibility_mode_label">Mode kompatibilitas</string>
|
||||||
|
<string name="settings_compatibility_mode_description">Nonaktifkan pengoptimalan untuk meningkatkan kompatibilitas. Coba ini jika anda tidak melihat data apa pun.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -81,6 +81,7 @@
|
|||||||
<string name="settings_monitor_mode_label">Monitor modus</string>
|
<string name="settings_monitor_mode_label">Monitor modus</string>
|
||||||
<string name="settings_monitor_mode_description">Onder welke omstandigheden houdt deze app Bluetooth-gegevens bij.</string>
|
<string name="settings_monitor_mode_description">Onder welke omstandigheden houdt deze app Bluetooth-gegevens bij.</string>
|
||||||
<string name="settings_scanner_mode_label">Scannermodus</string>
|
<string name="settings_scanner_mode_label">Scannermodus</string>
|
||||||
|
<string name="settings_scanner_mode_description">Moet de Bluetooth Low Energy-gegevensscanner prioriteit geven aan prestaties of energie besparen?</string>
|
||||||
<string name="settings_monitor_mode_manual_label">Wanneer app is geopend</string>
|
<string name="settings_monitor_mode_manual_label">Wanneer app is geopend</string>
|
||||||
<string name="settings_monitor_mode_automatic_label">Wanneer het apparaat is aangesloten</string>
|
<string name="settings_monitor_mode_automatic_label">Wanneer het apparaat is aangesloten</string>
|
||||||
<string name="settings_monitor_mode_always_label">Altijd</string>
|
<string name="settings_monitor_mode_always_label">Altijd</string>
|
||||||
@@ -88,10 +89,13 @@
|
|||||||
<string name="settings_scanner_mode_balanced_label">Gebalanceerd</string>
|
<string name="settings_scanner_mode_balanced_label">Gebalanceerd</string>
|
||||||
<string name="settings_scanner_mode_lowlatency_label">Lage latentie</string>
|
<string name="settings_scanner_mode_lowlatency_label">Lage latentie</string>
|
||||||
<string name="settings_autopause_label">Auto pauze</string>
|
<string name="settings_autopause_label">Auto pauze</string>
|
||||||
|
<string name="settings_autopause_description">Pauzeer de muziek wanneer u het apparaat van uw oor haalt.</string>
|
||||||
<string name="settings_showall_label">Alle apparaten weergeven</string>
|
<string name="settings_showall_label">Alle apparaten weergeven</string>
|
||||||
<string name="settings_showall_description">Toon apparaten van andere mensen die bij u in de buurt zijn.</string>
|
<string name="settings_showall_description">Toon apparaten van andere mensen die bij u in de buurt zijn.</string>
|
||||||
<string name="settings_autopplay_label">Automatisch afspelen</string>
|
<string name="settings_autopplay_label">Automatisch afspelen</string>
|
||||||
|
<string name="settings_autoplay_description">Start audioweergave wanneer het apparaat wordt gedragen.</string>
|
||||||
<string name="settings_fake_data_label">Nep gegevens</string>
|
<string name="settings_fake_data_label">Nep gegevens</string>
|
||||||
|
<string name="settings_fake_data_description">Toon nepgegevens, d.w.z. simuleer apparaten die niet bestaan.</string>
|
||||||
<string name="settings_debug_label">Foutopsporingsinstellingen</string>
|
<string name="settings_debug_label">Foutopsporingsinstellingen</string>
|
||||||
<string name="settings_debug_description">Aanvullende instellingen voor het oplossen van problemen met de app.</string>
|
<string name="settings_debug_description">Aanvullende instellingen voor het oplossen van problemen met de app.</string>
|
||||||
<string name="settings_signal_minimum_label">Minimale signaalkwaliteit</string>
|
<string name="settings_signal_minimum_label">Minimale signaalkwaliteit</string>
|
||||||
@@ -118,6 +122,7 @@
|
|||||||
<string name="overview_bluetooth_disabled_label">Bluetooth is uitgeschakeld</string>
|
<string name="overview_bluetooth_disabled_label">Bluetooth is uitgeschakeld</string>
|
||||||
<string name="overview_bluetooth_disabled_description">Bluetooth is uitgeschakeld, activeer het ;)</string>
|
<string name="overview_bluetooth_disabled_description">Bluetooth is uitgeschakeld, activeer het ;)</string>
|
||||||
<string name="help_translate_label">Vertaling</string>
|
<string name="help_translate_label">Vertaling</string>
|
||||||
|
<string name="help_translate_description">Help deze app te vertalen in uw favoriete taal.</string>
|
||||||
<string name="settings_onepod_mode_label">Eén pod-modus</string>
|
<string name="settings_onepod_mode_label">Eén pod-modus</string>
|
||||||
<string name="settings_onepod_mode_description">Het dragen van beide pods is niet vereist, het dragen van een enkele pod is voldoende om reacties uit te lokken.</string>
|
<string name="settings_onepod_mode_description">Het dragen van beide pods is niet vereist, het dragen van een enkele pod is voldoende om reacties uit te lokken.</string>
|
||||||
<string name="permission_system_alert_window_label">Systeemwaarschuwingsvenster</string>
|
<string name="permission_system_alert_window_label">Systeemwaarschuwingsvenster</string>
|
||||||
@@ -127,4 +132,6 @@
|
|||||||
<string name="settings_blescanner_unfiltered_label">Ongefilterde BLE-gegevens</string>
|
<string name="settings_blescanner_unfiltered_label">Ongefilterde BLE-gegevens</string>
|
||||||
<string name="settings_blescanner_unfiltered_description">Verwijder eventuele filters van de BLE-scanner om alle uitgezonden BLE-gegevens weer te geven. Handig om ondersteuning toe te voegen voor nieuwe typen hoofdtelefoons.</string>
|
<string name="settings_blescanner_unfiltered_description">Verwijder eventuele filters van de BLE-scanner om alle uitgezonden BLE-gegevens weer te geven. Handig om ondersteuning toe te voegen voor nieuwe typen hoofdtelefoons.</string>
|
||||||
<string name="permission_required_title">De volgende toestemming is vereist:</string>
|
<string name="permission_required_title">De volgende toestemming is vereist:</string>
|
||||||
|
<string name="settings_compatibility_mode_label">Compatibiliteitsmodus</string>
|
||||||
|
<string name="settings_compatibility_mode_description">Schakel optimalisaties uit om de compatibiliteit te verbeteren. Probeer dit als u geen gegevens ziet.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
<string name="permission_bluetooth_label">蓝牙</string>
|
<string name="permission_bluetooth_label">蓝牙</string>
|
||||||
<string name="permission_bluetooth_description">本应用需要“蓝牙”权限才能连接已配对的蓝牙设备</string>
|
<string name="permission_bluetooth_description">本应用需要“蓝牙”权限才能连接已配对的蓝牙设备</string>
|
||||||
<string name="permission_access_fine_location_label">访问精准位置</string>
|
<string name="permission_access_fine_location_label">访问精准位置</string>
|
||||||
<string name="permission_access_fine_location_description">CAPod 使用“精准定位”权限来接收低功耗蓝牙数据。您的耳机使用低功耗蓝牙技术来传播其状态,本应用「不会」通过蓝牙数据来给您定位。</string>
|
<string name="permission_access_fine_location_description">CAPod 使用“精准定位”权限来接收低功耗蓝牙数据。您的耳机使用低功耗蓝牙技术来广播其状态,本应用「不会」通过蓝牙数据测定您的位置。</string>
|
||||||
<string name="permission_background_location_label">在后台访问位置</string>
|
<string name="permission_background_location_label">在后台访问位置</string>
|
||||||
<string name="permission_background_location_description">CAPod 使用“在后台访问位置”权限以在本应用被关闭时继续提供如“显示弹窗”、“自动连接”等功能。此权限允许本应用在后台运行时继续接收蓝牙低功耗数据。本应用并不使用蓝牙数据来窥探您的位置。</string>
|
<string name="permission_background_location_description">CAPod 使用“在后台访问位置”权限以在本应用被关闭时继续提供如“显示弹窗”、“自动连接”等功能。此权限允许本应用在后台运行时继续接收蓝牙低功耗数据。本应用并不使用蓝牙数据来窥探您的位置。</string>
|
||||||
<string name="permission_ignore_battery_optimizations_label">禁用电池优化</string>
|
<string name="permission_ignore_battery_optimizations_label">禁用电池优化</string>
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
<string name="settings_debug_mode_label">调试模式</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_monitor_mode_label">监控模式</string>
|
<string name="settings_monitor_mode_label">监控模式</string>
|
||||||
<string name="settings_monitor_mode_description">此模式下本应用将监视蓝牙数据。</string>
|
<string name="settings_monitor_mode_description">决定本应用在何时收听蓝牙数据。</string>
|
||||||
<string name="settings_scanner_mode_label">扫描模式</string>
|
<string name="settings_scanner_mode_label">扫描模式</string>
|
||||||
<string name="settings_scanner_mode_description">低功耗蓝牙数据扫描器应着重性能还是省电?</string>
|
<string name="settings_scanner_mode_description">低功耗蓝牙数据扫描器应着重性能还是省电?</string>
|
||||||
<string name="settings_monitor_mode_manual_label">应用打开时</string>
|
<string name="settings_monitor_mode_manual_label">应用打开时</string>
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
<string name="settings_popup_caseopen_label">显示弹窗</string>
|
<string name="settings_popup_caseopen_label">显示弹窗</string>
|
||||||
<string name="settings_popup_caseopen_description">设备充电仓打开时显示弹窗(实验性)</string>
|
<string name="settings_popup_caseopen_description">设备充电仓打开时显示弹窗(实验性)</string>
|
||||||
<string name="overview_bluetooth_disabled_label">蓝牙已禁用</string>
|
<string name="overview_bluetooth_disabled_label">蓝牙已禁用</string>
|
||||||
<string name="overview_bluetooth_disabled_description">蓝牙已关闭,请启用之 ;)</string>
|
<string name="overview_bluetooth_disabled_description">蓝牙已关闭,请开启 ;)</string>
|
||||||
<string name="help_translate_label">翻译</string>
|
<string name="help_translate_label">翻译</string>
|
||||||
<string name="help_translate_description">帮助翻译本应用</string>
|
<string name="help_translate_description">帮助翻译本应用</string>
|
||||||
<string name="settings_onepod_mode_label">单耳模式</string>
|
<string name="settings_onepod_mode_label">单耳模式</string>
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
<string name="settings_support_installid_label">安裝 ID</string>
|
<string name="settings_support_installid_label">安裝 ID</string>
|
||||||
<string name="settings_support_installid_desc">自動傳送的錯誤報告是匿名的。如果開發人員需要找出你的錯誤報告將分享你的安裝 ID。</string>
|
<string name="settings_support_installid_desc">自動傳送的錯誤報告是匿名的。如果開發人員需要找出你的錯誤報告將分享你的安裝 ID。</string>
|
||||||
<string name="settings_support_label">支援</string>
|
<string name="settings_support_label">支援</string>
|
||||||
<string name="settings_support_description">如果你需要幫助。</string>
|
<string name="settings_support_description">如果你需要協助。</string>
|
||||||
<string name="issue_tracker_label">問題追蹤器</string>
|
<string name="issue_tracker_label">問題追蹤器</string>
|
||||||
<string name="issue_tracker_description">一個用於錯誤回報和功能需求的公用問題追蹤器 (僅英文)。</string>
|
<string name="issue_tracker_description">一個用於錯誤回報和功能需求的公用問題追蹤器 (僅英文)。</string>
|
||||||
<string name="discord_label">Discord</string>
|
<string name="discord_label">Discord</string>
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
<string name="settings_fake_data_label">假資料</string>
|
<string name="settings_fake_data_label">假資料</string>
|
||||||
<string name="settings_fake_data_description">顯示假資料,模擬不存在的裝置。</string>
|
<string name="settings_fake_data_description">顯示假資料,模擬不存在的裝置。</string>
|
||||||
<string name="settings_debug_label">偵錯設定</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_label">最低訊號質量</string>
|
||||||
<string name="settings_signal_minimum_description">可以被認為是你的裝置的最低訊號質量。</string>
|
<string name="settings_signal_minimum_description">可以被認為是你的裝置的最低訊號質量。</string>
|
||||||
<string name="settings_autoconnect_label">自動連線</string>
|
<string name="settings_autoconnect_label">自動連線</string>
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
<string name="settings_maindevice_address_description">你的已配對裝置的位址。這個應用程式用該位址來確定何時連線到你的手機。</string>
|
<string name="settings_maindevice_address_description">你的已配對裝置的位址。這個應用程式用該位址來確定何時連線到你的手機。</string>
|
||||||
<string name="settings_maindevice_address_none">無</string>
|
<string name="settings_maindevice_address_none">無</string>
|
||||||
<string name="settings_maindevice_model_label">你的裝置型號</string>
|
<string name="settings_maindevice_model_label">你的裝置型號</string>
|
||||||
<string name="settings_maindevice_model_description">你的主要裝置型號。這能幫助這個應用程式在未連線到你的手機時辨識你的裝置。</string>
|
<string name="settings_maindevice_model_description">你的主要裝置型號。這能協助這個應用程式在未連線到你的手機時辨識你的裝置。</string>
|
||||||
<string name="settings_reaction_autoconnect_whenseen_label">看到時</string>
|
<string name="settings_reaction_autoconnect_whenseen_label">看到時</string>
|
||||||
<string name="settings_reaction_autoconnect_caseopen_label">充電盒開啟</string>
|
<string name="settings_reaction_autoconnect_caseopen_label">充電盒開啟</string>
|
||||||
<string name="settings_reaction_autoconnect_inear_label">在耳中</string>
|
<string name="settings_reaction_autoconnect_inear_label">在耳中</string>
|
||||||
|
|||||||
@@ -144,4 +144,6 @@
|
|||||||
<string name="permission_required_title">The following permission is required:</string>
|
<string name="permission_required_title">The following permission is required:</string>
|
||||||
<string name="settings_compatibility_mode_label">Compatibility mode</string>
|
<string name="settings_compatibility_mode_label">Compatibility mode</string>
|
||||||
<string name="settings_compatibility_mode_description">Disable optimizations to improve compatibility. Try this if you are not seeing any data.</string>
|
<string name="settings_compatibility_mode_description">Disable optimizations to improve compatibility. Try this if you are not seeing any data.</string>
|
||||||
|
<string name="translators_thanks_title">Translators</string>
|
||||||
|
<string name="translators_thanks_description">darken</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -4,6 +4,15 @@
|
|||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/general_thank_you_label"
|
android:title="@string/general_thank_you_label"
|
||||||
app:iconSpaceReserved="false">
|
app:iconSpaceReserved="false">
|
||||||
|
<Preference
|
||||||
|
android:key="thanks.translators"
|
||||||
|
android:summary="@string/translators_thanks_description"
|
||||||
|
android:title="@string/translators_thanks_title"
|
||||||
|
app:iconSpaceReserved="false">
|
||||||
|
<intent
|
||||||
|
android:action="android.intent.action.VIEW"
|
||||||
|
android:data="https://crowdin.com/project/capod/activity-stream" />
|
||||||
|
</Preference>
|
||||||
<Preference
|
<Preference
|
||||||
android:key="thanks.maxpatchs"
|
android:key="thanks.maxpatchs"
|
||||||
android:summary="Thanks for the lovely icons."
|
android:summary="Thanks for the lovely icons."
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package eu.darken.capod.pods.core.apple.misc
|
||||||
|
|
||||||
|
import eu.darken.capod.pods.core.apple.BaseAirPodsTest
|
||||||
|
import io.kotest.matchers.shouldBe
|
||||||
|
import kotlinx.coroutines.test.runBlockingTest
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
class VarunrAirPodsProTest : BaseAirPodsTest() {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `guessed data`() = runBlockingTest {
|
||||||
|
create<VarunrAirPodsPro>("07 13 01 0E 20 71 AA 37 36 00 10 00 FF 64 FF 00 00 00 00 00 00") {
|
||||||
|
rawPrefix shouldBe 0x01.toUByte()
|
||||||
|
rawDeviceModel shouldBe 0x0E20.toUShort()
|
||||||
|
rawStatus shouldBe 0x71.toUByte()
|
||||||
|
rawPodsBattery shouldBe 0xAA.toUByte()
|
||||||
|
rawFlags shouldBe 0x3.toUShort()
|
||||||
|
rawCaseBattery shouldBe 0x7.toUShort()
|
||||||
|
rawCaseLidState shouldBe 0x36.toUByte()
|
||||||
|
rawDeviceColor shouldBe 0x00.toUByte()
|
||||||
|
rawSuffix shouldBe 0x10.toUByte()
|
||||||
|
|
||||||
|
batteryLeftPodPercent shouldBe 1.0f
|
||||||
|
batteryRightPodPercent shouldBe 1.0f
|
||||||
|
|
||||||
|
isCaseCharging shouldBe false
|
||||||
|
|
||||||
|
batteryCasePercent shouldBe 0.7f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -8,7 +8,7 @@ buildscript {
|
|||||||
'version' : [
|
'version' : [
|
||||||
'major': 1,
|
'major': 1,
|
||||||
'minor': 3,
|
'minor': 3,
|
||||||
'patch': 7,
|
'patch': 8,
|
||||||
'build': 0,
|
'build': 0,
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
CAPod - Companion for AirPods
|
CAPod - Assistent pels AirPods
|
||||||
@@ -1 +1 @@
|
|||||||
CAPod - Companion for AirPods
|
CAPod - Asistente para AirPods
|
||||||
@@ -1 +1 @@
|
|||||||
CAPod - Companion for AirPods
|
CAPod - Pendamping AirPods
|
||||||
@@ -6,7 +6,7 @@ CAPod 是为 AirPods 提供配套功能的一个应用。
|
|||||||
* 有关连接、麦克风和充电仓的附加信息。
|
* 有关连接、麦克风和充电仓的附加信息。
|
||||||
* 能够接收和显示位于附近的全部设备。
|
* 能够接收和显示位于附近的全部设备。
|
||||||
* 佩戴/取下时自动开始/暂停音乐播放。
|
* 佩戴/取下时自动开始/暂停音乐播放。
|
||||||
* Automatically connect phone and AirPods.
|
* 自动连接手机与 AirPods。
|
||||||
* 充电仓打开时显示弹窗。
|
* 充电仓打开时显示弹窗。
|
||||||
|
|
||||||
CAPod 是一款免费共享软件。 某些功能需在应用内购买。
|
CAPod 是一款免费共享软件。 某些功能需在应用内购买。
|
||||||
|
|||||||
Reference in New Issue
Block a user