From 45689ad77a78c3913c9ce1bb2f7f1f69240eca8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Sun, 4 Jan 2026 17:24:02 +0000 Subject: [PATCH] Add debug setting to override BUSY_CHECKING --- .../DeviceSpecificSettingsFragment.java | 7 ++- .../devices/AbstractDeviceCoordinator.java | 8 +++ .../devices/DeviceCoordinator.java | 5 ++ .../service/DeviceSupportFactory.java | 13 ++++- .../service/ServiceDeviceSupport.java | 6 +-- .../devicesettings_disable_busy_checking.xml | 11 +++++ .../res/xml/devicesettings_header_debug.xml | 6 +++ .../res/xml/devicesettings_stress_test.xml | 49 ++++++++++--------- 8 files changed, 78 insertions(+), 27 deletions(-) create mode 100644 app/src/main/res/xml/devicesettings_disable_busy_checking.xml create mode 100644 app/src/main/res/xml/devicesettings_header_debug.xml 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 4328bce382..3886315934 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 @@ -1614,9 +1614,14 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i } } if (BuildConfig.DEBUG) { + final int[] debugSettings = coordinator.getSupportedDebugSettings(device); deviceSpecificSettings.addRootScreen( DeviceSpecificSettingsScreen.DEVELOPER, - R.xml.devicesettings_stress_test + R.xml.devicesettings_header_debug + ); + deviceSpecificSettings.addRootScreen( + DeviceSpecificSettingsScreen.DEVELOPER, + debugSettings ); } if (GBApplication.getPrefs().experimentalSettings()) { 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 f2e502abd5..ff1190c4da 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/AbstractDeviceCoordinator.java @@ -969,6 +969,14 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator { return new int[0]; } + @Override + public int[] getSupportedDebugSettings(final GBDevice device) { + return new int[] { + R.xml.devicesettings_stress_test, + R.xml.devicesettings_disable_busy_checking, + }; + } + public boolean experimentalSettingEnabled(final GBDevice device, final String key) { return GBApplication.getPrefs().experimentalSettings() && GBApplication.getDevicePrefs(device).getBoolean(key, false); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java index a004ce505c..32a3dc4aeb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java @@ -813,6 +813,11 @@ public interface DeviceCoordinator { */ int[] getSupportedDeviceSpecificAuthenticationSettings(); + /** + * Returns device specific debug settings. This section is only shown in debug builds. + */ + int[] getSupportedDebugSettings(final GBDevice device); + /** * Returns device specific experimental settings. This screen is only shown when the global experimental settings * is enabled. diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java index fba8d7dd61..fdd69e0f95 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceSupportFactory.java @@ -33,11 +33,14 @@ import androidx.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import nodomain.freeyourgadget.gadgetbridge.BuildConfig; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBException; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.PebbleSupport; +import nodomain.freeyourgadget.gadgetbridge.util.preferences.DevicePrefs; import java.lang.reflect.Constructor; import java.util.EnumSet; @@ -97,7 +100,15 @@ public class DeviceSupportFactory { try { final DeviceSupport supportInstance = (DeviceSupport) supportClass.newInstance(); - return new ServiceDeviceSupport(supportInstance, coordinator.getInitialFlags()); + final EnumSet initialFlags = coordinator.getInitialFlags(); + if (BuildConfig.DEBUG && initialFlags.contains(ServiceDeviceSupport.Flags.BUSY_CHECKING)) { + final DevicePrefs devicePrefs = GBApplication.getDevicePrefs(device); + if (devicePrefs.getBoolean("pref_device_debug_remove_busy_checking", false)) { + LOG.warn("Removing BUSY_CHECKING flag from {}", device.getAddress()); + initialFlags.remove(ServiceDeviceSupport.Flags.BUSY_CHECKING); + } + } + return new ServiceDeviceSupport(supportInstance, initialFlags); } catch (ReflectiveOperationException e) { LOG.error("error calling DeviceSupport constructor for {} with zero arguments", device.getAddress()); throw new GBException(e); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java index a8f886000f..c9c561a457 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java @@ -52,7 +52,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.WorldClock; * Wraps another device support instance and supports busy-checking and throttling of events. */ public class ServiceDeviceSupport implements DeviceSupport { - public static enum Flags { + public enum Flags { THROTTLING, BUSY_CHECKING, } @@ -151,7 +151,7 @@ public class ServiceDeviceSupport implements DeviceSupport { return false; } if (getDevice().isBusy()) { - LOG.info("Ignoring " + notificationKind + " because we're busy with " + getDevice().getBusyTask()); + LOG.info("Ignoring {} because we're busy with {}", notificationKind, getDevice().getBusyTask()); return true; } return false; @@ -164,7 +164,7 @@ public class ServiceDeviceSupport implements DeviceSupport { long currentTime = System.currentTimeMillis(); if ((currentTime - lastNotificationTime) < THROTTLING_THRESHOLD) { if (notificationKind != null && notificationKind.equals(lastNotificationKind)) { - LOG.info("Ignoring " + notificationKind + " because of throttling threshold reached"); + LOG.info("Ignoring {} because of throttling threshold reached", notificationKind); return true; } } diff --git a/app/src/main/res/xml/devicesettings_disable_busy_checking.xml b/app/src/main/res/xml/devicesettings_disable_busy_checking.xml new file mode 100644 index 0000000000..7e68a80d24 --- /dev/null +++ b/app/src/main/res/xml/devicesettings_disable_busy_checking.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/xml/devicesettings_header_debug.xml b/app/src/main/res/xml/devicesettings_header_debug.xml new file mode 100644 index 0000000000..dd9ce14e4d --- /dev/null +++ b/app/src/main/res/xml/devicesettings_header_debug.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/xml/devicesettings_stress_test.xml b/app/src/main/res/xml/devicesettings_stress_test.xml index 503503decb..4b02749594 100644 --- a/app/src/main/res/xml/devicesettings_stress_test.xml +++ b/app/src/main/res/xml/devicesettings_stress_test.xml @@ -1,30 +1,35 @@ - - + android:key="pref_screen_dangerous_stress_test" + android:title="@string/device_stress_test_category"> - + - + + + +