Foreground location updates

This commit is contained in:
Yegor Vialov 2019-11-10 21:53:28 +00:00
parent 5792652619
commit 4b9ec5ca6e
5 changed files with 39 additions and 54 deletions

View File

@ -3,18 +3,13 @@
<uses-feature android:name="android.hardware.touchscreen" <uses-feature android:name="android.hardware.touchscreen"
android:required="false" /> android:required="false" />
<!-- The INTERNET permission is required for development. Specifically,
flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<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"/>
<!-- io.flutter.app.FlutterApplication is an android.app.Application that <!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method. calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide In most cases you can leave this as-is, but you if you want to provide

View File

@ -27,6 +27,7 @@ class LocationManager {
_isRunning = prefs.getBool("location-enabled") ?? false; _isRunning = prefs.getBool("location-enabled") ?? false;
if (_isRunning) { if (_isRunning) {
await _startLocationService(); await _startLocationService();
updateDeviceLocation(false);
} }
} }
@ -107,58 +108,46 @@ class LocationManager {
await workManager.Workmanager.cancelByTag(backgroundTaskTag); await workManager.Workmanager.cancelByTag(backgroundTaskTag);
} }
updateDeviceLocation() async { updateDeviceLocation(bool force) async {
Logger.d("[Test location] Started"); if (!force && !_isRunning) {
Logger.d("[Test location] Forcing Android location manager..."); Logger.d("[Foreground location] Not enabled. Aborting.");
return;
}
Logger.d("[Foreground location] Started");
//Logger.d("[Foreground location] Forcing Android location manager...");
Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true; Geolocator geolocator = Geolocator()..forceAndroidLocationManager = true;
var battery = Battery(); var battery = Battery();
int batteryLevel = 100;
String webhookId = ConnectionManager().webhookId; String webhookId = ConnectionManager().webhookId;
String httpWebHost = ConnectionManager().httpWebHost; String httpWebHost = ConnectionManager().httpWebHost;
if (webhookId != null && webhookId.isNotEmpty) { if (webhookId != null && webhookId.isNotEmpty) {
Logger.d("[Foreground location] Getting battery level...");
int batteryLevel = await battery.batteryLevel;
Logger.d("[Foreground location] Getting device location...");
Position position = await geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
locationPermissionLevel: GeolocationPermission.locationAlways
);
if (position != null) {
Logger.d("[Foreground location] Location: ${position.latitude} ${position.longitude}. Accuracy: ${position.accuracy}. (${position.timestamp})");
String url = "$httpWebHost/api/webhook/$webhookId"; String url = "$httpWebHost/api/webhook/$webhookId";
Map<String, String> headers = {};
headers["Content-Type"] = "application/json";
Map data = { Map data = {
"type": "update_location", "type": "update_location",
"data": { "data": {
"gps": [], "gps": [position.latitude, position.longitude],
"gps_accuracy": 0, "gps_accuracy": position.accuracy,
"battery": batteryLevel "battery": batteryLevel ?? 100
} }
}; };
Logger.d("[Test location] Getting battery level..."); Logger.d("[Foreground location] Sending data home...");
battery.batteryLevel.then((val) => data["data"]["battery"] = val).whenComplete((){ var response = await http.post(
Logger.d("[Test location] Getting device location...");
geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high, locationPermissionLevel: GeolocationPermission.locationAlways).then((location) {
Logger.d("[Test location] Got location: ${location.latitude} ${location.longitude} with accuracy of ${location.accuracy}");
if (location != null) {
data["data"]["gps"] = [location.latitude, location.longitude];
data["data"]["gps_accuracy"] = location.accuracy;
Logger.d("[Test location] Sending data home...");
http.post(
url, url,
headers: headers, headers: {"Content-Type": "application/json"},
body: json.encode(data) body: json.encode(data)
); );
Logger.d("[Foreground location] Got HTTP ${response.statusCode}");
} else {
Logger.d("[Foreground location] No location. Aborting.");
} }
}).catchError((e) {
Logger.d("[Test location] Error getting current location: ${e.toString()}. Trying last known...");
geolocator.getLastKnownPosition(desiredAccuracy: LocationAccuracy.medium).then((location){
Logger.d("[Test location] Got last known location: ${location.latitude} ${location.longitude} with accuracy of ${location.accuracy}");
if (location != null) {
data["data"]["gps"] = [location.latitude, location.longitude];
data["data"]["gps_accuracy"] = location.accuracy;
Logger.d("[Test location] Sending data home...");
http.post(
url,
headers: headers,
body: json.encode(data)
);
}
});
});
});
} }
} }

View File

@ -94,7 +94,7 @@ class _IntegrationSettingsPageState extends State<IntegrationSettingsPage> {
_switchLocationTrackingState(bool state) async { _switchLocationTrackingState(bool state) async {
if (state) { if (state) {
await LocationManager().updateDeviceLocation(); await LocationManager().updateDeviceLocation(true);
} }
await LocationManager().setSettings(_locationTrackingEnabled, _locationInterval); await LocationManager().setSettings(_locationTrackingEnabled, _locationInterval);
setState(() { setState(() {

View File

@ -122,6 +122,7 @@ class _MainPageState extends ReceiveShareState<MainPage> with WidgetsBindingObse
_showInfoBottomBar(progress: true,); _showInfoBottomBar(progress: true,);
ConnectionManager().init(loadSettings: false, forceReconnect: false).then((_){ ConnectionManager().init(loadSettings: false, forceReconnect: false).then((_){
_fetchData(); _fetchData();
LocationManager().updateDeviceLocation(false);
//StartupUserMessagesManager().checkMessagesToShow(); //StartupUserMessagesManager().checkMessagesToShow();
}, onError: (e) { }, onError: (e) {
_setErrorState(e); _setErrorState(e);

View File

@ -26,7 +26,7 @@ dependencies:
flutter_secure_storage: ^3.3.1+1 flutter_secure_storage: ^3.3.1+1
device_info: ^0.4.0+3 device_info: ^0.4.0+3
flutter_local_notifications: ^0.8.4 flutter_local_notifications: ^0.8.4
geolocator: ^5.1.4+2 geolocator: ^5.1.5
workmanager: ^0.1.3 workmanager: ^0.1.3
battery: ^0.3.1+1 battery: ^0.3.1+1
share: share: