From 1a9fec8b987bb2e0f4714533e6e3dbfa52f381b5 Mon Sep 17 00:00:00 2001 From: Yegor Vialov Date: Wed, 27 Nov 2019 12:26:55 +0000 Subject: [PATCH] Senty reporting. Fix background location tracking crash --- lib/main.dart | 36 ++++++++++++++++++------ lib/managers/location_manager.class.dart | 36 ++++++++---------------- lib/utils/logger.dart | 4 +++ pubspec.yaml | 1 + 4 files changed, 44 insertions(+), 33 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 6aa7fcc..e2e6b0c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,6 +30,7 @@ import 'package:uni_links/uni_links.dart'; import 'package:workmanager/workmanager.dart' as workManager; import 'package:geolocator/geolocator.dart'; import 'package:battery/battery.dart'; +import 'package:sentry/sentry.dart'; import 'utils/logger.dart'; @@ -138,6 +139,7 @@ part 'entities/media_player/widgets/media_player_progress_bar.widget.dart'; part 'pages/whats_new.page.dart'; EventBus eventBus = new EventBus(); +final SentryClient _sentry = SentryClient(dsn: "https://03ef364745cc4c23a60ddbc874c69925@sentry.io/1836118"); final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin(); const String appName = "HA Client"; @@ -145,11 +147,31 @@ const appVersionNumber = "0.7.4"; const appVersionAdd = ""; const appVersion = "$appVersionNumber$appVersionAdd"; -void main() async { - FlutterError.onError = (errorDetails) { - Logger.e( "${errorDetails.exception}"); +Future _reportError(dynamic error, dynamic stackTrace) async { + // Print the exception to the console. if (Logger.isInDebugMode) { - FlutterError.dumpErrorToConsole(errorDetails); + Logger.e('Caught error: $error'); + Logger.p(stackTrace); + return; + } else { + Logger.e('Caught error: $error. Reporting to Senrty.'); + // Send the Exception and Stacktrace to Sentry in Production mode. + _sentry.captureException( + exception: error, + stackTrace: stackTrace, + ); + } +} + +void main() async { + FlutterError.onError = (FlutterErrorDetails details) { + Logger.e(" Caut Flutter runtime error: ${details.exception}"); + if (Logger.isInDebugMode) { + FlutterError.dumpErrorToConsole(details); + } else { + // In production mode, report to the application zone to report to + // Sentry. + Zone.current.handleUncaughtError(details.exception, details.stack); } }; @@ -161,11 +183,7 @@ void main() async { runApp(new HAClientApp()); }, onError: (error, stack) { - Logger.e("$error"); - Logger.e("$stack"); - if (Logger.isInDebugMode) { - debugPrint("$stack"); - } + _reportError(error, stack); }); } diff --git a/lib/managers/location_manager.class.dart b/lib/managers/location_manager.class.dart index b6e4449..e89470d 100644 --- a/lib/managers/location_manager.class.dart +++ b/lib/managers/location_manager.class.dart @@ -83,7 +83,7 @@ class LocationManager { Logger.d("Scheduling location update task #$i for every ${interval.inMinutes} minutes in $delay minutes..."); await workManager.Workmanager.registerPeriodicTask( "$backgroundTaskId$n", - "haClientLocationTracking", + "haClientLocationTracking-0$n", tag: backgroundTaskTag, inputData: { "webhookId": webhookId, @@ -109,8 +109,7 @@ class LocationManager { updateDeviceLocation() async { Logger.d("[Foreground location] Started"); - //Logger.d("[Foreground location] Forcing Android location manager..."); - Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true; + Geolocator geolocator = Geolocator(); var battery = Battery(); String webhookId = ConnectionManager().webhookId; String httpWebHost = ConnectionManager().httpWebHost; @@ -150,14 +149,14 @@ class LocationManager { void updateDeviceLocationIsolate() { workManager.Workmanager.executeTask((backgroundTask, data) { - //print("[Background $backgroundTask] Started"); - Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true; + print("[Background $backgroundTask] Started"); + Geolocator geolocator = Geolocator(); var battery = Battery(); int batteryLevel = 100; String webhookId = data["webhookId"]; String httpWebHost = data["httpWebHost"]; if (webhookId != null && webhookId.isNotEmpty) { - //print("[Background $backgroundTask] hour=$battery"); + print("[Background $backgroundTask] hour=$battery"); String url = "$httpWebHost/api/webhook/$webhookId"; Map headers = {}; headers["Content-Type"] = "application/json"; @@ -169,36 +168,25 @@ void updateDeviceLocationIsolate() { "battery": batteryLevel } }; - //print("[Background $backgroundTask] Getting battery level..."); + print("[Background $backgroundTask] Getting battery level..."); battery.batteryLevel.then((val) => data["data"]["battery"] = val).whenComplete((){ - //print("[Background $backgroundTask] Getting device location..."); + print("[Background $backgroundTask] Getting device location..."); geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high, locationPermissionLevel: GeolocationPermission.locationAlways).then((location) { - //print("[Background $backgroundTask] Got location: ${location.latitude} ${location.longitude}"); if (location != null) { + print("[Background $backgroundTask] Got location: ${location.latitude} ${location.longitude}"); data["data"]["gps"] = [location.latitude, location.longitude]; data["data"]["gps_accuracy"] = location.accuracy; - //print("[Background $backgroundTask] Sending data home..."); + print("[Background $backgroundTask] Sending data home."); http.post( url, headers: headers, body: json.encode(data) ); + } else { + print("[Background $backgroundTask] No location. Finishing."); } }).catchError((e) { - //print("[Background $backgroundTask] Error getting current location: ${e.toString()}. Trying last known..."); - geolocator.getLastKnownPosition(desiredAccuracy: LocationAccuracy.medium).then((location){ - //print("[Background $backgroundTask] Got last known location: ${location.latitude} ${location.longitude}"); - if (location != null) { - data["data"]["gps"] = [location.latitude, location.longitude]; - data["data"]["gps_accuracy"] = location.accuracy; - //print("[Background $backgroundTask] Sending data home..."); - http.post( - url, - headers: headers, - body: json.encode(data) - ); - } - }); + print("[Background $backgroundTask] Error getting current location: ${e.toString()}"); }); }); } diff --git a/lib/utils/logger.dart b/lib/utils/logger.dart index 466ddcc..353906f 100644 --- a/lib/utils/logger.dart +++ b/lib/utils/logger.dart @@ -23,6 +23,10 @@ class Logger { return inDebugMode; } + static void p(data) { + print(data); + } + static void e(String message) { _writeToLog("Error", message); } diff --git a/pubspec.yaml b/pubspec.yaml index d6cd504..8d84bf7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -29,6 +29,7 @@ dependencies: geolocator: ^5.1.5 workmanager: ^0.1.3 battery: ^0.3.1+1 + sentry: ^2.3.1 share: git: url: https://github.com/d-silveira/flutter-share.git