Skip to content
Snippets Groups Projects
Commit 5f905a19 authored by Jonathan Flueren's avatar Jonathan Flueren
Browse files

Merge branch 'upload-indicator' into 'main'

Upload indicator

See merge request !4
parents 7990768f 22189774
No related branches found
No related tags found
1 merge request!4Upload indicator
Pipeline #276777 passed
......@@ -49,6 +49,9 @@ plugins {
release {
signingConfig signingConfigs.release
}
debug {
applicationIdSuffix = ".debug"
}
}
}
......
......@@ -10,6 +10,7 @@ import 'package:app/providers/location_provider.dart';
import 'package:app/providers/privacy_zone_provider.dart';
import 'package:app/providers/distance_provider.dart';
import 'package:app/providers/trip_provider.dart';
import 'package:app/providers/upload_provider.dart';
import 'package:app/welcome_page.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
......@@ -28,6 +29,7 @@ Future<void> main() async {
ChangeNotifierProvider(create: (context) => PrivacyZoneProvider()),
ChangeNotifierProvider(create: (context) => DistanceProvider()),
ChangeNotifierProvider(create: (context) => ButtonProvider()),
ChangeNotifierProvider(create: (context) => UploadProvider()),
ChangeNotifierProvider(create: (context) => TripProvider()),
ChangeNotifierProvider(create: (context) => LocationProvider()),
ChangeNotifierProvider(create: (context) => BatteryProvider()),
......
......@@ -20,18 +20,24 @@ class UploadManager {
int successCount = 0;
for (var trip in trips) {
final success = await uploadTrip(trip);
bool success = false;
try {
success = await uploadTrip(trip);
} catch (e) {
Sentry.captureException(e);
}
if (success) {
successCount++;
await database.writeTxn(() async {
final t = await database.trips.get(trip.id);
if (t == null) {
throw Exception("Trip was deleted while uploading!");
Sentry.captureException("Trip was deleted while uploading!");
return;
}
t.uploaded = true;
database.trips.put(t);
});
successCount++;
}
}
return (successCount, trips.length);
......
import 'dart:io';
import 'package:app/manager/upload_manger.dart';
import 'package:app/providers/trip_provider.dart';
import 'package:app/providers/upload_provider.dart';
import 'package:app/widgets/trip_page.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:toastification/toastification.dart';
import 'package:app/generated/i18n/app_localizations.dart';
......@@ -15,6 +19,7 @@ class ObsListUploadPage extends StatefulWidget {
class _ObsListUploadPageState extends State<ObsListUploadPage> {
bool showUploadedTrips = false;
@override
void initState() {
super.initState();
......@@ -23,6 +28,7 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
@override
Widget build(BuildContext context) {
final tripProvider = context.watch<TripProvider>();
final uploadStateProvider = context.watch<UploadProvider>();
return Scaffold(
appBar: AppBar(
......@@ -31,15 +37,52 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 30, horizontal: 10),
child: Column(children: [
child: Column(
children: [
// Upload button
ElevatedButton(
onPressed: () async {
UploadManager uploadManger = UploadManager();
onPressed: uploadStateProvider.uploading
? null
: () async {
final SharedPreferencesAsync prefs =
SharedPreferencesAsync();
if (((await prefs.getString('portalServer'))?.isEmpty ??
true) ||
((await prefs.getString('portalKey'))?.isEmpty ??
true)) {
toastification.show(
context: context,
type: ToastificationType.error,
style: ToastificationStyle.flat,
title: Text("No portal server or key"),
description: Text(
"Please set the portal server and key in the settings."),
alignment: Alignment.topRight,
autoCloseDuration: const Duration(seconds: 4),
);
return;
}
final (success, numTracks) = await uploadManger.upload();
uploadStateProvider.setUploading(true);
UploadManager uploadManager = UploadManager();
if (success == numTracks) {
final (success, numTracks) =
await uploadManager.upload();
uploadStateProvider.setUploading(false);
if (success == 0 && numTracks == 0) {
toastification.show(
context: context,
type: ToastificationType.error,
style: ToastificationStyle.flat,
title: Text("No tracks to upload"),
description: Text("There are no tracks to upload."),
alignment: Alignment.topRight,
autoCloseDuration: const Duration(seconds: 4),
);
} else if (success == numTracks) {
toastification.show(
context: context,
type: ToastificationType.success,
......@@ -66,6 +109,11 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
child: Text(AppLocalizations.of(context)!.uploadButton),
),
const SizedBox(height: 20),
uploadStateProvider.uploading
? const CircularProgressIndicator(
strokeWidth: 2,
)
: const SizedBox.shrink(), // Hide indicator when not loading
SwitchListTile(
title: Text(AppLocalizations.of(context)!.showUploadedSwitch),
value: showUploadedTrips,
......@@ -106,7 +154,7 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
tripProvider.deleteTrip(trip.id);
},
)
: Icon(Icons.sensors),
: const Icon(Icons.sensors),
onTap: () {
// Navigate to the map page
Navigator.push(
......@@ -126,7 +174,9 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
);
},
),
])),
],
),
),
),
);
}
......
......@@ -2,6 +2,7 @@ import 'package:app/database/privacy_zone.dart';
import 'package:app/widgets/map_page.dart';
import 'package:app/providers/privacy_zone_provider.dart';
import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'widgets/number_editing_controller.dart';
......@@ -76,6 +77,11 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
});
}
Future<String> _getAppVersion() async {
final packageInfo = await PackageInfo.fromPlatform();
return packageInfo.version;
}
Future<void> _saveStringValue(String key, String value) async {
SharedPreferencesAsync prefs = SharedPreferencesAsync();
await prefs.setString(key, value);
......@@ -237,11 +243,11 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
),
//Show the licence page
ElevatedButton(
onPressed: () {
onPressed: () async {
showLicensePage(
context: context,
applicationName: localizations.appTitle,
applicationVersion: 'TODO',
applicationVersion: await _getAppVersion(),
);
},
child: Text(localizations.settingsPageShowLicensesButton),
......@@ -252,6 +258,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
..obsFirmwareRevision = "test"
..createdAt = DateTime.now()
..uploaded = false
..isDone = true
..trackID = Uuid().v4();
final segment = TripSegment()
......@@ -268,7 +275,8 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
..sensorTwoDistances = [50.0]
..sensorOneDistances = [180.0]
..speed = 20.0
..speedAccuracy = 1.0;
..speedAccuracy = 1.0
..confirmedIdx = 0;
trip.segments.add(segment);
final database = await IsarService().isar;
......
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