Statistics*Fragment: keep reference to track instead of TrackStatistics and category.

This commit is contained in:
Dennis Guse
2021-04-11 18:25:43 +02:00
parent 2b5744ccc1
commit 610da5a106
3 changed files with 39 additions and 41 deletions
@@ -101,11 +101,12 @@ public class Track {
this.icon = icon; this.icon = icon;
} }
@NonNull
public TrackStatistics getTrackStatistics() { public TrackStatistics getTrackStatistics() {
return trackStatistics; return trackStatistics;
} }
public void setTrackStatistics(TrackStatistics trackStatistics) { public void setTrackStatistics(@NonNull TrackStatistics trackStatistics) {
this.trackStatistics = trackStatistics; this.trackStatistics = trackStatistics;
} }
@@ -65,11 +65,13 @@ public class StatisticsRecordedFragment extends Fragment {
return fragment; return fragment;
} }
private TrackStatistics trackStatistics;
private SensorStatistics sensorStatistics; private SensorStatistics sensorStatistics;
private SensorsAdapter sensorsAdapter; private SensorsAdapter sensorsAdapter;
private String category = "";
private Track.Id trackId; private Track.Id trackId;
@Nullable // Lazily loaded.
private Track track;
private ContentProviderUtils contentProviderUtils; private ContentProviderUtils contentProviderUtils;
private StatisticsRecordedBinding viewBinding; private StatisticsRecordedBinding viewBinding;
@@ -86,9 +88,9 @@ public class StatisticsRecordedFragment extends Fragment {
preferenceMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); 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; updateUInecessary = true;
preferenceReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), category); preferenceReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), track.getCategory());
} }
if (key != null && updateUInecessary && isResumed()) { if (key != null && updateUInecessary && isResumed()) {
@@ -152,15 +154,14 @@ public class StatisticsRecordedFragment extends Fragment {
getActivity().runOnUiThread(() -> { getActivity().runOnUiThread(() -> {
if (isResumed()) { if (isResumed()) {
Track track = contentProviderUtils.getTrack(trackId); Track track = contentProviderUtils.getTrack(trackId);
trackStatistics = track.getTrackStatistics();
sensorStatistics = contentProviderUtils.getSensorStats(trackId); sensorStatistics = contentProviderUtils.getSensorStats(trackId);
String newCategory = track.getCategory(); if ((this.track == null && track != null) || (this.track != null && track != null && !this.track.getCategory().equals(track.getCategory()))) {
if (!category.equals(newCategory)) {
category = newCategory;
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key)); sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key));
} }
this.track = track;
loadTrackDescription(track); loadTrackDescription(track);
updateUI(); updateUI();
updateSensorUI(); updateSensorUI();
@@ -174,10 +175,11 @@ public class StatisticsRecordedFragment extends Fragment {
private void loadTrackDescription(@NonNull Track track) { private void loadTrackDescription(@NonNull Track track) {
viewBinding.statsNameValue.setText(track.getName()); viewBinding.statsNameValue.setText(track.getName());
viewBinding.statsDescriptionValue.setText(track.getDescription()); 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() { private void updateUI() {
TrackStatistics trackStatistics = track.getTrackStatistics();
// Set total distance // Set total distance
{ {
Pair<String, String> parts = StringUtils.getDistanceParts(getContext(), trackStatistics.getTotalDistance(), preferenceMetricUnits); Pair<String, String> parts = StringUtils.getDistanceParts(getContext(), trackStatistics.getTotalDistance(), preferenceMetricUnits);
@@ -188,7 +190,7 @@ public class StatisticsRecordedFragment extends Fragment {
// Set activity type // 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))); viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), TrackIconUtils.getIconDrawable(trackIconValue)));
} }
@@ -34,7 +34,6 @@ import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.databinding.StatisticsRecordingBinding; import de.dennisguse.opentracks.databinding.StatisticsRecordingBinding;
import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
import de.dennisguse.opentracks.util.StringUtils; import de.dennisguse.opentracks.util.StringUtils;
import de.dennisguse.opentracks.util.TrackIconUtils; 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 String TAG = StatisticsRecordingFragment.class.getSimpleName();
private static final long UI_UPDATE_INTERVAL = UnitConversions.ONE_SECOND_MS; private static final long UI_UPDATE_INTERVAL = UnitConversions.ONE_SECOND_MS;
public static Fragment newInstance() { public static Fragment newInstance() {
return new StatisticsRecordingFragment(); return new StatisticsRecordingFragment();
} }
private TrackDataHub trackDataHub; private TrackDataHub trackDataHub;
private Handler handlerUpdateUI; private Handler handlerUpdateUI;
@@ -64,10 +63,8 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
private TrackRecordingServiceConnection trackRecordingServiceConnection = new TrackRecordingServiceConnection(); private TrackRecordingServiceConnection trackRecordingServiceConnection = new TrackRecordingServiceConnection();
private TrackPoint lastTrackPoint; private TrackPoint lastTrackPoint;
//TODO Should not be nullable @Nullable // Lazily loaded.
private TrackStatistics lastTrackStatistics; private Track track;
private String category = "";
private StatisticsRecordingBinding viewBinding; private StatisticsRecordingBinding viewBinding;
private SensorsAdapter sensorsAdapter; private SensorsAdapter sensorsAdapter;
@@ -86,9 +83,9 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
preferenceMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); 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; 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)) { 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() { private final Runnable updateUIeachSecond = new Runnable() {
public void run() { public void run() {
if (isResumed() && isSelectedTrackRecording()) { if (isResumed() && isSelectedTrackRecording()) {
if (!isSelectedTrackPaused() && lastTrackStatistics != null) { if (!isSelectedTrackPaused() && track != null) {
synchronized (this) { synchronized (this) {
if (lastTrackPoint != null && lastTrackPoint.hasLocation() && !lastTrackPoint.isRecent()) { if (lastTrackPoint != null && lastTrackPoint.hasLocation() && !lastTrackPoint.isRecent()) {
lastTrackPoint = null; lastTrackPoint = null;
@@ -142,7 +139,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
viewBinding = StatisticsRecordingBinding.inflate(inflater, container, false); 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; RecyclerView sensorsRecyclerView = viewBinding.statsSensorsRecyclerView;
sensorsRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); sensorsRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
@@ -199,12 +196,10 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
if (isResumed()) { if (isResumed()) {
getActivity().runOnUiThread(() -> { getActivity().runOnUiThread(() -> {
if (isResumed()) { if (isResumed()) {
lastTrackStatistics = track != null ? track.getTrackStatistics() : null; if ((this.track == null && track != null) || (this.track != null && track != null && !this.track.getCategory().equals(track.getCategory()))) {
String newCategory = track != null ? track.getCategory() : "";
if (!category.equals(newCategory)) {
category = newCategory;
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key)); sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key));
} }
this.track = track;
updateUI(); updateUI();
} }
}); });
@@ -338,12 +333,12 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
private void setTotalAltitudeGain(Float altitudeGain_m) { private void setTotalAltitudeGain(Float altitudeGain_m) {
Float totalAltitudeGain = altitudeGain_m; Float totalAltitudeGain = altitudeGain_m;
if (lastTrackStatistics != null && lastTrackStatistics.hasTotalAltitudeGain()) { if (track != null && track.getTrackStatistics().hasTotalAltitudeGain()) {
if (altitudeGain_m == null) { if (altitudeGain_m == null) {
totalAltitudeGain = lastTrackStatistics.getTotalAltitudeGain(); totalAltitudeGain = 0f;
} else {
totalAltitudeGain += lastTrackStatistics.getTotalAltitudeGain();
} }
totalAltitudeGain += track.getTrackStatistics().getTotalAltitudeGain();
} }
Pair<String, String> parts = StringUtils.formatAltitude(getContext(), totalAltitudeGain, preferenceMetricUnits); Pair<String, String> parts = StringUtils.formatAltitude(getContext(), totalAltitudeGain, preferenceMetricUnits);
@@ -355,11 +350,11 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
private void setTotalAltitudeLoss(Float altitudeLoss_m) { private void setTotalAltitudeLoss(Float altitudeLoss_m) {
Float totalAltitudeLoss = altitudeLoss_m; Float totalAltitudeLoss = altitudeLoss_m;
if (lastTrackStatistics != null && lastTrackStatistics.hasTotalAltitudeLoss()) { if (track != null && track.getTrackStatistics().hasTotalAltitudeLoss()) {
if (altitudeLoss_m == null) { if (altitudeLoss_m == null) {
totalAltitudeLoss = lastTrackStatistics.getTotalAltitudeLoss(); totalAltitudeLoss = track.getTrackStatistics().getTotalAltitudeLoss();
} else { } 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? setTotalDistance(Distance.of(0)); //TODO Why?
// Set activity type // Set activity type
{ if (track != null) {
String trackIconValue = TrackIconUtils.getIconValue(getContext(), category); String trackIconValue = TrackIconUtils.getIconValue(getContext(), track.getCategory());
viewBinding.statsActivityTypeIcon.setEnabled(isSelectedTrackRecording()); viewBinding.statsActivityTypeIcon.setEnabled(isSelectedTrackRecording());
viewBinding.statsActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(trackIconValue)); viewBinding.statsActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(trackIconValue));
} }
// Set time // Set time
if (lastTrackStatistics != null) { if (track != null && track.getTrackStatistics() != null) {
viewBinding.statsMovingTimeValue.setText(StringUtils.formatElapsedTime(lastTrackStatistics.getMovingTime())); viewBinding.statsMovingTimeValue.setText(StringUtils.formatElapsedTime(track.getTrackStatistics().getMovingTime()));
updateTotalTime(); updateTotalTime();
} }
// Set average speed/pace // 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); viewBinding.statsAverageSpeedLabel.setText(preferenceReportSpeed ? R.string.stats_average_speed : R.string.stats_average_pace);
Pair<String, String> parts = StringUtils.getSpeedParts(getContext(), speed, preferenceMetricUnits, preferenceReportSpeed); Pair<String, String> parts = StringUtils.getSpeedParts(getContext(), speed, preferenceMetricUnits, preferenceReportSpeed);
@@ -411,7 +406,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
// Set max speed/pace // 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); 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 // 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); 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() { private void updateTotalTime() {
Duration totalTime = lastTrackStatistics.getTotalTime(); Duration totalTime = track.getTrackStatistics().getTotalTime();
if (isSelectedTrackRecording()) { if (isSelectedTrackRecording()) {
TrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound(); TrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound();
if (trackRecordingService != null) { if (trackRecordingService != null) {
@@ -480,7 +475,7 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
} }
private void setTotalDistance(Distance sensorDistanceSinceLastTrackpoint) { 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<String, String> parts = StringUtils.getDistanceParts(getContext(), totalDistance, preferenceMetricUnits); Pair<String, String> parts = StringUtils.getDistanceParts(getContext(), totalDistance, preferenceMetricUnits);
viewBinding.statsDistanceValue.setText(parts.first); viewBinding.statsDistanceValue.setText(parts.first);