From e9deebea6c831454aec391cdc1d3eda760745956 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Wed, 7 Jan 2026 17:15:22 +0100 Subject: [PATCH] Refactor: RecordingLayout. --- .../settings/PreferencesOpenHelperTest.java | 5 +- .../settings/PreferencesUtilsTest.java | 8 +- .../RecordingLayoutTest.java | 25 ++-- .../opentracks/TrackRecordingActivity.java | 7 +- .../settings/PreferencesOpenHelper.java | 2 +- .../opentracks/settings/PreferencesUtils.java | 130 ++++++++---------- .../customRecordingLayout/CsvLayoutUtils.java | 13 ++ .../RecordingLayout.java | 15 +- .../RecordingLayoutIO.java | 10 +- src/main/res/values/settings.xml | 98 ------------- 10 files changed, 113 insertions(+), 200 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/settings/PreferencesOpenHelperTest.java b/src/androidTest/java/de/dennisguse/opentracks/settings/PreferencesOpenHelperTest.java index 16c8f9a67..3562740e6 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/settings/PreferencesOpenHelperTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/settings/PreferencesOpenHelperTest.java @@ -60,8 +60,7 @@ public class PreferencesOpenHelperTest { // when update to version 2 PreferencesOpenHelper.newInstance(2).check(); - String updatedOldCustomLayoutCsv = context.getString(R.string.activity_type_unknown) + ";" - + PreferencesUtils.getLayoutColumnsByDefault() + ";distance,1,1,0;speed,1,1,0;"; + String updatedOldCustomLayoutCsv = context.getString(R.string.activity_type_unknown) + ";2;distance,1,1,0;speed,1,1,0;"; // then there should be one layout with old custom layout that has the new CSV value. List recordingLayouts = PreferencesUtils.getAllCustomLayouts(); @@ -110,7 +109,7 @@ public class PreferencesOpenHelperTest { PreferencesOpenHelper.newInstance(1).check(); // then custom layout should be equals to default layout. - RecordingLayout defaultRecordingLayout = RecordingLayoutIO.fromCsv(PreferencesUtils.buildDefaultLayout(), resources); + RecordingLayout defaultRecordingLayout = RecordingLayoutIO.fromCsvLine(PreferencesUtils.buildDefaultLayout(), resources); List customRecordingLayout = PreferencesUtils.getAllCustomLayouts(); assertEquals(1, customRecordingLayout.size()); diff --git a/src/androidTest/java/de/dennisguse/opentracks/settings/PreferencesUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/settings/PreferencesUtilsTest.java index b341fca82..b0a961506 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/settings/PreferencesUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/settings/PreferencesUtilsTest.java @@ -210,7 +210,7 @@ public class PreferencesUtilsTest { String csv = sharedPreferences.getString(context.getString(R.string.stats_custom_layouts_key), null); assertNotNull(csv); assertEquals(csv, - "road cycling;" + PreferencesUtils.getLayoutColumnsByDefault() + ";" + "road cycling;2;" + context.getString(R.string.stats_custom_layout_moving_time_key) + ",1,1,0;" + context.getString(R.string.stats_custom_layout_distance_key) + ",1,0,0;" + context.getString(R.string.stats_custom_layout_average_moving_speed_key) + ",0,1,0;" @@ -258,8 +258,8 @@ public class PreferencesUtilsTest { + context.getString(R.string.stats_custom_layout_speed_key) + ",0,0;"; List layoutsToBeUpdated = new ArrayList<>(); - layoutsToBeUpdated.add(RecordingLayoutIO.fromCsv(cyclingProfileUpdated, resources)); - layoutsToBeUpdated.add(RecordingLayoutIO.fromCsv(runningProfile, resources)); + layoutsToBeUpdated.add(RecordingLayoutIO.fromCsvLine(cyclingProfileUpdated, resources)); + layoutsToBeUpdated.add(RecordingLayoutIO.fromCsvLine(runningProfile, resources)); PreferencesUtils.updateCustomLayouts(layoutsToBeUpdated); @@ -303,7 +303,7 @@ public class PreferencesUtilsTest { + context.getString(R.string.stats_custom_layout_distance_key) + ",0,0;" + context.getString(R.string.stats_custom_layout_average_moving_speed_key) + ",0,0;" + context.getString(R.string.stats_custom_layout_speed_key) + ",0,0;"; - RecordingLayout recordingLayoutToBeUpdated = RecordingLayoutIO.fromCsv(cyclingProfileUpdated, resources); + RecordingLayout recordingLayoutToBeUpdated = RecordingLayoutIO.fromCsvLine(cyclingProfileUpdated, resources); PreferencesUtils.updateCustomLayout(recordingLayoutToBeUpdated); // then only updated profile is modified in the custom layouts diff --git a/src/androidTest/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayoutTest.java b/src/androidTest/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayoutTest.java index 15c136017..1ab0a2338 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayoutTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayoutTest.java @@ -28,7 +28,7 @@ public class RecordingLayoutTest extends TestCase { String csv = "running;2;" + context.getString(R.string.stats_custom_layout_speed_key) + ",1,1,0;" + context.getString(R.string.stats_custom_layout_distance_key) + ",1,0,0;" + context.getString(R.string.stats_custom_layout_altitude_key) + ",0,1,0;" + context.getString(R.string.stats_custom_layout_gain_key) + ",0,0,0;"; // when create a layout from CSV line - RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv, resources); + RecordingLayout recordingLayout = RecordingLayoutIO.fromCsvLine(csv, resources); List dataFieldList = recordingLayout.getFields(); // then layout and data fields are built correctly @@ -60,13 +60,12 @@ public class RecordingLayoutTest extends TestCase { String csv1 = "Layout Name;speed,1,1;distance,0,0;"; // when create a layout from CSV line - RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv1, resources); - List dataFieldList = recordingLayout.getFields(); + RecordingLayout recordingLayout = RecordingLayoutIO.fromCsvLine(csv1, resources); // then layout and data fields are built correctly - assertEquals(recordingLayout.getName(), PreferencesUtils.getDefaultLayoutName()); - assertEquals(recordingLayout.getColumnsPerRow(), PreferencesUtils.getLayoutColumnsByDefault()); - assertEquals(0, recordingLayout.getFields().size()); + assertEquals(recordingLayout.getName(), "Default Layout"); + assertEquals(recordingLayout.getColumnsPerRow(), 2); + assertEquals(PreferencesUtils.getDefaultLayout().getFields(), recordingLayout.getFields()); } @Test @@ -75,13 +74,13 @@ public class RecordingLayoutTest extends TestCase { String csv1 = "Layout Name;2;"; // when create a layout from CSV line - RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv1, resources); + RecordingLayout recordingLayout = RecordingLayoutIO.fromCsvLine(csv1, resources); List dataFieldList = recordingLayout.getFields(); // then layout and data fields are built correctly - assertEquals(recordingLayout.getName(), PreferencesUtils.getDefaultLayoutName()); - assertEquals(recordingLayout.getColumnsPerRow(), PreferencesUtils.getLayoutColumnsByDefault()); - assertEquals(0, recordingLayout.getFields().size()); + assertEquals(recordingLayout.getName(), "Default Layout"); + assertEquals(recordingLayout.getColumnsPerRow(), 2); + assertEquals(PreferencesUtils.getDefaultLayout().getFields(), recordingLayout.getFields()); } @Test @@ -90,7 +89,7 @@ public class RecordingLayoutTest extends TestCase { String csv1 = "Layout Name;2;speed,distance,total time;"; // when create a layout from CSV line - RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv1, resources); + RecordingLayout recordingLayout = RecordingLayoutIO.fromCsvLine(csv1, resources); List dataFieldList = recordingLayout.getFields(); // then layout and data fields are built correctly @@ -105,7 +104,7 @@ public class RecordingLayoutTest extends TestCase { String csv1 = "Layout Name;2;speed,1,0;distance;"; // when create a layout from CSV line - RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv1, resources); + RecordingLayout recordingLayout = RecordingLayoutIO.fromCsvLine(csv1, resources); List dataFieldList = recordingLayout.getFields(); // then layout and data fields are built correctly @@ -145,6 +144,6 @@ public class RecordingLayoutTest extends TestCase { String csv = recordingLayout.toCsv(); // then csv is well built - assertEquals(csv, "Test Layout;" + PreferencesUtils.getLayoutColumnsByDefault() + ";key1,0,0,0;key2,0,1,0;key3,1,0,0;key4,1,1,0;key5,1,1,1;"); + assertEquals(csv, "Test Layout;2;key1,0,0,0;key2,0,1,0;key3,1,0,0;key4,1,1,0;key5,1,1,1;"); } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java index 449aeb3b5..44600240c 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java @@ -44,6 +44,7 @@ import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.SettingsActivity; +import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout; import de.dennisguse.opentracks.ui.intervals.IntervalsFragment; import de.dennisguse.opentracks.ui.markers.MarkerEditActivity; import de.dennisguse.opentracks.ui.markers.MarkerListActivity; @@ -285,8 +286,10 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc if (item.getItemId() == R.id.track_detail_menu_select_layout) { AlertDialog.Builder builder = new AlertDialog.Builder(this); - List layoutNames = PreferencesUtils.getAllCustomLayoutNames(); - builder.setTitle(getString(R.string.custom_layout_select_layout)).setItems(layoutNames.toArray(new String[0]), (dialog, which) -> PreferencesUtils.setDefaultLayout(layoutNames.get(which))); + List layoutNames = PreferencesUtils.getAllCustomLayouts().stream() + .map(RecordingLayout::getName) + .toList(); + builder.setTitle(getString(R.string.custom_layout_select_layout)).setItems(layoutNames.toArray(new String[0]), (dialog, which) -> PreferencesUtils.setSelectedLayoutName(layoutNames.get(which))); builder.create().show(); return true; } diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesOpenHelper.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesOpenHelper.java index 47537c460..249e06ce2 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesOpenHelper.java +++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesOpenHelper.java @@ -56,7 +56,7 @@ class PreferencesOpenHelper { } if (!parts.get(1).matches("\\d+")) { - parts.add(1, String.valueOf(PreferencesUtils.getLayoutColumnsByDefault())); + parts.add(1, String.valueOf(2)); } PreferencesUtils.setString(R.string.stats_custom_layouts_key, String.join(CsvLayoutUtils.ITEM_SEPARATOR, parts)); } diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java index 24c144176..159f47a9b 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java @@ -16,17 +16,16 @@ package de.dennisguse.opentracks.settings; -import android.annotation.SuppressLint; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.res.Resources; -import android.content.res.TypedArray; import android.net.Uri; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AppCompatDelegate; import androidx.preference.PreferenceManager; @@ -34,12 +33,11 @@ import androidx.preference.PreferenceManager; import com.google.android.material.color.DynamicColors; import java.time.Duration; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.models.ActivityType; @@ -51,7 +49,7 @@ import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.TrackFilenameGenerator; import de.dennisguse.opentracks.sensors.SensorType; -import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils; +import de.dennisguse.opentracks.ui.customRecordingLayout.DataField; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayoutIO; @@ -808,72 +806,54 @@ public class PreferencesUtils { return getDefaultExportDirectoryUri() != null; } - public static int getLayoutColumnsByDefault() { - return resources.getInteger(R.integer.stats_custom_layout_columns_default); - } + public static RecordingLayout getDefaultLayout() { + //TODO We could merge this with Mapping, right? + List defaultFields = List.of( + new DataField(resources.getString(R.string.stats_custom_layout_distance_key), true, true, false), + new DataField(resources.getString(R.string.stats_custom_layout_total_time_key), true, true, false), + new DataField(resources.getString(R.string.stats_custom_layout_speed_key), true, true, false), + new DataField(resources.getString(R.string.stats_custom_layout_moving_time_key), true, true, false), + new DataField(resources.getString(R.string.stats_custom_layout_average_speed_key), true, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_max_speed_key), true, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_average_moving_speed_key), true, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_altitude_key), true, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_gain_key), true, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_loss_key), true, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_pace_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_average_moving_pace_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_average_pace_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_average_segment_pace_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_elapsed_segment_time_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_fastest_pace_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_coordinates_key), false, false, true), + new DataField(resources.getString(R.string.stats_custom_layout_heart_rate_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_cadence_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_power_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_clock_key), false, false, false), + new DataField(resources.getString(R.string.stats_custom_layout_temperature_key), false, false, false) + ); - private static List getLayoutDataFields() { - return Stream.of( - R.array.stats_custom_layout_fields_default_value_0, - R.array.stats_custom_layout_fields_default_value_1, - R.array.stats_custom_layout_fields_default_value_2, - R.array.stats_custom_layout_fields_default_value_3, - R.array.stats_custom_layout_fields_default_value_4, - R.array.stats_custom_layout_fields_default_value_5, - R.array.stats_custom_layout_fields_default_value_6, - R.array.stats_custom_layout_fields_default_value_7, - R.array.stats_custom_layout_fields_default_value_8, - R.array.stats_custom_layout_fields_default_value_9, - R.array.stats_custom_layout_fields_default_value_10, - R.array.stats_custom_layout_fields_default_value_11, - R.array.stats_custom_layout_fields_default_value_12, - R.array.stats_custom_layout_fields_default_value_13, - R.array.stats_custom_layout_fields_default_value_14, - R.array.stats_custom_layout_fields_default_value_15, - R.array.stats_custom_layout_fields_default_value_16, - R.array.stats_custom_layout_fields_default_value_17, - R.array.stats_custom_layout_fields_default_value_18, - R.array.stats_custom_layout_fields_default_value_19, - R.array.stats_custom_layout_fields_default_value_20, - R.array.stats_custom_layout_fields_default_value_21 - ).map(id -> resources.obtainTypedArray(id)) - .toList(); - } - - @SuppressLint("ResourceType") - private static String buildDefaultFields() { - List fieldsArrays = getLayoutDataFields(); - return fieldsArrays.stream().map(i -> i.getString(0) + CsvLayoutUtils.PROPERTY_SEPARATOR + i.getString(1)).collect(Collectors.joining(CsvLayoutUtils.ITEM_SEPARATOR)) - + CsvLayoutUtils.ITEM_SEPARATOR; + RecordingLayout defaultLayout = new RecordingLayout(resources.getString(R.string.stats_custom_layout_default_layout), 2); + defaultLayout.addFields(defaultFields); + return defaultLayout; } static String buildDefaultLayout() { - return resources.getString(R.string.stats_custom_layout_default_layout) + CsvLayoutUtils.ITEM_SEPARATOR + getLayoutColumnsByDefault() + CsvLayoutUtils.ITEM_SEPARATOR + buildDefaultFields(); + return RecordingLayoutIO.toCSV(List.of(getDefaultLayout())); } - public static String getDefaultLayoutName() { - return resources.getString(R.string.stats_custom_layout_default_layout); - } - - /** - * @return custom layout selected or the first one if any has been selected or the one selected is not exists anymore. - */ public static RecordingLayout getCustomLayout() { + String selectedLayout = getSelectedLayoutName(); String csvCustomLayouts = getString(R.string.stats_custom_layouts_key, buildDefaultLayout()); - String[] csvLines = csvCustomLayouts.split(CsvLayoutUtils.LINE_SEPARATOR); - String layoutSelected = getString(R.string.stats_custom_layout_selected_layout_key, null); - if (layoutSelected == null) { - return RecordingLayoutIO.fromCsv(csvLines[0], resources); - } - for (String line : csvLines) { - RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(line, resources); - if (recordingLayout.sameName(layoutSelected)) { - return recordingLayout; - } - } + List recordingLayouts = RecordingLayoutIO.fromCsv(csvCustomLayouts, resources); - return RecordingLayoutIO.fromCsv(csvLines[0], resources); + RecordingLayout fallback = !recordingLayouts.isEmpty() ? recordingLayouts.get(0) : getDefaultLayout(); + + return recordingLayouts.stream() + .filter(it -> it.sameName(selectedLayout)) + .findFirst() + .orElse(fallback); } public static void updateCustomLayouts(@NonNull List recordingLayouts) { @@ -891,26 +871,28 @@ public class PreferencesUtils { } public static void addCustomLayout(@NonNull String layoutName) { - String newLayoutCsv = layoutName + CsvLayoutUtils.ITEM_SEPARATOR + getLayoutColumnsByDefault() + CsvLayoutUtils.ITEM_SEPARATOR + buildDefaultFields(); - String customLayoutCsv = getString(R.string.stats_custom_layouts_key, buildDefaultLayout()) + CsvLayoutUtils.LINE_SEPARATOR + newLayoutCsv; - setString(R.string.stats_custom_layouts_key, customLayoutCsv); + ArrayList currentLayouts = new ArrayList<>(PreferencesUtils.getAllCustomLayouts()); + + RecordingLayout newCustomLayout = RecordingLayout.fromDefault(layoutName); + + currentLayouts.add(newCustomLayout); + + setString(R.string.stats_custom_layouts_key, RecordingLayoutIO.toCSV(currentLayouts)); } - public static void setDefaultLayout(String layoutName) { + @Nullable + public static String getSelectedLayoutName() { + return getString(R.string.stats_custom_layout_selected_layout_key, null); + } + + public static void setSelectedLayoutName(String layoutName) { setString(R.string.stats_custom_layout_selected_layout_key, layoutName); } public static List getAllCustomLayouts() { - String csvCustomLayout = getString(R.string.stats_custom_layouts_key, buildDefaultLayout()); - String[] csvLines = csvCustomLayout.split(CsvLayoutUtils.LINE_SEPARATOR); + String csvCustomLayouts = getString(R.string.stats_custom_layouts_key, buildDefaultLayout()); - return Arrays.stream(csvLines).map(line -> RecordingLayoutIO.fromCsv(line, resources)).toList(); - } - - public static List getAllCustomLayoutNames() { - return getAllCustomLayouts().stream() - .map(RecordingLayout::getName) - .toList(); + return RecordingLayoutIO.fromCsv(csvCustomLayouts, resources); } public static void resetCustomLayoutPreferences() { diff --git a/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/CsvLayoutUtils.java b/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/CsvLayoutUtils.java index a47fb15dc..c6dc2a9b6 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/CsvLayoutUtils.java +++ b/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/CsvLayoutUtils.java @@ -5,13 +5,26 @@ import androidx.annotation.Nullable; import java.util.Arrays; import java.util.List; +//TODO refactor; rename ot CsvUtils public final class CsvLayoutUtils { + + @Deprecated //TODO private | package private public static final String LINE_SEPARATOR = "\n"; + @Deprecated //TODO private | package private public static final String ITEM_SEPARATOR = ";"; + @Deprecated //TODO private | package private public static final String PROPERTY_SEPARATOR = ","; private CsvLayoutUtils() { + } + @Nullable + public static List getCsvLines(String csv) { + if (csv == null) { + return null; + } + + return Arrays.stream(csv.split(CsvLayoutUtils.LINE_SEPARATOR)).toList(); } /** diff --git a/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayout.java b/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayout.java index 2cbaa2db5..144c84582 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayout.java +++ b/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayout.java @@ -17,9 +17,18 @@ public class RecordingLayout implements Parcelable { private int columnsPerRow; private final List dataFields = new ArrayList<>(); + public static RecordingLayout fromDefault(String newName) { + RecordingLayout defaultLayout = PreferencesUtils.getDefaultLayout(); + + RecordingLayout recordingLayout = new RecordingLayout(newName, defaultLayout.getColumnsPerRow()); + recordingLayout.addFields(defaultLayout.getFields()); + return recordingLayout; + } + + @Deprecated //TODO please set columnsPerRow explicitly public RecordingLayout(String name) { this.name = name; - this.columnsPerRow = PreferencesUtils.getLayoutColumnsByDefault(); + this.columnsPerRow = PreferencesUtils.getDefaultLayout().getColumnsPerRow(); } public RecordingLayout(String name, int columnsPerRow) { @@ -90,11 +99,11 @@ public class RecordingLayout implements Parcelable { } public boolean sameName(RecordingLayout recordingLayout) { - return this.name.equalsIgnoreCase(recordingLayout.getName()); + return sameName(recordingLayout.getName()); } public boolean sameName(String name) { - return this.name.equalsIgnoreCase(name); + return this.name.equals(name); } public String toCsv() { diff --git a/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayoutIO.java b/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayoutIO.java index 0c7752af1..7be731db9 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayoutIO.java +++ b/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayoutIO.java @@ -19,11 +19,17 @@ public class RecordingLayoutIO { private static final String YES_VALUE = "1"; private static final String NOT_VALUE = "0"; - public static RecordingLayout fromCsv(@NonNull String csvLine, @NonNull Resources resources) { + public static List fromCsv(@NonNull String csv, @NonNull Resources resources) { + return CsvLayoutUtils.getCsvLines(csv).stream() + .map(line -> RecordingLayoutIO.fromCsvLine(line, resources)) + .toList(); + } + + public static RecordingLayout fromCsvLine(@NonNull String csvLine, @NonNull Resources resources) { List csvParts = CsvLayoutUtils.getCsvLineParts(csvLine); if (csvParts == null) { Log.e(TAG, "Invalid CSV layout. It shouldn't happen: " + csvLine); - return new RecordingLayout(PreferencesUtils.getDefaultLayoutName()); + return PreferencesUtils.getDefaultLayout(); } RecordingLayout recordingLayout = new RecordingLayout(csvParts.get(0), Integer.parseInt(csvParts.get(1))); diff --git a/src/main/res/values/settings.xml b/src/main/res/values/settings.xml index e2194c760..91f08907a 100644 --- a/src/main/res/values/settings.xml +++ b/src/main/res/values/settings.xml @@ -336,9 +336,6 @@ statsCustomLayoutKey - - 2 - statsCustomLayoutFieldsKey statsCustomSelectedLayoutKey @@ -367,101 +364,6 @@ average_cadence power time - - - @string/stats_custom_layout_distance_key - 1,1,0 - - - @string/stats_custom_layout_total_time_key - 1,1,0 - - - @string/stats_custom_layout_speed_key - 1,1,0 - - - @string/stats_custom_layout_moving_time_key - 1,1,0 - - - @string/stats_custom_layout_average_speed_key - 1,0,0 - - - @string/stats_custom_layout_max_speed_key - 1,0,0 - - - @string/stats_custom_layout_average_moving_speed_key - 1,0,0 - - - @string/stats_custom_layout_altitude_key - 1,0,0 - - - @string/stats_custom_layout_gain_key - 1,0,0 - - - @string/stats_custom_layout_loss_key - 1,0,0 - - - @string/stats_custom_layout_pace_key - 0,0,0 - - - @string/stats_custom_layout_average_moving_pace_key - 0,0,0 - - - @string/stats_custom_layout_average_pace_key - 0,0,0 - - - @string/stats_custom_layout_average_segment_pace_key - 0,0,0 - - - @string/stats_custom_layout_elapsed_segment_time_key - 0,0,0 - - - @string/stats_custom_layout_fastest_pace_key - 0,0,0 - - - @string/stats_custom_layout_coordinates_key - 0,0,1 - - - @string/stats_custom_layout_heart_rate_key - 0,0,0 - - - @string/stats_custom_layout_cadence_key - 0,0,0 - - - @string/stats_custom_layout_power_key - 0,0,0 - - - @string/stats_custom_layout_clock_key - 0,0,0 - - - @string/stats_custom_layout_temperature_key - 0,0,0 - 0