Huawei/Honor: Enable VO2 Max for supported devices

This commit is contained in:
José Rebelo
2026-02-13 22:45:01 +00:00
parent 1f1c598968
commit 79cef62cd3
10 changed files with 39 additions and 19 deletions
@@ -330,7 +330,7 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator {
@Override @Override
@Nullable @Nullable
public Vo2MaxSampleProvider<? extends Vo2MaxSample> getVo2MaxSampleProvider(GBDevice device, DaoSession session) { public Vo2MaxSampleProvider<? extends Vo2MaxSample> getVo2MaxSampleProvider(GBDevice device, DaoSession session) {
return null; return new WorkoutVo2MaxSampleProvider(device, session);
} }
@Override @Override
@@ -1,9 +1,9 @@
package nodomain.freeyourgadget.gadgetbridge.devices.garmin; package nodomain.freeyourgadget.gadgetbridge.devices.garmin;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.Uri; import android.net.Uri;
import android.app.Activity;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@@ -28,12 +28,10 @@ import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpec
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.GenericTrainingLoadAcuteSampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.GenericTrainingLoadAcuteSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.GenericTrainingLoadChronicSampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.GenericTrainingLoadChronicSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.WorkoutLoadSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.WorkoutVo2MaxSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler; import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.TimeSampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.TimeSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.Vo2MaxSampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.WorkoutLoadSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummaryDao; import nodomain.freeyourgadget.gadgetbridge.entities.BaseActivitySummaryDao;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
import nodomain.freeyourgadget.gadgetbridge.entities.GarminActivitySampleDao; import nodomain.freeyourgadget.gadgetbridge.entities.GarminActivitySampleDao;
@@ -70,7 +68,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.RestingMetabolicRateSample;
import nodomain.freeyourgadget.gadgetbridge.model.SleepScoreSample; import nodomain.freeyourgadget.gadgetbridge.model.SleepScoreSample;
import nodomain.freeyourgadget.gadgetbridge.model.Spo2Sample; import nodomain.freeyourgadget.gadgetbridge.model.Spo2Sample;
import nodomain.freeyourgadget.gadgetbridge.model.StressSample; import nodomain.freeyourgadget.gadgetbridge.model.StressSample;
import nodomain.freeyourgadget.gadgetbridge.model.Vo2MaxSample;
import nodomain.freeyourgadget.gadgetbridge.model.WorkoutLoadSample; import nodomain.freeyourgadget.gadgetbridge.model.WorkoutLoadSample;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.GarminSupport; import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.GarminSupport;
@@ -191,11 +188,6 @@ public abstract class GarminCoordinator extends AbstractBLEDeviceCoordinator {
return new GenericTrainingLoadChronicSampleProvider(device, session); return new GenericTrainingLoadChronicSampleProvider(device, session);
} }
@Override
public Vo2MaxSampleProvider<? extends Vo2MaxSample> getVo2MaxSampleProvider(final GBDevice device, final DaoSession session) {
return new WorkoutVo2MaxSampleProvider(device, session);
}
@Override @Override
public TimeSampleProvider<? extends Spo2Sample> getSpo2SampleProvider(final GBDevice device, final DaoSession session) { public TimeSampleProvider<? extends Spo2Sample> getSpo2SampleProvider(final GBDevice device, final DaoSession session) {
return new GarminSpo2SampleProvider(device, session); return new GarminSpo2SampleProvider(device, session);
@@ -51,8 +51,6 @@ import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler; import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.SleepAsAndroidFeature; import nodomain.freeyourgadget.gadgetbridge.devices.SleepAsAndroidFeature;
import nodomain.freeyourgadget.gadgetbridge.devices.Vo2MaxSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.WorkoutVo2MaxSampleProvider;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiConst;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiExtendedSampleProvider; import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiExtendedSampleProvider;
@@ -60,7 +58,6 @@ import nodomain.freeyourgadget.gadgetbridge.entities.AbstractActivitySample;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryParser; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySummaryParser;
import nodomain.freeyourgadget.gadgetbridge.model.Vo2MaxSample;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport; import nodomain.freeyourgadget.gadgetbridge.service.DeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiLanguageType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiLanguageType;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiVibrationPatternNotificationType; import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiVibrationPatternNotificationType;
@@ -314,11 +311,6 @@ public abstract class ZeppOsCoordinator extends HuamiCoordinator {
return new HuamiExtendedSampleProvider(device, session); return new HuamiExtendedSampleProvider(device, session);
} }
@Override
public Vo2MaxSampleProvider<? extends Vo2MaxSample> getVo2MaxSampleProvider(final GBDevice device, final DaoSession session) {
return new WorkoutVo2MaxSampleProvider(device, session);
}
@Override @Override
public ActivitySummaryParser getActivitySummaryParser(final GBDevice device, final Context context) { public ActivitySummaryParser getActivitySummaryParser(final GBDevice device, final Context context) {
return new ZeppOsActivitySummaryParser(context); return new ZeppOsActivitySummaryParser(context);
@@ -311,6 +311,12 @@ public abstract class HuaweiCoordinator extends AbstractDeviceCoordinator {
return true; return true;
} }
@Override
public boolean supportsVO2Max(@NonNull final GBDevice device) {
// #5770 - most Huawei and Honor devices seem to support it
return true;
}
@Override @Override
public boolean supportsHeartRateMeasurement(@NonNull final GBDevice device) { public boolean supportsHeartRateMeasurement(@NonNull final GBDevice device) {
return HuaweiDeviceStateManager.get(device).supportsHeartRate(device); return HuaweiDeviceStateManager.get(device).supportsHeartRate(device);
@@ -51,4 +51,9 @@ public class HonorBand3Coordinator extends HuaweiLECoordinator {
public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) { public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) {
return DeviceCoordinator.DeviceKind.FITNESS_BAND; return DeviceCoordinator.DeviceKind.FITNESS_BAND;
} }
@Override
public boolean supportsVO2Max(@NonNull final GBDevice device) {
return false;
}
} }
@@ -46,4 +46,9 @@ public class HonorBand4Coordinator extends HuaweiLECoordinator {
public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) { public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) {
return DeviceCoordinator.DeviceKind.FITNESS_BAND; return DeviceCoordinator.DeviceKind.FITNESS_BAND;
} }
@Override
public boolean supportsVO2Max(@NonNull final GBDevice device) {
return false;
}
} }
@@ -46,4 +46,9 @@ public class HonorBand5Coordinator extends HuaweiLECoordinator {
public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) { public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) {
return DeviceCoordinator.DeviceKind.FITNESS_BAND; return DeviceCoordinator.DeviceKind.FITNESS_BAND;
} }
@Override
public boolean supportsVO2Max(@NonNull final GBDevice device) {
return false;
}
} }
@@ -46,4 +46,9 @@ public class HonorBand7Coordinator extends HuaweiLECoordinator {
public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) { public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) {
return DeviceCoordinator.DeviceKind.FITNESS_BAND; return DeviceCoordinator.DeviceKind.FITNESS_BAND;
} }
@Override
public boolean supportsVO2Max(@NonNull final GBDevice device) {
return false;
}
} }
@@ -46,4 +46,9 @@ public class HuaweiBandAw70Coordinator extends HuaweiLECoordinator {
public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) { public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) {
return DeviceCoordinator.DeviceKind.FITNESS_BAND; return DeviceCoordinator.DeviceKind.FITNESS_BAND;
} }
@Override
public boolean supportsVO2Max(@NonNull final GBDevice device) {
return false;
}
} }
@@ -46,4 +46,9 @@ public class HuaweiTalkBandB6Coordinator extends HuaweiBRCoordinator {
public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) { public DeviceCoordinator.DeviceKind getDeviceKind(@NonNull GBDevice device) {
return DeviceCoordinator.DeviceKind.FITNESS_BAND; return DeviceCoordinator.DeviceKind.FITNESS_BAND;
} }
@Override
public boolean supportsVO2Max(@NonNull final GBDevice device) {
return false;
}
} }