From 89632d864a62be4bacea9b7bbbc0c4a89bdd7ccc Mon Sep 17 00:00:00 2001 From: darken Date: Sun, 7 Sep 2025 07:32:21 +0200 Subject: [PATCH] Remove deviceModel property from ApplePodsFactory interface Removed the deviceModel property from ApplePodsFactory interface and all 25 implementing classes across AirPods, Beats, and misc device factories. This simplifies the factory pattern as the model information can be derived from the concrete implementation type itself. --- .../capod/devices/core/DeviceProfile.kt | 23 ----- .../capod/devices/core/DeviceProfilesRepo.kt | 87 ------------------- .../capod/pods/core/apple/AppleFactory.kt | 62 ++++++------- .../darken/capod/pods/core/apple/ApplePods.kt | 4 +- .../capod/pods/core/apple/ApplePodsFactory.kt | 1 - .../pods/core/apple/airpods/AirPodsGen1.kt | 1 - .../pods/core/apple/airpods/AirPodsGen2.kt | 1 - .../pods/core/apple/airpods/AirPodsGen3.kt | 1 - .../pods/core/apple/airpods/AirPodsGen4.kt | 1 - .../pods/core/apple/airpods/AirPodsGen4Anc.kt | 1 - .../pods/core/apple/airpods/AirPodsMax.kt | 1 - .../pods/core/apple/airpods/AirPodsMaxUsbc.kt | 1 - .../pods/core/apple/airpods/AirPodsPro.kt | 1 - .../pods/core/apple/airpods/AirPodsPro2.kt | 1 - .../core/apple/airpods/AirPodsPro2Usbc.kt | 1 - .../pods/core/apple/beats/BeatsFitPro.kt | 1 - .../capod/pods/core/apple/beats/BeatsFlex.kt | 1 - .../capod/pods/core/apple/beats/BeatsSolo3.kt | 1 - .../pods/core/apple/beats/BeatsStudio3.kt | 1 - .../capod/pods/core/apple/beats/BeatsX.kt | 1 - .../pods/core/apple/beats/PowerBeats3.kt | 1 - .../pods/core/apple/beats/PowerBeats4.kt | 1 - .../pods/core/apple/beats/PowerBeatsPro.kt | 1 - .../pods/core/apple/beats/PowerBeatsPro2.kt | 1 - .../pods/core/apple/misc/FakeAirPodsGen1.kt | 1 - .../pods/core/apple/misc/FakeAirPodsGen2.kt | 1 - .../pods/core/apple/misc/FakeAirPodsGen3.kt | 1 - .../pods/core/apple/misc/FakeAirPodsPro.kt | 1 - .../pods/core/apple/misc/FakeAirPodsPro2.kt | 1 - .../core/apple/misc/UnknownAppleDevice.kt | 1 - .../capod/profiles/core/AppleDeviceProfile.kt | 2 +- 31 files changed, 36 insertions(+), 168 deletions(-) delete mode 100644 app-common/src/main/java/eu/darken/capod/devices/core/DeviceProfile.kt delete mode 100644 app-common/src/main/java/eu/darken/capod/devices/core/DeviceProfilesRepo.kt diff --git a/app-common/src/main/java/eu/darken/capod/devices/core/DeviceProfile.kt b/app-common/src/main/java/eu/darken/capod/devices/core/DeviceProfile.kt deleted file mode 100644 index cb33e984..00000000 --- a/app-common/src/main/java/eu/darken/capod/devices/core/DeviceProfile.kt +++ /dev/null @@ -1,23 +0,0 @@ -package eu.darken.capod.devices.core - -import android.os.Parcelable -import com.squareup.moshi.JsonClass -import eu.darken.capod.common.bluetooth.BluetoothAddress -import eu.darken.capod.pods.core.PodDevice -import eu.darken.capod.pods.core.apple.protocol.IdentityResolvingKey -import eu.darken.capod.pods.core.apple.protocol.ProximityEncryptionKey -import kotlinx.parcelize.Parcelize -import java.util.UUID - -@Parcelize -@JsonClass(generateAdapter = true) -data class DeviceProfile( - val id: String = UUID.randomUUID().toString(), - val name: String, - val address: BluetoothAddress? = null, - val model: PodDevice.Model = PodDevice.Model.UNKNOWN, - val identityKey: IdentityResolvingKey? = null, - val encryptionKey: ProximityEncryptionKey? = null, - val minimumSignalQuality: Float = 0.20f, - val isEnabled: Boolean = true -) : Parcelable \ No newline at end of file diff --git a/app-common/src/main/java/eu/darken/capod/devices/core/DeviceProfilesRepo.kt b/app-common/src/main/java/eu/darken/capod/devices/core/DeviceProfilesRepo.kt deleted file mode 100644 index 1f51943d..00000000 --- a/app-common/src/main/java/eu/darken/capod/devices/core/DeviceProfilesRepo.kt +++ /dev/null @@ -1,87 +0,0 @@ -package eu.darken.capod.devices.core - -import android.content.Context -import android.content.SharedPreferences -import com.squareup.moshi.Moshi -import com.squareup.moshi.Types -import dagger.hilt.android.qualifiers.ApplicationContext -import eu.darken.capod.common.debug.logging.Logging.Priority.VERBOSE -import eu.darken.capod.common.debug.logging.log -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class DeviceProfilesRepo @Inject constructor( - @ApplicationContext private val context: Context, - private val moshi: Moshi, -) { - - private val preferences: SharedPreferences = context.getSharedPreferences("device_profiles", Context.MODE_PRIVATE) - - private val _profiles = MutableStateFlow>(emptyList()) - val profiles: Flow> = _profiles.asStateFlow() - - private val listType = Types.newParameterizedType(List::class.java, DeviceProfile::class.java) - private val adapter = moshi.adapter>(listType) - - init { - loadProfiles() - } - - private fun loadProfiles() { - val json = preferences.getString(KEY_PROFILES, null) - val loadedProfiles = if (json != null) { - try { - adapter.fromJson(json) ?: emptyList() - } catch (e: Exception) { - log(VERBOSE) { "Failed to load device profiles: $e" } - emptyList() - } - } else { - emptyList() - } - _profiles.value = loadedProfiles - log(VERBOSE) { "Loaded ${loadedProfiles.size} device profiles" } - } - - private fun saveProfiles() { - val json = adapter.toJson(_profiles.value) - preferences.edit().putString(KEY_PROFILES, json).apply() - log(VERBOSE) { "Saved ${_profiles.value.size} device profiles" } - } - - fun addProfile(profile: DeviceProfile) { - val updatedProfiles = _profiles.value.toMutableList() - updatedProfiles.add(profile) - _profiles.value = updatedProfiles - saveProfiles() - } - - fun updateProfile(profile: DeviceProfile) { - val updatedProfiles = _profiles.value.toMutableList() - val index = updatedProfiles.indexOfFirst { it.id == profile.id } - if (index != -1) { - updatedProfiles[index] = profile - _profiles.value = updatedProfiles - saveProfiles() - } - } - - fun removeProfile(profileId: String) { - val updatedProfiles = _profiles.value.toMutableList() - updatedProfiles.removeAll { it.id == profileId } - _profiles.value = updatedProfiles - saveProfiles() - } - - fun getProfile(profileId: String): DeviceProfile? { - return _profiles.value.find { it.id == profileId } - } - - companion object { - private const val KEY_PROFILES = "profiles" - } -} \ No newline at end of file diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/AppleFactory.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/AppleFactory.kt index cfaa29a4..60c40cce 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/AppleFactory.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/AppleFactory.kt @@ -61,49 +61,53 @@ class AppleFactory @Inject constructor( suspend fun create(scanResult: BleScanResult): PodDevice? = lock.withLock { val proximityMessage = getMessage(scanResult) ?: return@withLock null - - var isIRKMatch = false - val candidates = profilesRepo.profiles.first().filterIsInstance() - var profile = candidates.firstOrNull { - it.identityKey != null && rpaChecker.verify(scanResult.address, it.identityKey) - } - if (profile != null) { - isIRKMatch = true - log(TAG, VERBOSE) { "Got IRK match for from $profile for $scanResult" } - } - val factory = podFactories.firstOrNull { it.isResponsible(proximityMessage) } ?: unknownAppleFactory - // TODO more checks heuristicbased - if (profile == null) { - profile = candidates.firstOrNull { it.model == factory.deviceModel } - log(TAG, VERBOSE) { "Got no IRK match for from $profile for $scanResult" } + val profiles = profilesRepo.profiles.first().filterIsInstance() + var profile = profiles.firstOrNull { + it.identityKey != null && rpaChecker.verify(scanResult.address, it.identityKey) } - val payload = ProximityPayload( + val isIrkMatch = profile != null + if (isIrkMatch) log(TAG, VERBOSE) { "IRK match for $scanResult -> $profile" } + + var payload = ProximityPayload( public = ProximityPayload.Public( proximityMessage.data.take(9).toUByteArray() ), - private = run { - if (!isIRKMatch || profile == null) return@run null - if (proximityMessage.data.size != ProximityPairing.PAIRING_MESSAGE_LENGTH) return@run null - - val encKey = profile.encryptionKey?.takeIf { it.isNotEmpty() } - if (encKey == null) return@run null - - val encrypted = proximityMessage.data.takeLast(16).toUByteArray().toByteArray() - proximityMessageDecrypter.decrypt(encrypted, encKey)?.let { - ProximityPayload.Private(data = it) - } - }, + private = null, ) + if (profile != null && profile.encryptionKey != null) { + payload = payload.copy( + private = run { + if (proximityMessage.data.size != ProximityPairing.PAIRING_MESSAGE_LENGTH) return@run null + val encKey = profile.encryptionKey + val encrypted = proximityMessage.data.takeLast(16).toUByteArray().toByteArray() + proximityMessageDecrypter.decrypt(encrypted, encKey)?.let { + ProximityPayload.Private(data = it) + } + }, + ) + } + + if (profile == null) { + val tempDevice = factory.create( + scanResult = scanResult, + payload = payload, + meta = ApplePods.AppleMeta(), + ) + profile = profiles + .filter { it.model == tempDevice.model } + .filter { it.minimumSignalQuality <= tempDevice.signalQuality } + .firstOrNull() + } factory.create( scanResult = scanResult, payload = payload, meta = ApplePods.AppleMeta( - isIRKMatch = isIRKMatch, + isIRKMatch = profile != null, profile = profile, ), ) diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/ApplePods.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/ApplePods.kt index 5deeac32..c333f624 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/ApplePods.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/ApplePods.kt @@ -57,8 +57,8 @@ interface ApplePods : PodDevice { } data class AppleMeta( - val isIRKMatch: Boolean, - override val profile: AppleDeviceProfile?, + val isIRKMatch: Boolean = false, + override val profile: AppleDeviceProfile? = null, ) : PodDevice.Meta override val meta: AppleMeta diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/ApplePodsFactory.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/ApplePodsFactory.kt index 0281a8d4..6cc4befa 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/ApplePodsFactory.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/ApplePodsFactory.kt @@ -7,7 +7,6 @@ import eu.darken.capod.pods.core.apple.protocol.ProximityMessage import eu.darken.capod.pods.core.apple.protocol.ProximityPayload interface ApplePodsFactory { - val deviceModel: PodDevice.Model fun isResponsible(message: ProximityMessage): Boolean fun create(scanResult: BleScanResult, payload: ProximityPayload, meta: ApplePods.AppleMeta): ApplePods diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen1.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen1.kt index 8018c7a5..7a9d4625 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen1.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen1.kt @@ -42,7 +42,6 @@ data class AirPodsGen1( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_GEN1 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen2.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen2.kt index 46c96fc0..41ce1d04 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen2.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen2.kt @@ -42,7 +42,6 @@ data class AirPodsGen2( private val repo: PodHistoryRepo ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_GEN2 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen3.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen3.kt index 746ecaf9..b4174fc2 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen3.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen3.kt @@ -42,7 +42,6 @@ data class AirPodsGen3( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_GEN3 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen4.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen4.kt index 6244659a..6a69ce1a 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen4.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen4.kt @@ -42,7 +42,6 @@ data class AirPodsGen4( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_GEN4 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen4Anc.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen4Anc.kt index 7c8cfe7d..51dedf3d 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen4Anc.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsGen4Anc.kt @@ -41,7 +41,6 @@ data class AirPodsGen4Anc( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_GEN4_ANC override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMax.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMax.kt index 7358dcde..cf52b71c 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMax.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMax.kt @@ -48,7 +48,6 @@ data class AirPodsMax( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_MAX override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxUsbc.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxUsbc.kt index 710492fe..7420d97e 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxUsbc.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsMaxUsbc.kt @@ -48,7 +48,6 @@ data class AirPodsMaxUsbc( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_MAX_USBC override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro.kt index 90761e9d..6cc95eb2 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro.kt @@ -60,7 +60,6 @@ data class AirPodsPro( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_PRO override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro2.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro2.kt index d93470ad..90ddb7c0 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro2.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro2.kt @@ -60,7 +60,6 @@ data class AirPodsPro2( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_PRO2 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro2Usbc.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro2Usbc.kt index 0c0edb00..1882251d 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro2Usbc.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/airpods/AirPodsPro2Usbc.kt @@ -60,7 +60,6 @@ data class AirPodsPro2Usbc( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.AIRPODS_PRO2_USBC override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsFitPro.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsFitPro.kt index a7a3bdb2..11b756e8 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsFitPro.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsFitPro.kt @@ -41,7 +41,6 @@ data class BeatsFitPro( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.BEATS_FIT_PRO override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsFlex.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsFlex.kt index ec6dc455..3273df38 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsFlex.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsFlex.kt @@ -33,7 +33,6 @@ data class BeatsFlex( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.BEATS_FLEX override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsSolo3.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsSolo3.kt index 62440ec5..eb8aa872 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsSolo3.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsSolo3.kt @@ -32,7 +32,6 @@ data class BeatsSolo3( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.BEATS_SOLO_3 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsStudio3.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsStudio3.kt index 5c39790a..fb8b94f4 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsStudio3.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsStudio3.kt @@ -30,7 +30,6 @@ data class BeatsStudio3( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.BEATS_STUDIO_3 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().dirty == DEVICE_CODE_DIRTY && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsX.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsX.kt index 33ba823b..56648ca5 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsX.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/BeatsX.kt @@ -33,7 +33,6 @@ data class BeatsX( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.BEATS_X override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeats3.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeats3.kt index e9b1fd21..48473e1a 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeats3.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeats3.kt @@ -33,7 +33,6 @@ data class PowerBeats3( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.POWERBEATS_3 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeats4.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeats4.kt index 6363caca..918fd893 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeats4.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeats4.kt @@ -34,7 +34,6 @@ data class PowerBeats4( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.POWERBEATS_4 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeatsPro.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeatsPro.kt index d54bbe0b..b049ba6d 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeatsPro.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeatsPro.kt @@ -41,7 +41,6 @@ data class PowerBeatsPro( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.POWERBEATS_PRO override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeatsPro2.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeatsPro2.kt index 158e8a1c..891ce677 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeatsPro2.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/beats/PowerBeatsPro2.kt @@ -41,7 +41,6 @@ data class PowerBeatsPro2( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.POWERBEATS_PRO2 override fun isResponsible(message: ProximityMessage): Boolean = message.run { getModelInfo().full == DEVICE_CODE && length == ProximityPairing.PAIRING_MESSAGE_LENGTH } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen1.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen1.kt index 1d3e658f..06fd7ead 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen1.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen1.kt @@ -44,7 +44,6 @@ data class FakeAirPodsGen1( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.FAKE_AIRPODS_GEN1 override fun isResponsible(message: ProximityMessage): Boolean = message.run { // Official message length is 19HEX, i.e. binary 25, did they copy this wrong? getModelInfo().full == DEVICE_CODE && length == 19 diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen2.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen2.kt index 89f95479..2143082d 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen2.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen2.kt @@ -42,7 +42,6 @@ data class FakeAirPodsGen2( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.FAKE_AIRPODS_GEN2 override fun isResponsible(message: ProximityMessage): Boolean = message.run { // Official message length is 19HEX, i.e. binary 25, did they copy this wrong? getModelInfo().full == DEVICE_CODE && length == 19 diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen3.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen3.kt index 4fcbcfa6..dede2d32 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen3.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsGen3.kt @@ -44,7 +44,6 @@ data class FakeAirPodsGen3( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.FAKE_AIRPODS_GEN3 override fun isResponsible(message: ProximityMessage): Boolean = message.run { // Official message length is 19HEX, i.e. binary 25, did they copy this wrong? getModelInfo().full == DEVICE_CODE && length == 19 diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsPro.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsPro.kt index 1fa1c640..f7166389 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsPro.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsPro.kt @@ -62,7 +62,6 @@ data class FakeAirPodsPro( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.FAKE_AIRPODS_PRO override fun isResponsible(message: ProximityMessage): Boolean = message.run { // Official message length is 19HEX, i.e. binary 25, did they copy this wrong? getModelInfo().full == DEVICE_CODE && length == 19 diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsPro2.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsPro2.kt index 90682ba7..5b7b4835 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsPro2.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/FakeAirPodsPro2.kt @@ -66,7 +66,6 @@ data class FakeAirPodsPro2( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.FAKE_AIRPODS_PRO2 override fun isResponsible(message: ProximityMessage): Boolean = message.run { // Official message length is 19HEX, i.e. binary 25, did they copy this wrong? getModelInfo().full == DEVICE_CODE && length == 19 diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/UnknownAppleDevice.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/UnknownAppleDevice.kt index d1864504..956d87c6 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/misc/UnknownAppleDevice.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/misc/UnknownAppleDevice.kt @@ -35,7 +35,6 @@ data class UnknownAppleDevice( class Factory @Inject constructor( private val repo: PodHistoryRepo, ) : ApplePodsFactory { - override val deviceModel: PodDevice.Model = PodDevice.Model.UNKNOWN override fun isResponsible(message: ProximityMessage): Boolean = true override fun create( diff --git a/app/src/main/java/eu/darken/capod/profiles/core/AppleDeviceProfile.kt b/app/src/main/java/eu/darken/capod/profiles/core/AppleDeviceProfile.kt index ac62652e..fed45cac 100644 --- a/app/src/main/java/eu/darken/capod/profiles/core/AppleDeviceProfile.kt +++ b/app/src/main/java/eu/darken/capod/profiles/core/AppleDeviceProfile.kt @@ -15,7 +15,7 @@ data class AppleDeviceProfile( @Json(name = "label") override val label: String, @Json(name = "priority") override val priority: Int = 0, @Json(name = "model") override val model: PodDevice.Model = PodDevice.Model.UNKNOWN, - @Json(name = "minimumSignalQuality") override val minimumSignalQuality: Float? = DeviceProfile.DEFAULT_MINIMUM_SIGNAL_QUALITY, + @Json(name = "minimumSignalQuality") override val minimumSignalQuality: Float = DeviceProfile.DEFAULT_MINIMUM_SIGNAL_QUALITY, @Json(name = "identityKey") val identityKey: IdentityResolvingKey? = null, @Json(name = "encryptionKey") val encryptionKey: ProximityEncryptionKey? = null, @Json(name = "address") override val address: String? = null,