diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java index 146bff778c..bc850c5fc0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSpecificSettingsFragment.java @@ -93,6 +93,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandConst; +import nodomain.freeyourgadget.gadgetbridge.externalevents.gps.GBLocationService; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.BatteryConfig; import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec; @@ -683,6 +684,12 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i addPreferenceHandlerFor(PREF_CAMERA_REMOTE); addPreferenceHandlerFor(PREF_SCREEN_LIFT_WRIST); + final Preference sendGpsToBandPref = findPreference(PREF_WORKOUT_SEND_GPS_TO_BAND); + if (sendGpsToBandPref != null && !GBLocationService.isGpsSupportedAndEnabled()) { + sendGpsToBandPref.setEnabled(false); + sendGpsToBandPref.setSummary(R.string.phone_gps_not_available); + } + addPreferenceHandlerFor(PREF_BATTERY_POLLING_ENABLE); addPreferenceHandlerFor(PREF_BATTERY_POLLING_INTERVAL); addPreferenceHandlerFor(PREF_TIME_SYNC); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/gps/GBLocationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/gps/GBLocationService.java index 2c1befc137..272b266974 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/gps/GBLocationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/gps/GBLocationService.java @@ -21,6 +21,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.location.LocationManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -37,6 +38,7 @@ import java.util.Map; import java.util.Objects; import nodomain.freeyourgadget.gadgetbridge.BuildConfig; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.util.GB; @@ -86,18 +88,17 @@ public class GBLocationService extends BroadcastReceiver { LOG.debug("Starting location provider {} for {}", providerType, device.getAliasOrName()); - if (!providersByDevice.containsKey(device)) { - providersByDevice.put(device, new ArrayList<>()); - } - - updateNotification(); - - final List existingProviders = providersByDevice.get(device); - final GBLocationListener locationListener = new GBLocationListener(device); final GBLocationProvider locationProvider = providerType.newInstance(context, locationListener); - locationProvider.start(updateInterval); + try { + locationProvider.start(updateInterval); + } catch (final Exception e) { + LOG.error("Failed to start location provider {} for {}", providerType, device.getAliasOrName(), e); + return; + } + final List existingProviders = providersByDevice.computeIfAbsent(device, ignored -> new ArrayList<>()); Objects.requireNonNull(existingProviders).add(locationProvider); + updateNotification(); return; case ACTION_STOP: if (device != null) { @@ -144,6 +145,11 @@ public class GBLocationService extends BroadcastReceiver { updateNotification(); } + public static boolean isGpsSupportedAndEnabled() { + final LocationManager locationManager = (LocationManager) GBApplication.getContext().getSystemService(Context.LOCATION_SERVICE); + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); + } + public static void start(final Context context, @NonNull final GBDevice device, final GBLocationProviderType providerType, diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/gps/providers/PhoneLocationProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/gps/providers/PhoneLocationProvider.java index 7049b7c3d4..340d8fe170 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/gps/providers/PhoneLocationProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/gps/providers/PhoneLocationProvider.java @@ -1,4 +1,4 @@ -/* Copyright (C) 2022-2024 José Rebelo, LukasEdl +/* Copyright (C) 2022-2026 José Rebelo, LukasEdl This file is part of Gadgetbridge. @@ -47,7 +47,7 @@ public class PhoneLocationProvider extends GBLocationProvider { @Override public void start(final int interval) { - LOG.info("Starting phone gps location provider"); + LOG.info("Starting phone location provider ({})", provider); if (!GB.checkPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) && !GB.checkPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION)) { GB.toast("Location permission not granted", Toast.LENGTH_SHORT, GB.ERROR); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java index f4c5c77f47..e4b2b41fad 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/HuamiSupport.java @@ -1859,7 +1859,7 @@ public abstract class HuamiSupport extends AbstractBTLESingleDeviceSupport final boolean sendGpsToBand = HuamiCoordinator.getWorkoutSendGpsToBand(getDevice().getAddress()); if (workoutNeedsGps) { - if (sendGpsToBand) { + if (sendGpsToBand && GBLocationService.isGpsSupportedAndEnabled()) { lastPhoneGpsSent = 0; sendPhoneGps(HuamiPhoneGpsStatus.SEARCHING, null); GBLocationService.start(getContext(), getDevice(), GBLocationProviderType.GPS, 1000); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsWorkoutService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsWorkoutService.java index 06dc6f56aa..9bb413b776 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsWorkoutService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huami/zeppos/services/ZeppOsWorkoutService.java @@ -155,7 +155,7 @@ public class ZeppOsWorkoutService extends AbstractZeppOsService { final boolean sendGpsToBand = getDevicePrefs().getBoolean(DeviceSettingsPreferenceConst.PREF_WORKOUT_SEND_GPS_TO_BAND, false); if (workoutNeedsGps) { - if (sendGpsToBand) { + if (sendGpsToBand && GBLocationService.isGpsSupportedAndEnabled()) { lastPhoneGpsSent = 0; sendPhoneGps(HuamiPhoneGpsStatus.SEARCHING, null); GBLocationService.start(getContext(), getSupport().getDevice(), GBLocationProviderType.GPS, 1000); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiHealthService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiHealthService.java index 0f402bbcba..9685496e36 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiHealthService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xiaomi/services/XiaomiHealthService.java @@ -656,7 +656,7 @@ public class XiaomiHealthService extends AbstractXiaomiService { ); final boolean sendGpsToBand = getDevicePrefs().getBoolean(DeviceSettingsPreferenceConst.PREF_WORKOUT_SEND_GPS_TO_BAND, false); - if (!sendGpsToBand) { + if (!sendGpsToBand || !GBLocationService.isGpsSupportedAndEnabled()) { getSupport().sendCommand( "send location disabled", XiaomiProto.Command.newBuilder() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2a16b02a72..bbf99168c7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,6 +78,7 @@ All Satellites Speed first Accuracy First + Phone GPS is not available Activity info on device card Choose what activity details are displayed on device card