From d9ad3b30833b30fab55eeb947b2e660c68ebe52b Mon Sep 17 00:00:00 2001 From: Yegor Vialov Date: Mon, 17 Feb 2020 19:22:38 +0000 Subject: [PATCH] Location tracking... --- android/app/src/main/AndroidManifest.xml | 1 - lib/main.dart | 5 +- lib/managers/connection_manager.class.dart | 5 +- lib/managers/location_manager.class.dart | 78 ++++++++++++---------- lib/pages/main/main.page.dart | 36 +--------- 5 files changed, 49 insertions(+), 76 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 054b87f..e309ef2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,7 +6,6 @@ - diff --git a/lib/main.dart b/lib/main.dart index 9228a26..2e45d4c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,7 +4,6 @@ import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/gestures.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:web_socket_channel/io.dart'; import 'package:event_bus/event_bus.dart'; @@ -192,6 +191,10 @@ class _HAClientAppState extends State { _subscription = purchaseUpdates.listen((purchases) { _handlePurchaseUpdates(purchases); }); + workManager.Workmanager.initialize( + updateDeviceLocationIsolate, + isInDebugMode: false + ); super.initState(); } diff --git a/lib/managers/connection_manager.class.dart b/lib/managers/connection_manager.class.dart index c123b4e..2dbe80c 100644 --- a/lib/managers/connection_manager.class.dart +++ b/lib/managers/connection_manager.class.dart @@ -20,7 +20,6 @@ class ConnectionManager { String oauthUrl; String webhookId; bool useLovelace = true; - bool useWebView = false; bool settingsLoaded = false; bool get isAuthenticated => _token != null; StreamSubscription _socketSubscription; @@ -39,10 +38,10 @@ class ConnectionManager { Completer completer = Completer(); bool stopInit = false; if (loadSettings) { - Logger.e("Loading settings..."); + Logger.d("Loading settings..."); SharedPreferences prefs = await SharedPreferences.getInstance(); + Logger.d("..done"); useLovelace = prefs.getBool('use-lovelace') ?? true; - useWebView = prefs.getBool("use-webview") ?? false; _domain = prefs.getString('hassio-domain'); _port = prefs.getString('hassio-port'); webhookId = prefs.getString('app-webhook-id'); diff --git a/lib/managers/location_manager.class.dart b/lib/managers/location_manager.class.dart index ab46f01..3c6f33f 100644 --- a/lib/managers/location_manager.class.dart +++ b/lib/managers/location_manager.class.dart @@ -91,12 +91,12 @@ class LocationManager { }, frequency: interval, initialDelay: Duration(minutes: delay), - existingWorkPolicy: workManager.ExistingWorkPolicy.keep, + existingWorkPolicy: workManager.ExistingWorkPolicy.replace, backoffPolicy: workManager.BackoffPolicy.linear, backoffPolicyDelay: interval, constraints: workManager.Constraints( - networkType: workManager.NetworkType.connected - ) + networkType: workManager.NetworkType.connected, + ), ); } } @@ -149,46 +149,52 @@ class LocationManager { void updateDeviceLocationIsolate() { workManager.Workmanager.executeTask((backgroundTask, data) { - //print("[Background $backgroundTask] Started"); + Completer completer = Completer(); + print("[Background $backgroundTask] Started"); Geolocator geolocator = Geolocator(); var battery = Battery(); - int batteryLevel = 100; + int batteryLevel = 1; String webhookId = data["webhookId"]; String httpWebHost = data["httpWebHost"]; if (webhookId != null && webhookId.isNotEmpty) { - //print("[Background $backgroundTask] hour=$battery"); - String url = "$httpWebHost/api/webhook/$webhookId"; - Map headers = {}; - headers["Content-Type"] = "application/json"; - Map data = { - "type": "update_location", - "data": { - "gps": [], - "gps_accuracy": 0, - "battery": batteryLevel + String url = "$httpWebHost/api/webhook/$webhookId"; + Map headers = {}; + headers["Content-Type"] = "application/json"; + Map data = { + "type": "update_location", + "data": { + "gps": [], + "gps_accuracy": 0, + "battery": batteryLevel + } + }; + print("[Background $backgroundTask] Getting battery level..."); + battery.batteryLevel.then((val) => data["data"]["battery"] = val).whenComplete((){ + print("[Background $backgroundTask] Battery level is ${data["data"]["battery"]}. Getting device location..."); + geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high, locationPermissionLevel: GeolocationPermission.locationAlways).then((location) { + 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."); + http.post( + url, + headers: headers, + body: json.encode(data) + ); + completer.complete(true); + } else { + print("[Background $backgroundTask] Can't get device location. Location is null"); + completer.complete(true); } - }; - //print("[Background $backgroundTask] Getting battery level..."); - battery.batteryLevel.then((val) => data["data"]["battery"] = val).whenComplete((){ - //print("[Background $backgroundTask] Getting device location..."); - geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high, locationPermissionLevel: GeolocationPermission.locationAlways).then((location) { - 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."); - http.post( - url, - headers: headers, - body: json.encode(data) - ); - } else { - throw "Can't get device location. Location is null"; - } - }).catchError((e) { - //print("[Background $backgroundTask] Error getting current location: ${e.toString()}"); - }); + }).catchError((e) { + print("[Background $backgroundTask] Error getting current location: ${e.toString()}"); + completer.complete(true); }); + }); + } else { + print("[Background $backgroundTask] Not configured"); + completer.complete(true); } return Future.value(true); }); diff --git a/lib/pages/main/main.page.dart b/lib/pages/main/main.page.dart index 7085b76..32c016a 100644 --- a/lib/pages/main/main.page.dart +++ b/lib/pages/main/main.page.dart @@ -29,10 +29,6 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker @override void initState() { super.initState(); - workManager.Workmanager.initialize( - updateDeviceLocationIsolate, - isInDebugMode: false - ); WidgetsBinding.instance.addObserver(this); _firebaseMessaging.configure( @@ -118,25 +114,6 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker } _fetchData() async { - if (ConnectionManager().useWebView) { - //final flutterWebViewPlugin = new FlutterWebviewPlugin(); - - /*flutterWebViewPlugin.onStateChanged.listen((viewState) async { - if (viewState.type == WebViewState.startLoad) { - Logger.d("[WebView] Injecting external auth JS"); - rootBundle.loadString('assets/js/externalAuth.js').then((js){ - flutterWebViewPlugin.evalJavascript(js.replaceFirst("[token]", ConnectionManager()._token)); - }); - } - }); - - flutterWebViewPlugin.onUrlChanged.listen((String url) { - if (url.contains("htcmd://show-settings")) { - flutterWebViewPlugin.hide(); - Navigator.pushNamed(context, "/connection-settings"); - } - });*/ - } await HomeAssistant().fetchData().then((_) { _hideBottomBar(); if (_entityToShow != null) { @@ -857,17 +834,7 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker ); } } - if (!ConnectionManager().settingsLoaded) { - return Scaffold( - key: _scaffoldKey, - primary: false, - //bottomNavigationBar: bottomBar, - body: Container( - color: Colors.blue, - ) - ); - } else { - if (HomeAssistant().isNoViews) { + if (HomeAssistant().isNoViews) { return Scaffold( key: _scaffoldKey, primary: false, @@ -894,7 +861,6 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker }, ); } - } } @override