diff --git a/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUpdatesService.java b/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUpdatesService.java index c9a2fe1..365a46e 100644 --- a/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUpdatesService.java +++ b/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUpdatesService.java @@ -103,13 +103,16 @@ public class LocationUpdatesService extends Service { private void requestLocationUpdates() { long requestInterval = LocationUtils.getLocationUpdateIntervals(getApplicationContext()); - int priority = LocationUtils.getLocationUpdatesPriority(getApplicationContext()); - Log.i(TAG, "Requesting location updates. Every " + requestInterval + "ms with priority of " + priority); + int priority; + if (requestInterval >= 600000) { + mLocationRequest.setFastestInterval(60000); + priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY; + } else { + priority = LocationRequest.PRIORITY_HIGH_ACCURACY; + } mLocationRequest.setPriority(priority); mLocationRequest.setInterval(requestInterval); - /*if (priority == 102 && requestInterval > 60000) { - mLocationRequest.setFastestInterval(30000); - }*/ + Log.i(TAG, "Requesting location updates. Every " + requestInterval + "ms with priority of " + priority); startForeground(LocationUtils.SERVICE_NOTIFICATION_ID, LocationUtils.getNotification(this, null, LocationUtils.SERVICE_NOTIFICATION_CHANNEL_ID)); try { mFusedLocationClient.requestLocationUpdates(mLocationRequest, diff --git a/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUpdatesWorker.java b/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUpdatesWorker.java index f239470..1ed5db3 100644 --- a/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUpdatesWorker.java +++ b/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUpdatesWorker.java @@ -98,12 +98,8 @@ public class LocationUpdatesWorker extends ListenableWorker { }; LocationRequest locationRequest = new LocationRequest(); - int accuracy = LocationUtils.getLocationUpdatesPriority(getApplicationContext()); - locationRequest.setPriority(accuracy); + locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(5000); - /*if (accuracy == 102) { - locationRequest.setFastestInterval(1000); - }*/ try { fusedLocationClient.requestLocationUpdates(locationRequest, callback, Looper.myLooper()); diff --git a/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUtils.java b/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUtils.java index f3cb0df..e1fcaeb 100644 --- a/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUtils.java +++ b/android/app/src/main/java/com/keyboardcrumbs/hassclient/LocationUtils.java @@ -22,7 +22,6 @@ class LocationUtils { static final String KEY_REQUESTING_LOCATION_UPDATES = "flutter.location-updates-state"; static final String KEY_LOCATION_UPDATE_INTERVAL = "flutter.location-updates-interval"; - static final String KEY_LOCATION_UPDATE_PRIORITY = "flutter.location-updates-priority"; static final String KEY_LOCATION_SHOW_NOTIFICATION = "flutter.location-updates-show-notification"; static final String WORKER_NOTIFICATION_CHANNEL_ID = "location_worker"; @@ -50,10 +49,6 @@ class LocationUtils { return context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE).getLong(KEY_LOCATION_UPDATE_INTERVAL, DEFAULT_LOCATION_UPDATE_INTERVAL_MS); } - static int getLocationUpdatesPriority(Context context) { - return context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE).getInt(KEY_LOCATION_UPDATE_PRIORITY, 100); - } - static boolean showNotification(Context context) { return context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE).getBoolean(KEY_LOCATION_SHOW_NOTIFICATION, true); } @@ -65,10 +60,9 @@ class LocationUtils { .apply(); } - static void setLocationUpdatesSettings(Context context, int priority, long interval, boolean showNotification) { + static void setLocationUpdatesSettings(Context context, long interval, boolean showNotification) { context.getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE) .edit() - .putInt(KEY_LOCATION_UPDATE_PRIORITY, priority) .putBoolean(KEY_LOCATION_SHOW_NOTIFICATION, showNotification) .putLong(KEY_LOCATION_UPDATE_INTERVAL, interval) .apply(); diff --git a/android/app/src/main/java/com/keyboardcrumbs/hassclient/MainActivity.java b/android/app/src/main/java/com/keyboardcrumbs/hassclient/MainActivity.java index 64321f1..f8d07b3 100644 --- a/android/app/src/main/java/com/keyboardcrumbs/hassclient/MainActivity.java +++ b/android/app/src/main/java/com/keyboardcrumbs/hassclient/MainActivity.java @@ -14,6 +14,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.location.Location; import android.os.Bundle; import io.flutter.plugin.common.MethodChannel; @@ -67,12 +68,14 @@ public class MainActivity extends FlutterActivity { case "startLocationService": try { locationUpdatesInterval = ((Number)call.argument("location-updates-interval")).longValue(); - if (locationUpdatesInterval >= LocationUtils.MIN_WORKER_LOCATION_UPDATE_INTERVAL_MS) { - locationUpdatesType = LocationUtils.LOCATION_UPDATES_WORKER; - } else { + boolean useForegroundService = (boolean)call.argument("foreground-location-tracking"); + + if (useForegroundService) { locationUpdatesType = LocationUtils.LOCATION_UPDATES_SERVICE; + } else { + locationUpdatesType = LocationUtils.LOCATION_UPDATES_WORKER; } - LocationUtils.setLocationUpdatesSettings(this, (int)call.argument("location-updates-priority"), locationUpdatesInterval, (boolean)call.argument("location-updates-show-notification")); + LocationUtils.setLocationUpdatesSettings(this, locationUpdatesInterval, (boolean)call.argument("location-updates-show-notification")); if (isNoLocationPermissions()) { requestLocationPermissions(); } else { diff --git a/lib/home_assistant.class.dart b/lib/home_assistant.class.dart index 885ff9d..4f2ae23 100644 --- a/lib/home_assistant.class.dart +++ b/lib/home_assistant.class.dart @@ -278,6 +278,7 @@ class HomeAssistant { _rawPanels = data; List dashboards = []; data.forEach((k,v) { + Logger.d('[HA] Panel $k: title=${v['title']}; component=${v['component_name']}'); String title = v['title'] == null ? "${k[0].toUpperCase()}${k.substring(1)}" : "${v['title'][0].toUpperCase()}${v['title'].substring(1)}"; if (v['component_name'] != null && v['component_name'] == 'lovelace') { dashboards.add( diff --git a/lib/managers/app_settings.dart b/lib/managers/app_settings.dart index f72d6d9..9754340 100644 --- a/lib/managers/app_settings.dart +++ b/lib/managers/app_settings.dart @@ -81,8 +81,9 @@ class AppSettings { try { await platform.invokeMethod('startLocationService', { 'location-updates-interval': oldLocationTrackingInterval * 60 * 1000, - 'location-updates-priority': 100, - 'location-updates-show-notification': true + //'location-updates-priority': 100, + 'location-updates-show-notification': true, + 'foreground-location-tracking': false }); } catch (e, stack) { Logger.e("[MIGRATION] Can't start new location tracking: $e", stacktrace: stack); diff --git a/lib/pages/settings/integration_settings.part.dart b/lib/pages/settings/integration_settings.part.dart index cef68bf..e0379d9 100644 --- a/lib/pages/settings/integration_settings.part.dart +++ b/lib/pages/settings/integration_settings.part.dart @@ -21,7 +21,8 @@ class _IntegrationSettingsPageState extends State { bool _locationTrackingEnabled = false; bool _wait = false; bool _showNotification = true; - int _accuracy = 100; + //int _accuracy = 100; + bool _useForegroundService = false; @override void initState() { @@ -35,9 +36,10 @@ class _IntegrationSettingsPageState extends State { await prefs.reload(); SharedPreferences.getInstance().then((prefs) { setState(() { - _accuracy = /*prefs.getInt("location-updates-priority") ??*/ 100; + //_accuracy = prefs.getInt("location-updates-priority") ?? 100; _locationTrackingEnabled = (prefs.getInt("location-updates-state") ?? 0) > 0; _showNotification = prefs.getBool("location-updates-show-notification") ?? true; + _useForegroundService = prefs.getBool("foreground-location-tracking") ?? false; _locationInterval = Duration(milliseconds: prefs.getInt("location-updates-interval") ?? 900000); }); @@ -69,28 +71,20 @@ class _IntegrationSettingsPageState extends State { } void _decLocationInterval() { - if (_locationInterval.inSeconds > 5) { - if (_locationInterval.inSeconds <= 60) { - setState(() { + if ((_useForegroundService && _locationInterval.inSeconds > 5) || (!_useForegroundService && _locationInterval.inMinutes > 15)) { + setState(() { + if (_locationInterval.inSeconds <= 60) { _locationInterval = _locationInterval - Duration(seconds: 5); - }); - } else if (_locationInterval.inMinutes <= 15) { - setState(() { + } else if (_locationInterval.inMinutes <= 15) { _locationInterval = _locationInterval - Duration(minutes: 1); - }); - } else if (_locationInterval.inMinutes <= 60) { - setState(() { + } else if (_locationInterval.inMinutes <= 60) { _locationInterval = _locationInterval - Duration(minutes: 5); - }); - } else if (_locationInterval.inHours <= 4) { - setState(() { + } else if (_locationInterval.inHours <= 4) { _locationInterval = _locationInterval - Duration(minutes: 10); - }); - } else if (_locationInterval.inHours > 4) { - setState(() { + } else if (_locationInterval.inHours > 4) { _locationInterval = _locationInterval - Duration(hours: 1); - }); - } + } + }); } } @@ -99,7 +93,8 @@ class _IntegrationSettingsPageState extends State { try { await platform.invokeMethod('startLocationService', { 'location-updates-interval': _locationInterval.inMilliseconds, - 'location-updates-priority': _accuracy, + //'location-updates-priority': _accuracy, + 'foreground-location-tracking': _useForegroundService, 'location-updates-show-notification': _showNotification }); } catch (e) { @@ -144,8 +139,12 @@ class _IntegrationSettingsPageState extends State { if (_locationTrackingEnabled) { notes.add(_getNoteWidget('* Stop location tracking to change settings', false)); } - if ((_locationInterval?.inMinutes ?? 15) < 15) { - notes.add(_getNoteWidget('* Notification is mandatory for location updates with interval less than every 15 minutes', false)); + if (_useForegroundService) { + notes.add(_getNoteWidget('* Notification is mandatory for foreground service', false)); + } else { + notes.add(_getNoteWidget('* Use foreground service for intervals less then 15 minutes', false)); + } + if (_useForegroundService && _locationInterval.inMinutes < 10) { notes.add(_getNoteWidget('* Battery consumption will be noticeable', true)); } if (notes.isEmpty) { @@ -182,6 +181,25 @@ class _IntegrationSettingsPageState extends State { ], ), Container(height: Sizes.rowPadding), + Row( + children: [ + Text("Use foreground service"), + Switch( + value: _useForegroundService, + onChanged: _locationTrackingEnabled ? null : (value) { + setState(() { + _useForegroundService = value; + if (!_useForegroundService && _locationInterval.inMinutes < 15) { + _locationInterval = Duration(minutes: 15); + } else if (_useForegroundService) { + _showNotification = true; + } + }); + }, + ), + ], + ), + Container(height: Sizes.rowPadding), /*Text("Accuracy:", style: Theme.of(context).textTheme.body2), Container(height: Sizes.rowPadding), DropdownButton( @@ -231,7 +249,7 @@ class _IntegrationSettingsPageState extends State { Text("Show notification"), Switch( value: _showNotification, - onChanged: (_locationTrackingEnabled || (_locationInterval?.inMinutes ?? 0) < 15) ? null : (value) { + onChanged: (_locationTrackingEnabled || _useForegroundService) ? null : (value) { setState(() { _showNotification = value; }); diff --git a/lib/panels/panel_class.dart b/lib/panels/panel_class.dart index 745bdb1..bde9040 100644 --- a/lib/panels/panel_class.dart +++ b/lib/panels/panel_class.dart @@ -39,7 +39,7 @@ class Panel { eventBus.fire(ReloadUIEvent()); }); } else { - Launcher.launchAuthenticatedWebView(context: context, url: "${AppSettings().httpWebHost}/$urlPath", title: "${this.title}"); + Launcher.launchAuthenticatedWebView(context: context, url: "${AppSettings().httpWebHost}/$urlPath", title: "Back to app"); } } diff --git a/pubspec.yaml b/pubspec.yaml index 903da5c..9f2f10b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: hass_client description: Home Assistant Android Client -version: 1.3.0+1306 +version: 1.3.0+1307 environment: