StatisticsCustomLayoutEditAdapter: use StatisticsViewHolder (with demo data).

Part of #1118.
This commit is contained in:
Dennis Guse
2022-11-15 22:56:54 +01:00
parent dbac595754
commit d3cf2957cc
6 changed files with 50 additions and 104 deletions
@@ -1,6 +1,7 @@
package de.dennisguse.opentracks.ui.customRecordingLayout;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -9,18 +10,54 @@ import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.recyclerview.widget.RecyclerView;
import java.time.Duration;
import java.time.Instant;
import java.time.ZoneOffset;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Callable;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.Altitude;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Speed;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.databinding.CustomStatsItemBinding;
import de.dennisguse.opentracks.util.StatisticsUtils;
import de.dennisguse.opentracks.services.RecordingData;
import de.dennisguse.opentracks.settings.UnitSystem;
import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.viewmodels.Mapping;
import de.dennisguse.opentracks.viewmodels.StatisticViewHolder;
public class SettingsCustomLayoutEditAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = SettingsCustomLayoutEditAdapter.class.getSimpleName();
private static final RecordingData demoData;
static {
TrackStatistics trackStatistics = new TrackStatistics();
trackStatistics.setStartTime(Instant.ofEpochMilli(0));
trackStatistics.setMovingTime(Duration.ofMinutes(0));
trackStatistics.setTotalTime(Duration.ofMinutes(0));
trackStatistics.setTotalDistance(Distance.of(0));
trackStatistics.setTotalAltitudeGain(0f);
trackStatistics.setTotalAltitudeLoss(0f);
Track track = new Track(ZoneOffset.UTC);
track.setTrackStatistics(trackStatistics);
TrackPoint lastTrackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.ofEpochMilli(0));
lastTrackPoint.setLatitude(0);
lastTrackPoint.setLongitude(0);
lastTrackPoint.setAltitude(Altitude.EGM2008.of(0));
lastTrackPoint.setSpeed(Speed.of(0));
demoData = new RecordingData(track, lastTrackPoint, null);
}
private Layout layout;
private final Context context;
private final SettingsCustomLayoutItemClickListener itemClickListener;
@@ -39,7 +76,6 @@ public class SettingsCustomLayoutEditAdapter extends RecyclerView.Adapter<Recycl
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
CustomStatsItemBinding binding = CustomStatsItemBinding.inflate(LayoutInflater.from(context), parent, false);
//TODO CustomStatsItemBinding or rather use mapping.get().call() directly
return new SettingsCustomLayoutEditAdapter.ViewHolder(binding);
}
@@ -49,15 +85,17 @@ public class SettingsCustomLayoutEditAdapter extends RecyclerView.Adapter<Recycl
DataField field = layout.getFields().get(position);
viewHolder.itemView.setTag(field.getKey());
try {
viewHolder.viewBinding.statsLayout.statsDescriptionMain.setText(mapping.get(field.getKey()).call().getTitleId());
StatisticViewHolder<?> m = mapping.get(field.getKey()).call();
m.initialize(context, LayoutInflater.from(context));
m.configureUI(field);
m.onChanged(UnitSystem.METRIC, demoData);
viewHolder.viewBinding.statsLayout.removeAllViews(); //TODO this is not really performant
viewHolder.viewBinding.statsLayout.addView(m.getView());
} catch (Exception e) {
//Ignored.
Log.e(TAG, "Couldn't to instantiate UI for DataField with key " + field.getKey() + " " + e.getMessage());
throw new RuntimeException(e);
}
viewHolder.viewBinding.statsLayout.statsValue.setText(StatisticsUtils.emptyValue(context, field.getKey()));
viewHolder.viewBinding.statsLayout.statsDescriptionMain.setTextAppearance(context, field.isVisible() ? (field.isPrimary() ? R.style.TextAppearance_OpenTracks_PrimaryHeader : R.style.TextAppearance_OpenTracks_SecondaryHeader) : R.style.TextAppearance_OpenTracks_HiddenHeader);
viewHolder.viewBinding.statsLayout.statsValue.setTextAppearance(context, field.isVisible() ? (field.isPrimary() ? R.style.TextAppearance_OpenTracks_PrimaryValue : R.style.TextAppearance_OpenTracks_SecondaryValue) : R.style.TextAppearance_OpenTracks_HiddenValue);
viewHolder.viewBinding.statsIconShowStatus.setVisibility(field.isVisible() ? View.GONE : View.VISIBLE);
viewHolder.viewBinding.statsIconShowStatus.setImageDrawable(AppCompatResources.getDrawable(context, R.drawable.ic_baseline_visibility_off_24));
viewHolder.viewBinding.statsIvDragIndicator.setVisibility(field.isVisible() ? View.VISIBLE : View.GONE);
@@ -12,6 +12,7 @@ import de.dennisguse.opentracks.ui.customRecordingLayout.Layout;
public class StatisticsUtils {
@Deprecated
public static String emptyValue(@NonNull Context context, @NonNull String statTitle) {
if (PreferencesUtils.isKey(R.string.stats_custom_layout_total_time_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_moving_time_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_pace_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_average_moving_pace_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_average_pace_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_fastest_pace_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_clock_key, statTitle)) {
return context.getString(R.string.stats_empty_value_time);
@@ -24,6 +25,7 @@ public class StatisticsUtils {
}
}
@Deprecated //Add to Layout?
public static Layout filterVisible(Layout layout, boolean visible) {
Layout result = new Layout(layout.getName());
result.addFields(layout.getFields().stream().filter(f -> f.isVisible() == visible).collect(Collectors.toList()));
@@ -21,11 +21,6 @@ public class ClockViewHolder extends StatisticViewHolder<StatsClockItemBinding>
getBinding().statsClock.setTextAppearance(getContext(), dataField.isPrimary() ? R.style.TextAppearance_OpenTracks_PrimaryValue : R.style.TextAppearance_OpenTracks_SecondaryValue);
}
@Override
public int getTitleId() {
return R.string.stats_clock;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
}
@@ -30,11 +30,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class Distance extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_distance;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
Pair<String, String> valueAndUnit = DistanceFormatter.Builder()
@@ -49,11 +44,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class TotalTime extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_total_time;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
Pair<String, String> valueAndUnit = new Pair<>(StringUtils.formatElapsedTime(data.getTrackStatistics().getTotalTime()), null);
@@ -66,11 +56,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class MovingTime extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_moving_time;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
String value = StringUtils.formatElapsedTime(data.getTrackStatistics().getMovingTime());
@@ -82,11 +67,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class SpeedOrPace extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_speed;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
// TODO Pace wont work for now
@@ -115,11 +95,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class AverageMovingSpeed extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_average_moving_speed;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SpeedFormatter speedFormatterSpeed = SpeedFormatter.Builder()
@@ -137,11 +112,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class AverageSpeed extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_average_speed;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SpeedFormatter speedFormatterSpeed = SpeedFormatter.Builder()
@@ -159,11 +129,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class MaxSpeed extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_max_speed;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SpeedFormatter speedFormatterSpeed = SpeedFormatter.Builder()
@@ -181,11 +146,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class AverageMovingPace extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_average_moving_pace;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SpeedFormatter speedFormatterSpeed = SpeedFormatter.Builder()
@@ -203,11 +163,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class AveragePace extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_average_pace;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SpeedFormatter speedFormatterSpeed = SpeedFormatter.Builder()
@@ -225,11 +180,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class FastestPace extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_fastest_pace;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SpeedFormatter speedFormatterSpeed = SpeedFormatter.Builder()
@@ -247,11 +197,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class Altitude extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_altitude;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
TrackPoint latestTrackPoint = data.getLatestTrackPoint();
@@ -268,11 +213,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class Gain extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_gain;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
@@ -286,11 +226,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class Loss extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_loss;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
@@ -304,11 +239,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class Coordinates extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_coordinates;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
TrackPoint latestTrackPoint = data.getLatestTrackPoint();
@@ -326,11 +256,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class SensorHeartRate extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_sensors_heart_rate;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SensorDataSet sensorDataSet = data.getSensorDataSet();
@@ -353,11 +278,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class SensorCadence extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_sensors_cadence;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SensorDataSet sensorDataSet = data.getSensorDataSet();
@@ -380,11 +300,6 @@ public abstract class GenericStatisticsViewHolder extends StatisticViewHolder<St
public static class SensorPower extends GenericStatisticsViewHolder {
@Override
public int getTitleId() {
return R.string.stats_sensors_power;
}
@Override
public void onChanged(UnitSystem unitSystem, RecordingData data) {
SensorDataSet sensorDataSet = data.getSensorDataSet();
@@ -25,9 +25,6 @@ public abstract class StatisticViewHolder<T extends ViewBinding> {
public abstract void configureUI(DataField dataField);
@Deprecated
public abstract int getTitleId();
public abstract void onChanged(UnitSystem unitSystem, RecordingData data);
public View getView() {
+1 -2
View File
@@ -22,11 +22,10 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<include
<FrameLayout
android:id="@+id/stats_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
layout="@layout/stats_generic_item"
app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toEndOf="@id/stats_iv_drag_indicator"
app:layout_constraintEnd_toStartOf="@id/stats_icon_show_status"