Location tracking...

This commit is contained in:
Yegor Vialov 2020-02-17 19:22:38 +00:00
parent b2686cb105
commit d9ad3b3083
5 changed files with 49 additions and 76 deletions

View File

@ -6,7 +6,6 @@
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>

View File

@ -4,7 +4,6 @@ import 'dart:math';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/gestures.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:web_socket_channel/io.dart'; import 'package:web_socket_channel/io.dart';
import 'package:event_bus/event_bus.dart'; import 'package:event_bus/event_bus.dart';
@ -192,6 +191,10 @@ class _HAClientAppState extends State<HAClientApp> {
_subscription = purchaseUpdates.listen((purchases) { _subscription = purchaseUpdates.listen((purchases) {
_handlePurchaseUpdates(purchases); _handlePurchaseUpdates(purchases);
}); });
workManager.Workmanager.initialize(
updateDeviceLocationIsolate,
isInDebugMode: false
);
super.initState(); super.initState();
} }

View File

@ -20,7 +20,6 @@ class ConnectionManager {
String oauthUrl; String oauthUrl;
String webhookId; String webhookId;
bool useLovelace = true; bool useLovelace = true;
bool useWebView = false;
bool settingsLoaded = false; bool settingsLoaded = false;
bool get isAuthenticated => _token != null; bool get isAuthenticated => _token != null;
StreamSubscription _socketSubscription; StreamSubscription _socketSubscription;
@ -39,10 +38,10 @@ class ConnectionManager {
Completer completer = Completer(); Completer completer = Completer();
bool stopInit = false; bool stopInit = false;
if (loadSettings) { if (loadSettings) {
Logger.e("Loading settings..."); Logger.d("Loading settings...");
SharedPreferences prefs = await SharedPreferences.getInstance(); SharedPreferences prefs = await SharedPreferences.getInstance();
Logger.d("..done");
useLovelace = prefs.getBool('use-lovelace') ?? true; useLovelace = prefs.getBool('use-lovelace') ?? true;
useWebView = prefs.getBool("use-webview") ?? false;
_domain = prefs.getString('hassio-domain'); _domain = prefs.getString('hassio-domain');
_port = prefs.getString('hassio-port'); _port = prefs.getString('hassio-port');
webhookId = prefs.getString('app-webhook-id'); webhookId = prefs.getString('app-webhook-id');

View File

@ -91,12 +91,12 @@ class LocationManager {
}, },
frequency: interval, frequency: interval,
initialDelay: Duration(minutes: delay), initialDelay: Duration(minutes: delay),
existingWorkPolicy: workManager.ExistingWorkPolicy.keep, existingWorkPolicy: workManager.ExistingWorkPolicy.replace,
backoffPolicy: workManager.BackoffPolicy.linear, backoffPolicy: workManager.BackoffPolicy.linear,
backoffPolicyDelay: interval, backoffPolicyDelay: interval,
constraints: workManager.Constraints( constraints: workManager.Constraints(
networkType: workManager.NetworkType.connected networkType: workManager.NetworkType.connected,
) ),
); );
} }
} }
@ -149,46 +149,52 @@ class LocationManager {
void updateDeviceLocationIsolate() { void updateDeviceLocationIsolate() {
workManager.Workmanager.executeTask((backgroundTask, data) { workManager.Workmanager.executeTask((backgroundTask, data) {
//print("[Background $backgroundTask] Started"); Completer completer = Completer();
print("[Background $backgroundTask] Started");
Geolocator geolocator = Geolocator(); Geolocator geolocator = Geolocator();
var battery = Battery(); var battery = Battery();
int batteryLevel = 100; int batteryLevel = 1;
String webhookId = data["webhookId"]; String webhookId = data["webhookId"];
String httpWebHost = data["httpWebHost"]; String httpWebHost = data["httpWebHost"];
if (webhookId != null && webhookId.isNotEmpty) { if (webhookId != null && webhookId.isNotEmpty) {
//print("[Background $backgroundTask] hour=$battery"); String url = "$httpWebHost/api/webhook/$webhookId";
String url = "$httpWebHost/api/webhook/$webhookId"; Map<String, String> headers = {};
Map<String, String> headers = {}; headers["Content-Type"] = "application/json";
headers["Content-Type"] = "application/json"; Map data = {
Map data = { "type": "update_location",
"type": "update_location", "data": {
"data": { "gps": [],
"gps": [], "gps_accuracy": 0,
"gps_accuracy": 0, "battery": batteryLevel
"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);
} }
}; }).catchError((e) {
//print("[Background $backgroundTask] Getting battery level..."); print("[Background $backgroundTask] Error getting current location: ${e.toString()}");
battery.batteryLevel.then((val) => data["data"]["battery"] = val).whenComplete((){ completer.complete(true);
//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()}");
});
}); });
});
} else {
print("[Background $backgroundTask] Not configured");
completer.complete(true);
} }
return Future.value(true); return Future.value(true);
}); });

View File

@ -29,10 +29,6 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
@override @override
void initState() { void initState() {
super.initState(); super.initState();
workManager.Workmanager.initialize(
updateDeviceLocationIsolate,
isInDebugMode: false
);
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addObserver(this);
_firebaseMessaging.configure( _firebaseMessaging.configure(
@ -118,25 +114,6 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
} }
_fetchData() async { _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((_) { await HomeAssistant().fetchData().then((_) {
_hideBottomBar(); _hideBottomBar();
if (_entityToShow != null) { if (_entityToShow != null) {
@ -857,17 +834,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
); );
} }
} }
if (!ConnectionManager().settingsLoaded) { if (HomeAssistant().isNoViews) {
return Scaffold(
key: _scaffoldKey,
primary: false,
//bottomNavigationBar: bottomBar,
body: Container(
color: Colors.blue,
)
);
} else {
if (HomeAssistant().isNoViews) {
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
primary: false, primary: false,
@ -894,7 +861,6 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
}, },
); );
} }
}
} }
@override @override