Polar H9: Initial support

This commit is contained in:
José Rebelo
2025-08-11 19:22:14 +01:00
parent 28fb5732a6
commit a4fe2bbd4d
5 changed files with 84 additions and 57 deletions
@@ -0,0 +1,63 @@
package nodomain.freeyourgadget.gadgetbridge.devices.polar;
import androidx.annotation.NonNull;
import java.util.regex.Pattern;
import de.greenrobot.dao.query.QueryBuilder;
import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
import nodomain.freeyourgadget.gadgetbridge.entities.PolarH10ActivitySampleDao;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.polar.PolarH10DeviceSupport;
public abstract class AbstractPolarDeviceCoordinator extends AbstractBLEDeviceCoordinator {
@Override
public int getDefaultIconResource() {
return R.drawable.ic_device_lovetoy;
}
@Override
public String getManufacturer() {
return "Polar Electro Oy";
}
@Override
public int getBondingStyle() {
return BONDING_STYLE_NONE;
}
@Override
public boolean supportsHeartRateMeasurement(GBDevice device) {
return true;
}
@Override
public boolean supportsActivityTracking(@NonNull GBDevice device) {
return true;
}
@NonNull
@Override
public Class<? extends DeviceSupport> getDeviceSupportClass(GBDevice device) {
return PolarH10DeviceSupport.class;
}
@Override
public SampleProvider<? extends ActivitySample> getSampleProvider(GBDevice device, DaoSession session) {
return new PolarH10ActivitySampleProvider(device, session);
}
@Override
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
Long deviceId = device.getId();
QueryBuilder<?> qb = session.getPolarH10ActivitySampleDao().queryBuilder();
qb.where(PolarH10ActivitySampleDao.Properties.DeviceId.eq(deviceId)).buildDelete().executeDeleteWithoutDetachingEntities();
}
}
@@ -1,73 +1,17 @@
package nodomain.freeyourgadget.gadgetbridge.devices.polar;
import androidx.annotation.NonNull;
import java.util.regex.Pattern;
import de.greenrobot.dao.query.QueryBuilder;
import nodomain.freeyourgadget.gadgetbridge.GBException;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
import nodomain.freeyourgadget.gadgetbridge.entities.Device;
import nodomain.freeyourgadget.gadgetbridge.entities.PolarH10ActivitySampleDao;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.polar.PolarH10DeviceSupport;
public class PolarH10DeviceCoordinator extends AbstractBLEDeviceCoordinator {
public class PolarH10DeviceCoordinator extends AbstractPolarDeviceCoordinator {
@Override
public int getDeviceNameResource() {
return R.string.devicetype_polarh10;
}
@Override
public int getDefaultIconResource() {
return R.drawable.ic_device_default;
}
@Override
public String getManufacturer() {
return "Polar Electro Oy";
}
@Override
public int getBondingStyle() {
return BONDING_STYLE_NONE;
}
@Override
public boolean supportsHeartRateMeasurement(GBDevice device) {
return true;
}
@Override
public boolean supportsActivityTracking(@NonNull GBDevice device) {
return true;
}
@NonNull
@Override
public Class<? extends DeviceSupport> getDeviceSupportClass(GBDevice device) {
return PolarH10DeviceSupport.class;
}
@Override
protected Pattern getSupportedDeviceName() {
return Pattern.compile("^Polar H10.*");
}
@Override
public SampleProvider<? extends ActivitySample> getSampleProvider(GBDevice device, DaoSession session) {
return new PolarH10ActivitySampleProvider(device, session);
}
@Override
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
Long deviceId = device.getId();
QueryBuilder<?> qb = session.getPolarH10ActivitySampleDao().queryBuilder();
qb.where(PolarH10ActivitySampleDao.Properties.DeviceId.eq(deviceId)).buildDelete().executeDeleteWithoutDetachingEntities();
}
}
@@ -0,0 +1,17 @@
package nodomain.freeyourgadget.gadgetbridge.devices.polar;
import java.util.regex.Pattern;
import nodomain.freeyourgadget.gadgetbridge.R;
public class PolarH9DeviceCoordinator extends AbstractPolarDeviceCoordinator {
@Override
public int getDeviceNameResource() {
return R.string.devicetype_polarh9;
}
@Override
protected Pattern getSupportedDeviceName() {
return Pattern.compile("Polar H9( \\w+)?$");
}
}
@@ -306,6 +306,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.pebble.PebbleCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.pinetime.PineTimeJFCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.pixel.PixelBudsACoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.polar.PolarH10DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.polar.PolarH9DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.qc35.QC35Coordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.QHybridCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.realme.RealmeBudsAir5ProCoordinator;
@@ -533,6 +534,7 @@ public enum DeviceType {
FOSSILQHYBRID(QHybridCoordinator.class),
TLW64(TLW64Coordinator.class),
PINETIME_JF(PineTimeJFCoordinator.class),
POLARH9(PolarH9DeviceCoordinator.class),
POLARH10(PolarH10DeviceCoordinator.class),
MIJIA_LYWSD02(MijiaLywsd02Coordinator.class),
MIJIA_LYWSD03(MijiaLywsd03Coordinator.class),
+1
View File
@@ -1987,6 +1987,7 @@
<string name="devicetype_banglejs" translatable="false">Bangle.js</string>
<string name="devicetype_tlw64" translatable="false">TLW64</string>
<string name="devicetype_pinetime_jf" translatable="false">PineTime (JF Firmware)</string>
<string name="devicetype_polarh9" translatable="false">Polar H9</string>
<string name="devicetype_polarh10" translatable="false">Polar H10</string>
<string name="devicetype_sonyswr12" translatable="false">Sony SWR12</string>
<string name="devicetype_waspos" translatable="false">Wasp-os</string>