From 8ba9f90f54b145213c84f5cf4a230706e7643dd7 Mon Sep 17 00:00:00 2001 From: SiteRelEnby <125829806+SiteRelEnby@users.noreply.github.com> Date: Sat, 18 Jul 2026 14:00:57 -0400 Subject: [PATCH 1/2] clarify wording for ampersand file formats between the two export options --- .../lupine/sheaf/ui/ampersandimport/AmpersandImportScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sheaf/app/src/main/java/systems/lupine/sheaf/ui/ampersandimport/AmpersandImportScreen.kt b/sheaf/app/src/main/java/systems/lupine/sheaf/ui/ampersandimport/AmpersandImportScreen.kt index 1a40bc2..b45aa89 100644 --- a/sheaf/app/src/main/java/systems/lupine/sheaf/ui/ampersandimport/AmpersandImportScreen.kt +++ b/sheaf/app/src/main/java/systems/lupine/sheaf/ui/ampersandimport/AmpersandImportScreen.kt @@ -103,8 +103,8 @@ private fun FilePickSection(onPick: () -> Unit) { Text("Choose your Ampersand export to get started.", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant) Button(onClick = onPick) { Text("Choose file") } Text( - "In Ampersand, open Settings → Import & export → Export, and save the " + - ".json file. Then select it here.", + "In Ampersand, open Settings → Import & export → Export your data to a JSON file (note: this is a different option to 'Export your data', which " + + "produces an incompatible file format), and save the .json file. Then select it here.", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.7f), ) From 165cdcaa4e30fbf235f3062ac50893681178859c Mon Sep 17 00:00:00 2001 From: SiteRelEnby <125829806+SiteRelEnby@users.noreply.github.com> Date: Sat, 25 Jul 2026 19:00:54 -0400 Subject: [PATCH 2/2] fix(wear): open-on-phone button + reactive auth refresh (#44), duplicate-front message (#45) #44, two parts: - Add an "Open on phone" button to the watch's "sign in on your phone" screen. It uses RemoteActivityHelper (system-mediated, so it isn't blocked by the phone's background-activity-launch limits) to fire a `sheaf://open` deep link the phone app now registers; the phone MainActivity just comes to the foreground (the URL carries no redeem params, so the redemption capture ignores it). Toasts if the phone can't be reached. - Make that screen refresh reactively when the phone pushes a token. The auth state flow was per-WearAuthManager-instance, so the data-layer service applying a phone-pushed credential updated only its own copy and the login screen (a different instance) never saw it, forcing a leave-and-return. Hoisted the flow into a process-wide singleton so any instance's save/clear updates the exact flow the UI collects. The signal-counter listener stays as a belt. #45: creating a front whose exact member set already has an open front returns 409 from the server, which the watch surfaced as a bare "Switch failed". Added a SwitchOutcome (SWITCHED / ALREADY_FRONTING / FAILED); switchFront maps 409 to ALREADY_FRONTING and callers word it accordingly (" already fronting" on the quick-switch tile, "Already fronting" on the switch screen) instead of an error. --- sheaf/app/src/main/AndroidManifest.xml | 13 ++++++ sheaf/gradle/libs.versions.toml | 2 + sheaf/wear/build.gradle.kts | 2 + .../lupine/sheaf/wear/data/WearAuthManager.kt | 32 ++++++++++++--- .../lupine/sheaf/wear/data/WearStore.kt | 41 +++++++++++++------ .../sheaf/wear/presentation/SwitchScreen.kt | 21 ++++++---- .../sheaf/wear/presentation/WearNavigation.kt | 39 +++++++++++++++++- .../tile/QuickSwitchTrampolineActivity.kt | 7 +++- 8 files changed, 128 insertions(+), 29 deletions(-) diff --git a/sheaf/app/src/main/AndroidManifest.xml b/sheaf/app/src/main/AndroidManifest.xml index 834b504..75ed739 100644 --- a/sheaf/app/src/main/AndroidManifest.xml +++ b/sheaf/app/src/main/AndroidManifest.xml @@ -131,6 +131,19 @@ android:host="notifications" android:path="/redeem" /> + + + + + + +