From 414cf5e472040676b934cd0141061029b6d7db1a Mon Sep 17 00:00:00 2001 From: Oleg Afanasyev Date: Tue, 16 Jan 2024 12:47:09 +0000 Subject: [PATCH] Sport Activity Summary: fix group order instability Previously group order was determined on the fly by available entries order or appearance. This commit changes it to use group definition order. --- .../model/ActivitySummaryJsonSummary.java | 75 ++++++++++++------- 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryJsonSummary.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryJsonSummary.java index 55e8c2076..b8637b080 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryJsonSummary.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivitySummaryJsonSummary.java @@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -120,9 +121,9 @@ public class ActivitySummaryJsonSummary { private JSONObject setSummaryGroupedList(JSONObject summaryDatalist){ this.groupData = createActivitySummaryGroups(); //structure for grouping activities into groups, when vizualizing - if (summaryDatalist ==null ) return null; + if (summaryDatalist == null) return null; Iterator keys = summaryDatalist.keys(); - JSONObject list=new JSONObject(); + Map activeGroups = new HashMap<>(); while (keys.hasNext()) { String key = keys.next(); @@ -130,27 +131,43 @@ public class ActivitySummaryJsonSummary { JSONObject innerData = (JSONObject) summaryDatalist.get(key); Object value = innerData.get("value"); String unit = innerData.getString("unit"); - String group = getGroup(key); + String groupName = getGroup(key); - if (!list.has(group)) { - list.put(group,new JSONArray()); + JSONArray group = activeGroups.get(groupName); + if (group == null) { + group = new JSONArray(); + activeGroups.put(groupName, group); } - JSONArray tmpl = (JSONArray) list.get(group); - JSONObject innernew = new JSONObject(); - innernew.put("name", key); - innernew.put("value", value); - innernew.put("unit", unit); - tmpl.put(innernew); - list.put(group, tmpl); + JSONObject item = new JSONObject(); + item.put("name", key); + item.put("value", value); + item.put("unit", unit); + group.put(item); } catch (JSONException e) { - LOG.error("SportsActivity", e); + LOG.error("SportsActivity internal error building grouped summary", e); } } - return list; + + // Reorder collected groups according to the order set by this.groupData. + JSONObject grouped = new JSONObject(); + Iterator names = this.groupData.keys(); + while(names.hasNext()) { + String groupName = names.next(); + JSONArray group = activeGroups.get(groupName); + if (group != null) { + try { + grouped.put(groupName, group); + } catch (JSONException e) { + LOG.error("SportsActivity internal error building grouped summary", e); + } + } + } + return grouped; } private String getGroup(String searchItem) { + // NB: Default group must be present in group JSONObject created by createActivitySummaryGroups String defaultGroup = "Activity"; if (groupData == null) return defaultGroup; Iterator keys = groupData.keys(); @@ -170,31 +187,33 @@ public class ActivitySummaryJsonSummary { return defaultGroup; } private JSONObject createActivitySummaryGroups(){ - final Map> groupDefinitions = new HashMap>() {{ - put("Strokes", Arrays.asList( - STROKE_DISTANCE_AVG, STROKE_AVG_PER_SECOND, STROKES, - STROKE_RATE_AVG, STROKE_RATE_MAX + final Map> groupDefinitions = new LinkedHashMap>() {{ + // NB: Default group Activity must be present in this definition, otherwise it wouldn't + // be shown. + put("Activity", Arrays.asList( + DISTANCE_METERS, STEPS, ACTIVE_SECONDS, CALORIES_BURNT, STRIDE_TOTAL, + HR_AVG, HR_MAX, HR_MIN, STRIDE_AVG, STRIDE_MAX, STRIDE_MIN )); - put("Swimming", Arrays.asList( - SWOLF_INDEX, SWIM_STYLE + put("Speed", Arrays.asList( + SPEED_AVG, SPEED_MAX, SPEED_MIN, PACE_AVG_SECONDS_KM, PACE_MIN, + PACE_MAX, "averageSpeed2", CADENCE_AVG, CADENCE_MAX, CADENCE_MIN )); put("Elevation", Arrays.asList( ASCENT_METERS, DESCENT_METERS, ALTITUDE_MAX, ALTITUDE_MIN, ALTITUDE_AVG, ALTITUDE_BASE, ASCENT_SECONDS, DESCENT_SECONDS, FLAT_SECONDS, ASCENT_DISTANCE, DESCENT_DISTANCE, FLAT_DISTANCE, ELEVATION_GAIN, ELEVATION_LOSS )); - put("Speed", Arrays.asList( - SPEED_AVG, SPEED_MAX, SPEED_MIN, PACE_AVG_SECONDS_KM, PACE_MIN, - PACE_MAX, "averageSpeed2", CADENCE_AVG, CADENCE_MAX, CADENCE_MIN - )); - put("Activity", Arrays.asList( - DISTANCE_METERS, STEPS, ACTIVE_SECONDS, CALORIES_BURNT, STRIDE_TOTAL, - HR_AVG, HR_MAX, HR_MIN, STRIDE_AVG, STRIDE_MAX, STRIDE_MIN - )); put("HeartRateZones", Arrays.asList( HR_ZONE_NA, HR_ZONE_WARM_UP, HR_ZONE_FAT_BURN, HR_ZONE_AEROBIC, HR_ZONE_ANAEROBIC, HR_ZONE_EXTREME )); + put("Strokes", Arrays.asList( + STROKE_DISTANCE_AVG, STROKE_AVG_PER_SECOND, STROKES, + STROKE_RATE_AVG, STROKE_RATE_MAX + )); + put("Swimming", Arrays.asList( + SWOLF_INDEX, SWIM_STYLE + )); put("TrainingEffect", Arrays.asList( TRAINING_EFFECT_AEROBIC, TRAINING_EFFECT_ANAEROBIC, WORKOUT_LOAD, MAXIMUM_OXYGEN_UPTAKE