|
@@ -3,7 +3,7 @@ import 'dart:async';
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:photos/core/configuration.dart';
|
|
|
import 'package:photos/core/event_bus.dart';
|
|
|
-import 'package:photos/events/photo_upload_event.dart';
|
|
|
+import 'package:photos/events/sync_status_update_event.dart';
|
|
|
import 'package:photos/services/sync_service.dart';
|
|
|
|
|
|
class SyncIndicator extends StatefulWidget {
|
|
@@ -15,6 +15,7 @@ class SyncIndicator extends StatefulWidget {
|
|
|
|
|
|
class _SyncIndicatorState extends State<SyncIndicator> {
|
|
|
SyncStatusUpdate _event;
|
|
|
+ double _containerHeight = 48;
|
|
|
int _latestCompletedCount = 0;
|
|
|
StreamSubscription<SyncStatusUpdate> _subscription;
|
|
|
|
|
@@ -29,6 +30,7 @@ class _SyncIndicatorState extends State<SyncIndicator> {
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
+ _event = SyncService.instance.getLastSyncStatusEvent();
|
|
|
super.initState();
|
|
|
}
|
|
|
|
|
@@ -40,13 +42,38 @@ class _SyncIndicatorState extends State<SyncIndicator> {
|
|
|
|
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
|
- if (Configuration.instance.hasConfiguredAccount()) {
|
|
|
- if (SyncService.instance.isSyncInProgress()) {
|
|
|
- return Container(
|
|
|
- height: 48,
|
|
|
- width: double.infinity,
|
|
|
- margin: EdgeInsets.all(8),
|
|
|
- alignment: Alignment.center,
|
|
|
+ if (Configuration.instance.hasConfiguredAccount() && _event != null) {
|
|
|
+ if (_event.status == SyncStatus.completed) {
|
|
|
+ Future.delayed(Duration(milliseconds: 5000), () {
|
|
|
+ setState(() {
|
|
|
+ _containerHeight = 0;
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ _containerHeight = 48;
|
|
|
+ }
|
|
|
+ var icon;
|
|
|
+ if (_event.status == SyncStatus.completed) {
|
|
|
+ icon = Icon(
|
|
|
+ Icons.cloud_done_outlined,
|
|
|
+ color: Theme.of(context).accentColor,
|
|
|
+ );
|
|
|
+ } else if (_event.status == SyncStatus.error) {
|
|
|
+ icon = Icon(
|
|
|
+ Icons.error_outline,
|
|
|
+ color: Theme.of(context).accentColor,
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ icon = CircularProgressIndicator(strokeWidth: 2);
|
|
|
+ }
|
|
|
+ return AnimatedContainer(
|
|
|
+ duration: Duration(milliseconds: 300),
|
|
|
+ height: _containerHeight,
|
|
|
+ width: double.infinity,
|
|
|
+ margin: EdgeInsets.all(8),
|
|
|
+ alignment: Alignment.center,
|
|
|
+ child: SingleChildScrollView(
|
|
|
+ physics: NeverScrollableScrollPhysics(),
|
|
|
child: Column(
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
@@ -58,7 +85,7 @@ class _SyncIndicatorState extends State<SyncIndicator> {
|
|
|
Container(
|
|
|
width: 24,
|
|
|
height: 24,
|
|
|
- child: CircularProgressIndicator(strokeWidth: 2),
|
|
|
+ child: icon,
|
|
|
),
|
|
|
Padding(
|
|
|
padding: const EdgeInsets.fromLTRB(8, 4, 0, 0),
|
|
@@ -70,8 +97,8 @@ class _SyncIndicatorState extends State<SyncIndicator> {
|
|
|
Divider(),
|
|
|
],
|
|
|
),
|
|
|
- );
|
|
|
- }
|
|
|
+ ),
|
|
|
+ );
|
|
|
}
|
|
|
return Container();
|
|
|
}
|
|
@@ -81,18 +108,22 @@ class _SyncIndicatorState extends State<SyncIndicator> {
|
|
|
return "Syncing...";
|
|
|
} else {
|
|
|
var s;
|
|
|
- // TODO: Display errors softly
|
|
|
if (_event.status == SyncStatus.error) {
|
|
|
s = "Upload failed.";
|
|
|
- } else if (_event.status == SyncStatus.completed && _event.wasStopped) {
|
|
|
- s = "Sync stopped.";
|
|
|
+ } else if (_event.status == SyncStatus.completed) {
|
|
|
+ if (_event.wasStopped) {
|
|
|
+ s = "Sync stopped.";
|
|
|
+ } else {
|
|
|
+ s = "All memories preserved.";
|
|
|
+ }
|
|
|
+ } else if (_event.status == SyncStatus.paused) {
|
|
|
+ s = _event.reason;
|
|
|
} else {
|
|
|
s = _latestCompletedCount.toString() +
|
|
|
"/" +
|
|
|
_event.total.toString() +
|
|
|
" memories preserved";
|
|
|
}
|
|
|
- _event = null;
|
|
|
return s;
|
|
|
}
|
|
|
}
|