fix: add edit button, bypass constraints on manual sync

- Add Edit icon to PairDetailScreen top bar
- Wire onEdit callback through NavGraph to AddPairScreen with pairId
- Manual "Sync now" (home card + detail screen) now ignores wifiOnly
  and chargingOnly constraints so it runs immediately on tap

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-22 23:32:46 +00:00
parent c8e50ac17e
commit d6220b7bd7
6 changed files with 7 additions and 4 deletions
@@ -23,7 +23,7 @@ class HomeViewModel @Inject constructor(
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList()) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())
fun triggerSync(pair: SyncPairEntity) { fun triggerSync(pair: SyncPairEntity) {
val req = SyncWorker.buildOneTimeRequest(pair.id, pair.wifiOnly, pair.chargingOnly) val req = SyncWorker.buildOneTimeRequest(pair.id, wifiOnly = false, chargingOnly = false)
workManager.enqueue(req) workManager.enqueue(req)
} }
@@ -48,6 +48,7 @@ fun SyncFlowNavGraph(navController: NavHostController) {
) { ) {
PairDetailScreen( PairDetailScreen(
onBack = { navController.popBackStack() }, onBack = { navController.popBackStack() },
onEdit = { id -> navController.navigate(Screen.AddPair.route(id)) },
onConflicts = { id -> navController.navigate(Screen.Conflicts.route(id)) }, onConflicts = { id -> navController.navigate(Screen.Conflicts.route(id)) },
) )
} }
@@ -21,6 +21,7 @@ import java.time.format.FormatStyle
@Composable @Composable
fun PairDetailScreen( fun PairDetailScreen(
onBack: () -> Unit, onBack: () -> Unit,
onEdit: (Long) -> Unit,
onConflicts: (Long) -> Unit, onConflicts: (Long) -> Unit,
vm: PairDetailViewModel = hiltViewModel(), vm: PairDetailViewModel = hiltViewModel(),
) { ) {
@@ -49,6 +50,7 @@ fun PairDetailScreen(
title = { Text(pair?.name ?: "") }, title = { Text(pair?.name ?: "") },
navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Default.ArrowBack, "Back") } }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Default.ArrowBack, "Back") } },
actions = { actions = {
IconButton(onClick = { pair?.let { onEdit(it.id) } }) { Icon(Icons.Default.Edit, "Edit") }
IconButton(onClick = { vm.syncNow() }) { Icon(Icons.Default.Sync, "Sync now") } IconButton(onClick = { vm.syncNow() }) { Icon(Icons.Default.Sync, "Sync now") }
IconButton(onClick = { showDelete = true }) { Icon(Icons.Default.Delete, "Delete") } IconButton(onClick = { showDelete = true }) { Icon(Icons.Default.Delete, "Delete") }
}, },
@@ -36,7 +36,7 @@ class PairDetailViewModel @Inject constructor(
fun syncNow() { fun syncNow() {
val p = pair.value ?: return val p = pair.value ?: return
workManager.enqueue(SyncWorker.buildOneTimeRequest(p.id, p.wifiOnly, p.chargingOnly)) workManager.enqueue(SyncWorker.buildOneTimeRequest(p.id, wifiOnly = false, chargingOnly = false))
} }
fun delete() { fun delete() {
+2 -2
View File
@@ -1,2 +1,2 @@
VERSION_NAME=1.0.2 VERSION_NAME=1.0.3
VERSION_CODE=3 VERSION_CODE=4