mirror of
https://github.com/d4rken-org/capod.git
synced 2026-09-16 19:26:12 -04:00
Improve lid state detection
This commit is contained in:
@@ -75,7 +75,8 @@ class PodMonitor @Inject constructor(
|
|||||||
pods[it.identifier] = it
|
pods[it.identifier] = it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
val now = Instant.now()
|
||||||
|
// pods.values.sortedWith(compareBy<PodDevice> { Duration.between(it.lastSeenAt,now) }.thenByDescending { it.rssi })
|
||||||
pods.values.sortedByDescending { it.rssi }
|
pods.values.sortedByDescending { it.rssi }
|
||||||
}
|
}
|
||||||
.onStart { emit(emptyList()) }
|
.onStart { emit(emptyList()) }
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package eu.darken.capod.pods.core.apple
|
package eu.darken.capod.pods.core.apple
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.util.Range
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import eu.darken.capod.R
|
import eu.darken.capod.R
|
||||||
import eu.darken.capod.common.debug.logging.log
|
import eu.darken.capod.common.debug.logging.log
|
||||||
@@ -96,15 +97,25 @@ interface DualApplePods : ApplePods, HasDualPods, HasEarDetection, HasCase {
|
|||||||
get() = rawCaseBattery.upperNibble.isBitSet(2)
|
get() = rawCaseBattery.upperNibble.isBitSet(2)
|
||||||
|
|
||||||
val caseLidState: LidState
|
val caseLidState: LidState
|
||||||
get() = LidState.values().firstOrNull { it.raw == rawCaseLidState } ?: LidState.UNKNOWN
|
get() {
|
||||||
|
return LidState.values().firstOrNull { it.rawRange.contains(rawCaseLidState) } ?: LidState.UNKNOWN
|
||||||
|
}
|
||||||
|
|
||||||
enum class LidState(val raw: UByte?) {
|
/**
|
||||||
OPEN(0x31),
|
* TODO this is glitchy
|
||||||
CLOSED(0x38),
|
* The counters generally increase if quickly and repeatedly:
|
||||||
NOT_IN_CASE(0x01),
|
* - open/close
|
||||||
UNKNOWN(null);
|
* - add/remove the last airpod to the case
|
||||||
|
* They reset after some time to their start values.
|
||||||
|
* The upper limits are not the maximums but are only reached if playing with the case.
|
||||||
|
*/
|
||||||
|
enum class LidState(val rawRange: Range<UByte>) {
|
||||||
|
OPEN(0x30, 0x37),
|
||||||
|
CLOSED(0x38, 0x3F),
|
||||||
|
NOT_IN_CASE(0x00, 0x03),
|
||||||
|
UNKNOWN(0xFF, 0xFF);
|
||||||
|
|
||||||
constructor(raw: Int) : this(raw.toUByte())
|
constructor(vararg raw: Int) : this(Range(raw[0].toUByte(), (raw[1].toUByte())))
|
||||||
}
|
}
|
||||||
|
|
||||||
val deviceColor: DeviceColor
|
val deviceColor: DeviceColor
|
||||||
|
|||||||
@@ -26,9 +26,12 @@ class PopUpReaction @Inject constructor(
|
|||||||
.flatMapLatest { if (it) podMonitor.mainDevice else emptyFlow() }
|
.flatMapLatest { if (it) podMonitor.mainDevice else emptyFlow() }
|
||||||
.withPrevious()
|
.withPrevious()
|
||||||
.map { (previous, current) ->
|
.map { (previous, current) ->
|
||||||
|
|
||||||
if (previous is DualApplePods? && current is DualApplePods) {
|
if (previous is DualApplePods? && current is DualApplePods) {
|
||||||
log(TAG) { "previous=${previous?.rawCaseLidState}, current=${current.rawCaseLidState}" }
|
log(TAG) {
|
||||||
|
val prev = previous?.rawCaseLidState?.let { String.format("%02X", it.toByte()) }
|
||||||
|
val cur = current.rawCaseLidState.let { String.format("%02X", it.toByte()) }
|
||||||
|
"previous=$prev (${previous?.caseLidState}), current=$cur (${current.caseLidState})"
|
||||||
|
}
|
||||||
log(TAG, VERBOSE) { "previous-id=${previous?.identifier}, current-id=${current.identifier}" }
|
log(TAG, VERBOSE) { "previous-id=${previous?.identifier}, current-id=${current.identifier}" }
|
||||||
|
|
||||||
val isSameDeviceWithCaseNowOpen =
|
val isSameDeviceWithCaseNowOpen =
|
||||||
@@ -41,6 +44,8 @@ class PopUpReaction @Inject constructor(
|
|||||||
|
|
||||||
if (current.caseLidState == DualApplePods.LidState.OPEN) {
|
if (current.caseLidState == DualApplePods.LidState.OPEN) {
|
||||||
log(TAG, INFO) { "Show popup" }
|
log(TAG, INFO) { "Show popup" }
|
||||||
|
} else if (current.caseLidState == DualApplePods.LidState.CLOSED) {
|
||||||
|
log(TAG, INFO) { "Hide popup" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user