v1.0.16: spinning sync icon, colorful icon, ON_CHANGE fix, notification fix
- Sync icon now rotates (CSS-style spin) in StatusPill, StatusBanner, and card sync button whenever status is SYNCING - Launcher icon redesigned: indigo→violet→cyan gradient background, upload arrow fades white→sky-blue, download arrow fades white→violet, soft glow ring behind arrows - Fix ON_CHANGE not triggering: FileWatchService.start() now called from AddPairViewModel.save() so pairs created with ON_CHANGE immediately begin watching without needing a toggle or reboot - Fix FileWatch notification hidden: IMPORTANCE_MIN → IMPORTANCE_LOW so the "Watching N folders" notification shows in the shade Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,10 @@
|
||||
package com.syncflow.ui.pairdetail
|
||||
|
||||
import androidx.compose.animation.core.LinearEasing
|
||||
import androidx.compose.animation.core.animateFloat
|
||||
import androidx.compose.animation.core.infiniteRepeatable
|
||||
import androidx.compose.animation.core.rememberInfiniteTransition
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
@@ -13,6 +18,7 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.graphicsLayer
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import com.syncflow.data.db.entities.SyncEventEntity
|
||||
@@ -143,6 +149,11 @@ private fun StatusBanner(pair: SyncPairEntity) {
|
||||
SyncStatus.PARTIAL -> Triple(Icons.Default.WarningAmber,"Partial", MaterialTheme.colorScheme.tertiaryContainer)
|
||||
SyncStatus.IDLE -> Triple(Icons.Outlined.Circle, "Idle", MaterialTheme.colorScheme.surfaceVariant)
|
||||
}
|
||||
val rotation by rememberInfiniteTransition(label = "bannerSpin").animateFloat(
|
||||
initialValue = 0f, targetValue = 360f,
|
||||
animationSpec = infiniteRepeatable(tween(1000, easing = LinearEasing)),
|
||||
label = "bannerRotation",
|
||||
)
|
||||
Surface(
|
||||
color = containerColor,
|
||||
shape = RoundedCornerShape(16.dp),
|
||||
@@ -152,7 +163,12 @@ private fun StatusBanner(pair: SyncPairEntity) {
|
||||
modifier = Modifier.padding(16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
Icon(icon, null, modifier = Modifier.size(40.dp))
|
||||
Icon(
|
||||
icon, null,
|
||||
modifier = Modifier.size(40.dp).graphicsLayer {
|
||||
if (pair.lastSyncResult == SyncStatus.SYNCING) rotationZ = rotation
|
||||
},
|
||||
)
|
||||
Spacer(Modifier.width(16.dp))
|
||||
Column {
|
||||
Text(label, style = MaterialTheme.typography.titleMedium)
|
||||
|
||||
Reference in New Issue
Block a user