diff --git a/src/main/java/de/dennisguse/opentracks/content/data/Track.java b/src/main/java/de/dennisguse/opentracks/content/data/Track.java index 1d0304dba..bd7eb2926 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/Track.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/Track.java @@ -101,11 +101,12 @@ public class Track { this.icon = icon; } + @NonNull public TrackStatistics getTrackStatistics() { return trackStatistics; } - public void setTrackStatistics(TrackStatistics trackStatistics) { + public void setTrackStatistics(@NonNull TrackStatistics trackStatistics) { this.trackStatistics = trackStatistics; } diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index 92d20b58a..0078d9440 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -65,11 +65,13 @@ public class StatisticsRecordedFragment extends Fragment { return fragment; } - private TrackStatistics trackStatistics; private SensorStatistics sensorStatistics; private SensorsAdapter sensorsAdapter; - private String category = ""; + private Track.Id trackId; + @Nullable // Lazily loaded. + private Track track; + private ContentProviderUtils contentProviderUtils; private StatisticsRecordedBinding viewBinding; @@ -86,9 +88,9 @@ public class StatisticsRecordedFragment extends Fragment { preferenceMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); } - if (PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key)) { + if (PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key) && track != null) { updateUInecessary = true; - preferenceReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), category); + preferenceReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), track.getCategory()); } if (key != null && updateUInecessary && isResumed()) { @@ -152,15 +154,14 @@ public class StatisticsRecordedFragment extends Fragment { getActivity().runOnUiThread(() -> { if (isResumed()) { Track track = contentProviderUtils.getTrack(trackId); - trackStatistics = track.getTrackStatistics(); sensorStatistics = contentProviderUtils.getSensorStats(trackId); - String newCategory = track.getCategory(); - if (!category.equals(newCategory)) { - category = newCategory; + if ((this.track == null && track != null) || (this.track != null && track != null && !this.track.getCategory().equals(track.getCategory()))) { sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key)); } + this.track = track; + loadTrackDescription(track); updateUI(); updateSensorUI(); @@ -174,10 +175,11 @@ public class StatisticsRecordedFragment extends Fragment { private void loadTrackDescription(@NonNull Track track) { viewBinding.statsNameValue.setText(track.getName()); viewBinding.statsDescriptionValue.setText(track.getDescription()); - viewBinding.statsStartDatetimeValue.setText(StringUtils.formatDateTime(getContext(), trackStatistics.getStartTime())); + viewBinding.statsStartDatetimeValue.setText(StringUtils.formatDateTime(getContext(), track.getTrackStatistics().getStartTime())); } private void updateUI() { + TrackStatistics trackStatistics = track.getTrackStatistics(); // Set total distance { Pair parts = StringUtils.getDistanceParts(getContext(), trackStatistics.getTotalDistance(), preferenceMetricUnits); @@ -188,7 +190,7 @@ public class StatisticsRecordedFragment extends Fragment { // Set activity type { - String trackIconValue = TrackIconUtils.getIconValue(getContext(), category); + String trackIconValue = TrackIconUtils.getIconValue(getContext(), track.getCategory()); viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), TrackIconUtils.getIconDrawable(trackIconValue))); } diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java index 44de7b92b..ae2872c32 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordingFragment.java @@ -34,7 +34,6 @@ import de.dennisguse.opentracks.content.sensor.SensorDataSet; import de.dennisguse.opentracks.databinding.StatisticsRecordingBinding; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; -import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.StringUtils; import de.dennisguse.opentracks.util.TrackIconUtils; @@ -52,11 +51,11 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi private static final String TAG = StatisticsRecordingFragment.class.getSimpleName(); private static final long UI_UPDATE_INTERVAL = UnitConversions.ONE_SECOND_MS; + public static Fragment newInstance() { return new StatisticsRecordingFragment(); } - private TrackDataHub trackDataHub; private Handler handlerUpdateUI; @@ -64,10 +63,8 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi private TrackRecordingServiceConnection trackRecordingServiceConnection = new TrackRecordingServiceConnection(); private TrackPoint lastTrackPoint; - //TODO Should not be nullable - private TrackStatistics lastTrackStatistics; - - private String category = ""; + @Nullable // Lazily loaded. + private Track track; private StatisticsRecordingBinding viewBinding; private SensorsAdapter sensorsAdapter; @@ -86,9 +83,9 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi preferenceMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); } - if (PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key)) { + if (PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key) && track != null) { updateUInecessary = true; - preferenceReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), category); + preferenceReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), track.getCategory()); } if (PreferencesUtils.isKey(getContext(), R.string.stats_show_grade_altitude_key, key)) { @@ -113,7 +110,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi private final Runnable updateUIeachSecond = new Runnable() { public void run() { if (isResumed() && isSelectedTrackRecording()) { - if (!isSelectedTrackPaused() && lastTrackStatistics != null) { + if (!isSelectedTrackPaused() && track != null) { synchronized (this) { if (lastTrackPoint != null && lastTrackPoint.hasLocation() && !lastTrackPoint.isRecent()) { lastTrackPoint = null; @@ -142,7 +139,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewBinding = StatisticsRecordingBinding.inflate(inflater, container, false); - viewBinding.statsActivityTypeIcon.setOnClickListener(v -> ((TrackRecordingActivity) getActivity()).chooseActivityType(category)); + viewBinding.statsActivityTypeIcon.setOnClickListener(v -> ((TrackRecordingActivity) getActivity()).chooseActivityType(track != null ? track.getCategory() : "")); //TODO "" would be useless as Track was not yet loaded. RecyclerView sensorsRecyclerView = viewBinding.statsSensorsRecyclerView; sensorsRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); @@ -199,12 +196,10 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi if (isResumed()) { getActivity().runOnUiThread(() -> { if (isResumed()) { - lastTrackStatistics = track != null ? track.getTrackStatistics() : null; - String newCategory = track != null ? track.getCategory() : ""; - if (!category.equals(newCategory)) { - category = newCategory; + if ((this.track == null && track != null) || (this.track != null && track != null && !this.track.getCategory().equals(track.getCategory()))) { sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key)); } + this.track = track; updateUI(); } }); @@ -338,12 +333,12 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi private void setTotalAltitudeGain(Float altitudeGain_m) { Float totalAltitudeGain = altitudeGain_m; - if (lastTrackStatistics != null && lastTrackStatistics.hasTotalAltitudeGain()) { + if (track != null && track.getTrackStatistics().hasTotalAltitudeGain()) { if (altitudeGain_m == null) { - totalAltitudeGain = lastTrackStatistics.getTotalAltitudeGain(); - } else { - totalAltitudeGain += lastTrackStatistics.getTotalAltitudeGain(); + totalAltitudeGain = 0f; } + + totalAltitudeGain += track.getTrackStatistics().getTotalAltitudeGain(); } Pair parts = StringUtils.formatAltitude(getContext(), totalAltitudeGain, preferenceMetricUnits); @@ -355,11 +350,11 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi private void setTotalAltitudeLoss(Float altitudeLoss_m) { Float totalAltitudeLoss = altitudeLoss_m; - if (lastTrackStatistics != null && lastTrackStatistics.hasTotalAltitudeLoss()) { + if (track != null && track.getTrackStatistics().hasTotalAltitudeLoss()) { if (altitudeLoss_m == null) { - totalAltitudeLoss = lastTrackStatistics.getTotalAltitudeLoss(); + totalAltitudeLoss = track.getTrackStatistics().getTotalAltitudeLoss(); } else { - totalAltitudeLoss += lastTrackStatistics.getTotalAltitudeLoss(); + totalAltitudeLoss += track.getTrackStatistics().getTotalAltitudeLoss(); } } @@ -387,21 +382,21 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi setTotalDistance(Distance.of(0)); //TODO Why? // Set activity type - { - String trackIconValue = TrackIconUtils.getIconValue(getContext(), category); + if (track != null) { + String trackIconValue = TrackIconUtils.getIconValue(getContext(), track.getCategory()); viewBinding.statsActivityTypeIcon.setEnabled(isSelectedTrackRecording()); viewBinding.statsActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(trackIconValue)); } // Set time - if (lastTrackStatistics != null) { - viewBinding.statsMovingTimeValue.setText(StringUtils.formatElapsedTime(lastTrackStatistics.getMovingTime())); + if (track != null && track.getTrackStatistics() != null) { + viewBinding.statsMovingTimeValue.setText(StringUtils.formatElapsedTime(track.getTrackStatistics().getMovingTime())); updateTotalTime(); } // Set average speed/pace { - Speed speed = lastTrackStatistics != null ? lastTrackStatistics.getAverageSpeed() : null; + Speed speed = track != null ? track.getTrackStatistics().getAverageSpeed() : null; viewBinding.statsAverageSpeedLabel.setText(preferenceReportSpeed ? R.string.stats_average_speed : R.string.stats_average_pace); Pair parts = StringUtils.getSpeedParts(getContext(), speed, preferenceMetricUnits, preferenceReportSpeed); @@ -411,7 +406,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi // Set max speed/pace { - Speed speed = lastTrackStatistics != null ? lastTrackStatistics.getMaxSpeed() : null; + Speed speed = track != null ? track.getTrackStatistics().getMaxSpeed() : null; viewBinding.statsMaxSpeedLabel.setText(preferenceReportSpeed ? R.string.stats_max_speed : R.string.stats_fastest_pace); @@ -422,7 +417,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi // Set moving speed/pace { - Speed speed = lastTrackStatistics != null ? lastTrackStatistics.getAverageMovingSpeed() : null; + Speed speed = track != null ? track.getTrackStatistics().getAverageMovingSpeed() : null; viewBinding.statsMovingSpeedLabel.setText(preferenceReportSpeed ? R.string.stats_average_moving_speed : R.string.stats_average_moving_pace); @@ -438,7 +433,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi } private void updateTotalTime() { - Duration totalTime = lastTrackStatistics.getTotalTime(); + Duration totalTime = track.getTrackStatistics().getTotalTime(); if (isSelectedTrackRecording()) { TrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); if (trackRecordingService != null) { @@ -480,7 +475,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi } private void setTotalDistance(Distance sensorDistanceSinceLastTrackpoint) { - Distance totalDistance = lastTrackStatistics != null ? (lastTrackStatistics.getTotalDistance().plus(sensorDistanceSinceLastTrackpoint)) : Distance.invalid(); + Distance totalDistance = track != null ? (track.getTrackStatistics().getTotalDistance().plus(sensorDistanceSinceLastTrackpoint)) : Distance.invalid(); Pair parts = StringUtils.getDistanceParts(getContext(), totalDistance, preferenceMetricUnits); viewBinding.statsDistanceValue.setText(parts.first);