diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java index dfc6bdb00b..6e9bfc5e88 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/devicesettings/DeviceSettingsPreferenceConst.java @@ -624,4 +624,5 @@ public class DeviceSettingsPreferenceConst { public static final String PREF_DISPLAY_ENABLED_ALL_DAY = "display_all_day"; public static final String PREF_DISPLAY_ON_START = "display_on_start"; public static final String PREF_DISPLAY_ON_END = "display_on_end"; + public static final String PREF_CONNECTION_PRIORITY_LOW_POWER = "connection_priority_low_power"; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java index 914b7ae02b..535e6bb8be 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java @@ -1,7 +1,7 @@ -/* Copyright (C) 2015-2024 akasaka / Genjitsu Labs, Alicia Hormann, Andreas +/* Copyright (C) 2015-2025 akasaka / Genjitsu Labs, Alicia Hormann, Andreas Shimokawa, Arjan Schrijver, Carsten Pfeiffer, Daniel Dakhno, Daniele Gobbetti, Davis Mosenkovs, Dmitry Markin, José Rebelo, Matthieu Baerts, Nephiel, - Petr Vaněk, Taavi Eomäe, Johannes Krude + Petr Vaněk, Taavi Eomäe, Johannes Krude, Thomas Kuehne This file is part of Gadgetbridge. @@ -800,6 +800,10 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator { settings = ArrayUtils.insert(0, settings, R.xml.devicesettings_reconnect_bl_classic); } + if (connectionType.usesBluetoothLE() || connectionType.usesBluetoothClassic()){ + settings = ArrayUtils.add(settings, R.xml.devicesettings_connection_priority_low_power); + } + return settings; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java index 1e088ea0d6..72bc8f04fa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEDeviceSupport.java @@ -1,5 +1,6 @@ -/* Copyright (C) 2015-2024 Andreas Böhler, Arjan Schrijver, Carsten Pfeiffer, - Daniel Dakhno, Daniele Gobbetti, Johannes Krude, JohnnySun, José Rebelo +/* Copyright (C) 2015-2025 Andreas Böhler, Arjan Schrijver, Carsten Pfeiffer, + Daniel Dakhno, Daniele Gobbetti, Johannes Krude, JohnnySun, José Rebelo, + Thomas Kuehne This file is part of Gadgetbridge. @@ -369,7 +370,14 @@ public abstract class AbstractBTLEDeviceSupport extends AbstractDeviceSupport im bleApi.initializeDevice(builder); } - initializeDevice(builder).queue(getQueue()); + initializeDevice(builder); + + boolean lowPower = getDevicePrefs().getConnectionPriorityLowPower(); + // have to explicitly request normal ("balanced") as some Android devices remember the last + // request. Else low power would become a set once option. + builder.requestConnectionPriority(lowPower ? BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER : BluetoothGatt.CONNECTION_PRIORITY_BALANCED); + + builder.queue(getQueue()); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEMultiDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEMultiDeviceSupport.java index 7dd430d26c..96b493e7da 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEMultiDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/btle/AbstractBTLEMultiDeviceSupport.java @@ -454,7 +454,14 @@ public abstract class AbstractBTLEMultiDeviceSupport extends AbstractDeviceSuppo bleApis[deviceIdx].initializeDevice(builder); } - initializeDevice(builder, deviceIdx).queue(getQueue(deviceIdx)); + initializeDevice(builder, deviceIdx); + + boolean lowPower = getDevicePrefs().getConnectionPriorityLowPower(); + // have to explicitly request normal ("balanced") as some Android devices remember the last + // request. Else low power would become a set once option. + builder.requestConnectionPriority(lowPower ? BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER : BluetoothGatt.CONNECTION_PRIORITY_BALANCED); + + builder.queue(getQueue(deviceIdx)); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/preferences/DevicePrefs.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/preferences/DevicePrefs.java index 95f626c25b..ff3f861cba 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/preferences/DevicePrefs.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/preferences/DevicePrefs.java @@ -1,6 +1,6 @@ -/* Copyright (C) 2016-2024 Andreas Shimokawa, Anemograph, Carsten Pfeiffer, +/* Copyright (C) 2016-2025 Andreas Shimokawa, Anemograph, Carsten Pfeiffer, Daniel Dakhno, Daniele Gobbetti, Davis Mosenkovs, Dikay900, Felix Konstantin - Maurer, José Rebelo, Petr Vaněk, Johannes Krude + Maurer, José Rebelo, Petr Vaněk, Johannes Krude, Thomas Kuehne This file is part of Gadgetbridge. @@ -120,6 +120,10 @@ public class DevicePrefs extends Prefs { return getBoolean(PREF_ALLOW_HIGH_MTU, true); } + public boolean getConnectionPriorityLowPower() { + return getBoolean(PREF_CONNECTION_PRIORITY_LOW_POWER, false); + } + public DeviceCoordinator.ConnectionType getForcedConnectionTypeFromPrefs() { final String connTypePref = getString(DeviceSettingsPreferenceConst.PREF_FORCE_CONNECTION_TYPE, "BOTH"); diff --git a/app/src/main/res/drawable/ic_low_priority.xml b/app/src/main/res/drawable/ic_low_priority.xml new file mode 100644 index 0000000000..52811e6e4d --- /dev/null +++ b/app/src/main/res/drawable/ic_low_priority.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 353bb38dcd..d25cc2122e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -469,6 +469,8 @@ Off - ignore, On - reject Shake wrist ignore/reject call Duplicates watch button action + Request low power + Reduce bluetooth priority and data rate connection parameters. Device settings Force synchronize time diff --git a/app/src/main/res/xml/devicesettings_connection_priority_low_power.xml b/app/src/main/res/xml/devicesettings_connection_priority_low_power.xml new file mode 100644 index 0000000000..19346763c0 --- /dev/null +++ b/app/src/main/res/xml/devicesettings_connection_priority_low_power.xml @@ -0,0 +1,10 @@ + + + +