Skip to content

Instantly share code, notes, and snippets.

View LethalMaus's full-sized avatar

James Cullimore LethalMaus

View GitHub Profile
@LethalMaus
LethalMaus / WearManifest.xml
Created January 15, 2026 22:07
WearManifest.xml
<service
android:name=".service.WearBridgeListenerService"
android:exported="true">
<intent-filter>
<action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
<data android:scheme="wear" />
<data android:host="*" />
<data android:path="/request-control" />
<data android:path="/ping" />
<data android:path="/pong" />
@LethalMaus
LethalMaus / WearBridgeListenerService.kt
Created January 15, 2026 22:07
WearBridgeListenerService.kt
class WearBridgeListenerService : WearableListenerService() {
private val manager by lazy {
WearDataLayerManager(applicationContext, DeviceType.PHONE)
}
override fun onCreate() {
super.onCreate()
manager.refreshNodes()
}
@LethalMaus
LethalMaus / RequestControlIndicator.kt
Created January 15, 2026 22:07
RequestControlIndicator.kt
if (isRequesting) {
Box(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 2.dp),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator(strokeWidth = 2.dp)
}
} else {
@LethalMaus
LethalMaus / ControlStatusChip.kt
Created January 15, 2026 22:07
ControlStatusChip.kt
Chip(
modifier = Modifier.fillMaxWidth(),
enabled = !isRequesting,
colors = ChipDefaults.primaryChipColors(),
onClick = {
coroutineScope.launch {
showEmergency = false
isRequesting = true
val delivered = manager.requestControl()
val success = delivered && withTimeoutOrNull(5000) {
@LethalMaus
LethalMaus / EmergencyTakeoverButton.kt
Created January 15, 2026 22:07
EmergencyTakeoverButton.kt
if (!connection.connected || showEmergency) {
Chip(
modifier = Modifier.fillMaxWidth(),
colors = ChipDefaults.secondaryChipColors(),
onClick = { manager.takeControl(emergency = true) },
label = {
Box(
modifier = Modifier.fillMaxWidth(),
contentAlignment = Alignment.Center
) {
@LethalMaus
LethalMaus / WatchControlScreen.kt
Created January 15, 2026 22:07
WatchControlScreen.kt
@Composable
fun WatchControlScreen(manager: WearDataLayerManager, modifier: Modifier = Modifier) {
val connection by manager.connectionStatus.collectAsState()
val control by manager.controlStatus.collectAsState()
val profile by manager.userProfile.collectAsState()
val coroutineScope = rememberCoroutineScope()
var isRequesting by rememberSaveable { mutableStateOf(false) }
var showEmergency by rememberSaveable { mutableStateOf(false) }
val localDevice = DeviceType.WATCH
@LethalMaus
LethalMaus / SyncProfileButton.kt
Created January 15, 2026 22:07
SyncProfileButton.kt
OutlinedTextField(
value = username,
onValueChange = { username = it },
label = { Text("User / login name") }
)
Button(onClick = {
val value = if (username.isBlank()) "Phone User" else username
manager.syncUserProfile(UserProfile(value))
}) {
Text("Sync profile to watch")
@LethalMaus
LethalMaus / RequestControlButton.kt
Created January 15, 2026 22:07
RequestControlButton.kt
Button(
enabled = !isRequesting,
onClick = {
coroutineScope.launch {
showEmergency = false
isRequesting = true
val delivered = manager.requestControl()
val success = delivered && withTimeoutOrNull(5000) {
manager.controlStatus.first { it.holder == localDevice }
} != null
@LethalMaus
LethalMaus / onDataChanged.kt
Created January 15, 2026 22:07
onDataChanged.kt
override fun onDataChanged(dataEvents: DataEventBuffer) {
dataEvents.forEach { event ->
when (event.type) {
DataEvent.TYPE_CHANGED -> handleDataItem(event.dataItem)
DataEvent.TYPE_DELETED -> handleDeletion(event.dataItem.uri)
}
}
}
@LethalMaus
LethalMaus / onMessageReceived.kt
Created January 15, 2026 22:07
onMessageReceived.kt
override fun onMessageReceived(event: MessageEvent) {
when (event.path) {
WearPaths.REQUEST_CONTROL -> {
val requester = DeviceType.fromName(event.data.decodeToString())
publishControl(
ControlStatus(
holder = requester,
emergency = false,
timestamp = System.currentTimeMillis(),
)