diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HeartRateZonesConfig.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HeartRateZonesConfig.java index 38554b94ca..56896047dd 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HeartRateZonesConfig.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HeartRateZonesConfig.java @@ -114,16 +114,12 @@ public class HeartRateZonesConfig { //TODO: I am not sure about this. But it looks correct. private int getHRCorrection() { - switch (this.configType) { - case TYPE_SITTING: - return 6; - case TYPE_SWIMMING: - return 10; - case TYPE_OTHER: - return 5; - default: - return 0; - } + return switch (this.configType) { + case TYPE_SITTING -> 6; + case TYPE_SWIMMING -> 10; + case TYPE_OTHER -> 5; + default -> 0; + }; } public int getCalculateMethod() { @@ -296,8 +292,6 @@ public class HeartRateZonesConfig { return true; } return (method == CALCULATE_METHOD_MHR) || (method == CALCULATE_METHOD_HRR); - } - } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiSampleProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiSampleProvider.java index e9356e75df..5da36979c5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiSampleProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiSampleProvider.java @@ -47,7 +47,6 @@ import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiWorkoutSummarySampleD import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; -import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider; public class HuaweiSampleProvider extends AbstractSampleProvider { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiTemperatureSampleProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiTemperatureSampleProvider.java index 1b51cabe22..2c4794ca9c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiTemperatureSampleProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/HuaweiTemperatureSampleProvider.java @@ -17,36 +17,19 @@ package nodomain.freeyourgadget.gadgetbridge.devices.huawei; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.nio.ByteBuffer; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import de.greenrobot.dao.AbstractDao; import de.greenrobot.dao.Property; import de.greenrobot.dao.query.QueryBuilder; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.devices.AbstractTimeSampleProvider; -import nodomain.freeyourgadget.gadgetbridge.devices.TimeSampleProvider; import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession; import nodomain.freeyourgadget.gadgetbridge.entities.Device; -import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiDictData; -import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiDictDataDao; -import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiDictDataValues; -import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiDictDataValuesDao; -import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiSleepStageSample; -import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiSleepStageSampleDao; -import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiSleepStatsSample; -import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiSleepStatsSampleDao; import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiTemperatureSample; import nodomain.freeyourgadget.gadgetbridge.entities.HuaweiTemperatureSampleDao; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; -import nodomain.freeyourgadget.gadgetbridge.model.TemperatureSample; public class HuaweiTemperatureSampleProvider extends AbstractTimeSampleProvider { @@ -97,6 +80,4 @@ public class HuaweiTemperatureSampleProvider extends AbstractTimeSampleProvider< HuaweiTemperatureSample sample = samples.get(0); return sample.getLastTimestamp(); } - - } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/ui/HuaweiStressCalibrationFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/ui/HuaweiStressCalibrationFragment.java index 670c2ca386..3f02902f5a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/ui/HuaweiStressCalibrationFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huawei/ui/HuaweiStressCalibrationFragment.java @@ -149,18 +149,13 @@ public class HuaweiStressCalibrationFragment extends AbstractGBFragment { } private String getLevelDescription(byte level) { - switch (level) { - case 1: - return getString(R.string.stress_relaxed); - case 2: - return getString(R.string.stress_mild); - case 3: - return getString(R.string.stress_moderate); - case 4: - return getString(R.string.stress_high); - default: - return getString(R.string.n_a); - } + return switch (level) { + case 1 -> getString(R.string.stress_relaxed); + case 2 -> getString(R.string.stress_mild); + case 3 -> getString(R.string.stress_moderate); + case 4 -> getString(R.string.stress_high); + default -> getString(R.string.n_a); + }; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSyncState.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSyncState.java index 25b6ed6595..460bfacd02 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSyncState.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiSyncState.java @@ -1,7 +1,5 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei; -import android.util.Log; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutGbParser.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutGbParser.java index 228fe5458c..94199db230 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutGbParser.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutGbParser.java @@ -134,12 +134,12 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { charts.addAll(DefaultWorkoutCharts.buildDefaultCharts(context, activityPoints, activityKind)); } byte[] recoveryHR = huaweiSummaries.get(0).getRecoveryHeartRates(); - if(recoveryHR != null && recoveryHR.length > 0) { + if (recoveryHR != null && recoveryHR.length > 0) { // starts from workoutEndTime - 5000 byte[] recHR = StringUtils.hexToBytes(new String(recoveryHR)); final List heartRateDataPoints = new ArrayList<>(); - for(int i = 0; i< recHR.length; i++) { - heartRateDataPoints.add(new Entry(i * 5000, recHR[i]& 0xFF)); + for (int i = 0; i < recHR.length; i++) { + heartRateDataPoints.add(new Entry(i * 5000, recHR[i] & 0xFF)); } charts.add(createRecoveryHeartRateChart(context, heartRateDataPoints)); } @@ -427,6 +427,21 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { session.getBaseActivitySummaryDao().insertOrReplace(baseSummary); } + public static Integer parseAndValidatePostureType(final String postureType) { + if (postureType == null) { + return null; + } + try { + int type = Integer.parseInt(postureType); + if (type < 1 || type > 4) { + return null; + } + return type; + } catch (NumberFormatException e) { + return null; + } + } + public static class HuaweiAdditionalSummaryParameter { public static final int TYPE_STRING = 1; public static final int TYPE_INT = 2; @@ -495,21 +510,6 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { param.addData(summaryData, value); } - private Integer parseAndValidatePostureType(String postureType) { - if(postureType == null) { - return null; - } - try { - int type = Integer.parseInt(postureType); - if (type < 1 || type > 4) { - return null; - } - return type; - } catch (NumberFormatException e) { - return null; - } - } - private static WorkoutChart createRecoveryHeartRateChart(final Context context, final List heartRateDataPoints) { final String label = String.format("%s(%s)", context.getString(R.string.recovery_heart_rate), DefaultWorkoutCharts.getUnitString(context, ActivitySummaryEntries.UNIT_BPM)); @@ -526,8 +526,8 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { public ActivitySummaryData updateBaseSummary(final DaoSession session, - final HuaweiWorkoutSummarySample summary, - final BaseActivitySummary baseSummary, final List activityPoints) { + final HuaweiWorkoutSummarySample summary, + final BaseActivitySummary baseSummary, final List activityPoints) { ActivitySummaryData summaryData = new ActivitySummaryData(); @@ -557,7 +557,7 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { additionalValues.put(sav.getKey(), sav.getValue()); } - ActivityKind type = huaweiTypeToGbType(summary.getType()); + final ActivityKind type = huaweiTypeToGbType(summary.getType()); summaryData.add(ActivitySummaryEntries.CALORIES_BURNT, summary.getCalories(), ActivitySummaryEntries.UNIT_KCAL); summaryData.add(ActivitySummaryEntries.DISTANCE_METERS, summary.getDistance(), ActivitySummaryEntries.UNIT_METERS); @@ -567,12 +567,11 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { summaryData.add(ActivitySummaryEntries.TYPE, summary.getType() & 0xFF, ActivitySummaryEntries.UNIT_NONE); if (summary.getDuration() > 0) { - float totalAvgSpeed = (float)summary.getDistance() / (float)summary.getDuration(); - LOG.info("totalAvgSpeed: {}", totalAvgSpeed); - if(ActivityKind.isSwimActivity(type)) { + float totalAvgSpeed = (float) summary.getDistance() / (float) summary.getDuration(); + if (ActivityKind.isSwimActivity(type)) { summaryData.add(ActivitySummaryEntries.PACE_AVG_SECONDS_KM, 100.0f / totalAvgSpeed, ActivitySummaryEntries.UNIT_SECONDS_PER_100_METERS); } else if (ActivityKind.isPaceActivity(type)) { - summaryData.add(ActivitySummaryEntries.PACE_AVG_SECONDS_KM,(60f / ((totalAvgSpeed * 3.6f))) * 60f, ActivitySummaryEntries.UNIT_SECONDS_PER_KM); + summaryData.add(ActivitySummaryEntries.PACE_AVG_SECONDS_KM, (60f / ((totalAvgSpeed * 3.6f))) * 60f, ActivitySummaryEntries.UNIT_SECONDS_PER_KM); } else { summaryData.add(ActivitySummaryEntries.SPEED_AVG, totalAvgSpeed, ActivitySummaryEntries.UNIT_METERS_PER_SECOND); } @@ -611,8 +610,8 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { } if (summary.getMaxMET() > 0) { - int value = (int) (((float) summary.getMaxMET() * 3.5f)) / 65536; - summaryData.add(ActivitySummaryEntries.MAXIMUM_OXYGEN_UPTAKE, value, ActivitySummaryEntries.UNIT_ML_KG_MIN); + int oxygenUptake = (int) (((float) summary.getMaxMET() * 3.5f)) / 65536; + summaryData.add(ActivitySummaryEntries.MAXIMUM_OXYGEN_UPTAKE, oxygenUptake, ActivitySummaryEntries.UNIT_ML_KG_MIN); } Integer summaryMinAltitude = summary.getMinAltitude(); @@ -630,9 +629,7 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { boolean unknownData = false; if (!dataSamples.isEmpty()) { int maxSpeed = Integer.MIN_VALUE; - int speed = 0; int speedCount = 0; - int avgStepRate = 0; int cadence = 0; int cadenceCount = 0; int stepLength = 0; @@ -681,7 +678,7 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { Integer zonePostureType = parseAndValidatePostureType(additionalValues.get("postureType")); LOG.info("Workout HR Zone Workout Posture Type: {}", zonePostureType); - if(zonePostureType == null) { + if (zonePostureType == null) { zonePostureType = HuaweiWorkoutUtils.getHRZonePostureTypeByActivity(type); } LOG.info("Workout HR Zone Final Posture Type: {}", zonePostureType); @@ -716,14 +713,13 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { } if (dataSample.getSpeed() != -1) { - speed += dataSample.getSpeed(); speedCount += 1; if (dataSample.getSpeed() > maxSpeed) maxSpeed = dataSample.getSpeed(); ac.setSpeed(dataSample.getSpeed() / 10.0f); } //TODO: currently only for walking but I suppose it can be used for all workouts - if(summary.getNewSteps() && (type == ActivityKind.WALKING || type == ActivityKind.OUTDOOR_WALKING)) { + if (summary.getNewSteps() && (type == ActivityKind.WALKING || type == ActivityKind.OUTDOOR_WALKING)) { if (dataSample.getStepRate() != -1) { ac.setCadence(dataSample.getStepRate() & 0xFF); } @@ -822,7 +818,7 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { } previousAlt = alt; - ac.setLocation(new GPSCoordinate(0, 0, alt/ 10.0f)); + ac.setLocation(new GPSCoordinate(0, 0, alt / 10.0f)); } if (dataSample.getDataErrorHex() != null) unknownData = true; @@ -835,11 +831,12 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { final double totalTime = Arrays.stream(HRZones).sum(); final List zoneOrder = Arrays.asList(ActivitySummaryEntries.HR_ZONE_WARM_UP, ActivitySummaryEntries.HR_ZONE_FAT_BURN, ActivitySummaryEntries.HR_ZONE_AEROBIC, ActivitySummaryEntries.HR_ZONE_ANAEROBIC, ActivitySummaryEntries.HR_ZONE_EXTREME); final int[] zoneColors = new int[]{ - context.getResources().getColor(R.color.hr_zone_warm_up_color), - context.getResources().getColor(R.color.hr_zone_easy_color), - context.getResources().getColor(R.color.hr_zone_aerobic_color), - context.getResources().getColor(R.color.hr_zone_threshold_color), - context.getResources().getColor(R.color.hr_zone_maximum_color), + ContextCompat.getColor(context, R.color.hr_zone_warm_up_color), + ContextCompat.getColor(context, R.color.hr_zone_warm_up_color), + ContextCompat.getColor(context, R.color.hr_zone_easy_color), + ContextCompat.getColor(context, R.color.hr_zone_aerobic_color), + ContextCompat.getColor(context, R.color.hr_zone_threshold_color), + ContextCompat.getColor(context, R.color.hr_zone_maximum_color), }; for (int i = zoneOrder.size() - 1; i >= 0; i--) { double timeInZone = HRZones[i]; @@ -856,14 +853,11 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { } } - // Average the things that should be averaged - if (speedCount > 0) - speed = (int)((float)speed / speedCount); + int avgStepRate = (int) ((summary.getStepCount() / ((float) dataSamples.size() * (float) dataDelta)) * 60.0f); // steps per minute + if (cadenceCount > 0) cadence = cadence / cadenceCount; - - avgStepRate = (int)((summary.getStepCount() / ((float)dataSamples.size() * (float)dataDelta)) * 60.0f); // steps per minute if (stepLengthCount > 0) stepLength = stepLength / stepLengthCount; if (groundContactTimeCount > 0) @@ -886,10 +880,10 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { avgAltitude = avgAltitude / altitudeCount; if (speedCount > 0) { - if(ActivityKind.isSwimActivity(type)) { - summaryData.add(ActivitySummaryEntries.PACE_MAX, 100.0f / (maxSpeed/ 10f) , ActivitySummaryEntries.UNIT_SECONDS_PER_100_METERS); + if (ActivityKind.isSwimActivity(type)) { + summaryData.add(ActivitySummaryEntries.PACE_MAX, 100.0f / (maxSpeed / 10f), ActivitySummaryEntries.UNIT_SECONDS_PER_100_METERS); } else if (ActivityKind.isPaceActivity(type)) { - summaryData.add(ActivitySummaryEntries.PACE_MAX,(60f / ((maxSpeed/ 10f) * 3.6)) * 60f , ActivitySummaryEntries.UNIT_SECONDS_PER_KM); + summaryData.add(ActivitySummaryEntries.PACE_MAX, (60f / ((maxSpeed / 10f) * 3.6)) * 60f, ActivitySummaryEntries.UNIT_SECONDS_PER_KM); } else { summaryData.add(ActivitySummaryEntries.SPEED_MAX, maxSpeed / 10f, ActivitySummaryEntries.UNIT_METERS_PER_SECOND); } @@ -1148,7 +1142,7 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { final List columns = new LinkedList<>(); columns.add(new ActivitySummaryValue(currentIndex++, ActivitySummaryEntries.UNIT_NONE)); columns.add(new ActivitySummaryValue(getSwimStyle(sample.getSwimType()), ActivitySummaryEntries.UNIT_NONE)); - String segmentDistanceUnit = sample.getType() == 1?ActivitySummaryEntries.UNIT_YARD:ActivitySummaryEntries.UNIT_METERS; + String segmentDistanceUnit = sample.getType() == 1 ? ActivitySummaryEntries.UNIT_YARD : ActivitySummaryEntries.UNIT_METERS; columns.add(new ActivitySummaryValue(sample.getDistance(), segmentDistanceUnit)); columns.add(new ActivitySummaryValue(sample.getTime(), ActivitySummaryEntries.UNIT_SECONDS)); @@ -1166,7 +1160,7 @@ public class HuaweiWorkoutGbParser implements ActivitySummaryParser { columns2.add(new ActivitySummaryValue("", ActivitySummaryEntries.UNIT_NONE)); columns2.add(new ActivitySummaryValue(sample.getStrokes(), ActivitySummaryEntries.UNIT_STROKES)); columns2.add(new ActivitySummaryValue(sample.getAvgSwolf(), ActivitySummaryEntries.UNIT_NONE)); - String segmentPaceUnit = sample.getType() == 1?ActivitySummaryEntries.UNIT_SECONDS_PER_100_YARDS:ActivitySummaryEntries.UNIT_SECONDS_PER_100_METERS; + String segmentPaceUnit = sample.getType() == 1 ? ActivitySummaryEntries.UNIT_SECONDS_PER_100_YARDS : ActivitySummaryEntries.UNIT_SECONDS_PER_100_METERS; columns2.add(new ActivitySummaryValue(sample.getPace(), segmentPaceUnit)); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutUtils.java index f35242017a..820fea4650 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutUtils.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/HuaweiWorkoutUtils.java @@ -26,10 +26,9 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; public class HuaweiWorkoutUtils { private static final Map activityHRZoneType = createActivityHRZoneType(); - //TODO: discover and add more activity types. Should be same as in the watch. private static Map createActivityHRZoneType() { - Map result = new HashMap<>(); + final Map result = new HashMap<>(); result.put(ActivityKind.RUNNING, HeartRateZonesConfig.TYPE_UPRIGHT); result.put(ActivityKind.WALKING, HeartRateZonesConfig.TYPE_UPRIGHT); result.put(ActivityKind.CYCLING, HeartRateZonesConfig.TYPE_SITTING); @@ -60,5 +59,4 @@ public class HuaweiWorkoutUtils { } return null; } - } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/Request.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/Request.java index 9e0ad9e5b4..01123c0523 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/Request.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/huawei/requests/Request.java @@ -16,7 +16,6 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests; -import android.bluetooth.BluetoothGattCharacteristic; import android.content.Context; import android.os.Handler; import android.os.Looper;