Renamed Layout to RecordingLayout.

Part of #1118.
This commit is contained in:
Dennis Guse
2022-11-22 06:46:56 +01:00
parent d3cf2957cc
commit 4ea70b15e7
30 changed files with 311 additions and 280 deletions
@@ -7,5 +7,5 @@ Changes:
Bugfix: Bugfix:
- Speech announcements use MAY_DUCK (again) - Speech announcements use MAY_DUCK (again)
- ChartView shows markers (again) - ChartView shows markers (again)
- Fixed landscape layout of TrackListActivity - Fixed landscape recordingLayout of TrackListActivity
- Request legacy file API behavior (necessary for Android 10) - Request legacy file API behavior (necessary for Android 10)
@@ -17,8 +17,8 @@ import org.junit.runner.RunWith;
import java.util.List; import java.util.List;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
import de.dennisguse.opentracks.ui.customRecordingLayout.LayoutIO; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayoutIO;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class PreferencesOpenHelperTest { public class PreferencesOpenHelperTest {
@@ -39,10 +39,10 @@ public class PreferencesOpenHelperTest {
PreferencesOpenHelper.newInstance(1).check(); PreferencesOpenHelper.newInstance(1).check();
// then there should be one layout with old custom layout that has the new CSV value. // then there should be one layout with old custom layout that has the new CSV value.
List<Layout> layouts = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> recordingLayouts = PreferencesUtils.getAllCustomLayouts();
assertNotNull(layouts); assertNotNull(recordingLayouts);
assertEquals(layouts.size(), 1); assertEquals(recordingLayouts.size(), 1);
assertEquals(layouts.get(0).toCsv(), PreferencesUtils.getCustomLayout().toCsv()); assertEquals(recordingLayouts.get(0).toCsv(), PreferencesUtils.getCustomLayout().toCsv());
} }
@Test @Test
@@ -64,10 +64,10 @@ public class PreferencesOpenHelperTest {
+ PreferencesUtils.getLayoutColumnsByDefault() + ";distance,1,1,0;speed,1,1,0;"; + PreferencesUtils.getLayoutColumnsByDefault() + ";distance,1,1,0;speed,1,1,0;";
// then there should be one layout with old custom layout that has the new CSV value. // then there should be one layout with old custom layout that has the new CSV value.
List<Layout> layouts = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> recordingLayouts = PreferencesUtils.getAllCustomLayouts();
assertNotNull(layouts); assertNotNull(recordingLayouts);
assertEquals(layouts.size(), 1); assertEquals(recordingLayouts.size(), 1);
assertEquals(layouts.get(0).toCsv(), updatedOldCustomLayoutCsv); assertEquals(recordingLayouts.get(0).toCsv(), updatedOldCustomLayoutCsv);
} }
@Test @Test
@@ -88,10 +88,10 @@ public class PreferencesOpenHelperTest {
String updatedOldCustomLayoutCsv = "whatever;3;distance,1,1,0;speed,1,1,0;"; String updatedOldCustomLayoutCsv = "whatever;3;distance,1,1,0;speed,1,1,0;";
// then there should be one layout with old custom layout that has the new CSV value. // then there should be one layout with old custom layout that has the new CSV value.
List<Layout> layouts = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> recordingLayouts = PreferencesUtils.getAllCustomLayouts();
assertNotNull(layouts); assertNotNull(recordingLayouts);
assertEquals(layouts.size(), 1); assertEquals(recordingLayouts.size(), 1);
assertEquals(layouts.get(0).toCsv(), updatedOldCustomLayoutCsv); assertEquals(recordingLayouts.get(0).toCsv(), updatedOldCustomLayoutCsv);
} }
@Test @Test
@@ -110,10 +110,10 @@ public class PreferencesOpenHelperTest {
PreferencesOpenHelper.newInstance(1).check(); PreferencesOpenHelper.newInstance(1).check();
// then custom layout should be equals to default layout. // then custom layout should be equals to default layout.
Layout defaultLayout = LayoutIO.fromCsv(PreferencesUtils.buildDefaultLayout(), resources); RecordingLayout defaultRecordingLayout = RecordingLayoutIO.fromCsv(PreferencesUtils.buildDefaultLayout(), resources);
List<Layout> customLayout = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> customRecordingLayout = PreferencesUtils.getAllCustomLayouts();
assertEquals(customLayout.size(), 1); assertEquals(customRecordingLayout.size(), 1);
assertEquals(defaultLayout.toCsv(), customLayout.get(0).toCsv()); assertEquals(defaultRecordingLayout.toCsv(), customRecordingLayout.get(0).toCsv());
} }
} }
@@ -22,8 +22,8 @@ import java.util.List;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.ui.customRecordingLayout.DataField; import de.dennisguse.opentracks.ui.customRecordingLayout.DataField;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
import de.dennisguse.opentracks.ui.customRecordingLayout.LayoutIO; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayoutIO;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class PreferencesUtilsTest { public class PreferencesUtilsTest {
@@ -86,13 +86,13 @@ public class PreferencesUtilsTest {
editor.commit(); editor.commit();
// when // when
List<Layout> layouts = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> recordingLayouts = PreferencesUtils.getAllCustomLayouts();
// then // then
assertEquals(layouts.size(), 1); assertEquals(recordingLayouts.size(), 1);
assertTrue(layouts.get(0).getFields().size() > 0); assertTrue(recordingLayouts.get(0).getFields().size() > 0);
assertEquals(layouts.get(0).getName(), context.getString(R.string.stats_custom_layout_default_layout)); assertEquals(recordingLayouts.get(0).getName(), context.getString(R.string.stats_custom_layout_default_layout));
assertTrue(layouts.get(0).getFields().stream().anyMatch(DataField::isVisible)); assertTrue(recordingLayouts.get(0).getFields().stream().anyMatch(DataField::isVisible));
} }
@Test @Test
@@ -104,12 +104,12 @@ public class PreferencesUtilsTest {
editor.commit(); editor.commit();
// when // when
Layout layout = PreferencesUtils.getCustomLayout(); RecordingLayout recordingLayout = PreferencesUtils.getCustomLayout();
// then // then
assertTrue(layout.getFields().size() > 0); assertTrue(recordingLayout.getFields().size() > 0);
assertEquals(layout.getName(), context.getString(R.string.stats_custom_layout_default_layout)); assertEquals(recordingLayout.getName(), context.getString(R.string.stats_custom_layout_default_layout));
assertTrue(layout.getFields().stream().anyMatch(DataField::isVisible)); assertTrue(recordingLayout.getFields().stream().anyMatch(DataField::isVisible));
} }
@Test @Test
@@ -127,28 +127,28 @@ public class PreferencesUtilsTest {
editor.apply(); editor.apply();
// when // when
Layout layout = PreferencesUtils.getCustomLayout(); RecordingLayout recordingLayout = PreferencesUtils.getCustomLayout();
// then // then
assertEquals(layout.getFields().size(), 4); assertEquals(recordingLayout.getFields().size(), 4);
assertEquals(layout.getName(), "run"); assertEquals(recordingLayout.getName(), "run");
assertEquals(layout.getColumnsPerRow(), 2); assertEquals(recordingLayout.getColumnsPerRow(), 2);
assertEquals(layout.getFields().get(0).getKey(), context.getString(R.string.stats_custom_layout_moving_time_key)); assertEquals(recordingLayout.getFields().get(0).getKey(), context.getString(R.string.stats_custom_layout_moving_time_key));
assertTrue(layout.getFields().get(0).isVisible()); assertTrue(recordingLayout.getFields().get(0).isVisible());
assertTrue(layout.getFields().get(0).isPrimary()); assertTrue(recordingLayout.getFields().get(0).isPrimary());
assertEquals(layout.getFields().get(1).getKey(), context.getString(R.string.stats_custom_layout_distance_key)); assertEquals(recordingLayout.getFields().get(1).getKey(), context.getString(R.string.stats_custom_layout_distance_key));
assertTrue(layout.getFields().get(1).isVisible()); assertTrue(recordingLayout.getFields().get(1).isVisible());
assertFalse(layout.getFields().get(1).isPrimary()); assertFalse(recordingLayout.getFields().get(1).isPrimary());
assertEquals(layout.getFields().get(2).getKey(), context.getString(R.string.stats_custom_layout_average_moving_speed_key)); assertEquals(recordingLayout.getFields().get(2).getKey(), context.getString(R.string.stats_custom_layout_average_moving_speed_key));
assertFalse(layout.getFields().get(2).isVisible()); assertFalse(recordingLayout.getFields().get(2).isVisible());
assertTrue(layout.getFields().get(2).isPrimary()); assertTrue(recordingLayout.getFields().get(2).isPrimary());
assertEquals(layout.getFields().get(3).getKey(), context.getString(R.string.stats_custom_layout_speed_key)); assertEquals(recordingLayout.getFields().get(3).getKey(), context.getString(R.string.stats_custom_layout_speed_key));
assertFalse(layout.getFields().get(3).isVisible()); assertFalse(recordingLayout.getFields().get(3).isVisible());
assertFalse(layout.getFields().get(3).isPrimary()); assertFalse(recordingLayout.getFields().get(3).isPrimary());
} }
@Test @Test
@@ -166,44 +166,44 @@ public class PreferencesUtilsTest {
editor.apply(); editor.apply();
// when // when
Layout layout = PreferencesUtils.getCustomLayout(); RecordingLayout recordingLayout = PreferencesUtils.getCustomLayout();
// then // then
assertEquals(layout.getFields().size(), 4); assertEquals(recordingLayout.getFields().size(), 4);
assertEquals(layout.getName(), "walking"); assertEquals(recordingLayout.getName(), "walking");
assertEquals(layout.getColumnsPerRow(), 2); assertEquals(recordingLayout.getColumnsPerRow(), 2);
assertEquals(layout.getFields().get(0).getKey(), context.getString(R.string.stats_custom_layout_moving_time_key)); assertEquals(recordingLayout.getFields().get(0).getKey(), context.getString(R.string.stats_custom_layout_moving_time_key));
assertTrue(layout.getFields().get(0).isVisible()); assertTrue(recordingLayout.getFields().get(0).isVisible());
assertTrue(layout.getFields().get(0).isPrimary()); assertTrue(recordingLayout.getFields().get(0).isPrimary());
assertEquals(layout.getFields().get(1).getKey(), context.getString(R.string.stats_custom_layout_distance_key)); assertEquals(recordingLayout.getFields().get(1).getKey(), context.getString(R.string.stats_custom_layout_distance_key));
assertTrue(layout.getFields().get(1).isVisible()); assertTrue(recordingLayout.getFields().get(1).isVisible());
assertFalse(layout.getFields().get(1).isPrimary()); assertFalse(recordingLayout.getFields().get(1).isPrimary());
assertEquals(layout.getFields().get(2).getKey(), context.getString(R.string.stats_custom_layout_coordinates_key)); assertEquals(recordingLayout.getFields().get(2).getKey(), context.getString(R.string.stats_custom_layout_coordinates_key));
assertFalse(layout.getFields().get(2).isVisible()); assertFalse(recordingLayout.getFields().get(2).isVisible());
assertTrue(layout.getFields().get(2).isPrimary()); assertTrue(recordingLayout.getFields().get(2).isPrimary());
assertTrue(layout.getFields().get(2).isWide()); assertTrue(recordingLayout.getFields().get(2).isWide());
assertEquals(layout.getFields().get(3).getKey(), context.getString(R.string.stats_custom_layout_speed_key)); assertEquals(recordingLayout.getFields().get(3).getKey(), context.getString(R.string.stats_custom_layout_speed_key));
assertFalse(layout.getFields().get(3).isVisible()); assertFalse(recordingLayout.getFields().get(3).isVisible());
assertFalse(layout.getFields().get(3).isPrimary()); assertFalse(recordingLayout.getFields().get(3).isPrimary());
} }
@Test @Test
public void testSetCustomLayout() { public void testSetCustomLayout() {
// given // given
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
Layout layoutSrc = new Layout("road cycling"); RecordingLayout recordingLayoutSrc = new RecordingLayout("road cycling");
layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_moving_time_key), true, true, false)); recordingLayoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_moving_time_key), true, true, false));
layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_distance_key), true, false, false)); recordingLayoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_distance_key), true, false, false));
layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_average_moving_speed_key), false, true, false)); recordingLayoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_average_moving_speed_key), false, true, false));
layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_speed_key), false, false, false)); recordingLayoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_speed_key), false, false, false));
// when // when
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(context.getString(R.string.stats_custom_layouts_key), layoutSrc.toCsv()); editor.putString(context.getString(R.string.stats_custom_layouts_key), recordingLayoutSrc.toCsv());
editor.commit(); editor.commit();
// then // then
@@ -216,13 +216,13 @@ public class PreferencesUtilsTest {
+ context.getString(R.string.stats_custom_layout_average_moving_speed_key) + ",0,1,0;" + context.getString(R.string.stats_custom_layout_average_moving_speed_key) + ",0,1,0;"
+ context.getString(R.string.stats_custom_layout_speed_key) + ",0,0,0;"); + context.getString(R.string.stats_custom_layout_speed_key) + ",0,0,0;");
Layout layoutDst = PreferencesUtils.getCustomLayout(); RecordingLayout recordingLayoutDst = PreferencesUtils.getCustomLayout();
assertEquals(layoutSrc.getName(), layoutDst.getName()); assertEquals(recordingLayoutSrc.getName(), recordingLayoutDst.getName());
assertEquals(layoutSrc.getFields().size(), layoutDst.getFields().size()); assertEquals(recordingLayoutSrc.getFields().size(), recordingLayoutDst.getFields().size());
for (int i = 0; i < layoutSrc.getFields().size(); i++) { for (int i = 0; i < recordingLayoutSrc.getFields().size(); i++) {
assertEquals(layoutSrc.getFields().get(i).getKey(), layoutDst.getFields().get(i).getKey()); assertEquals(recordingLayoutSrc.getFields().get(i).getKey(), recordingLayoutDst.getFields().get(i).getKey());
assertEquals(layoutSrc.getFields().get(i).isVisible(), layoutDst.getFields().get(i).isVisible()); assertEquals(recordingLayoutSrc.getFields().get(i).isVisible(), recordingLayoutDst.getFields().get(i).isVisible());
assertEquals(layoutSrc.getFields().get(i).isPrimary(), layoutDst.getFields().get(i).isPrimary()); assertEquals(recordingLayoutSrc.getFields().get(i).isPrimary(), recordingLayoutDst.getFields().get(i).isPrimary());
} }
} }
@@ -248,7 +248,7 @@ public class PreferencesUtilsTest {
editor.putString(context.getString(R.string.stats_custom_layouts_key), cyclingProfile + "\n" + runningProfile); editor.putString(context.getString(R.string.stats_custom_layouts_key), cyclingProfile + "\n" + runningProfile);
editor.apply(); editor.apply();
List<Layout> layoutsBefore = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> layoutsBefore = PreferencesUtils.getAllCustomLayouts();
// when cyling profile is updated // when cyling profile is updated
String cyclingProfileUpdated = "cycling;2;" String cyclingProfileUpdated = "cycling;2;"
@@ -257,14 +257,14 @@ public class PreferencesUtilsTest {
+ context.getString(R.string.stats_custom_layout_average_moving_speed_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;"; + context.getString(R.string.stats_custom_layout_speed_key) + ",0,0;";
List<Layout> layoutsToBeUpdated = new ArrayList<>(); List<RecordingLayout> layoutsToBeUpdated = new ArrayList<>();
layoutsToBeUpdated.add(LayoutIO.fromCsv(cyclingProfileUpdated, resources)); layoutsToBeUpdated.add(RecordingLayoutIO.fromCsv(cyclingProfileUpdated, resources));
layoutsToBeUpdated.add(LayoutIO.fromCsv(runningProfile, resources)); layoutsToBeUpdated.add(RecordingLayoutIO.fromCsv(runningProfile, resources));
PreferencesUtils.updateCustomLayouts(layoutsToBeUpdated); PreferencesUtils.updateCustomLayouts(layoutsToBeUpdated);
// then only updated profile is modified in the custom layouts // then only updated profile is modified in the custom layouts
List<Layout> layoutsAfter = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> layoutsAfter = PreferencesUtils.getAllCustomLayouts();
assertEquals(layoutsBefore.size(), 2); assertEquals(layoutsBefore.size(), 2);
assertEquals(layoutsAfter.size(), 2); assertEquals(layoutsAfter.size(), 2);
@@ -295,7 +295,7 @@ public class PreferencesUtilsTest {
editor.putString(context.getString(R.string.stats_custom_layouts_key), cyclingProfile + "\n" + runningProfile); editor.putString(context.getString(R.string.stats_custom_layouts_key), cyclingProfile + "\n" + runningProfile);
editor.apply(); editor.apply();
List<Layout> layoutsBefore = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> layoutsBefore = PreferencesUtils.getAllCustomLayouts();
// when cyling profile is updated // when cyling profile is updated
String cyclingProfileUpdated = "cycling;2;" String cyclingProfileUpdated = "cycling;2;"
@@ -303,11 +303,11 @@ public class PreferencesUtilsTest {
+ context.getString(R.string.stats_custom_layout_distance_key) + ",0,0;" + 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_average_moving_speed_key) + ",0,0;"
+ context.getString(R.string.stats_custom_layout_speed_key) + ",0,0;"; + context.getString(R.string.stats_custom_layout_speed_key) + ",0,0;";
Layout layoutToBeUpdated = LayoutIO.fromCsv(cyclingProfileUpdated, resources); RecordingLayout recordingLayoutToBeUpdated = RecordingLayoutIO.fromCsv(cyclingProfileUpdated, resources);
PreferencesUtils.updateCustomLayout(layoutToBeUpdated); PreferencesUtils.updateCustomLayout(recordingLayoutToBeUpdated);
// then only updated profile is modified in the custom layouts // then only updated profile is modified in the custom layouts
List<Layout> layoutsAfter = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> layoutsAfter = PreferencesUtils.getAllCustomLayouts();
assertEquals(layoutsBefore.size(), 2); assertEquals(layoutsBefore.size(), 2);
assertEquals(layoutsAfter.size(), 2); assertEquals(layoutsAfter.size(), 2);
@@ -338,9 +338,9 @@ public class PreferencesUtilsTest {
editor.apply(); editor.apply();
// when it gets the custom layout // when it gets the custom layout
Layout layout = PreferencesUtils.getCustomLayout(); RecordingLayout recordingLayout = PreferencesUtils.getCustomLayout();
// then the first one was returned // then the first one was returned
assertEquals(layout.getName(), "cycling"); assertEquals(recordingLayout.getName(), "cycling");
} }
} }
@@ -10,7 +10,7 @@ import org.junit.runner.RunWith;
import java.util.List; import java.util.List;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class CsvLayoutUtilsTest extends TestCase { public class CsvRecordingLayoutUtilsTest extends TestCase {
@Test @Test
public void testGetCsvLineParts() { public void testGetCsvLineParts() {
@@ -30,7 +30,7 @@ import de.dennisguse.opentracks.settings.PreferencesUtils;
@LargeTest @LargeTest
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class EspressoCustomLayoutTest { public class EspressoCustomRecordingLayoutTest {
@Rule @Rule
public ActivityScenarioRule<TrackListActivity> mActivityTestRule = new ActivityScenarioRule<>(TrackListActivity.class); public ActivityScenarioRule<TrackListActivity> mActivityTestRule = new ActivityScenarioRule<>(TrackListActivity.class);
@@ -45,9 +45,9 @@ public class EspressoCustomLayoutTest {
trackControllerRecordButton.perform(click()); trackControllerRecordButton.perform(click());
// Get custom layout preferences and check all data fields are showed. // Get custom layout preferences and check all data fields are showed.
Layout layout = PreferencesUtils.getCustomLayout(); RecordingLayout recordingLayout = PreferencesUtils.getCustomLayout();
onView(withId(R.id.recycler_view)).check(new RecyclerViewItemCountAssertion((int) layout.getFields().stream().filter(DataField::isVisible).count())); onView(withId(R.id.recycler_view)).check(new RecyclerViewItemCountAssertion((int) recordingLayout.getFields().stream().filter(DataField::isVisible).count()));
// stop recording // stop recording
ViewInteraction trackControllerStopButton = onView(withId(R.id.track_recording_fab_action)); ViewInteraction trackControllerStopButton = onView(withId(R.id.track_recording_fab_action));
@@ -17,7 +17,7 @@ import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.PreferencesUtils;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class LayoutTest extends TestCase { public class RecordingLayoutTest extends TestCase {
private final Context context = ApplicationProvider.getApplicationContext(); private final Context context = ApplicationProvider.getApplicationContext();
private final Resources resources = ApplicationProvider.getApplicationContext().getResources(); private final Resources resources = ApplicationProvider.getApplicationContext().getResources();
@@ -28,12 +28,12 @@ public class LayoutTest 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;"; 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 // when create a layout from CSV line
Layout layout = LayoutIO.fromCsv(csv, resources); RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv, resources);
List<DataField> dataFieldList = layout.getFields(); List<DataField> dataFieldList = recordingLayout.getFields();
// then layout and data fields are built correctly // then layout and data fields are built correctly
assertEquals(layout.getName(), "running"); assertEquals(recordingLayout.getName(), "running");
assertEquals(layout.getColumnsPerRow(), 2); assertEquals(recordingLayout.getColumnsPerRow(), 2);
assertEquals(dataFieldList.size(), 4); assertEquals(dataFieldList.size(), 4);
assertEquals(dataFieldList.get(0).getKey(), context.getString(R.string.stats_custom_layout_speed_key)); assertEquals(dataFieldList.get(0).getKey(), context.getString(R.string.stats_custom_layout_speed_key));
assertEquals(dataFieldList.get(1).getKey(), context.getString(R.string.stats_custom_layout_distance_key)); assertEquals(dataFieldList.get(1).getKey(), context.getString(R.string.stats_custom_layout_distance_key));
@@ -60,13 +60,13 @@ public class LayoutTest extends TestCase {
String csv1 = "Layout Name;speed,1,1;distance,0,0;"; String csv1 = "Layout Name;speed,1,1;distance,0,0;";
// when create a layout from CSV line // when create a layout from CSV line
Layout layout = LayoutIO.fromCsv(csv1, resources); RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv1, resources);
List<DataField> dataFieldList = layout.getFields(); List<DataField> dataFieldList = recordingLayout.getFields();
// then layout and data fields are built correctly // then layout and data fields are built correctly
assertEquals(layout.getName(), PreferencesUtils.getDefaultLayoutName()); assertEquals(recordingLayout.getName(), PreferencesUtils.getDefaultLayoutName());
assertEquals(layout.getColumnsPerRow(), PreferencesUtils.getLayoutColumnsByDefault()); assertEquals(recordingLayout.getColumnsPerRow(), PreferencesUtils.getLayoutColumnsByDefault());
assertEquals(layout.getFields().size(), 0); assertEquals(recordingLayout.getFields().size(), 0);
} }
@Test @Test
@@ -75,13 +75,13 @@ public class LayoutTest extends TestCase {
String csv1 = "Layout Name;2;"; String csv1 = "Layout Name;2;";
// when create a layout from CSV line // when create a layout from CSV line
Layout layout = LayoutIO.fromCsv(csv1, resources); RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv1, resources);
List<DataField> dataFieldList = layout.getFields(); List<DataField> dataFieldList = recordingLayout.getFields();
// then layout and data fields are built correctly // then layout and data fields are built correctly
assertEquals(layout.getName(), PreferencesUtils.getDefaultLayoutName()); assertEquals(recordingLayout.getName(), PreferencesUtils.getDefaultLayoutName());
assertEquals(layout.getColumnsPerRow(), PreferencesUtils.getLayoutColumnsByDefault()); assertEquals(recordingLayout.getColumnsPerRow(), PreferencesUtils.getLayoutColumnsByDefault());
assertEquals(layout.getFields().size(), 0); assertEquals(recordingLayout.getFields().size(), 0);
} }
@Test @Test
@@ -90,13 +90,13 @@ public class LayoutTest extends TestCase {
String csv1 = "Layout Name;2;speed,distance,total time;"; String csv1 = "Layout Name;2;speed,distance,total time;";
// when create a layout from CSV line // when create a layout from CSV line
Layout layout = LayoutIO.fromCsv(csv1, resources); RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv1, resources);
List<DataField> dataFieldList = layout.getFields(); List<DataField> dataFieldList = recordingLayout.getFields();
// then layout and data fields are built correctly // then layout and data fields are built correctly
assertEquals(layout.getName(), "Layout Name"); assertEquals(recordingLayout.getName(), "Layout Name");
assertEquals(layout.getColumnsPerRow(), 2); assertEquals(recordingLayout.getColumnsPerRow(), 2);
assertEquals(layout.getFields().size(), 0); assertEquals(recordingLayout.getFields().size(), 0);
} }
@Test @Test
@@ -105,27 +105,27 @@ public class LayoutTest extends TestCase {
String csv1 = "Layout Name;2;speed,1,0;distance;"; String csv1 = "Layout Name;2;speed,1,0;distance;";
// when create a layout from CSV line // when create a layout from CSV line
Layout layout = LayoutIO.fromCsv(csv1, resources); RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(csv1, resources);
List<DataField> dataFieldList = layout.getFields(); List<DataField> dataFieldList = recordingLayout.getFields();
// then layout and data fields are built correctly // then layout and data fields are built correctly
assertEquals(layout.getName(), "Layout Name"); assertEquals(recordingLayout.getName(), "Layout Name");
assertEquals(layout.getColumnsPerRow(), 2); assertEquals(recordingLayout.getColumnsPerRow(), 2);
assertEquals(layout.getFields().size(), 1); assertEquals(recordingLayout.getFields().size(), 1);
} }
@Test @Test
public void testToCsv() { public void testToCsv() {
// given a layout's object // given a layout's object
Layout layout = new Layout("Test Layout", 2); RecordingLayout recordingLayout = new RecordingLayout("Test Layout", 2);
layout.addField(new DataField("key1", false, false, false)); recordingLayout.addField(new DataField("key1", false, false, false));
layout.addField(new DataField("key2", false, true, false)); recordingLayout.addField(new DataField("key2", false, true, false));
layout.addField(new DataField("key3", true, false, false)); recordingLayout.addField(new DataField("key3", true, false, false));
layout.addField(new DataField("key4", true, true, false)); recordingLayout.addField(new DataField("key4", true, true, false));
layout.addField(new DataField("key5", true, true, true)); recordingLayout.addField(new DataField("key5", true, true, true));
// when converts it to CSV // when converts it to CSV
String csv = layout.toCsv(); String csv = recordingLayout.toCsv();
// then csv is well built // then csv is well built
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;"); 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;");
@@ -134,15 +134,15 @@ public class LayoutTest extends TestCase {
@Test @Test
public void testToCsv_columnsByDefault() { public void testToCsv_columnsByDefault() {
// given a layout's object // given a layout's object
Layout layout = new Layout("Test Layout"); RecordingLayout recordingLayout = new RecordingLayout("Test Layout");
layout.addField(new DataField("key1", false, false, false)); recordingLayout.addField(new DataField("key1", false, false, false));
layout.addField(new DataField("key2", false, true, false)); recordingLayout.addField(new DataField("key2", false, true, false));
layout.addField(new DataField("key3", true, false, false)); recordingLayout.addField(new DataField("key3", true, false, false));
layout.addField(new DataField("key4", true, true, false)); recordingLayout.addField(new DataField("key4", true, true, false));
layout.addField(new DataField("key5", true, true, true)); recordingLayout.addField(new DataField("key5", true, true, true));
// when converts it to CSV // when converts it to CSV
String csv = layout.toCsv(); String csv = recordingLayout.toCsv();
// then csv is well built // 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;" + PreferencesUtils.getLayoutColumnsByDefault() + ";key1,0,0,0;key2,0,1,0;key3,1,0,0;key4,1,1,0;key5,1,1,1;");
@@ -12,7 +12,7 @@ import org.junit.runner.RunWith;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.ui.customRecordingLayout.DataField; import de.dennisguse.opentracks.ui.customRecordingLayout.DataField;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class StatisticsUtilsTest extends TestCase { public class StatisticsUtilsTest extends TestCase {
@@ -44,16 +44,16 @@ public class StatisticsUtilsTest extends TestCase {
@Test @Test
public void testFilterVisible() { public void testFilterVisible() {
// given // given
Layout layout = new Layout("profile"); RecordingLayout recordingLayout = new RecordingLayout("profile");
layout.addField(new DataField("key1", true, true, false)); recordingLayout.addField(new DataField("key1", true, true, false));
layout.addField(new DataField("key2", false, true, false)); recordingLayout.addField(new DataField("key2", false, true, false));
layout.addField(new DataField("key3", true, true, false)); recordingLayout.addField(new DataField("key3", true, true, false));
layout.addField(new DataField("key4", false, true, false)); recordingLayout.addField(new DataField("key4", false, true, false));
layout.addField(new DataField("key5", true, true, false)); recordingLayout.addField(new DataField("key5", true, true, false));
// when // when
Layout resultTrue = StatisticsUtils.filterVisible(layout, true); RecordingLayout resultTrue = StatisticsUtils.filterVisible(recordingLayout, true);
Layout resultFalse = StatisticsUtils.filterVisible(layout, false); RecordingLayout resultFalse = StatisticsUtils.filterVisible(recordingLayout, false);
// then // then
assertEquals(resultTrue.getFields().size(), 3); assertEquals(resultTrue.getFields().size(), 3);
@@ -26,7 +26,7 @@ import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.settings.UnitSystem; import de.dennisguse.opentracks.settings.UnitSystem;
import de.dennisguse.opentracks.ui.customRecordingLayout.DataField; import de.dennisguse.opentracks.ui.customRecordingLayout.DataField;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
import de.dennisguse.opentracks.viewmodels.Mapping; import de.dennisguse.opentracks.viewmodels.Mapping;
import de.dennisguse.opentracks.viewmodels.StatisticViewHolder; import de.dennisguse.opentracks.viewmodels.StatisticViewHolder;
@@ -50,7 +50,7 @@ public class StatisticsRecordingFragment extends Fragment {
private final List<StatisticViewHolder<?>> viewHolders = new LinkedList<>(); private final List<StatisticViewHolder<?>> viewHolders = new LinkedList<>();
private Layout layout; private RecordingLayout recordingLayout;
private StatisticsRecordingBinding viewBinding; private StatisticsRecordingBinding viewBinding;
@@ -116,13 +116,13 @@ public class StatisticsRecordingFragment extends Fragment {
trackRecordingServiceConnection = null; trackRecordingServiceConnection = null;
} }
private void onLayoutChanged(@NonNull Layout newLayout) { private void onLayoutChanged(@NonNull RecordingLayout newRecordingLayout) {
if (newLayout.equals(layout)) { if (newRecordingLayout.equals(recordingLayout)) {
return; return;
} }
layout = newLayout; recordingLayout = newRecordingLayout;
viewBinding.statsLayout.setColumnCount(layout.getColumnsPerRow()); viewBinding.statsLayout.setColumnCount(recordingLayout.getColumnsPerRow());
viewBinding.statsLayout.removeAllViews(); //Let's start from scratch viewBinding.statsLayout.removeAllViews(); //Let's start from scratch
viewHolders.clear(); viewHolders.clear();
@@ -131,20 +131,20 @@ public class StatisticsRecordingFragment extends Fragment {
int rowIndex = 0; int rowIndex = 0;
int columnIndex = 0; int columnIndex = 0;
for (int i = 0; i < layout.getFields().size(); i++) { for (int i = 0; i < recordingLayout.getFields().size(); i++) {
DataField dataField = layout.getFields().get(i); DataField dataField = recordingLayout.getFields().get(i);
GridLayout.LayoutParams param = new GridLayout.LayoutParams(); GridLayout.LayoutParams param = new GridLayout.LayoutParams();
param.setGravity(Gravity.FILL_HORIZONTAL); param.setGravity(Gravity.FILL_HORIZONTAL);
param.width = 0; param.width = 0;
if (dataField.isWide()) { if (dataField.isWide()) {
rowIndex++; rowIndex++;
param.columnSpec = GridLayout.spec(0, layout.getColumnsPerRow(), 1); param.columnSpec = GridLayout.spec(0, recordingLayout.getColumnsPerRow(), 1);
param.rowSpec = GridLayout.spec(rowIndex, 1, 1); param.rowSpec = GridLayout.spec(rowIndex, 1, 1);
columnIndex = 0; columnIndex = 0;
rowIndex++; rowIndex++;
} else { } else {
if (columnIndex >= layout.getColumnsPerRow()) { if (columnIndex >= recordingLayout.getColumnsPerRow()) {
columnIndex = 0; columnIndex = 0;
rowIndex++; rowIndex++;
} }
@@ -46,8 +46,8 @@ import de.dennisguse.opentracks.data.models.Speed;
import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.io.file.TrackFilenameGenerator; import de.dennisguse.opentracks.io.file.TrackFilenameGenerator;
import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils; import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
import de.dennisguse.opentracks.ui.customRecordingLayout.LayoutIO; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayoutIO;
import de.dennisguse.opentracks.util.IntentDashboardUtils; import de.dennisguse.opentracks.util.IntentDashboardUtils;
import de.dennisguse.opentracks.util.TrackIconUtils; import de.dennisguse.opentracks.util.TrackIconUtils;
@@ -754,37 +754,35 @@ public class PreferencesUtils {
/** /**
* @return custom layout selected or the first one if any has been selected or the one selected is not exists anymore. * @return custom layout selected or the first one if any has been selected or the one selected is not exists anymore.
*/ */
@Deprecated //TODO Move parsing to LayoutIO public static RecordingLayout getCustomLayout() {
public static Layout getCustomLayout() {
String csvCustomLayouts = getString(R.string.stats_custom_layouts_key, buildDefaultLayout()); String csvCustomLayouts = getString(R.string.stats_custom_layouts_key, buildDefaultLayout());
String[] csvLines = csvCustomLayouts.split(CsvLayoutUtils.LINE_SEPARATOR); String[] csvLines = csvCustomLayouts.split(CsvLayoutUtils.LINE_SEPARATOR);
String layoutSelected = getString(R.string.stats_custom_layout_selected_layout_key, null); String layoutSelected = getString(R.string.stats_custom_layout_selected_layout_key, null);
if (layoutSelected == null) { if (layoutSelected == null) {
return LayoutIO.fromCsv(csvLines[0], resources); return RecordingLayoutIO.fromCsv(csvLines[0], resources);
} }
for (String line : csvLines) { for (String line : csvLines) {
Layout layout = LayoutIO.fromCsv(line, resources); RecordingLayout recordingLayout = RecordingLayoutIO.fromCsv(line, resources);
if (layout.sameName(layoutSelected)) { if (recordingLayout.sameName(layoutSelected)) {
return layout; return recordingLayout;
} }
} }
return LayoutIO.fromCsv(csvLines[0], resources); return RecordingLayoutIO.fromCsv(csvLines[0], resources);
} }
//TODO Move string generation to LayoutIO public static void updateCustomLayouts(@NonNull List<RecordingLayout> recordingLayouts) {
public static void updateCustomLayouts(@NonNull List<Layout> layouts) { setString(R.string.stats_custom_layouts_key, RecordingLayoutIO.toCSV(recordingLayouts));
setString(R.string.stats_custom_layouts_key, layouts.stream().map(Layout::toCsv).collect(Collectors.joining(CsvLayoutUtils.LINE_SEPARATOR)));
} }
public static void updateCustomLayout(@NonNull Layout layout) { public static void updateCustomLayout(@NonNull RecordingLayout recordingLayout) {
List<Layout> preferenceLayouts = PreferencesUtils.getAllCustomLayouts(); List<RecordingLayout> preferenceRecordingLayouts = PreferencesUtils.getAllCustomLayouts();
Optional<Layout> layoutToBeUpdated = preferenceLayouts.stream().filter(l -> l.sameName(layout)).findFirst(); Optional<RecordingLayout> layoutToBeUpdated = preferenceRecordingLayouts.stream().filter(l -> l.sameName(recordingLayout)).findFirst();
if (layoutToBeUpdated.isPresent()) { if (layoutToBeUpdated.isPresent()) {
layoutToBeUpdated.get().replaceAllFields(layout.getFields()); layoutToBeUpdated.get().replaceAllFields(recordingLayout.getFields());
layoutToBeUpdated.get().setColumnsPerRow(layout.getColumnsPerRow()); layoutToBeUpdated.get().setColumnsPerRow(recordingLayout.getColumnsPerRow());
PreferencesUtils.updateCustomLayouts(preferenceLayouts); PreferencesUtils.updateCustomLayouts(preferenceRecordingLayouts);
} }
} }
@@ -798,19 +796,19 @@ public class PreferencesUtils {
setString(R.string.stats_custom_layout_selected_layout_key, layoutName); setString(R.string.stats_custom_layout_selected_layout_key, layoutName);
} }
public static List<Layout> getAllCustomLayouts() { public static List<RecordingLayout> getAllCustomLayouts() {
List<Layout> layouts = new ArrayList<>(); List<RecordingLayout> recordingLayouts = new ArrayList<>();
String csvCustomLayout = getString(R.string.stats_custom_layouts_key, buildDefaultLayout()); String csvCustomLayout = getString(R.string.stats_custom_layouts_key, buildDefaultLayout());
String[] csvLines = csvCustomLayout.split(CsvLayoutUtils.LINE_SEPARATOR); String[] csvLines = csvCustomLayout.split(CsvLayoutUtils.LINE_SEPARATOR);
for (String line : csvLines) { for (String line : csvLines) {
layouts.add(LayoutIO.fromCsv(line, resources)); recordingLayouts.add(RecordingLayoutIO.fromCsv(line, resources));
} }
return layouts; return recordingLayouts;
} }
public static List<String> getAllCustomLayoutNames() { public static List<String> getAllCustomLayoutNames() {
return getAllCustomLayouts().stream().map(Layout::getName).collect(Collectors.toList()); return getAllCustomLayouts().stream().map(RecordingLayout::getName).collect(Collectors.toList());
} }
public static void resetCustomLayoutPreferences() { public static void resetCustomLayoutPreferences() {
@@ -17,7 +17,7 @@ import de.dennisguse.opentracks.AbstractActivity;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.databinding.ActivitySettingsCustomLayoutBinding; import de.dennisguse.opentracks.databinding.ActivitySettingsCustomLayoutBinding;
import de.dennisguse.opentracks.ui.customRecordingLayout.DataField; import de.dennisguse.opentracks.ui.customRecordingLayout.DataField;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
import de.dennisguse.opentracks.ui.customRecordingLayout.SettingsCustomLayoutEditAdapter; import de.dennisguse.opentracks.ui.customRecordingLayout.SettingsCustomLayoutEditAdapter;
import de.dennisguse.opentracks.ui.util.ArrayAdapterFilterDisabled; import de.dennisguse.opentracks.ui.util.ArrayAdapterFilterDisabled;
import de.dennisguse.opentracks.util.StatisticsUtils; import de.dennisguse.opentracks.util.StatisticsUtils;
@@ -30,8 +30,8 @@ public class SettingsCustomLayoutEditActivity extends AbstractActivity implement
private SettingsCustomLayoutEditAdapter adapterFieldsVisible; private SettingsCustomLayoutEditAdapter adapterFieldsVisible;
private SettingsCustomLayoutEditAdapter adapterFieldsHidden; private SettingsCustomLayoutEditAdapter adapterFieldsHidden;
private String profile; private String profile;
private Layout layoutFieldsVisible; private RecordingLayout recordingLayoutFieldsVisible;
private Layout layoutFieldsHidden; private RecordingLayout recordingLayoutFieldsHidden;
private int numColumns; private int numColumns;
@Override @Override
@@ -39,12 +39,12 @@ public class SettingsCustomLayoutEditActivity extends AbstractActivity implement
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
// Recycler view with visible stats. // Recycler view with visible stats.
Layout layout = getIntent().getParcelableExtra(EXTRA_LAYOUT); RecordingLayout recordingLayout = getIntent().getParcelableExtra(EXTRA_LAYOUT);
profile = layout.getName(); profile = recordingLayout.getName();
layoutFieldsVisible = StatisticsUtils.filterVisible(layout, true); recordingLayoutFieldsVisible = StatisticsUtils.filterVisible(recordingLayout, true);
adapterFieldsVisible = new SettingsCustomLayoutEditAdapter(this, this, layoutFieldsVisible); adapterFieldsVisible = new SettingsCustomLayoutEditAdapter(this, this, recordingLayoutFieldsVisible);
numColumns = layout.getColumnsPerRow(); numColumns = recordingLayout.getColumnsPerRow();
RecyclerView recyclerViewVisible = viewBinding.recyclerViewVisible; RecyclerView recyclerViewVisible = viewBinding.recyclerViewVisible;
gridLayoutManager = new GridLayoutManager(this, numColumns); gridLayoutManager = new GridLayoutManager(this, numColumns);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@@ -65,7 +65,7 @@ public class SettingsCustomLayoutEditActivity extends AbstractActivity implement
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
int fromPosition = viewHolder.getAdapterPosition(); int fromPosition = viewHolder.getAdapterPosition();
int toPosition = target.getAdapterPosition(); int toPosition = target.getAdapterPosition();
layoutFieldsVisible = adapterFieldsVisible.move(fromPosition, toPosition); recordingLayoutFieldsVisible = adapterFieldsVisible.move(fromPosition, toPosition);
return true; return true;
} }
@@ -90,8 +90,8 @@ public class SettingsCustomLayoutEditActivity extends AbstractActivity implement
viewBinding.rowsOptions.setText(rowsOptionAdapter.getItem(numColumns - 1).toString(), false); viewBinding.rowsOptions.setText(rowsOptionAdapter.getItem(numColumns - 1).toString(), false);
// Recycler view with not visible stats. // Recycler view with not visible stats.
layoutFieldsHidden = StatisticsUtils.filterVisible(layout, false); recordingLayoutFieldsHidden = StatisticsUtils.filterVisible(recordingLayout, false);
adapterFieldsHidden = new SettingsCustomLayoutEditAdapter(this, this, layoutFieldsHidden); adapterFieldsHidden = new SettingsCustomLayoutEditAdapter(this, this, recordingLayoutFieldsHidden);
RecyclerView recyclerViewNotVisible = viewBinding.recyclerViewNotVisible; RecyclerView recyclerViewNotVisible = viewBinding.recyclerViewNotVisible;
recyclerViewNotVisible.setLayoutManager(new LinearLayoutManager(this)); recyclerViewNotVisible.setLayoutManager(new LinearLayoutManager(this));
recyclerViewNotVisible.setAdapter(adapterFieldsHidden); recyclerViewNotVisible.setAdapter(adapterFieldsHidden);
@@ -103,18 +103,18 @@ public class SettingsCustomLayoutEditActivity extends AbstractActivity implement
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
if (!layoutFieldsVisible.getFields().isEmpty() || !layoutFieldsHidden.getFields().isEmpty()) { if (!recordingLayoutFieldsVisible.getFields().isEmpty() || !recordingLayoutFieldsHidden.getFields().isEmpty()) {
Layout layout = new Layout(profile, numColumns); RecordingLayout recordingLayout = new RecordingLayout(profile, numColumns);
layout.addFields(layoutFieldsVisible.getFields()); recordingLayout.addFields(recordingLayoutFieldsVisible.getFields());
layout.addFields(layoutFieldsHidden.getFields()); recordingLayout.addFields(recordingLayoutFieldsHidden.getFields());
PreferencesUtils.updateCustomLayout(layout); PreferencesUtils.updateCustomLayout(recordingLayout);
} }
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
layoutFieldsVisible = null; recordingLayoutFieldsVisible = null;
} }
@Override @Override
@@ -132,24 +132,24 @@ public class SettingsCustomLayoutEditActivity extends AbstractActivity implement
if (which == 0) { if (which == 0) {
field.togglePrimary(); field.togglePrimary();
} else { } else {
layoutFieldsVisible.removeField(field); recordingLayoutFieldsVisible.removeField(field);
field.toggleVisibility(); field.toggleVisibility();
layoutFieldsHidden.addField(field); recordingLayoutFieldsHidden.addField(field);
} }
adapterFieldsVisible.swapValues(layoutFieldsVisible); adapterFieldsVisible.swapValues(recordingLayoutFieldsVisible);
adapterFieldsHidden.swapValues(layoutFieldsHidden); adapterFieldsHidden.swapValues(recordingLayoutFieldsHidden);
}) })
.create() .create()
.show(); .show();
} else { } else {
layoutFieldsHidden.removeField(field); recordingLayoutFieldsHidden.removeField(field);
field.toggleVisibility(); field.toggleVisibility();
layoutFieldsVisible.addField(field); recordingLayoutFieldsVisible.addField(field);
viewBinding.scrollView.fullScroll(ScrollView.FOCUS_UP); viewBinding.scrollView.fullScroll(ScrollView.FOCUS_UP);
adapterFieldsVisible.swapValues(layoutFieldsVisible); adapterFieldsVisible.swapValues(recordingLayoutFieldsVisible);
adapterFieldsHidden.swapValues(layoutFieldsHidden); adapterFieldsHidden.swapValues(recordingLayoutFieldsHidden);
} }
} }
} }
@@ -23,7 +23,7 @@ import com.google.android.material.textfield.TextInputLayout;
import de.dennisguse.opentracks.AbstractActivity; import de.dennisguse.opentracks.AbstractActivity;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.databinding.ActivitySettingsCustomLayoutListBinding; import de.dennisguse.opentracks.databinding.ActivitySettingsCustomLayoutListBinding;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
import de.dennisguse.opentracks.ui.customRecordingLayout.SettingsCustomLayoutListAdapter; import de.dennisguse.opentracks.ui.customRecordingLayout.SettingsCustomLayoutListAdapter;
import de.dennisguse.opentracks.ui.util.RecyclerViewSwipeDeleteCallback; import de.dennisguse.opentracks.ui.util.RecyclerViewSwipeDeleteCallback;
@@ -96,7 +96,7 @@ public class SettingsCustomLayoutListActivity extends AbstractActivity implement
@Override @Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) { public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
final int position = viewHolder.getAdapterPosition(); final int position = viewHolder.getAdapterPosition();
final Layout item = adapter.getLayouts().get(position); final RecordingLayout item = adapter.getLayouts().get(position);
adapter.removeLayout(position); adapter.removeLayout(position);
@@ -150,9 +150,9 @@ public class SettingsCustomLayoutListActivity extends AbstractActivity implement
} }
@Override @Override
public void onSettingsCustomLayoutProfileClicked(@NonNull Layout layout) { public void onSettingsCustomLayoutProfileClicked(@NonNull RecordingLayout recordingLayout) {
Intent intent = new Intent(this, SettingsCustomLayoutEditActivity.class); Intent intent = new Intent(this, SettingsCustomLayoutEditActivity.class);
intent.putExtra(SettingsCustomLayoutEditActivity.EXTRA_LAYOUT, layout); intent.putExtra(SettingsCustomLayoutEditActivity.EXTRA_LAYOUT, recordingLayout);
startActivity(intent); startActivity(intent);
} }
@@ -10,38 +10,38 @@ import java.util.stream.Collectors;
import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.PreferencesUtils;
public class Layout implements Parcelable { public class RecordingLayout implements Parcelable {
// User-generated layout's name. // User-generated layout's name.
private final String name; private final String name;
private int columnsPerRow; private int columnsPerRow;
private final List<DataField> dataFields = new ArrayList<>(); private final List<DataField> dataFields = new ArrayList<>();
public Layout(String name) { public RecordingLayout(String name) {
this.name = name; this.name = name;
this.columnsPerRow = PreferencesUtils.getLayoutColumnsByDefault(); this.columnsPerRow = PreferencesUtils.getLayoutColumnsByDefault();
} }
public Layout(String name, int columnsPerRow) { public RecordingLayout(String name, int columnsPerRow) {
this.name = name; this.name = name;
this.columnsPerRow = columnsPerRow; this.columnsPerRow = columnsPerRow;
} }
protected Layout(Parcel in) { protected RecordingLayout(Parcel in) {
name = in.readString(); name = in.readString();
columnsPerRow = in.readInt(); columnsPerRow = in.readInt();
in.readList(dataFields, DataField.class.getClassLoader()); in.readList(dataFields, DataField.class.getClassLoader());
} }
public static final Creator<Layout> CREATOR = new Creator<>() { public static final Creator<RecordingLayout> CREATOR = new Creator<>() {
@Override @Override
public Layout createFromParcel(Parcel in) { public RecordingLayout createFromParcel(Parcel in) {
return new Layout(in); return new RecordingLayout(in);
} }
@Override @Override
public Layout[] newArray(int size) { public RecordingLayout[] newArray(int size) {
return new Layout[size]; return new RecordingLayout[size];
} }
}; };
@@ -83,8 +83,8 @@ public class Layout implements Parcelable {
this.columnsPerRow = columnsPerRow; this.columnsPerRow = columnsPerRow;
} }
public boolean sameName(Layout layout) { public boolean sameName(RecordingLayout recordingLayout) {
return this.name.equalsIgnoreCase(layout.getName()); return this.name.equalsIgnoreCase(recordingLayout.getName());
} }
public boolean sameName(String name) { public boolean sameName(String name) {
@@ -98,7 +98,7 @@ public class Layout implements Parcelable {
} }
return getName() + CsvLayoutUtils.ITEM_SEPARATOR + getColumnsPerRow() + CsvLayoutUtils.ITEM_SEPARATOR return getName() + CsvLayoutUtils.ITEM_SEPARATOR + getColumnsPerRow() + CsvLayoutUtils.ITEM_SEPARATOR
+ fields.stream().map(LayoutIO::toCsv).collect(Collectors.joining(CsvLayoutUtils.ITEM_SEPARATOR)) + fields.stream().map(RecordingLayoutIO::toCsv).collect(Collectors.joining(CsvLayoutUtils.ITEM_SEPARATOR))
+ CsvLayoutUtils.ITEM_SEPARATOR; + CsvLayoutUtils.ITEM_SEPARATOR;
} }
@@ -118,8 +118,8 @@ public class Layout implements Parcelable {
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
Layout layout = (Layout) o; RecordingLayout recordingLayout = (RecordingLayout) o;
return columnsPerRow == layout.columnsPerRow && Objects.equals(name, layout.name) && Objects.equals(dataFields, layout.dataFields); return columnsPerRow == recordingLayout.columnsPerRow && Objects.equals(name, recordingLayout.name) && Objects.equals(dataFields, recordingLayout.dataFields);
} }
@Override @Override
@@ -6,41 +6,39 @@ import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.PreferencesUtils;
public class LayoutIO { public class RecordingLayoutIO {
private static final String TAG = Layout.class.getSimpleName(); private static final String TAG = RecordingLayout.class.getSimpleName();
private static final String YES_VALUE = "1"; private static final String YES_VALUE = "1";
private static final String NOT_VALUE = "0"; private static final String NOT_VALUE = "0";
public static String toCsv(DataField datafield) { public static RecordingLayout fromCsv(@NonNull String csvLine, @NonNull Resources resources) {
String visible = datafield.isVisible() ? YES_VALUE : NOT_VALUE;
String primary = datafield.isPrimary() ? YES_VALUE : NOT_VALUE;
String wide = datafield.isWide() ? YES_VALUE : NOT_VALUE;
return datafield.getKey() + CsvLayoutUtils.PROPERTY_SEPARATOR + visible + CsvLayoutUtils.PROPERTY_SEPARATOR + primary + CsvLayoutUtils.PROPERTY_SEPARATOR + wide;
}
public static Layout fromCsv(@NonNull String csvLine, @NonNull Resources resources) {
List<String> csvParts = CsvLayoutUtils.getCsvLineParts(csvLine); List<String> csvParts = CsvLayoutUtils.getCsvLineParts(csvLine);
if (csvParts == null) { if (csvParts == null) {
Log.e(TAG, "Invalid CSV layout. It shouldn't happen: " + csvLine); Log.e(TAG, "Invalid CSV layout. It shouldn't happen: " + csvLine);
return new Layout(PreferencesUtils.getDefaultLayoutName()); return new RecordingLayout(PreferencesUtils.getDefaultLayoutName());
} }
Layout layout = new Layout(csvParts.get(0), Integer.parseInt(csvParts.get(1))); RecordingLayout recordingLayout = new RecordingLayout(csvParts.get(0), Integer.parseInt(csvParts.get(1)));
for (int i = 2; i < csvParts.size(); i++) { for (int i = 2; i < csvParts.size(); i++) {
String[] fieldParts = CsvLayoutUtils.getCsvFieldParts(csvParts.get(i)); String[] fieldParts = CsvLayoutUtils.getCsvFieldParts(csvParts.get(i));
if (fieldParts == null) { if (fieldParts == null) {
Log.e(TAG, "Invalid CSV layout. It shouldn't happen: " + csvLine); Log.e(TAG, "Invalid CSV layout. It shouldn't happen: " + csvLine);
return layout; return recordingLayout;
} }
layout.addField(fromCSV(fieldParts, resources)); recordingLayout.addField(fromCSV(fieldParts, resources));
} }
return layout; return recordingLayout;
}
public static String toCSV(List<RecordingLayout> recordingLayouts) {
return recordingLayouts.stream().map(RecordingLayout::toCsv).collect(Collectors.joining(CsvLayoutUtils.LINE_SEPARATOR));
} }
private static DataField fromCSV(String[] fieldParts, @NonNull Resources resources) { private static DataField fromCSV(String[] fieldParts, @NonNull Resources resources) {
@@ -50,4 +48,11 @@ public class LayoutIO {
fieldParts[2].equals(YES_VALUE), fieldParts[2].equals(YES_VALUE),
fieldParts[0].equals(resources.getString(R.string.stats_custom_layout_coordinates_key))); fieldParts[0].equals(resources.getString(R.string.stats_custom_layout_coordinates_key)));
} }
static String toCsv(DataField datafield) {
String visible = datafield.isVisible() ? YES_VALUE : NOT_VALUE;
String primary = datafield.isPrimary() ? YES_VALUE : NOT_VALUE;
String wide = datafield.isWide() ? YES_VALUE : NOT_VALUE;
return datafield.getKey() + CsvLayoutUtils.PROPERTY_SEPARATOR + visible + CsvLayoutUtils.PROPERTY_SEPARATOR + primary + CsvLayoutUtils.PROPERTY_SEPARATOR + wide;
}
} }
@@ -58,16 +58,16 @@ public class SettingsCustomLayoutEditAdapter extends RecyclerView.Adapter<Recycl
demoData = new RecordingData(track, lastTrackPoint, null); demoData = new RecordingData(track, lastTrackPoint, null);
} }
private Layout layout; private RecordingLayout recordingLayout;
private final Context context; private final Context context;
private final SettingsCustomLayoutItemClickListener itemClickListener; private final SettingsCustomLayoutItemClickListener itemClickListener;
private final Map<String, Callable<StatisticViewHolder<?>>> mapping; private final Map<String, Callable<StatisticViewHolder<?>>> mapping;
public SettingsCustomLayoutEditAdapter(Context context, SettingsCustomLayoutItemClickListener itemClickListener, Layout layout) { public SettingsCustomLayoutEditAdapter(Context context, SettingsCustomLayoutItemClickListener itemClickListener, RecordingLayout recordingLayout) {
this.context = context; this.context = context;
this.itemClickListener = itemClickListener; this.itemClickListener = itemClickListener;
this.layout = layout; this.recordingLayout = recordingLayout;
mapping = Mapping.create(context); mapping = Mapping.create(context);
} }
@@ -82,7 +82,7 @@ public class SettingsCustomLayoutEditAdapter extends RecyclerView.Adapter<Recycl
@Override @Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
SettingsCustomLayoutEditAdapter.ViewHolder viewHolder = (SettingsCustomLayoutEditAdapter.ViewHolder) holder; SettingsCustomLayoutEditAdapter.ViewHolder viewHolder = (SettingsCustomLayoutEditAdapter.ViewHolder) holder;
DataField field = layout.getFields().get(position); DataField field = recordingLayout.getFields().get(position);
viewHolder.itemView.setTag(field.getKey()); viewHolder.itemView.setTag(field.getKey());
try { try {
StatisticViewHolder<?> m = mapping.get(field.getKey()).call(); StatisticViewHolder<?> m = mapping.get(field.getKey()).call();
@@ -103,32 +103,32 @@ public class SettingsCustomLayoutEditAdapter extends RecyclerView.Adapter<Recycl
@Override @Override
public int getItemCount() { public int getItemCount() {
if (layout == null) { if (recordingLayout == null) {
return 0; return 0;
} else { } else {
return layout.getFields().size(); return recordingLayout.getFields().size();
} }
} }
public boolean isItemWide(int position) { public boolean isItemWide(int position) {
return layout.getFields().get(position).isWide(); return recordingLayout.getFields().get(position).isWide();
} }
public DataField getItem(int position) { public DataField getItem(int position) {
return layout.getFields().get(position); return recordingLayout.getFields().get(position);
} }
public void swapValues(Layout data) { public void swapValues(RecordingLayout data) {
this.layout = data; this.recordingLayout = data;
if (this.layout != null) { if (this.recordingLayout != null) {
this.notifyDataSetChanged(); this.notifyDataSetChanged();
} }
} }
public Layout move(int fromPosition, int toPosition) { public RecordingLayout move(int fromPosition, int toPosition) {
layout.moveField(fromPosition, toPosition); recordingLayout.moveField(fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition); notifyItemMoved(fromPosition, toPosition);
return layout; return recordingLayout;
} }
private class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@@ -145,7 +145,7 @@ public class SettingsCustomLayoutEditAdapter extends RecyclerView.Adapter<Recycl
@Override @Override
public void onClick(View view) { public void onClick(View view) {
String statTitle = (String) view.getTag(); String statTitle = (String) view.getTag();
Optional<DataField> optionalField = layout.getFields().stream().filter(f -> f.getKey().equals(statTitle)).findFirst(); Optional<DataField> optionalField = recordingLayout.getFields().stream().filter(f -> f.getKey().equals(statTitle)).findFirst();
optionalField.ifPresent(itemClickListener::onSettingsCustomLayoutItemClicked); optionalField.ifPresent(itemClickListener::onSettingsCustomLayoutItemClicked);
} }
} }
@@ -17,14 +17,14 @@ import de.dennisguse.opentracks.settings.PreferencesUtils;
public class SettingsCustomLayoutListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public class SettingsCustomLayoutListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Layout> layoutList; private List<RecordingLayout> recordingLayoutList;
private final Context context; private final Context context;
private final SettingsCustomLayoutProfileClickListener itemClickListener; private final SettingsCustomLayoutProfileClickListener itemClickListener;
public SettingsCustomLayoutListAdapter(Context context, SettingsCustomLayoutProfileClickListener itemClickListener) { public SettingsCustomLayoutListAdapter(Context context, SettingsCustomLayoutProfileClickListener itemClickListener) {
this.context = context; this.context = context;
this.itemClickListener = itemClickListener; this.itemClickListener = itemClickListener;
layoutList = PreferencesUtils.getAllCustomLayouts(); recordingLayoutList = PreferencesUtils.getAllCustomLayouts();
} }
@NonNull @NonNull
@@ -37,37 +37,37 @@ public class SettingsCustomLayoutListAdapter extends RecyclerView.Adapter<Recycl
@Override @Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
SettingsCustomLayoutListAdapter.ViewHolder viewHolder = (SettingsCustomLayoutListAdapter.ViewHolder) holder; SettingsCustomLayoutListAdapter.ViewHolder viewHolder = (SettingsCustomLayoutListAdapter.ViewHolder) holder;
Layout layout = layoutList.get(position); RecordingLayout recordingLayout = recordingLayoutList.get(position);
viewHolder.itemView.setTag(layout.getName()); viewHolder.itemView.setTag(recordingLayout.getName());
viewHolder.title.setText(layout.getName()); viewHolder.title.setText(recordingLayout.getName());
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
if (layoutList == null) { if (recordingLayoutList == null) {
return 0; return 0;
} }
return layoutList.size(); return recordingLayoutList.size();
} }
public List<Layout> getLayouts() { public List<RecordingLayout> getLayouts() {
return layoutList; return recordingLayoutList;
} }
public void reloadLayouts() { public void reloadLayouts() {
layoutList = PreferencesUtils.getAllCustomLayouts(); recordingLayoutList = PreferencesUtils.getAllCustomLayouts();
notifyDataSetChanged(); notifyDataSetChanged();
} }
public void removeLayout(int position) { public void removeLayout(int position) {
layoutList.remove(position); recordingLayoutList.remove(position);
PreferencesUtils.updateCustomLayouts(layoutList); PreferencesUtils.updateCustomLayouts(recordingLayoutList);
notifyDataSetChanged(); notifyDataSetChanged();
} }
public void restoreItem(Layout layout, int position) { public void restoreItem(RecordingLayout recordingLayout, int position) {
layoutList.add(position, layout); recordingLayoutList.add(position, recordingLayout);
PreferencesUtils.updateCustomLayouts(layoutList); PreferencesUtils.updateCustomLayouts(recordingLayoutList);
notifyDataSetChanged(); notifyDataSetChanged();
} }
@@ -83,12 +83,12 @@ public class SettingsCustomLayoutListAdapter extends RecyclerView.Adapter<Recycl
@Override @Override
public void onClick(View view) { public void onClick(View view) {
String profile = (String) view.getTag(); String profile = (String) view.getTag();
Optional<Layout> optionalLayout = layoutList.stream().filter(layout -> layout.sameName(new Layout(profile))).findFirst(); Optional<RecordingLayout> optionalLayout = recordingLayoutList.stream().filter(layout -> layout.sameName(new RecordingLayout(profile))).findFirst();
optionalLayout.ifPresent(itemClickListener::onSettingsCustomLayoutProfileClicked); optionalLayout.ifPresent(itemClickListener::onSettingsCustomLayoutProfileClicked);
} }
} }
public interface SettingsCustomLayoutProfileClickListener { public interface SettingsCustomLayoutProfileClickListener {
void onSettingsCustomLayoutProfileClicked(@NonNull Layout layout); void onSettingsCustomLayoutProfileClicked(@NonNull RecordingLayout recordingLayout);
} }
} }
@@ -8,7 +8,7 @@ import java.util.stream.Collectors;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.ui.customRecordingLayout.Layout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
public class StatisticsUtils { public class StatisticsUtils {
@@ -26,9 +26,9 @@ public class StatisticsUtils {
} }
@Deprecated //Add to Layout? @Deprecated //Add to Layout?
public static Layout filterVisible(Layout layout, boolean visible) { public static RecordingLayout filterVisible(RecordingLayout recordingLayout, boolean visible) {
Layout result = new Layout(layout.getName()); RecordingLayout result = new RecordingLayout(recordingLayout.getName());
result.addFields(layout.getFields().stream().filter(f -> f.isVisible() == visible).collect(Collectors.toList())); result.addFields(recordingLayout.getFields().stream().filter(f -> f.isVisible() == visible).collect(Collectors.toList()));
return result; return result;
} }
} }
+3 -1
View File
@@ -120,6 +120,8 @@
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
@@ -56,6 +56,8 @@
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
@@ -75,6 +75,8 @@
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -21,6 +21,8 @@
</ScrollView> </ScrollView>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -26,6 +26,8 @@
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -307,6 +307,8 @@
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -143,6 +143,8 @@
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -251,6 +251,8 @@
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
@@ -28,6 +28,8 @@ limitations under the License.
android:layout_height="match_parent" /> android:layout_height="match_parent" />
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -138,6 +138,8 @@ limitations under the License.
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -38,6 +38,8 @@ limitations under the License.
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -17,6 +17,8 @@
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -46,6 +46,8 @@ limitations under the License.
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
+3 -1
View File
@@ -36,6 +36,8 @@ limitations under the License.
</LinearLayout> </LinearLayout>
<include android:id="@+id/bottom_app_bar_layout" layout="@layout/bottomappbar" /> <include
android:id="@+id/bottom_app_bar_layout"
layout="@layout/bottomappbar" />
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>