Location tracking...
This commit is contained in:
parent
b2686cb105
commit
d9ad3b3083
@ -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"/>
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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');
|
||||||
|
@ -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);
|
||||||
});
|
});
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user