Skip to content
Snippets Groups Projects
Commit 56b7de1a authored by JonOfUs's avatar JonOfUs
Browse files

Show single upload indicator while uploading, consistent across page switches

parent c4534256
Branches
No related tags found
1 merge request!4Upload indicator
Pipeline #276744 passed
...@@ -23,9 +23,6 @@ class Trip { ...@@ -23,9 +23,6 @@ class Trip {
@Index() @Index()
bool isDone = false; // True if the trip recording has been ended by the user bool isDone = false; // True if the trip recording has been ended by the user
@ignore
bool isUploading = false;
} }
@embedded @embedded
......
...@@ -10,6 +10,7 @@ import 'package:app/providers/location_provider.dart'; ...@@ -10,6 +10,7 @@ import 'package:app/providers/location_provider.dart';
import 'package:app/providers/privacy_zone_provider.dart'; import 'package:app/providers/privacy_zone_provider.dart';
import 'package:app/providers/distance_provider.dart'; import 'package:app/providers/distance_provider.dart';
import 'package:app/providers/trip_provider.dart'; import 'package:app/providers/trip_provider.dart';
import 'package:app/providers/upload_provider.dart';
import 'package:app/welcome_page.dart'; import 'package:app/welcome_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
...@@ -28,6 +29,7 @@ Future<void> main() async { ...@@ -28,6 +29,7 @@ Future<void> main() async {
ChangeNotifierProvider(create: (context) => PrivacyZoneProvider()), ChangeNotifierProvider(create: (context) => PrivacyZoneProvider()),
ChangeNotifierProvider(create: (context) => DistanceProvider()), ChangeNotifierProvider(create: (context) => DistanceProvider()),
ChangeNotifierProvider(create: (context) => ButtonProvider()), ChangeNotifierProvider(create: (context) => ButtonProvider()),
ChangeNotifierProvider(create: (context) => UploadProvider()),
ChangeNotifierProvider(create: (context) => TripProvider()), ChangeNotifierProvider(create: (context) => TripProvider()),
ChangeNotifierProvider(create: (context) => LocationProvider()), ChangeNotifierProvider(create: (context) => LocationProvider()),
ChangeNotifierProvider(create: (context) => BatteryProvider()), ChangeNotifierProvider(create: (context) => BatteryProvider()),
......
...@@ -2,6 +2,7 @@ import 'dart:io'; ...@@ -2,6 +2,7 @@ import 'dart:io';
import 'package:app/manager/upload_manger.dart'; import 'package:app/manager/upload_manger.dart';
import 'package:app/providers/trip_provider.dart'; import 'package:app/providers/trip_provider.dart';
import 'package:app/providers/upload_provider.dart';
import 'package:app/widgets/trip_page.dart'; import 'package:app/widgets/trip_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
...@@ -27,6 +28,7 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> { ...@@ -27,6 +28,7 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final tripProvider = context.watch<TripProvider>(); final tripProvider = context.watch<TripProvider>();
final uploadStateProvider = context.watch<UploadProvider>();
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
...@@ -39,12 +41,16 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> { ...@@ -39,12 +41,16 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
children: [ children: [
// Upload button // Upload button
ElevatedButton( ElevatedButton(
onPressed: () async { onPressed: uploadStateProvider.uploading
final SharedPreferencesAsync prefs = SharedPreferencesAsync(); ? null
: () async {
final SharedPreferencesAsync prefs =
SharedPreferencesAsync();
if (((await prefs.getString('portalServer'))?.isEmpty ?? if (((await prefs.getString('portalServer'))?.isEmpty ??
true) || true) ||
((await prefs.getString('portalKey'))?.isEmpty ?? true)) { ((await prefs.getString('portalKey'))?.isEmpty ??
true)) {
toastification.show( toastification.show(
context: context, context: context,
type: ToastificationType.error, type: ToastificationType.error,
...@@ -58,25 +64,13 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> { ...@@ -58,25 +64,13 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
return; return;
} }
uploadStateProvider.setUploading(true);
UploadManager uploadManager = UploadManager(); UploadManager uploadManager = UploadManager();
for (var trip in tripProvider.trips) { final (success, numTracks) =
if (!trip.uploaded && trip.isDone) { await uploadManager.upload();
setState(() {
trip.isUploading = true;
tripProvider.updateTrip(trip.id, trip);
});
}
}
final (success, numTracks) = await uploadManager.upload(); uploadStateProvider.setUploading(false);
for (var trip in tripProvider.trips) {
setState(() {
trip.isUploading = false;
tripProvider.updateTrip(trip.id, trip);
});
}
if (success == 0 && numTracks == 0) { if (success == 0 && numTracks == 0) {
toastification.show( toastification.show(
...@@ -115,6 +109,11 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> { ...@@ -115,6 +109,11 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
child: Text(AppLocalizations.of(context)!.uploadButton), child: Text(AppLocalizations.of(context)!.uploadButton),
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
uploadStateProvider.uploading
? const CircularProgressIndicator(
strokeWidth: 2,
)
: const SizedBox.shrink(), // Hide indicator when not loading
SwitchListTile( SwitchListTile(
title: Text(AppLocalizations.of(context)!.showUploadedSwitch), title: Text(AppLocalizations.of(context)!.showUploadedSwitch),
value: showUploadedTrips, value: showUploadedTrips,
...@@ -147,16 +146,15 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> { ...@@ -147,16 +146,15 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
? AppLocalizations.of(context)!.uploaded ? AppLocalizations.of(context)!.uploaded
: ''), : ''),
]), ]),
trailing: trip.isUploading trailing:
? const CircularProgressIndicator() trip.isDone // when a trip is recording do not show a delete button
: (trip.isDone // when a trip is recording do not show a delete button
? IconButton( ? IconButton(
icon: const Icon(Icons.delete), icon: const Icon(Icons.delete),
onPressed: () { onPressed: () {
tripProvider.deleteTrip(trip.id); tripProvider.deleteTrip(trip.id);
}, },
) )
: const Icon(Icons.sensors)), : const Icon(Icons.sensors),
onTap: () { onTap: () {
// Navigate to the map page // Navigate to the map page
Navigator.push( Navigator.push(
......
import 'package:flutter/material.dart';
class UploadProvider extends ChangeNotifier {
bool _uploading = false;
bool get uploading => _uploading;
void setUploading(bool value) {
_uploading = value;
notifyListeners();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment