forked from upstream-mirrors/OpenTracks
Refactor: RecordingLayout.
This commit is contained in:
+2
-3
@@ -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<RecordingLayout> 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<RecordingLayout> customRecordingLayout = PreferencesUtils.getAllCustomLayouts();
|
||||
|
||||
assertEquals(1, customRecordingLayout.size());
|
||||
|
||||
@@ -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<RecordingLayout> 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
|
||||
|
||||
+12
-13
@@ -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<DataField> 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<DataField> 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<DataField> 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<DataField> 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<DataField> 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;");
|
||||
}
|
||||
}
|
||||
@@ -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<String> 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<String> 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;
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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<DataField> 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<TypedArray> 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<TypedArray> 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<RecordingLayout> 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<RecordingLayout> 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<RecordingLayout> 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<RecordingLayout> 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<String> getAllCustomLayoutNames() {
|
||||
return getAllCustomLayouts().stream()
|
||||
.map(RecordingLayout::getName)
|
||||
.toList();
|
||||
return RecordingLayoutIO.fromCsv(csvCustomLayouts, resources);
|
||||
}
|
||||
|
||||
public static void resetCustomLayoutPreferences() {
|
||||
|
||||
@@ -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<String> getCsvLines(String csv) {
|
||||
if (csv == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return Arrays.stream(csv.split(CsvLayoutUtils.LINE_SEPARATOR)).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+12
-3
@@ -17,9 +17,18 @@ public class RecordingLayout implements Parcelable {
|
||||
private int columnsPerRow;
|
||||
private final List<DataField> 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() {
|
||||
|
||||
+8
-2
@@ -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<RecordingLayout> 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<String> 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)));
|
||||
|
||||
@@ -336,9 +336,6 @@
|
||||
<!-- Stats layout customization -->
|
||||
<string name="stats_custom_layout_key" translatable="false">statsCustomLayoutKey</string>
|
||||
|
||||
<!-- Stats layout customization: number of columns per row -->
|
||||
<integer name="stats_custom_layout_columns_default" translatable="false">2</integer>
|
||||
|
||||
<!-- Stats layout customization: key -->
|
||||
<string name="stats_custom_layouts_key" translatable="false">statsCustomLayoutFieldsKey</string>
|
||||
<string name="stats_custom_layout_selected_layout_key" translatable="false">statsCustomSelectedLayoutKey</string>
|
||||
@@ -367,101 +364,6 @@
|
||||
<string name="stats_custom_layout_average_cadence_key" translatable="false">average_cadence</string>
|
||||
<string name="stats_custom_layout_power_key" translatable="false">power</string>
|
||||
<string name="stats_custom_layout_clock_key" translatable="false">time</string>
|
||||
<!--
|
||||
Default dataFields for stats layout customization in a set of arrays.
|
||||
Every array has two items:
|
||||
- Key value for the dataField.
|
||||
- Comma separated flags for: visible, primary and span/wide for the dataField.
|
||||
TODO: refactor, so this data is not stored here, but in de.dennisguse.opentracks.viewmodels.Mapping. No need to have two places.
|
||||
-->
|
||||
<string-array name="stats_custom_layout_fields_default_value_0">
|
||||
<item>@string/stats_custom_layout_distance_key</item>
|
||||
<item>1,1,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_1">
|
||||
<item>@string/stats_custom_layout_total_time_key</item>
|
||||
<item>1,1,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_2">
|
||||
<item>@string/stats_custom_layout_speed_key</item>
|
||||
<item>1,1,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_3">
|
||||
<item>@string/stats_custom_layout_moving_time_key</item>
|
||||
<item>1,1,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_4">
|
||||
<item>@string/stats_custom_layout_average_speed_key</item>
|
||||
<item>1,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_5">
|
||||
<item>@string/stats_custom_layout_max_speed_key</item>
|
||||
<item>1,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_6">
|
||||
<item>@string/stats_custom_layout_average_moving_speed_key</item>
|
||||
<item>1,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_7">
|
||||
<item>@string/stats_custom_layout_altitude_key</item>
|
||||
<item>1,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_8">
|
||||
<item>@string/stats_custom_layout_gain_key</item>
|
||||
<item>1,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_9">
|
||||
<item>@string/stats_custom_layout_loss_key</item>
|
||||
<item>1,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_10">
|
||||
<item>@string/stats_custom_layout_pace_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_11">
|
||||
<item>@string/stats_custom_layout_average_moving_pace_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_12">
|
||||
<item>@string/stats_custom_layout_average_pace_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_13">
|
||||
<item>@string/stats_custom_layout_average_segment_pace_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_14">
|
||||
<item>@string/stats_custom_layout_elapsed_segment_time_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_15">
|
||||
<item>@string/stats_custom_layout_fastest_pace_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_16">
|
||||
<item>@string/stats_custom_layout_coordinates_key</item>
|
||||
<item>0,0,1</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_17">
|
||||
<item>@string/stats_custom_layout_heart_rate_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_18">
|
||||
<item>@string/stats_custom_layout_cadence_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_19">
|
||||
<item>@string/stats_custom_layout_power_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_20">
|
||||
<item>@string/stats_custom_layout_clock_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
<string-array name="stats_custom_layout_fields_default_value_21">
|
||||
<item>@string/stats_custom_layout_temperature_key</item>
|
||||
<item>0,0,0</item>
|
||||
</string-array>
|
||||
|
||||
<!-- Stats empty values -->
|
||||
<string name="stats_empty_value_integer" translatable="false">0</string>
|
||||
|
||||
Reference in New Issue
Block a user