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 6ee6769e5..8b92ae3ef 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 @@ -107,6 +107,7 @@ public class DeviceSettingsPreferenceConst { public static final String PREF_DEVICE_INTENTS = "device_intents"; public static final String PREF_ACTIVE_NOISE_CANCELLING_TOGGLE = "active_noise_cancelling_toggle"; + public static final String PREF_WEAR_SENSOR_TOGGLE = "wear_sensor_toggle"; public static final String PREF_BANDW_PSERIES_VPT_ENABLED = "bandw_pseries_vpt_enabled"; public static final String PREF_BANDW_PSERIES_VPT_LEVEL = "bandw_pseries_vpt_level"; public static final String PREF_BANDW_PSERIES_GUI_VPT_LEVEL = "bandw_pseries_gui_vpt_level"; 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 76039bf91..4f20e68bd 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 @@ -612,6 +612,7 @@ public class DeviceSpecificSettingsFragment extends AbstractPreferenceFragment i addPreferenceHandlerFor(PREF_SLEEP_MODE_SMART_ENABLE); addPreferenceHandlerFor(PREF_ACTIVE_NOISE_CANCELLING_TOGGLE); + addPreferenceHandlerFor(PREF_WEAR_SENSOR_TOGGLE); addPreferenceHandlerFor(PREF_BANDW_PSERIES_GUI_VPT_LEVEL); addPreferenceHandlerFor(PREF_HYBRID_HR_DRAW_WIDGET_CIRCLES); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/bandwpseries/BandWPSeriesDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/bandwpseries/BandWPSeriesDeviceCoordinator.java index 7ceefd7df..ea816ba69 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/bandwpseries/BandWPSeriesDeviceCoordinator.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/bandwpseries/BandWPSeriesDeviceCoordinator.java @@ -55,7 +55,8 @@ public class BandWPSeriesDeviceCoordinator extends AbstractBLEDeviceCoordinator public int[] getSupportedDeviceSpecificSettings(GBDevice device) { return new int[] { R.xml.devicesettings_active_noise_cancelling_toggle, - R.xml.devicesettings_bandw_pseries + R.xml.devicesettings_bandw_pseries, + R.xml.devicesettings_wear_sensor_toggle }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWBLEProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWBLEProfile.java index a612021cf..2ed04b0be 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWBLEProfile.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWBLEProfile.java @@ -50,6 +50,10 @@ public class BandWBLEProfile extends Abstra sendRequest(builder, (byte) 0x03, (byte) 0x03); } + public void requestWearSensorEnabled(final TransactionBuilder builder) { + sendRequest(builder, (byte) 0x0a, (byte) 0x01); + } + public void setAncModeState(final TransactionBuilder builder, final boolean mode) throws IOException { BandWPSeriesRequest req = new BandWPSeriesRequest((byte) 0x03, (byte) 0x02).addToPayload(mode ? ANC_MODE_ON : ANC_MODE_OFF); builder.write(getCharacteristic(UUID_RPC_REQUEST_CHARACTERISTIC), req.finishAndGetBytes()); @@ -65,6 +69,11 @@ public class BandWBLEProfile extends Abstra builder.write(getCharacteristic(UUID_RPC_REQUEST_CHARACTERISTIC), req.finishAndGetBytes()); } + public void setWearSensorEnabled(final TransactionBuilder builder, final boolean mode) throws IOException { + BandWPSeriesRequest req = new BandWPSeriesRequest((byte) 0x0a, (byte) 0x02).addToPayload(mode); + builder.write(getCharacteristic(UUID_RPC_REQUEST_CHARACTERISTIC), req.finishAndGetBytes()); + } + private void sendRequest(final TransactionBuilder builder, byte namespace, byte commandID) { BandWPSeriesRequest req; try { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWPSeriesDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWPSeriesDeviceSupport.java index d81f89b65..fcf67c82e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWPSeriesDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWPSeriesDeviceSupport.java @@ -4,6 +4,7 @@ import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.Dev import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BANDW_PSERIES_GUI_VPT_LEVEL; import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BANDW_PSERIES_VPT_ENABLED; import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_BANDW_PSERIES_VPT_LEVEL; +import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSettingsPreferenceConst.PREF_WEAR_SENSOR_TOGGLE; import static nodomain.freeyourgadget.gadgetbridge.impl.GBDevice.BATTERY_UNKNOWN; import static nodomain.freeyourgadget.gadgetbridge.service.devices.bandwpseries.BandWBLEProfile.ANC_MODE_ON; @@ -78,6 +79,7 @@ public class BandWPSeriesDeviceSupport extends AbstractBTLEDeviceSupport { BandWBLEProfile.requestAncModeState(builder); BandWBLEProfile.requestVptEnabled(builder); BandWBLEProfile.requestVptLevel(builder); + BandWBLEProfile.requestWearSensorEnabled(builder); return builder; } @@ -129,6 +131,12 @@ public class BandWPSeriesDeviceSupport extends AbstractBTLEDeviceSupport { if (response.commandId == 0x17) { return handleBatteryLevels(response); } + } else if (response.namespace == 0x0a) { + if (response.commandId == 0x01) { + return handleGetWearSensorEnabledResponse(response); + } else if (response.commandId == 0x02) { + return getBooleanResponseStatus(response); + } } return true; } @@ -168,6 +176,24 @@ public class BandWPSeriesDeviceSupport extends AbstractBTLEDeviceSupport { return true; } + private boolean handleGetWearSensorEnabledResponse(BandWPSeriesResponse response) { + if (!response.messageType.hasPayload) { + GB.toast("No payload in response!", Toast.LENGTH_SHORT, GB.ERROR); + return false; + } + boolean wearSensorEnabled; + try { + wearSensorEnabled = response.getPayloadBoolean(); + } catch (IOException e) { + GB.toast("Failed to unpack wear sensor status from payload " + Arrays.toString(response.payload), Toast.LENGTH_SHORT, GB.ERROR); + return false; + } + Editor editor = GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()).edit(); + editor.putBoolean(PREF_WEAR_SENSOR_TOGGLE, wearSensorEnabled); + editor.apply(); + return true; + } + private boolean handleFirmwareVersionResponse(BandWPSeriesResponse response) { String firmwareString = response.getPayloadString(); if (firmwareString == null) { @@ -249,6 +275,10 @@ public class BandWPSeriesDeviceSupport extends AbstractBTLEDeviceSupport { BandWBLEProfile.setVptLevel(builder, level - 1); } break; + case PREF_WEAR_SENSOR_TOGGLE: + boolean wearSensorEnabled = GBApplication.getDeviceSpecificSharedPrefs(gbDevice.getAddress()).getBoolean(PREF_WEAR_SENSOR_TOGGLE, true); + BandWBLEProfile.setWearSensorEnabled(builder, wearSensorEnabled); + break; } performImmediately(builder); } catch (IOException e) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWPSeriesResponse.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWPSeriesResponse.java index a2ed63e58..6e80c4cf1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWPSeriesResponse.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/bandwpseries/BandWPSeriesResponse.java @@ -77,4 +77,8 @@ public class BandWPSeriesResponse { } return values; } + + public boolean getPayloadBoolean() throws IOException{ + return payloadUnpacker.unpackBoolean(); + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e71d47f23..7b87e5633 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2581,6 +2581,8 @@ Stress Blood Oxygen HRV Status + Detect when the device is not being worn + Wear Sensor Body Energy Running VO₂ Max Cycling VO₂ Max diff --git a/app/src/main/res/xml/devicesettings_wear_sensor_toggle.xml b/app/src/main/res/xml/devicesettings_wear_sensor_toggle.xml new file mode 100644 index 000000000..61ed78f2a --- /dev/null +++ b/app/src/main/res/xml/devicesettings_wear_sensor_toggle.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file