Battery level for device_tracker

This commit is contained in:
Yegor Vialov 2019-10-24 18:34:38 +00:00
parent e36b33dcec
commit 4068b295bd
3 changed files with 54 additions and 80 deletions

View File

@ -29,6 +29,7 @@ import 'plugins/spoiler_card.dart';
import 'package:uni_links/uni_links.dart'; import 'package:uni_links/uni_links.dart';
import 'package:workmanager/workmanager.dart' as workManager; import 'package:workmanager/workmanager.dart' as workManager;
import 'package:geolocator/geolocator.dart'; import 'package:geolocator/geolocator.dart';
import 'package:battery/battery.dart';
import 'utils/logger.dart'; import 'utils/logger.dart';

View File

@ -17,16 +17,16 @@ class LocationManager {
final String backgroundTaskId = "haclocationtask4352"; final String backgroundTaskId = "haclocationtask4352";
final String backgroundTaskTag = "haclocation"; final String backgroundTaskTag = "haclocation";
Duration _updateInterval; Duration _updateInterval;
bool _isEnabled; bool _isRunning;
void init() async { void init() async {
SharedPreferences prefs = await SharedPreferences.getInstance(); SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.reload(); await prefs.reload();
_updateInterval = Duration(minutes: prefs.getInt("location-interval") ?? _updateInterval = Duration(minutes: prefs.getInt("location-interval") ??
defaultUpdateIntervalMinutes); defaultUpdateIntervalMinutes);
_isEnabled = prefs.getBool("location-enabled") ?? false; _isRunning = prefs.getBool("location-enabled") ?? false;
if (_isEnabled) { if (_isRunning) {
_startLocationService(); await _startLocationService();
} }
} }
@ -35,23 +35,28 @@ class LocationManager {
if (interval != _updateInterval.inMinutes) { if (interval != _updateInterval.inMinutes) {
prefs.setInt("location-interval", interval); prefs.setInt("location-interval", interval);
_updateInterval = Duration(minutes: interval); _updateInterval = Duration(minutes: interval);
if (_isRunning) {
Logger.d("Stopping location tracking...");
_isRunning = false;
await _stopLocationService();
} }
if (enabled && !_isEnabled) { }
Logger.d("Enabling location service"); if (enabled && !_isRunning) {
Logger.d("Starting location tracking");
SharedPreferences prefs = await SharedPreferences.getInstance(); SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("location-enabled", enabled); prefs.setBool("location-enabled", enabled);
_isEnabled = true; _isRunning = true;
_startLocationService(); await _startLocationService();
} else if (!enabled && _isEnabled) { } else if (!enabled && _isRunning) {
Logger.d("Disabling location service"); Logger.d("Stopping location tracking...");
SharedPreferences prefs = await SharedPreferences.getInstance(); SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("location-enabled", enabled); prefs.setBool("location-enabled", enabled);
_isEnabled = false; _isRunning = false;
_stopLocationService(); await _stopLocationService();
} }
} }
void _startLocationService() async { _startLocationService() async {
Logger.d("Scheduling location update for every ${_updateInterval Logger.d("Scheduling location update for every ${_updateInterval
.inMinutes} minutes..."); .inMinutes} minutes...");
String webhookId = ConnectionManager().webhookId; String webhookId = ConnectionManager().webhookId;
@ -76,12 +81,12 @@ class LocationManager {
} }
} }
void _stopLocationService() async { _stopLocationService() async {
Logger.d("Canceling previous schedule if any..."); Logger.d("Canceling previous schedule if any...");
await workManager.Workmanager.cancelByTag(backgroundTaskTag); await workManager.Workmanager.cancelByTag(backgroundTaskTag);
} }
void updateDeviceLocation() async { updateDeviceLocation() async {
if (ConnectionManager().webhookId != null && if (ConnectionManager().webhookId != null &&
ConnectionManager().webhookId.isNotEmpty) { ConnectionManager().webhookId.isNotEmpty) {
String url = "${ConnectionManager() String url = "${ConnectionManager()
@ -92,9 +97,7 @@ class LocationManager {
desiredAccuracy: LocationAccuracy.medium); desiredAccuracy: LocationAccuracy.medium);
Logger.d("[Location] Got location: ${location.latitude} ${location Logger.d("[Location] Got location: ${location.latitude} ${location
.longitude}. Sending home..."); .longitude}. Sending home...");
int battery = DateTime int battery = await Battery().batteryLevel;
.now()
.hour;
var data = { var data = {
"type": "update_location", "type": "update_location",
"data": { "data": {
@ -117,83 +120,52 @@ class LocationManager {
void updateDeviceLocationIsolate() { void updateDeviceLocationIsolate() {
workManager.Workmanager.executeTask((backgroundTask, data) { workManager.Workmanager.executeTask((backgroundTask, data) {
print("[Background $backgroundTask] Started"); //print("[Background $backgroundTask] Started");
var battery = Battery();
int batteryLevel = 100;
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) {
int battery = DateTime.now().hour; //print("[Background $backgroundTask] hour=$battery");
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";
print("[Background $backgroundTask] Getting device location..."); 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] Getting device location...");
Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.medium).then((location) { Geolocator().getCurrentPosition(desiredAccuracy: LocationAccuracy.medium).then((location) {
print("[Background $backgroundTask] Got location: ${location.latitude} ${location.longitude}"); //print("[Background $backgroundTask] Got location: ${location.latitude} ${location.longitude}");
print("[Background $backgroundTask] sending data home..."); data["data"]["gps"] = [location.latitude, location.longitude];
var data = { data["data"]["gps_accuracy"] = location.accuracy;
"type": "update_location", //print("[Background $backgroundTask] Sending data home...");
"data": {
"gps": [location.latitude, location.longitude],
"gps_accuracy": location.accuracy,
"battery": battery
}
};
http.post( http.post(
url, url,
headers: headers, headers: headers,
body: json.encode(data) body: json.encode(data)
).catchError((e) { );
print("[Background $backgroundTask] Error sending data: ${e.toString()}");
}).then((_) {
print("[Background $backgroundTask] Success!");
});
}).catchError((e) { }).catchError((e) {
print("[Background $backgroundTask] Error getting current location: ${e.toString()}. Trying last known..."); //print("[Background $backgroundTask] Error getting current location: ${e.toString()}. Trying last known...");
Geolocator().getLastKnownPosition(desiredAccuracy: LocationAccuracy.medium).then((location){ Geolocator().getLastKnownPosition(desiredAccuracy: LocationAccuracy.medium).then((location){
print("[Background $backgroundTask] Got last known location: ${location.latitude} ${location.longitude}"); //print("[Background $backgroundTask] Got last known location: ${location.latitude} ${location.longitude}");
print("[Background $backgroundTask] sending data home..."); data["data"]["gps"] = [location.latitude, location.longitude];
var data = { data["data"]["gps_accuracy"] = location.accuracy;
"type": "update_location", //print("[Background $backgroundTask] Sending data home...");
"data": {
"gps": [location.latitude, location.longitude],
"gps_accuracy": location.accuracy,
"battery": battery
}
};
http.post( http.post(
url, url,
headers: headers, headers: headers,
body: json.encode(data) body: json.encode(data)
).catchError((e) { );
print("[Background $backgroundTask] Error sending data: ${e.toString()}");
}).then((_) {
print("[Background $backgroundTask] Success!");
});
}).catchError((e){
print("[Background $backgroundTask] Error getting last known location: ${e.toString()}. Sending fake...");
print("[Background $backgroundTask] sending data home...");
var data = {
"type": "update_location",
"data": {
"gps": [40.34, 30.34],
"gps_accuracy": 300,
"battery": battery
}
};
http.post(
url,
headers: headers,
body: json.encode(data)
).catchError((e) {
print("[Background $backgroundTask] Error sending data: ${e.toString()}");
}).then((_) {
print("[Background $backgroundTask] Success!");
}); });
}); });
}); });
} else {
print("[Background $backgroundTask] No webhook id. Aborting");
} }
return Future.value(true); return Future.value(true);
}); });

View File

@ -1,7 +1,7 @@
name: hass_client name: hass_client
description: Home Assistant Android Client description: Home Assistant Android Client
version: 0.7.0+704 version: 0.7.0+705
environment: environment:
sdk: ">=2.0.0-dev.68.0 <3.0.0" sdk: ">=2.0.0-dev.68.0 <3.0.0"
@ -27,6 +27,7 @@ dependencies:
flutter_local_notifications: ^0.8.4 flutter_local_notifications: ^0.8.4
geolocator: ^5.1.4+2 geolocator: ^5.1.4+2
workmanager: ^0.1.3 workmanager: ^0.1.3
battery: ^0.3.1+1
share: share:
git: git:
url: https://github.com/d-silveira/flutter-share.git url: https://github.com/d-silveira/flutter-share.git