Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,17 @@ import kotlin.time.Duration
import kotlin.time.Instant
import kotlin.uuid.Uuid

class FakeLibPebble : LibPebble {
class FakeLibPebble(
fakeWatches: List<WatchHardwarePlatform> = listOf(WatchHardwarePlatform.CORE_ASTERIX),
activeWatch: WatchHardwarePlatform = fakeWatches.firstOrNull() ?: WatchHardwarePlatform.CORE_ASTERIX,
) : LibPebble {
override fun init() {
// No-op
}

override val watches: PebbleDevices = MutableStateFlow(fakeWatches())
override val watches: PebbleDevices = MutableStateFlow(
fakeWatches.mapIndexed { index, hw -> fakeWatch(connected = hw == activeWatch, watchType = hw, index = index) }
)
override val connectionEvents: Flow<PebbleConnectionEvent> = MutableSharedFlow()

override fun watchesDebugState(): String {
Expand Down Expand Up @@ -183,7 +188,7 @@ class FakeLibPebble : LibPebble {
}

override fun getLockerApp(id: Uuid): Flow<LockerWrapper?> {
return flow { emit(fakeLockerEntries.first()) }
return locker.map { list -> list.firstOrNull { it.properties.id == id } }
}

override suspend fun setAppOrder(id: Uuid, order: Int) {
Expand All @@ -206,8 +211,9 @@ class FakeLibPebble : LibPebble {
override fun restoreSystemAppOrder() {
}

override val activeWatchface: StateFlow<LockerWrapper?>
get() = MutableStateFlow(fakeLockerEntry())
override val activeWatchface: StateFlow<LockerWrapper?> = MutableStateFlow(
locker.value.firstOrNull { it.properties.type == AppType.Watchface }
)

private val _notificationApps = MutableStateFlow(fakeNotificationApps)

Expand Down Expand Up @@ -493,62 +499,24 @@ fun fakeWatches(): List<PebbleDevice> {
}
}

fun fakeWatch(connected: Boolean = Random.nextBoolean()): PebbleDevice {
val num = Random.nextInt(1111, 9999)
val name = "Core $num"
val fakeIdentifier = if (PlatformUtils.IS_JVM) {
randomMacAddress().asPebbleBleIdentifier()
} else {
Uuid.random().toString().asPebbleBleIdentifier()
}
fun fakeWatch(connected: Boolean = true, watchType: WatchHardwarePlatform = WatchHardwarePlatform.CORE_ASTERIX, index: Int = 0): PebbleDevice {
val name = watchType.displayName
val fakeIdentifier = "AA:BB:CC:DD:EE:${index.toString(16).padStart(2, '0').uppercase()}".asPebbleBleIdentifier()
return if (connected) {
val updating = Random.nextBoolean()
val fwupState = if (updating) {
val fakeUpdate = FirmwareUpdateCheckResult.FoundUpdate(
version = FirmwareVersion.from(
"v4.9.9-core1",
isRecovery = false,
gitHash = "",
timestamp = Instant.DISTANT_PAST,
isDualSlot = false,
isSlot0 = false,
)!!,
url = "",
notes = "v4.9.9-core1 is great",
)
FirmwareUpdater.FirmwareUpdateStatus.InProgress(fakeUpdate, MutableStateFlow(0.47f))
} else {
FirmwareUpdater.FirmwareUpdateStatus.NotInProgress.Idle()
}
val fwupAvailable = if (!updating && Random.nextBoolean()) {
FirmwareUpdateCheckResult.FoundUpdate(
version = FirmwareVersion.from(
"v4.9.9-core2",
isRecovery = false,
gitHash = "",
timestamp = kotlin.time.Instant.DISTANT_PAST,
isDualSlot = false,
isSlot0 = false,
)!!,
url = "http://something",
notes = "update!!",
)
} else {
null
}
FakeConnectedDevice(
identifier = fakeIdentifier,
firmwareUpdateAvailable = FirmwareUpdateCheckState(false, fwupAvailable),
firmwareUpdateState = fwupState,
firmwareUpdateAvailable = FirmwareUpdateCheckState(false, null),
firmwareUpdateState = FirmwareUpdater.FirmwareUpdateStatus.NotInProgress.Idle(),
name = name,
nickname = null,
connectionFailureInfo = null,
watchType = watchType,
)
} else {
object : DiscoveredPebbleDevice {
override val identifier = fakeIdentifier
override val name: String = "Fake 1234"
override val nickname: String? = "Faker 1234"
override val name: String = name
override val nickname: String? = null
override val connectionFailureInfo: ConnectionFailureInfo? = null

override fun connect() {
Expand Down Expand Up @@ -577,7 +545,7 @@ class FakeConnectedDevice(
override val runningFwVersion: String = "v1.2.3-core",
override val connectionFailureInfo: ConnectionFailureInfo?,
override val usingBtClassic: Boolean = false,
override val capabilities: Set<ProtocolCapsFlag> = emptySet()
override val capabilities: Set<ProtocolCapsFlag> = setOf(ProtocolCapsFlag.SupportsBlobDbVersion)
) : ConnectedPebbleDevice {

override fun forget() {}
Expand Down Expand Up @@ -731,7 +699,7 @@ class FakeConnectedDeviceInRecovery(
override val runningFwVersion: String = "v1.2.3-core",
override val connectionFailureInfo: ConnectionFailureInfo?,
override val usingBtClassic: Boolean = false,
override val capabilities: Set<ProtocolCapsFlag> = emptySet(),
override val capabilities: Set<ProtocolCapsFlag> = setOf(ProtocolCapsFlag.SupportsBlobDbVersion),
) : ConnectedPebbleDeviceInRecovery {

override fun forget() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,40 +14,40 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

enum class WatchHardwarePlatform(val protocolNumber: UByte, private val _watchType: WatchType, val revision: String) {
UNKNOWN(0u, WatchType.BASALT, "unknown"),
PEBBLE_ONE_EV_1(1u, WatchType.APLITE, "ev1"),
PEBBLE_ONE_EV_2(2u, WatchType.APLITE, "ev2"),
PEBBLE_ONE_EV_2_3(3u, WatchType.APLITE, "ev2_3"),
PEBBLE_ONE_EV_2_4(4u, WatchType.APLITE, "ev2_4"),
PEBBLE_ONE_POINT_FIVE(5u, WatchType.APLITE, "v1_5"),
PEBBLE_TWO_POINT_ZERO(6u, WatchType.APLITE, "v2_0"),
PEBBLE_SNOWY_EVT_2(7u, WatchType.BASALT, "snowy_evt2"),
PEBBLE_SNOWY_DVT(8u, WatchType.BASALT, "snowy_dvt"),
PEBBLE_BOBBY_SMILES(10u, WatchType.BASALT, "snowy_s3"),
PEBBLE_ONE_BIGBOARD_2(254u, WatchType.APLITE, "bb2"),
PEBBLE_ONE_BIGBOARD(255u, WatchType.APLITE, "bigboard"),
PEBBLE_SNOWY_BIGBOARD(253u, WatchType.BASALT, "snowy_bb2"),
PEBBLE_SNOWY_BIGBOARD_2(252u, WatchType.BASALT, "unk"),
PEBBLE_SPALDING_EVT(9u, WatchType.CHALK, "spalding_evt"),
PEBBLE_SPALDING_PVT(11u, WatchType.CHALK, "spalding"),
PEBBLE_SPALDING_BIGBOARD(251u, WatchType.CHALK, "spalding_bb2"),
PEBBLE_SILK_EVT(12u, WatchType.DIORITE, "silk_evt"),
PEBBLE_SILK(14u, WatchType.DIORITE, "silk"),
CORE_ASTERIX(15u, WatchType.FLINT, "asterix"),
CORE_OBELIX_EVT(16u, WatchType.EMERY, "obelix_evt"),
CORE_OBELIX_DVT(17u, WatchType.EMERY, "obelix_dvt"),
CORE_OBELIX_PVT(18u, WatchType.EMERY, "obelix_pvt"),
CORE_GETAFIX_EVT(19u, WatchType.GABBRO, "getafix_evt"),
CORE_GETAFIX_DVT(20u, WatchType.GABBRO, "getafix_dvt"),
CORE_GETAFIX_DVT2(21u, WatchType.GABBRO, "getafix_dvt2"),
PEBBLE_SILK_BIGBOARD(250u, WatchType.DIORITE, "silk_bb"),
PEBBLE_SILK_BIGBOARD_2_PLUS(248u, WatchType.DIORITE, "silk_bb2"),
PEBBLE_ROBERT_EVT(13u, WatchType.EMERY, "robert_evt"),
PEBBLE_ROBERT_BIGBOARD(249u, WatchType.EMERY, "robert_bb"),
PEBBLE_ROBERT_BIGBOARD_2(247u, WatchType.EMERY, "robert_bb2"),
CORE_OBELIX_BIGBOARD(244u, WatchType.EMERY, "obelix_bb"),
CORE_OBELIX_BIGBOARD_2(243u, WatchType.EMERY, "obelix_bb2"),
enum class WatchHardwarePlatform(val protocolNumber: UByte, private val _watchType: WatchType, val revision: String, val displayName: String, val isConsumer: Boolean = false) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding a user-facing name to a board doesn't really make sense - this is probably the wrong layer to do this (also many of the isConsumer flags here are wrong)

UNKNOWN(0u, WatchType.BASALT, "unknown", "Unknown (Basalt)"),
PEBBLE_ONE_EV_1(1u, WatchType.APLITE, "ev1", "Pebble One EV1 (Aplite)"),
PEBBLE_ONE_EV_2(2u, WatchType.APLITE, "ev2", "Pebble One EV2 (Aplite)"),
PEBBLE_ONE_EV_2_3(3u, WatchType.APLITE, "ev2_3", "Pebble One EV2.3 (Aplite)"),
PEBBLE_ONE_EV_2_4(4u, WatchType.APLITE, "ev2_4", "Pebble One EV2.4 (Aplite)"),
PEBBLE_ONE_POINT_FIVE(5u, WatchType.APLITE, "v1_5", "Pebble One V1.5 (Aplite)"),
PEBBLE_TWO_POINT_ZERO(6u, WatchType.APLITE, "v2_0", "Pebble Two V2.0 (Aplite)"),
PEBBLE_SNOWY_EVT_2(7u, WatchType.BASALT, "snowy_evt2", "Pebble Time EVT2 (Basalt)"),
PEBBLE_SNOWY_DVT(8u, WatchType.BASALT, "snowy_dvt", "Pebble Time DVT (Basalt)"),
PEBBLE_BOBBY_SMILES(10u, WatchType.BASALT, "snowy_s3", "Pebble Time (Basalt)", isConsumer = true),
PEBBLE_ONE_BIGBOARD_2(254u, WatchType.APLITE, "bb2", "Pebble One Bigboard 2 (Aplite)"),
PEBBLE_ONE_BIGBOARD(255u, WatchType.APLITE, "bigboard", "Pebble One Bigboard (Aplite)"),
PEBBLE_SNOWY_BIGBOARD(253u, WatchType.BASALT, "snowy_bb2", "Pebble Time Bigboard (Basalt)"),
PEBBLE_SNOWY_BIGBOARD_2(252u, WatchType.BASALT, "unk", "Pebble Time Bigboard 2 (Basalt)"),
PEBBLE_SPALDING_EVT(9u, WatchType.CHALK, "spalding_evt", "Pebble Time Round EVT (Chalk)"),
PEBBLE_SPALDING_PVT(11u, WatchType.CHALK, "spalding", "Pebble Time Round (Chalk)", isConsumer = true),
PEBBLE_SPALDING_BIGBOARD(251u, WatchType.CHALK, "spalding_bb2", "Pebble Time Round Bigboard (Chalk)"),
PEBBLE_SILK_EVT(12u, WatchType.DIORITE, "silk_evt", "Pebble 2 EVT (Diorite)"),
PEBBLE_SILK(14u, WatchType.DIORITE, "silk", "Pebble 2 (Diorite)", isConsumer = true),
CORE_ASTERIX(15u, WatchType.FLINT, "asterix", "Core Asterix (Flint)", isConsumer = true),
CORE_OBELIX_EVT(16u, WatchType.EMERY, "obelix_evt", "Core Obelix EVT (Emery)"),
CORE_OBELIX_DVT(17u, WatchType.EMERY, "obelix_dvt", "Core Obelix DVT (Emery)"),
CORE_OBELIX_PVT(18u, WatchType.EMERY, "obelix_pvt", "Core Obelix (Emery)", isConsumer = true),
CORE_GETAFIX_EVT(19u, WatchType.GABBRO, "getafix_evt", "Core Getafix EVT (Gabbro)"),
CORE_GETAFIX_DVT(20u, WatchType.GABBRO, "getafix_dvt", "Core Getafix DVT (Gabbro)"),
CORE_GETAFIX_DVT2(21u, WatchType.GABBRO, "getafix_dvt2", "Core Getafix DVT2 (Gabbro)"),
PEBBLE_SILK_BIGBOARD(250u, WatchType.DIORITE, "silk_bb", "Pebble 2 Bigboard (Diorite)"),
PEBBLE_SILK_BIGBOARD_2_PLUS(248u, WatchType.DIORITE, "silk_bb2", "Pebble 2 Bigboard 2+ (Diorite)"),
PEBBLE_ROBERT_EVT(13u, WatchType.EMERY, "robert_evt", "Pebble 2+ EVT (Emery)"),
PEBBLE_ROBERT_BIGBOARD(249u, WatchType.EMERY, "robert_bb", "Pebble 2+ Bigboard (Emery)"),
PEBBLE_ROBERT_BIGBOARD_2(247u, WatchType.EMERY, "robert_bb2", "Pebble 2+ Bigboard 2 (Emery)"),
CORE_OBELIX_BIGBOARD(244u, WatchType.EMERY, "obelix_bb", "Core Obelix Bigboard (Emery)"),
CORE_OBELIX_BIGBOARD_2(243u, WatchType.EMERY, "obelix_bb2", "Core Obelix Bigboard 2 (Emery)"),
;

val watchType: WatchType
Expand Down
Loading