forked from upstream-mirrors/OpenTracks
Merge pull request #1618 from OpenTracksApp/exportType#1608
Refactor activity type / category / icon
This commit is contained in:
+8
-7
@@ -46,6 +46,7 @@ import de.dennisguse.opentracks.R;
|
|||||||
import de.dennisguse.opentracks.TimezoneRule;
|
import de.dennisguse.opentracks.TimezoneRule;
|
||||||
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Cadence;
|
import de.dennisguse.opentracks.data.models.Cadence;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.HeartRate;
|
import de.dennisguse.opentracks.data.models.HeartRate;
|
||||||
@@ -95,8 +96,8 @@ public class ExportImportTest {
|
|||||||
|
|
||||||
private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
|
private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
|
||||||
|
|
||||||
private static final String TRACK_ICON = "the track icon";
|
private static final ActivityType TRACK_ACTIVITY_TYPE = ActivityType.MOUNTAIN_BIKING;
|
||||||
private static final String TRACK_ACTIVITY_TYPE = "the activity type";
|
private static final String TRACK_ACTIVITY_TYPE_LOCALIZED = "the activity type";
|
||||||
private static final String TRACK_DESCRIPTION = "the description";
|
private static final String TRACK_DESCRIPTION = "the description";
|
||||||
|
|
||||||
private File tmpFile;
|
private File tmpFile;
|
||||||
@@ -180,8 +181,8 @@ public class ExportImportTest {
|
|||||||
service.endCurrentTrack();
|
service.endCurrentTrack();
|
||||||
|
|
||||||
Track track = contentProviderUtils.getTrack(trackId);
|
Track track = contentProviderUtils.getTrack(trackId);
|
||||||
track.setIcon(TRACK_ICON);
|
|
||||||
track.setActivityType(TRACK_ACTIVITY_TYPE);
|
track.setActivityType(TRACK_ACTIVITY_TYPE);
|
||||||
|
track.setActivityTypeLocalized(TRACK_ACTIVITY_TYPE_LOCALIZED);
|
||||||
track.setDescription(TRACK_DESCRIPTION);
|
track.setDescription(TRACK_DESCRIPTION);
|
||||||
contentProviderUtils.updateTrack(track);
|
contentProviderUtils.updateTrack(track);
|
||||||
|
|
||||||
@@ -192,7 +193,7 @@ public class ExportImportTest {
|
|||||||
assertEquals(2, markers.size());
|
assertEquals(2, markers.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO Does not test images
|
//TODO Does not test marker images
|
||||||
@LargeTest
|
@LargeTest
|
||||||
@Test
|
@Test
|
||||||
public void kmz_with_trackdetail_and_sensordata() throws TimeoutException, IOException {
|
public void kmz_with_trackdetail_and_sensordata() throws TimeoutException, IOException {
|
||||||
@@ -216,10 +217,10 @@ public class ExportImportTest {
|
|||||||
// 1. track
|
// 1. track
|
||||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||||
assertNotNull(importedTrack);
|
assertNotNull(importedTrack);
|
||||||
assertEquals(track.getActivityType(), importedTrack.getActivityType());
|
assertEquals(track.getActivityTypeLocalized(), importedTrack.getActivityTypeLocalized());
|
||||||
assertEquals(track.getDescription(), importedTrack.getDescription());
|
assertEquals(track.getDescription(), importedTrack.getDescription());
|
||||||
assertEquals(track.getName(), importedTrack.getName());
|
assertEquals(track.getName(), importedTrack.getName());
|
||||||
assertEquals(track.getIcon(), importedTrack.getIcon());
|
assertEquals(track.getActivityType(), importedTrack.getActivityType());
|
||||||
|
|
||||||
// 2. trackpoints
|
// 2. trackpoints
|
||||||
TrackPointAssert a = new TrackPointAssert();
|
TrackPointAssert a = new TrackPointAssert();
|
||||||
@@ -323,7 +324,7 @@ public class ExportImportTest {
|
|||||||
// 1. track
|
// 1. track
|
||||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||||
assertNotNull(importedTrack);
|
assertNotNull(importedTrack);
|
||||||
assertEquals(track.getActivityType(), importedTrack.getActivityType());
|
assertEquals(track.getActivityTypeLocalized(), importedTrack.getActivityTypeLocalized());
|
||||||
assertEquals(track.getDescription(), importedTrack.getDescription());
|
assertEquals(track.getDescription(), importedTrack.getDescription());
|
||||||
assertEquals(track.getName(), importedTrack.getName());
|
assertEquals(track.getName(), importedTrack.getName());
|
||||||
|
|
||||||
|
|||||||
+7
-6
@@ -28,6 +28,7 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
import de.dennisguse.opentracks.data.models.Speed;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
@@ -79,10 +80,10 @@ public class GPXTrackImporterTest {
|
|||||||
// 2. track
|
// 2. track
|
||||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||||
assertNotNull(importedTrack);
|
assertNotNull(importedTrack);
|
||||||
assertEquals("the category", importedTrack.getActivityType());
|
assertEquals("the category", importedTrack.getActivityTypeLocalized());
|
||||||
assertEquals("the description", importedTrack.getDescription());
|
assertEquals("the description", importedTrack.getDescription());
|
||||||
assertEquals("2021-01-07 22:51", importedTrack.getName());
|
assertEquals("2021-01-07 22:51", importedTrack.getName());
|
||||||
assertEquals("UNKNOWN", importedTrack.getIcon());
|
assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType());
|
||||||
|
|
||||||
//TODO Check trackstatistics
|
//TODO Check trackstatistics
|
||||||
|
|
||||||
@@ -133,10 +134,10 @@ public class GPXTrackImporterTest {
|
|||||||
// 2. track
|
// 2. track
|
||||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||||
assertNotNull(importedTrack);
|
assertNotNull(importedTrack);
|
||||||
assertEquals("", importedTrack.getActivityType());
|
assertEquals("", importedTrack.getActivityTypeLocalized());
|
||||||
assertEquals("", importedTrack.getDescription());
|
assertEquals("", importedTrack.getDescription());
|
||||||
assertEquals("20210907_213924.gpx", importedTrack.getName());
|
assertEquals("20210907_213924.gpx", importedTrack.getName());
|
||||||
assertEquals("", importedTrack.getIcon());
|
assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType());
|
||||||
|
|
||||||
// 3. trackstatistics
|
// 3. trackstatistics
|
||||||
TrackStatistics trackStatistics = importedTrack.getTrackStatistics();
|
TrackStatistics trackStatistics = importedTrack.getTrackStatistics();
|
||||||
@@ -181,10 +182,10 @@ public class GPXTrackImporterTest {
|
|||||||
// 2. track
|
// 2. track
|
||||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||||
assertNotNull(importedTrack);
|
assertNotNull(importedTrack);
|
||||||
assertEquals("", importedTrack.getActivityType());
|
assertEquals("", importedTrack.getActivityTypeLocalized());
|
||||||
assertEquals("", importedTrack.getDescription());
|
assertEquals("", importedTrack.getDescription());
|
||||||
assertEquals("20210907_213924.gpx", importedTrack.getName());
|
assertEquals("20210907_213924.gpx", importedTrack.getName());
|
||||||
assertEquals("", importedTrack.getIcon());
|
assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType());
|
||||||
|
|
||||||
// 3. trackstatistics
|
// 3. trackstatistics
|
||||||
TrackStatistics trackStatistics = importedTrack.getTrackStatistics();
|
TrackStatistics trackStatistics = importedTrack.getTrackStatistics();
|
||||||
|
|||||||
+7
-6
@@ -22,6 +22,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
import de.dennisguse.opentracks.content.data.TestDataUtil;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
import de.dennisguse.opentracks.data.models.Speed;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
@@ -70,10 +71,10 @@ public class KMLTrackImporterTest {
|
|||||||
// 1. track
|
// 1. track
|
||||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||||
assertNotNull(importedTrack);
|
assertNotNull(importedTrack);
|
||||||
assertEquals("", importedTrack.getActivityType());
|
assertEquals("", importedTrack.getActivityTypeLocalized());
|
||||||
assertEquals("", importedTrack.getDescription());
|
assertEquals("", importedTrack.getDescription());
|
||||||
assertEquals("", importedTrack.getName());
|
assertEquals("", importedTrack.getName());
|
||||||
assertEquals("", importedTrack.getIcon());
|
assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType());
|
||||||
|
|
||||||
// 2. markers
|
// 2. markers
|
||||||
assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size());
|
assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size());
|
||||||
@@ -119,10 +120,10 @@ public class KMLTrackImporterTest {
|
|||||||
// 1. track
|
// 1. track
|
||||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||||
assertNotNull(importedTrack);
|
assertNotNull(importedTrack);
|
||||||
assertEquals("", importedTrack.getActivityType());
|
assertEquals("", importedTrack.getActivityTypeLocalized());
|
||||||
assertEquals("", importedTrack.getDescription());
|
assertEquals("", importedTrack.getDescription());
|
||||||
assertEquals("", importedTrack.getName());
|
assertEquals("", importedTrack.getName());
|
||||||
assertEquals("", importedTrack.getIcon());
|
assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType());
|
||||||
|
|
||||||
// 2. markers
|
// 2. markers
|
||||||
assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size());
|
assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size());
|
||||||
@@ -159,10 +160,10 @@ public class KMLTrackImporterTest {
|
|||||||
// 1. track
|
// 1. track
|
||||||
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
Track importedTrack = contentProviderUtils.getTrack(importTrackId);
|
||||||
assertNotNull(importedTrack);
|
assertNotNull(importedTrack);
|
||||||
assertEquals("unknown", importedTrack.getActivityType());
|
assertEquals("unknown", importedTrack.getActivityTypeLocalized());
|
||||||
assertEquals("Test Track", importedTrack.getDescription());
|
assertEquals("Test Track", importedTrack.getDescription());
|
||||||
assertEquals("2020-11-28 18:06", importedTrack.getName());
|
assertEquals("2020-11-28 18:06", importedTrack.getName());
|
||||||
assertEquals("UNKNOWN", importedTrack.getIcon());
|
assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType());
|
||||||
|
|
||||||
// 2. markers
|
// 2. markers
|
||||||
assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size());
|
assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size());
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ public class DescriptionGeneratorTest {
|
|||||||
stats.setTotalAltitudeLoss(6000f);
|
stats.setTotalAltitudeLoss(6000f);
|
||||||
stats.setStartTime(START_TIME);
|
stats.setStartTime(START_TIME);
|
||||||
track.setTrackStatistics(stats);
|
track.setTrackStatistics(stats);
|
||||||
track.setActivityType("hiking");
|
track.setActivityTypeLocalized("hiking");
|
||||||
String expected = //"Created by"
|
String expected = //"Created by"
|
||||||
"<a href='https://github.com/OpenTracksApp/OpenTracks'>OpenTracks (Debug)</a><p>"
|
"<a href='https://github.com/OpenTracksApp/OpenTracks'>OpenTracks (Debug)</a><p>"
|
||||||
+ "Name: -<br>"
|
+ "Name: -<br>"
|
||||||
@@ -118,7 +118,7 @@ public class DescriptionGeneratorTest {
|
|||||||
stats.setTotalAltitudeLoss(6000f);
|
stats.setTotalAltitudeLoss(6000f);
|
||||||
stats.setStartTime(START_TIME);
|
stats.setStartTime(START_TIME);
|
||||||
track.setTrackStatistics(stats);
|
track.setTrackStatistics(stats);
|
||||||
track.setActivityType("hiking");
|
track.setActivityTypeLocalized("hiking");
|
||||||
String expected = //"Created by"
|
String expected = //"Created by"
|
||||||
"<a href='https://github.com/OpenTracksApp/OpenTracks'>OpenTracks (Debug)</a><p>"
|
"<a href='https://github.com/OpenTracksApp/OpenTracks'>OpenTracks (Debug)</a><p>"
|
||||||
+ "Name: -<br>"
|
+ "Name: -<br>"
|
||||||
|
|||||||
+6
-6
@@ -16,18 +16,18 @@ import java.time.Instant;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
import de.dennisguse.opentracks.data.models.Speed;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
import de.dennisguse.opentracks.stats.TrackStatistics;
|
import de.dennisguse.opentracks.stats.TrackStatistics;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
|
|
||||||
@RunWith(JUnit4.class)
|
@RunWith(JUnit4.class)
|
||||||
public class AggregatedStatisticsTest {
|
public class AggregatedStatisticsTest {
|
||||||
|
|
||||||
private final Context context = ApplicationProvider.getApplicationContext();
|
private final Context context = ApplicationProvider.getApplicationContext();
|
||||||
|
|
||||||
private static Track createTrack(Context context, Distance totalDistance, Duration totalTime, String category) {
|
private static Track createTrack(Context context, Distance totalDistance, Duration totalTime, String activityTypeLocalized) {
|
||||||
TrackStatistics statistics = new TrackStatistics();
|
TrackStatistics statistics = new TrackStatistics();
|
||||||
statistics.setStartTime(Instant.ofEpochMilli(1000L)); // Resulting start time
|
statistics.setStartTime(Instant.ofEpochMilli(1000L)); // Resulting start time
|
||||||
statistics.setStopTime(statistics.getStartTime().plus(totalTime));
|
statistics.setStopTime(statistics.getStartTime().plus(totalTime));
|
||||||
@@ -40,8 +40,8 @@ public class AggregatedStatisticsTest {
|
|||||||
statistics.setMinAltitude(1200.0); // Resulting min altitude
|
statistics.setMinAltitude(1200.0); // Resulting min altitude
|
||||||
|
|
||||||
Track track = new Track();
|
Track track = new Track();
|
||||||
track.setIcon(TrackIconUtils.getIconValue(context, category));
|
track.setActivityType(ActivityType.findByLocalizedString(context, activityTypeLocalized));
|
||||||
track.setActivityType(category);
|
track.setActivityTypeLocalized(activityTypeLocalized);
|
||||||
track.setTrackStatistics(statistics);
|
track.setTrackStatistics(statistics);
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
@@ -243,8 +243,8 @@ public class AggregatedStatisticsTest {
|
|||||||
// Check order
|
// Check order
|
||||||
|
|
||||||
{
|
{
|
||||||
assertEquals(biking, aggregatedStatistics.getItem(0).getActivityType());
|
assertEquals(biking, aggregatedStatistics.getItem(0).getActivityTypeLocalized());
|
||||||
assertEquals(driving, aggregatedStatistics.getItem(3).getActivityType());
|
assertEquals(driving, aggregatedStatistics.getItem(3).getActivityTypeLocalized());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -51,7 +51,7 @@ public class EspressoAggregatedFilterTest {
|
|||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
Pair<Track, List<TrackPoint>> pair = TestDataUtil.createTrack(new Track.Id(System.currentTimeMillis()), 20);
|
Pair<Track, List<TrackPoint>> pair = TestDataUtil.createTrack(new Track.Id(System.currentTimeMillis()), 20);
|
||||||
pair.first.setActivityType(CATEGORY);
|
pair.first.setActivityTypeLocalized(CATEGORY);
|
||||||
TestDataUtil.insertTrackWithLocations(new ContentProviderUtils(ApplicationProvider.getApplicationContext()), pair.first, pair.second);
|
TestDataUtil.insertTrackWithLocations(new ContentProviderUtils(ApplicationProvider.getApplicationContext()), pair.first, pair.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import de.dennisguse.opentracks.data.models.Track;
|
|||||||
import de.dennisguse.opentracks.databinding.TrackEditBinding;
|
import de.dennisguse.opentracks.databinding.TrackEditBinding;
|
||||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
||||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
import de.dennisguse.opentracks.util.TrackUtils;
|
import de.dennisguse.opentracks.util.TrackUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,7 +47,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
|
|||||||
private TrackRecordingServiceConnection trackRecordingServiceConnection;
|
private TrackRecordingServiceConnection trackRecordingServiceConnection;
|
||||||
private ContentProviderUtils contentProviderUtils;
|
private ContentProviderUtils contentProviderUtils;
|
||||||
private Track track;
|
private Track track;
|
||||||
private String iconValue;
|
private ActivityType activityType;
|
||||||
|
|
||||||
private TrackEditBinding viewBinding;
|
private TrackEditBinding viewBinding;
|
||||||
|
|
||||||
@@ -74,28 +73,31 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
|
|||||||
|
|
||||||
viewBinding.fields.trackEditName.setText(track.getName());
|
viewBinding.fields.trackEditName.setText(track.getName());
|
||||||
|
|
||||||
viewBinding.fields.trackEditActivityType.setText(track.getActivityType());
|
viewBinding.fields.trackEditActivityType.setText(track.getActivityTypeLocalized());
|
||||||
|
|
||||||
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this));
|
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this));
|
||||||
viewBinding.fields.trackEditActivityType.setAdapter(adapter);
|
viewBinding.fields.trackEditActivityType.setAdapter(adapter);
|
||||||
viewBinding.fields.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.fields.trackEditActivityType.getAdapter().getItem(position))));
|
viewBinding.fields.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> {
|
||||||
|
String localizedActivityType = (String) viewBinding.fields.trackEditActivityType.getAdapter().getItem(position);
|
||||||
|
setActivityTypeIcon(ActivityType.findByLocalizedString(this, localizedActivityType));
|
||||||
|
});
|
||||||
viewBinding.fields.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
|
viewBinding.fields.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
|
||||||
if (!hasFocus) {
|
if (!hasFocus) {
|
||||||
setActivityTypeIcon(TrackIconUtils.getIconValue(
|
String localizedActivityType = viewBinding.fields.trackEditActivityType.getText().toString();
|
||||||
TrackEditActivity.this, viewBinding.fields.trackEditActivityType.getText().toString()));
|
setActivityTypeIcon(ActivityType.findByLocalizedString(this, localizedActivityType));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
iconValue = null;
|
activityType = null;
|
||||||
if (bundle != null) {
|
if (bundle != null) {
|
||||||
iconValue = bundle.getString(ICON_VALUE_KEY);
|
activityType = (ActivityType) bundle.getSerializable(ICON_VALUE_KEY);
|
||||||
}
|
}
|
||||||
if (iconValue == null) {
|
if (activityType == null) {
|
||||||
iconValue = track.getIcon();
|
activityType = track.getActivityType();
|
||||||
}
|
}
|
||||||
|
|
||||||
setActivityTypeIcon(iconValue);
|
setActivityTypeIcon(activityType);
|
||||||
viewBinding.fields.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.fields.trackEditActivityType.getText().toString()));
|
viewBinding.fields.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), this, viewBinding.fields.trackEditActivityType.getText().toString()));
|
||||||
|
|
||||||
viewBinding.fields.trackEditDescription.setText(track.getDescription());
|
viewBinding.fields.trackEditDescription.setText(track.getDescription());
|
||||||
|
|
||||||
@@ -127,7 +129,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
|
|||||||
@Override
|
@Override
|
||||||
public void onSaveInstanceState(@NonNull Bundle outState) {
|
public void onSaveInstanceState(@NonNull Bundle outState) {
|
||||||
super.onSaveInstanceState(outState);
|
super.onSaveInstanceState(outState);
|
||||||
outState.putString(ICON_VALUE_KEY, iconValue);
|
outState.putSerializable(ICON_VALUE_KEY, activityType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -136,14 +138,14 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
|
|||||||
return viewBinding.getRoot();
|
return viewBinding.getRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setActivityTypeIcon(String iconValue) {
|
private void setActivityTypeIcon(ActivityType activityType) {
|
||||||
this.iconValue = iconValue;
|
this.activityType = activityType;
|
||||||
viewBinding.fields.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue));
|
viewBinding.fields.trackEditActivityTypeIcon.setImageResource(activityType.getIconDrawableId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChooseActivityTypeDone(String value) {
|
public void onChooseActivityTypeDone(ActivityType activityType) {
|
||||||
setActivityTypeIcon(value);
|
setActivityTypeIcon(activityType);
|
||||||
viewBinding.fields.trackEditActivityType.setText(getString(TrackIconUtils.getIconActivityType(value)));
|
viewBinding.fields.trackEditActivityType.setText(getString(activityType.getLocalizedStringId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ import java.time.Instant;
|
|||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.time.ZoneOffset;
|
import java.time.ZoneOffset;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.DistanceFormatter;
|
import de.dennisguse.opentracks.data.models.DistanceFormatter;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
@@ -72,7 +73,6 @@ import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
|||||||
import de.dennisguse.opentracks.util.IntentUtils;
|
import de.dennisguse.opentracks.util.IntentUtils;
|
||||||
import de.dennisguse.opentracks.util.PermissionRequester;
|
import de.dennisguse.opentracks.util.PermissionRequester;
|
||||||
import de.dennisguse.opentracks.util.StringUtils;
|
import de.dennisguse.opentracks.util.StringUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An activity displaying a list of tracks.
|
* An activity displaying a list of tracks.
|
||||||
@@ -212,14 +212,15 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
|
|||||||
int totalDistanceIndex = cursor.getColumnIndexOrThrow(TracksColumns.TOTALDISTANCE);
|
int totalDistanceIndex = cursor.getColumnIndexOrThrow(TracksColumns.TOTALDISTANCE);
|
||||||
int startTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME);
|
int startTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME);
|
||||||
int startTimeOffsetIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME_OFFSET);
|
int startTimeOffsetIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME_OFFSET);
|
||||||
int activityTypeIndex = cursor.getColumnIndexOrThrow(TracksColumns.ACTIVITY_TYPE);
|
int activityTypeIndex = cursor.getColumnIndexOrThrow(TracksColumns.ACTIVITY_TYPE_LOCALIZED);
|
||||||
int descriptionIndex = cursor.getColumnIndexOrThrow(TracksColumns.DESCRIPTION);
|
int descriptionIndex = cursor.getColumnIndexOrThrow(TracksColumns.DESCRIPTION);
|
||||||
int markerCountIndex = cursor.getColumnIndexOrThrow(TracksColumns.MARKER_COUNT);
|
int markerCountIndex = cursor.getColumnIndexOrThrow(TracksColumns.MARKER_COUNT);
|
||||||
|
|
||||||
Track.Id trackId = new Track.Id(cursor.getLong(idIndex));
|
Track.Id trackId = new Track.Id(cursor.getLong(idIndex));
|
||||||
boolean isRecording = trackId.equals(recordingStatus.getTrackId());
|
boolean isRecording = trackId.equals(recordingStatus.getTrackId());
|
||||||
String icon = cursor.getString(iconIndex);
|
String icon = cursor.getString(iconIndex);
|
||||||
int iconId = TrackIconUtils.getIconDrawable(icon);
|
int iconId = ActivityType.findBy(icon)
|
||||||
|
.getIconDrawableId();
|
||||||
String name = cursor.getString(nameIndex);
|
String name = cursor.getString(nameIndex);
|
||||||
String totalTime = StringUtils.formatElapsedTime(Duration.ofMillis(cursor.getLong(totalTimeIndex)));
|
String totalTime = StringUtils.formatElapsedTime(Duration.ofMillis(cursor.getLong(totalTimeIndex)));
|
||||||
String totalDistance = DistanceFormatter.Builder()
|
String totalDistance = DistanceFormatter.Builder()
|
||||||
@@ -516,7 +517,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
|
|||||||
@Override
|
@Override
|
||||||
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
|
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
|
||||||
final String[] PROJECTION = new String[]{TracksColumns._ID, TracksColumns.NAME,
|
final String[] PROJECTION = new String[]{TracksColumns._ID, TracksColumns.NAME,
|
||||||
TracksColumns.DESCRIPTION, TracksColumns.ACTIVITY_TYPE, TracksColumns.STARTTIME, TracksColumns.STARTTIME_OFFSET,
|
TracksColumns.DESCRIPTION, TracksColumns.ACTIVITY_TYPE_LOCALIZED, TracksColumns.STARTTIME, TracksColumns.STARTTIME_OFFSET,
|
||||||
TracksColumns.TOTALDISTANCE, TracksColumns.TOTALTIME, TracksColumns.ICON, TracksColumns.MARKER_COUNT};
|
TracksColumns.TOTALDISTANCE, TracksColumns.TOTALTIME, TracksColumns.ICON, TracksColumns.MARKER_COUNT};
|
||||||
|
|
||||||
final String sortOrder = TracksColumns.STARTTIME + " DESC";
|
final String sortOrder = TracksColumns.STARTTIME + " DESC";
|
||||||
@@ -526,7 +527,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
|
|||||||
} else {
|
} else {
|
||||||
final String SEARCH_QUERY = TracksColumns.NAME + " LIKE ? OR " +
|
final String SEARCH_QUERY = TracksColumns.NAME + " LIKE ? OR " +
|
||||||
TracksColumns.DESCRIPTION + " LIKE ? OR " +
|
TracksColumns.DESCRIPTION + " LIKE ? OR " +
|
||||||
TracksColumns.ACTIVITY_TYPE + " LIKE ?";
|
TracksColumns.ACTIVITY_TYPE_LOCALIZED + " LIKE ?";
|
||||||
final String[] selectionArgs = new String[]{"%" + searchQuery + "%", "%" + searchQuery + "%", "%" + searchQuery + "%"};
|
final String[] selectionArgs = new String[]{"%" + searchQuery + "%", "%" + searchQuery + "%", "%" + searchQuery + "%"};
|
||||||
return new CursorLoader(TrackListActivity.this, TracksColumns.CONTENT_URI, PROJECTION, SEARCH_QUERY, selectionArgs, sortOrder);
|
return new CursorLoader(TrackListActivity.this, TracksColumns.CONTENT_URI, PROJECTION, SEARCH_QUERY, selectionArgs, sortOrder);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import de.dennisguse.opentracks.chart.ChartFragment;
|
|||||||
import de.dennisguse.opentracks.chart.TrackDataHubInterface;
|
import de.dennisguse.opentracks.chart.TrackDataHubInterface;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
import de.dennisguse.opentracks.data.TrackDataHub;
|
import de.dennisguse.opentracks.data.TrackDataHub;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
import de.dennisguse.opentracks.databinding.TrackRecordingBinding;
|
import de.dennisguse.opentracks.databinding.TrackRecordingBinding;
|
||||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
||||||
@@ -46,7 +47,6 @@ import de.dennisguse.opentracks.ui.markers.MarkerListActivity;
|
|||||||
import de.dennisguse.opentracks.ui.util.ActivityUtils;
|
import de.dennisguse.opentracks.ui.util.ActivityUtils;
|
||||||
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
import de.dennisguse.opentracks.util.IntentDashboardUtils;
|
||||||
import de.dennisguse.opentracks.util.IntentUtils;
|
import de.dennisguse.opentracks.util.IntentUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
import de.dennisguse.opentracks.util.TrackUtils;
|
import de.dennisguse.opentracks.util.TrackUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -317,10 +317,10 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChooseActivityTypeDone(String iconValue) {
|
public void onChooseActivityTypeDone(ActivityType activityType) {
|
||||||
Track track = contentProviderUtils.getTrack(trackId);
|
Track track = contentProviderUtils.getTrack(trackId);
|
||||||
String activityType = getString(TrackIconUtils.getIconActivityType(iconValue));
|
String activityTypeLocalized = getString(activityType.getLocalizedStringId());
|
||||||
TrackUtils.updateTrack(this, track, null, activityType, null, contentProviderUtils);
|
TrackUtils.updateTrack(this, track, null, activityTypeLocalized, null, contentProviderUtils);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class CustomFragmentPagerAdapter extends FragmentStateAdapter {
|
private class CustomFragmentPagerAdapter extends FragmentStateAdapter {
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragm
|
|||||||
import de.dennisguse.opentracks.util.ExportUtils;
|
import de.dennisguse.opentracks.util.ExportUtils;
|
||||||
import de.dennisguse.opentracks.util.IntentUtils;
|
import de.dennisguse.opentracks.util.IntentUtils;
|
||||||
import de.dennisguse.opentracks.util.StringUtils;
|
import de.dennisguse.opentracks.util.StringUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
import de.dennisguse.opentracks.util.TrackUtils;
|
import de.dennisguse.opentracks.util.TrackUtils;
|
||||||
|
|
||||||
public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
|
public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
|
||||||
@@ -50,22 +49,23 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
|
|||||||
|
|
||||||
viewBinding.trackEditName.setText(track.getName());
|
viewBinding.trackEditName.setText(track.getName());
|
||||||
|
|
||||||
viewBinding.trackEditActivityType.setText(track.getActivityType());
|
viewBinding.trackEditActivityType.setText(track.getActivityTypeLocalized());
|
||||||
|
|
||||||
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this));
|
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this));
|
||||||
viewBinding.trackEditActivityType.setAdapter(adapter);
|
viewBinding.trackEditActivityType.setAdapter(adapter);
|
||||||
viewBinding.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.trackEditActivityType.getAdapter().getItem(position))));
|
viewBinding.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> {
|
||||||
|
String localizedActivityType = (String) viewBinding.trackEditActivityType.getAdapter().getItem(position);
|
||||||
|
setActivityTypeIcon(ActivityType.findByLocalizedString(this, localizedActivityType));
|
||||||
|
});
|
||||||
viewBinding.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
|
viewBinding.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
|
||||||
if (!hasFocus) {
|
if (!hasFocus) {
|
||||||
setActivityTypeIcon(TrackIconUtils.getIconValue(
|
String localizedActivityType = viewBinding.trackEditActivityType.getText().toString();
|
||||||
TrackStoppedActivity.this, viewBinding.trackEditActivityType.getText().toString()));
|
setActivityTypeIcon(ActivityType.findByLocalizedString(this, localizedActivityType));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
String iconValue = track.getIcon();
|
setActivityTypeIcon(track.getActivityType());
|
||||||
|
viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), this, viewBinding.trackEditActivityType.getText().toString()));
|
||||||
setActivityTypeIcon(iconValue);
|
|
||||||
viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.trackEditActivityType.getText().toString()));
|
|
||||||
|
|
||||||
viewBinding.trackEditDescription.setText(track.getDescription());
|
viewBinding.trackEditDescription.setText(track.getDescription());
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
|
|||||||
{
|
{
|
||||||
Pair<String, String> parts = SpeedFormatter.Builder()
|
Pair<String, String> parts = SpeedFormatter.Builder()
|
||||||
.setUnit(PreferencesUtils.getUnitSystem())
|
.setUnit(PreferencesUtils.getUnitSystem())
|
||||||
.setReportSpeedOrPace(PreferencesUtils.isReportSpeed(track.getActivityType()))
|
.setReportSpeedOrPace(PreferencesUtils.isReportSpeed(track))
|
||||||
.build(this)
|
.build(this)
|
||||||
.getSpeedParts(track.getTrackStatistics().getAverageMovingSpeed());
|
.getSpeedParts(track.getTrackStatistics().getAverageMovingSpeed());
|
||||||
viewBinding.speed.setText(parts.first);
|
viewBinding.speed.setText(parts.first);
|
||||||
@@ -125,14 +125,14 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
|
|||||||
return viewBinding.getRoot();
|
return viewBinding.getRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setActivityTypeIcon(String iconValue) {
|
private void setActivityTypeIcon(ActivityType activityType) {
|
||||||
viewBinding.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue));
|
viewBinding.trackEditActivityTypeIcon.setImageResource(activityType.getIconDrawableId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChooseActivityTypeDone(String iconValue) {
|
public void onChooseActivityTypeDone(ActivityType activityType) {
|
||||||
setActivityTypeIcon(iconValue);
|
setActivityTypeIcon(activityType);
|
||||||
viewBinding.trackEditActivityType.setText(getString(TrackIconUtils.getIconActivityType(iconValue)));
|
viewBinding.trackEditActivityType.setText(getString(activityType.getLocalizedStringId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resumeTrackAndFinish() {
|
private void resumeTrackAndFinish() {
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener {
|
|||||||
|
|
||||||
// Stats gathered from the received data
|
// Stats gathered from the received data
|
||||||
private final List<ChartPoint> pendingPoints = new ArrayList<>();
|
private final List<ChartPoint> pendingPoints = new ArrayList<>();
|
||||||
private String category = "";
|
private String activityTypeLocalized = "";
|
||||||
|
|
||||||
// Modes of operation
|
// Modes of operation
|
||||||
private boolean chartByDistance;
|
private boolean chartByDistance;
|
||||||
@@ -87,7 +87,7 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (PreferencesUtils.isKey(R.string.stats_rate_key, key)) {
|
if (PreferencesUtils.isKey(R.string.stats_rate_key, key)) {
|
||||||
boolean reportSpeed = PreferencesUtils.isReportSpeed(category);
|
boolean reportSpeed = PreferencesUtils.isReportSpeed(activityTypeLocalized);
|
||||||
if (reportSpeed != viewBinding.chartView.getReportSpeed()) {
|
if (reportSpeed != viewBinding.chartView.getReportSpeed()) {
|
||||||
viewBinding.chartView.setReportSpeed(reportSpeed);
|
viewBinding.chartView.setReportSpeed(reportSpeed);
|
||||||
viewBinding.chartView.applyReportSpeed();
|
viewBinding.chartView.applyReportSpeed();
|
||||||
@@ -160,12 +160,12 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener {
|
|||||||
public void onTrackUpdated(Track track) {
|
public void onTrackUpdated(Track track) {
|
||||||
if (isResumed()) {
|
if (isResumed()) {
|
||||||
if (track == null) {
|
if (track == null) {
|
||||||
category = "";
|
activityTypeLocalized = "";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
category = track.getActivityType();
|
activityTypeLocalized = track.getActivityTypeLocalized();
|
||||||
boolean reportSpeed = PreferencesUtils.isReportSpeed(category);
|
boolean reportSpeed = PreferencesUtils.isReportSpeed(activityTypeLocalized);
|
||||||
if (reportSpeed != viewBinding.chartView.getReportSpeed()) {
|
if (reportSpeed != viewBinding.chartView.getReportSpeed()) {
|
||||||
viewBinding.chartView.setReportSpeed(reportSpeed);
|
viewBinding.chartView.setReportSpeed(reportSpeed);
|
||||||
viewBinding.chartView.applyReportSpeed();
|
viewBinding.chartView.applyReportSpeed();
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import java.util.List;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.BuildConfig;
|
import de.dennisguse.opentracks.BuildConfig;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Altitude;
|
import de.dennisguse.opentracks.data.models.Altitude;
|
||||||
import de.dennisguse.opentracks.data.models.Cadence;
|
import de.dennisguse.opentracks.data.models.Cadence;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
@@ -100,7 +101,7 @@ public class ContentProviderUtils {
|
|||||||
int uuidIndex = cursor.getColumnIndexOrThrow(TracksColumns.UUID);
|
int uuidIndex = cursor.getColumnIndexOrThrow(TracksColumns.UUID);
|
||||||
int nameIndex = cursor.getColumnIndexOrThrow(TracksColumns.NAME);
|
int nameIndex = cursor.getColumnIndexOrThrow(TracksColumns.NAME);
|
||||||
int descriptionIndex = cursor.getColumnIndexOrThrow(TracksColumns.DESCRIPTION);
|
int descriptionIndex = cursor.getColumnIndexOrThrow(TracksColumns.DESCRIPTION);
|
||||||
int categoryIndex = cursor.getColumnIndexOrThrow(TracksColumns.ACTIVITY_TYPE);
|
int activityTypeLocalizedIndex = cursor.getColumnIndexOrThrow(TracksColumns.ACTIVITY_TYPE_LOCALIZED);
|
||||||
int startTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME);
|
int startTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME);
|
||||||
int startTimeOffsetIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME_OFFSET);
|
int startTimeOffsetIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME_OFFSET);
|
||||||
int stopTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STOPTIME);
|
int stopTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STOPTIME);
|
||||||
@@ -128,8 +129,8 @@ public class ContentProviderUtils {
|
|||||||
if (!cursor.isNull(descriptionIndex)) {
|
if (!cursor.isNull(descriptionIndex)) {
|
||||||
track.setDescription(cursor.getString(descriptionIndex));
|
track.setDescription(cursor.getString(descriptionIndex));
|
||||||
}
|
}
|
||||||
if (!cursor.isNull(categoryIndex)) {
|
if (!cursor.isNull(activityTypeLocalizedIndex)) {
|
||||||
track.setActivityType(cursor.getString(categoryIndex));
|
track.setActivityTypeLocalized(cursor.getString(activityTypeLocalizedIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cursor.isNull(startTimeIndex)) {
|
if (!cursor.isNull(startTimeIndex)) {
|
||||||
@@ -163,7 +164,7 @@ public class ContentProviderUtils {
|
|||||||
trackStatistics.setTotalAltitudeLoss(cursor.getFloat(altitudeLossIndex));
|
trackStatistics.setTotalAltitudeLoss(cursor.getFloat(altitudeLossIndex));
|
||||||
}
|
}
|
||||||
if (!cursor.isNull(iconIndex)) {
|
if (!cursor.isNull(iconIndex)) {
|
||||||
track.setIcon(cursor.getString(iconIndex));
|
track.setActivityType(ActivityType.findBy(cursor.getString(iconIndex)));
|
||||||
}
|
}
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
@@ -290,7 +291,7 @@ public class ContentProviderUtils {
|
|||||||
values.put(TracksColumns.UUID, UUIDUtils.toBytes(track.getUuid()));
|
values.put(TracksColumns.UUID, UUIDUtils.toBytes(track.getUuid()));
|
||||||
values.put(TracksColumns.NAME, track.getName());
|
values.put(TracksColumns.NAME, track.getName());
|
||||||
values.put(TracksColumns.DESCRIPTION, track.getDescription());
|
values.put(TracksColumns.DESCRIPTION, track.getDescription());
|
||||||
values.put(TracksColumns.ACTIVITY_TYPE, track.getActivityType());
|
values.put(TracksColumns.ACTIVITY_TYPE_LOCALIZED, track.getActivityTypeLocalized());
|
||||||
values.put(TracksColumns.STARTTIME_OFFSET, track.getZoneOffset().getTotalSeconds());
|
values.put(TracksColumns.STARTTIME_OFFSET, track.getZoneOffset().getTotalSeconds());
|
||||||
if (trackStatistics.getStartTime() != null) {
|
if (trackStatistics.getStartTime() != null) {
|
||||||
values.put(TracksColumns.STARTTIME, trackStatistics.getStartTime().toEpochMilli());
|
values.put(TracksColumns.STARTTIME, trackStatistics.getStartTime().toEpochMilli());
|
||||||
@@ -308,7 +309,7 @@ public class ContentProviderUtils {
|
|||||||
values.put(TracksColumns.MAX_ALTITUDE, trackStatistics.getMaxAltitude());
|
values.put(TracksColumns.MAX_ALTITUDE, trackStatistics.getMaxAltitude());
|
||||||
values.put(TracksColumns.ALTITUDE_GAIN, trackStatistics.getTotalAltitudeGain());
|
values.put(TracksColumns.ALTITUDE_GAIN, trackStatistics.getTotalAltitudeGain());
|
||||||
values.put(TracksColumns.ALTITUDE_LOSS, trackStatistics.getTotalAltitudeLoss());
|
values.put(TracksColumns.ALTITUDE_LOSS, trackStatistics.getTotalAltitudeLoss());
|
||||||
values.put(TracksColumns.ICON, track.getIcon());
|
values.put(TracksColumns.ICON, track.getActivityType() != null ? track.getActivityType().getIconId() : "");
|
||||||
|
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ public class TrackSelection implements ContentProviderUtils.ContentProviderSelec
|
|||||||
}
|
}
|
||||||
if (!categories.isEmpty()) {
|
if (!categories.isEmpty()) {
|
||||||
selection += selection.isEmpty() ? "" : " AND ";
|
selection += selection.isEmpty() ? "" : " AND ";
|
||||||
selection += String.format(TracksColumns.ACTIVITY_TYPE + " IN (%s)", TextUtils.join(",", Collections.nCopies(categories.size(), "?")));
|
selection += String.format(TracksColumns.ACTIVITY_TYPE_LOCALIZED + " IN (%s)", TextUtils.join(",", Collections.nCopies(categories.size(), "?")));
|
||||||
}
|
}
|
||||||
if (from != null && to != null) {
|
if (from != null && to != null) {
|
||||||
selection += selection.isEmpty() ? "" : " AND ";
|
selection += selection.isEmpty() ? "" : " AND ";
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package de.dennisguse.opentracks.data.models;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
|
|
||||||
|
public enum ActivityIcon {
|
||||||
|
AIRPLANE("AIRPLANE", R.drawable.ic_activity_flight_24dp),
|
||||||
|
BIKE("BIKE", R.drawable.ic_activity_bike_24dp),
|
||||||
|
MOUNTAIN_BIKE("MOUNTAIN_BIKE", R.drawable.ic_activity_mtb_24dp),
|
||||||
|
MOTOR_BIKE("MOTOR_BIKE", R.drawable.ic_activity_motorbike_24dp),
|
||||||
|
KAYAK("KAYAK", R.drawable.ic_activity_kayaking_24dp),
|
||||||
|
BOAT("BOAT", R.drawable.ic_activity_boat_24dp),
|
||||||
|
SAILING("SAILING", R.drawable.ic_activity_sailing_24dp),
|
||||||
|
DRIVE("DRIVE", R.drawable.ic_activity_drive_24dp),
|
||||||
|
RUN("RUN", R.drawable.ic_activity_run_24dp),
|
||||||
|
SKI("SKI", R.drawable.ic_activity_skiing_24dp),
|
||||||
|
SNOW_BOARDING("SNOW_BOARDING", R.drawable.ic_activity_snowboarding_24dp),
|
||||||
|
UNKNOWN("UNKNOWN", R.drawable.ic_logo_24dp),
|
||||||
|
WALK("WALK", R.drawable.ic_activity_walk_24dp),
|
||||||
|
ESCOOTER("ESCOOTER", R.drawable.ic_activity_escooter_24dp),
|
||||||
|
INLINE_SKATING("INLINES_SKATING", R.drawable.ic_activity_inline_skating_24dp),
|
||||||
|
SKATE_BOARDING("SKATE_BOARDING", R.drawable.ic_activity_skateboarding_24dp),
|
||||||
|
CLIMBING("CLIMBING", R.drawable.ic_activity_climbing_24dp),
|
||||||
|
SWIMMING("SWIMMING", R.drawable.ic_activity_swimming_24dp),
|
||||||
|
SWIMMING_OPEN("SWIMMING_OPEN", R.drawable.ic_activity_swimming_open_24dp),
|
||||||
|
WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp);
|
||||||
|
|
||||||
|
@Deprecated //TODO should be removed.
|
||||||
|
final String iconId;
|
||||||
|
final int iconDrawableId;
|
||||||
|
|
||||||
|
ActivityIcon(String iconId, int iconDrawableId) {
|
||||||
|
this.iconId = iconId;
|
||||||
|
this.iconDrawableId = iconDrawableId;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
package de.dennisguse.opentracks.data.models;
|
package de.dennisguse.opentracks.data.models;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -10,70 +12,138 @@ import java.util.stream.Collectors;
|
|||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
|
|
||||||
public enum ActivityType {
|
public enum ActivityType {
|
||||||
AIRPLANE("AIRPLANE", R.drawable.ic_activity_flight_24dp, true, R.string.activity_type_airplane, R.string.activity_type_commercial_airplane, R.string.activity_type_rc_airplane),
|
|
||||||
BIKE("BIKE", R.drawable.ic_activity_bike_24dp, true, R.string.activity_type_biking, R.string.activity_type_cycling, R.string.activity_type_dirt_bike, R.string.activity_type_road_biking, R.string.activity_type_track_cycling),
|
AIRPLANE("airplane", R.string.activity_type_airplane, ActivityIcon.AIRPLANE, true),
|
||||||
MOUNTAIN_BIKE("MOUNTAIN_BIKE", R.drawable.ic_activity_mtb_24dp, true, R.string.activity_type_mountain_biking),
|
ATV("ATV", R.string.activity_type_atv, ActivityIcon.DRIVE, true),
|
||||||
MOTOR_BIKE("MOTOR_BIKE", R.drawable.ic_activity_motorbike_24dp, true, R.string.activity_type_motor_bike),
|
BIKING("biking", R.string.activity_type_biking, ActivityIcon.BIKE, true),
|
||||||
KAYAK("KAYAK", R.drawable.ic_activity_kayaking_24dp, true, R.string.activity_type_kayaking),
|
BLIMP("blimp", R.string.activity_type_blimp, ActivityIcon.UNKNOWN, true),
|
||||||
BOAT("BOAT", R.drawable.ic_activity_boat_24dp, true, R.string.activity_type_boat, R.string.activity_type_ferry, R.string.activity_type_motor_boating, R.string.activity_type_rc_boat),
|
BOAT("boat", R.string.activity_type_boat, ActivityIcon.BOAT, true),
|
||||||
SAILING("SAILING", R.drawable.ic_activity_sailing_24dp, true, R.string.activity_type_sailing),
|
CLIMBING("climbing", R.string.activity_type_climbing, ActivityIcon.CLIMBING, false),
|
||||||
DRIVE("DRIVE", R.drawable.ic_activity_drive_24dp, true, R.string.activity_type_atv, R.string.activity_type_driving, R.string.activity_type_driving_bus, R.string.activity_type_driving_car),
|
COMMERCIAL_AIRPLANE("commercial airplane", R.string.activity_type_commercial_airplane, ActivityIcon.AIRPLANE, true),
|
||||||
RUN("RUN", R.drawable.ic_activity_run_24dp, false, R.string.activity_type_running, R.string.activity_type_street_running, R.string.activity_type_track_running, R.string.activity_type_trail_running),
|
CROSS_COUNTRY_SKIING("cross-country skiing", R.string.activity_type_cross_country_skiing, ActivityIcon.SKI, true),
|
||||||
SKI("SKI", R.drawable.ic_activity_skiing_24dp, true, R.string.activity_type_cross_country_skiing, R.string.activity_type_skiing),
|
CYCLING("cycling", R.string.activity_type_cycling, ActivityIcon.BIKE, true),
|
||||||
SNOW_BOARDING("SNOW_BOARDING", R.drawable.ic_activity_snowboarding_24dp, true, R.string.activity_type_snow_boarding),
|
DIRT_BIKE("dirt bike", R.string.activity_type_dirt_bike, ActivityIcon.MOTOR_BIKE, true),
|
||||||
UNKNOWN("UNKNOWN", R.drawable.ic_logo_24dp, true, R.string.activity_type_unknown),
|
DONKEY_BACK_RIDING("donkey back riding", R.string.activity_type_donkey_back_riding, ActivityIcon.UNKNOWN, true),
|
||||||
WALK("WALK", R.drawable.ic_activity_walk_24dp, false, R.string.activity_type_hiking, R.string.activity_type_off_trail_hiking, R.string.activity_type_speed_walking, R.string.activity_type_trail_hiking, R.string.activity_type_walking),
|
DRIVING("driving", R.string.activity_type_driving, ActivityIcon.DRIVE, true),
|
||||||
ESCOOTER("ESCOOTER", R.drawable.ic_activity_escooter_24dp, true, R.string.activity_type_escooter),
|
DRIVING_BUS("driving bus", R.string.activity_type_driving_bus, ActivityIcon.DRIVE, true),
|
||||||
INLINE_SKATING("INLINES_SKATING", R.drawable.ic_activity_inline_skating_24dp, true, R.string.activity_type_inline_skating),
|
DRIVING_CAR("driving car", R.string.activity_type_driving_car, ActivityIcon.DRIVE, true),
|
||||||
SKATE_BOARDING("SKATE_BOARDING", R.drawable.ic_activity_skateboarding_24dp, true, R.string.activity_type_skate_boarding),
|
ESCOOTER("escooter", R.string.activity_type_escooter, ActivityIcon.ESCOOTER, true),
|
||||||
CLIMBING("CLIMBING", R.drawable.ic_activity_climbing_24dp, false, R.string.activity_type_climbing),
|
FERRY("ferry", R.string.activity_type_ferry, ActivityIcon.BOAT, true),
|
||||||
SWIMMING("SWIMMING", R.drawable.ic_activity_swimming_24dp, false, R.string.activity_type_swimming),
|
FRISBEE("frisbee", R.string.activity_type_frisbee, ActivityIcon.UNKNOWN, true),
|
||||||
SWIMMING_OPEN("SWIMMING_OPEN", R.drawable.ic_activity_swimming_open_24dp, false, R.string.activity_type_swimming_open),
|
GLIDING("gliding", R.string.activity_type_gliding, ActivityIcon.UNKNOWN, true),
|
||||||
WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp, false, R.string.activity_type_workout);
|
HANG_GLIDING("hang gliding", R.string.activity_type_hang_gliding, ActivityIcon.UNKNOWN, true),
|
||||||
|
HELICOPTER("helicopter", R.string.activity_type_helicopter, ActivityIcon.UNKNOWN, true),
|
||||||
|
HIKING("hiking", R.string.activity_type_hiking, ActivityIcon.WALK, false),
|
||||||
|
HORSE_BACK_RIDING("horse back riding", R.string.activity_type_horse_back_riding, ActivityIcon.UNKNOWN, true),
|
||||||
|
HOT_AIR_BALLOON("hot air balloon", R.string.activity_type_hot_air_balloon, ActivityIcon.UNKNOWN, true),
|
||||||
|
ICE_SAILING("ice sailing", R.string.activity_type_ice_sailing, ActivityIcon.UNKNOWN, true),
|
||||||
|
INLINE_SKATING("inline skating", R.string.activity_type_inline_skating, ActivityIcon.INLINE_SKATING, true),
|
||||||
|
KAYAKING("kayaking", R.string.activity_type_kayaking, ActivityIcon.KAYAK, true),
|
||||||
|
KITE_SURFING("kite surfing", R.string.activity_type_kite_surfing, ActivityIcon.UNKNOWN, true),
|
||||||
|
LAND_SAILING("land sailing", R.string.activity_type_land_sailing, ActivityIcon.UNKNOWN, true),
|
||||||
|
MIXED_TYPE("mixed type", R.string.activity_type_mixed_type, ActivityIcon.UNKNOWN, true),
|
||||||
|
MOTOR_BIKE("motor bike", R.string.activity_type_motor_bike, ActivityIcon.MOTOR_BIKE, true),
|
||||||
|
MOTOR_BOATING("motor boating", R.string.activity_type_motor_boating, ActivityIcon.BOAT, true),
|
||||||
|
MOUNTAIN_BIKING("mountain biking", R.string.activity_type_mountain_biking, ActivityIcon.MOUNTAIN_BIKE, true),
|
||||||
|
OFF_TRAIL_HIKING("off trail hiking", R.string.activity_type_hiking, ActivityIcon.WALK, false),
|
||||||
|
OTHER("other", R.string.activity_type_other, ActivityIcon.UNKNOWN, true),
|
||||||
|
PADDLING("paddling", R.string.activity_type_paddling, ActivityIcon.UNKNOWN, true),
|
||||||
|
PARA_GLIDING("para gliding", R.string.activity_type_para_gliding, ActivityIcon.UNKNOWN, true),
|
||||||
|
RC_AIRPLANE("RC airplane", R.string.activity_type_rc_airplane, ActivityIcon.AIRPLANE, true),
|
||||||
|
RC_BOAT("RC boat", R.string.activity_type_rc_boat, ActivityIcon.BOAT, true),
|
||||||
|
RC_HELICOPTER("RC helicopter", R.string.activity_type_rc_helicopter, ActivityIcon.UNKNOWN, true),
|
||||||
|
RIDING("riding", R.string.activity_type_horse_back_riding, ActivityIcon.UNKNOWN, true),
|
||||||
|
ROAD_BIKING("road biking", R.string.activity_type_road_biking, ActivityIcon.BIKE, true),
|
||||||
|
ROLLER_SKIING("roller skiing", R.string.activity_type_roller_skiing, ActivityIcon.UNKNOWN, true),
|
||||||
|
ROWING("rowing", R.string.activity_type_rowing, ActivityIcon.UNKNOWN, true),
|
||||||
|
RUNNING("running", R.string.activity_type_running, ActivityIcon.RUN, false),
|
||||||
|
SAILING("sailing", R.string.activity_type_sailing, ActivityIcon.SAILING, true),
|
||||||
|
SEAPLANE("seaplane", R.string.activity_type_seaplane, ActivityIcon.AIRPLANE, true),
|
||||||
|
SKATE_BOARDING("skate boarding", R.string.activity_type_skate_boarding, ActivityIcon.SKATE_BOARDING, true),
|
||||||
|
SKATING("skating", R.string.activity_type_skating, ActivityIcon.UNKNOWN, true),
|
||||||
|
SKIING("skiing", R.string.activity_type_skiing, ActivityIcon.SKI, true),
|
||||||
|
SKY_JUMPING("sky jumping", R.string.activity_type_sky_jumping, ActivityIcon.UNKNOWN, true),
|
||||||
|
SLED("sled", R.string.activity_type_sled, ActivityIcon.UNKNOWN, true),
|
||||||
|
SNOW_BOARDING("snow boarding", R.string.activity_type_snow_boarding, ActivityIcon.SNOW_BOARDING, true),
|
||||||
|
SNOW_SHOEING("snow shoeing", R.string.activity_type_snow_shoeing, ActivityIcon.UNKNOWN, true),
|
||||||
|
SPEED_WALKING("speed walking", R.string.activity_type_speed_walking, ActivityIcon.WALK, false),
|
||||||
|
STREET_RUNNING("street running", R.string.activity_type_street_running, ActivityIcon.RUN, false),
|
||||||
|
SURFING("surfing", R.string.activity_type_surfing, ActivityIcon.UNKNOWN, true),
|
||||||
|
TRACK_CYCLING("track cycling", R.string.activity_type_track_cycling, ActivityIcon.BIKE, true),
|
||||||
|
TRACK_RUNNING("track running", R.string.activity_type_trail_running, ActivityIcon.RUN, false),
|
||||||
|
TRAIL_HIKING("trail hiking", R.string.activity_type_trail_hiking, ActivityIcon.WALK, false),
|
||||||
|
TRAIL_RUNNING("trail running", R.string.activity_type_trail_running, ActivityIcon.RUN, false),
|
||||||
|
TRAIN("train", R.string.activity_type_train, ActivityIcon.UNKNOWN, true),
|
||||||
|
ULTIMATE_FRISBEE("ultimate frisbee", R.string.activity_type_ultimate_frisbee, ActivityIcon.UNKNOWN, true),
|
||||||
|
WAKEBOARDING("wakeboarding", R.string.activity_type_wakeboarding, ActivityIcon.UNKNOWN, true),
|
||||||
|
WALKING("walking", R.string.activity_type_walking, ActivityIcon.WALK, false),
|
||||||
|
WATER_SKIING("water skiing", R.string.activity_type_water_skiing, ActivityIcon.UNKNOWN, true),
|
||||||
|
WIND_SURFING("wind surfing", R.string.activity_type_wind_surfing, ActivityIcon.UNKNOWN, true),
|
||||||
|
SWIMMING("swimming", R.string.activity_type_swimming, ActivityIcon.SWIMMING, false),
|
||||||
|
SWIMMING_OPEN("swimming in open water", R.string.activity_type_swimming_open, ActivityIcon.SWIMMING_OPEN, false),
|
||||||
|
WORKOUT("workout", R.string.activity_type_workout, ActivityIcon.WORKOUT, false),
|
||||||
|
UNKNOWN("unknown", R.string.activity_type_unknown, ActivityIcon.UNKNOWN, true);
|
||||||
|
|
||||||
final String id;
|
final String id;
|
||||||
final int iconId;
|
|
||||||
|
final ActivityIcon icon;
|
||||||
final boolean showSpeedPreferred;
|
final boolean showSpeedPreferred;
|
||||||
final int[] localizedStringIds;
|
final int localizedStringId;
|
||||||
|
|
||||||
//isSpeed?
|
ActivityType(String id, int localizedStringId, ActivityIcon icon, boolean showSpeedPreferred) {
|
||||||
|
|
||||||
ActivityType(String id, int iconId, boolean showSpeedPreferred, int... localizedStringIds) {
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.iconId = iconId;
|
this.localizedStringId = localizedStringId;
|
||||||
|
this.icon = icon;
|
||||||
this.showSpeedPreferred = showSpeedPreferred;
|
this.showSpeedPreferred = showSpeedPreferred;
|
||||||
this.localizedStringIds = localizedStringIds;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getIconId() {
|
@Deprecated
|
||||||
return iconId;
|
public String getIconId() {
|
||||||
|
return icon.iconId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIconDrawableId() {
|
||||||
|
return icon.iconDrawableId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLocalizedStringId() {
|
||||||
|
return localizedStringId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isShowSpeedPreferred() {
|
public boolean isShowSpeedPreferred() {
|
||||||
return showSpeedPreferred;
|
return showSpeedPreferred;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int[] getLocalizedStringIds() {
|
|
||||||
return localizedStringIds;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getFirstLocalizedStringId() {
|
|
||||||
return localizedStringIds[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<String> getLocalizedStrings(Context context) {
|
public static List<String> getLocalizedStrings(Context context) {
|
||||||
List<String> result = new ArrayList<>();
|
return Arrays.stream(values())
|
||||||
for (ActivityType activityType : values()) {
|
.map(ActivityType::getLocalizedStringId)
|
||||||
List<String> strings = Arrays.stream(activityType.localizedStringIds)
|
.map(context::getString)
|
||||||
.mapToObj(context::getString)
|
.collect(Collectors.toList());
|
||||||
.collect(Collectors.toList());
|
}
|
||||||
result.addAll(strings);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
@NonNull
|
||||||
|
public static ActivityType findBy(String iconId) {
|
||||||
|
if (ActivityIcon.UNKNOWN.iconId.equals(iconId)) {
|
||||||
|
return ActivityType.UNKNOWN;
|
||||||
|
}
|
||||||
|
return Arrays.stream(ActivityType.values()).filter(
|
||||||
|
it -> it.icon.iconId.equals(iconId)
|
||||||
|
).findFirst()
|
||||||
|
.orElse(ActivityType.UNKNOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ActivityType findByLocalizedString(Context context, String localizedActivityType) {
|
||||||
|
return findByLocalizedString(context.getResources(), localizedActivityType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ActivityType findByLocalizedString(Resources resources, String localizedActivityType) {
|
||||||
|
return Arrays.stream(ActivityType.values())
|
||||||
|
.filter(it -> resources.getString(it.getLocalizedStringId()).equals(localizedActivityType))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(ActivityType.UNKNOWN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,9 +44,9 @@ public class Track {
|
|||||||
|
|
||||||
private String name = "";
|
private String name = "";
|
||||||
private String description = "";
|
private String description = "";
|
||||||
private String activityType = "";
|
private String activityTypeLocalized = "";
|
||||||
|
|
||||||
private String icon = "";
|
private ActivityType activityType;
|
||||||
|
|
||||||
private final ZoneOffset zoneOffset;
|
private final ZoneOffset zoneOffset;
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ public class Track {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public Track() {
|
public Track() {
|
||||||
this.zoneOffset = ZoneOffset.UTC;
|
this(ZoneOffset.UTC);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Track(@NonNull ZoneOffset zoneOffset) {
|
public Track(@NonNull ZoneOffset zoneOffset) {
|
||||||
@@ -97,22 +97,22 @@ public class Track {
|
|||||||
this.description = description;
|
this.description = description;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getActivityType() {
|
public String getActivityTypeLocalized() {
|
||||||
|
return activityTypeLocalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setActivityTypeLocalized(String activityType) {
|
||||||
|
this.activityTypeLocalized = activityType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ActivityType getActivityType() {
|
||||||
return activityType;
|
return activityType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setActivityType(String activityType) {
|
public void setActivityType(ActivityType activityType) {
|
||||||
this.activityType = activityType;
|
this.activityType = activityType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getIcon() {
|
|
||||||
return icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setIcon(String icon) {
|
|
||||||
this.icon = icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ZoneOffset getZoneOffset() {
|
public ZoneOffset getZoneOffset() {
|
||||||
return zoneOffset;
|
return zoneOffset;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public interface TracksColumns extends BaseColumns {
|
|||||||
String UUID = "uuid"; // identifier to make tracks globally unique (prevent re-import)
|
String UUID = "uuid"; // identifier to make tracks globally unique (prevent re-import)
|
||||||
String NAME = "name"; // track name
|
String NAME = "name"; // track name
|
||||||
String DESCRIPTION = "description"; // track description
|
String DESCRIPTION = "description"; // track description
|
||||||
String ACTIVITY_TYPE = "category"; // track activity type
|
String ACTIVITY_TYPE_LOCALIZED = "category"; // track activity type
|
||||||
String STARTTIME = "starttime"; // track start time
|
String STARTTIME = "starttime"; // track start time
|
||||||
String STARTTIME_OFFSET = "starttime_offset"; // in plus/minus in seconds
|
String STARTTIME_OFFSET = "starttime_offset"; // in plus/minus in seconds
|
||||||
String STOPTIME = "stoptime"; // track stop time
|
String STOPTIME = "stoptime"; // track stop time
|
||||||
@@ -57,13 +57,13 @@ public interface TracksColumns extends BaseColumns {
|
|||||||
String MAX_ALTITUDE = "maxelevation"; // maximum altitude //TODO RENAME column
|
String MAX_ALTITUDE = "maxelevation"; // maximum altitude //TODO RENAME column
|
||||||
String ALTITUDE_GAIN = "elevationgain"; // altitude gain //TODO RENAME column
|
String ALTITUDE_GAIN = "elevationgain"; // altitude gain //TODO RENAME column
|
||||||
String ALTITUDE_LOSS = "elevationloss"; // altitude loss //TODO RENAME column
|
String ALTITUDE_LOSS = "elevationloss"; // altitude loss //TODO RENAME column
|
||||||
String ICON = "icon"; // track activity type icon
|
String ICON = "icon"; // track activity type icon //TODO DEPRECATED
|
||||||
|
|
||||||
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " ("
|
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " ("
|
||||||
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
+ NAME + " TEXT, "
|
+ NAME + " TEXT, "
|
||||||
+ DESCRIPTION + " TEXT, "
|
+ DESCRIPTION + " TEXT, "
|
||||||
+ ACTIVITY_TYPE + " TEXT, "
|
+ ACTIVITY_TYPE_LOCALIZED + " TEXT, "
|
||||||
+ STARTTIME + " INTEGER, "
|
+ STARTTIME + " INTEGER, "
|
||||||
+ STOPTIME + " INTEGER, "
|
+ STOPTIME + " INTEGER, "
|
||||||
+ NUMPOINTS + " INTEGER, "
|
+ NUMPOINTS + " INTEGER, "
|
||||||
|
|||||||
+45
-20
@@ -16,37 +16,62 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.databinding.ChooseActivityTypeBinding;
|
import de.dennisguse.opentracks.databinding.ChooseActivityTypeBinding;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A DialogFragment to choose an activity type.
|
|
||||||
*/
|
|
||||||
public class ChooseActivityTypeDialogFragment extends DialogFragment implements AdapterView.OnItemClickListener {
|
public class ChooseActivityTypeDialogFragment extends DialogFragment implements AdapterView.OnItemClickListener {
|
||||||
|
|
||||||
private static final String CHOOSE_ACTIVITY_TYPE_DIALOG_TAG = "chooseActivityType";
|
private static final String CHOOSE_ACTIVITY_TYPE_DIALOG_TAG = "chooseActivityType";
|
||||||
|
|
||||||
public static void showDialog(FragmentManager fragmentManager, String preselectedCategory) {
|
@Deprecated
|
||||||
new ChooseActivityTypeDialogFragment(preselectedCategory).show(fragmentManager, ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG);
|
public static void showDialog(FragmentManager fragmentManager, Context context, String activityTypeLocalized) {
|
||||||
|
ActivityType activityType = ActivityType.findByLocalizedString(context, activityTypeLocalized);
|
||||||
|
showDialog(fragmentManager, activityType);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getPosition(Context context, String category) {
|
public static void showDialog(FragmentManager fragmentManager, ActivityType activityType) {
|
||||||
if (category == null) {
|
new ChooseActivityTypeDialogFragment(activityType).show(fragmentManager, ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final List<ActivityType> activityTypes = List.of(
|
||||||
|
ActivityType.UNKNOWN,
|
||||||
|
ActivityType.AIRPLANE,
|
||||||
|
ActivityType.BIKING,
|
||||||
|
ActivityType.MOUNTAIN_BIKING,
|
||||||
|
ActivityType.MOTOR_BIKE,
|
||||||
|
ActivityType.KAYAKING,
|
||||||
|
ActivityType.BOAT,
|
||||||
|
ActivityType.SAILING,
|
||||||
|
ActivityType.DRIVING,
|
||||||
|
ActivityType.RUNNING,
|
||||||
|
ActivityType.SNOW_BOARDING,
|
||||||
|
ActivityType.SKIING,
|
||||||
|
ActivityType.WALKING,
|
||||||
|
ActivityType.ESCOOTER,
|
||||||
|
ActivityType.INLINE_SKATING,
|
||||||
|
ActivityType.SKATE_BOARDING,
|
||||||
|
ActivityType.CLIMBING,
|
||||||
|
ActivityType.SWIMMING,
|
||||||
|
ActivityType.SWIMMING_OPEN,
|
||||||
|
ActivityType.WORKOUT
|
||||||
|
);
|
||||||
|
|
||||||
|
private static int getPosition(Context context, ActivityType activityType) {
|
||||||
|
if (activityType == null) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
String iconValue = TrackIconUtils.getIconValue(context, category);
|
|
||||||
|
|
||||||
return TrackIconUtils.getAllIconValues().indexOf(iconValue);
|
return activityTypes.indexOf(activityType);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChooseActivityTypeBinding viewBinding;
|
private ChooseActivityTypeBinding viewBinding;
|
||||||
|
|
||||||
private final String preselectedCategory;
|
private final ActivityType preselectedActivityType;
|
||||||
|
|
||||||
private ChooseActivityTypeCaller chooseActivityTypeCaller;
|
private ChooseActivityTypeCaller chooseActivityTypeCaller;
|
||||||
|
|
||||||
private ChooseActivityTypeDialogFragment(String preselectedCategory) {
|
private ChooseActivityTypeDialogFragment(ActivityType activityType) {
|
||||||
this.preselectedCategory = preselectedCategory;
|
this.preselectedActivityType = activityType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@@ -61,13 +86,13 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
viewBinding = ChooseActivityTypeBinding.inflate(inflater, container, false);
|
viewBinding = ChooseActivityTypeBinding.inflate(inflater, container, false);
|
||||||
|
|
||||||
List<Integer> imageIds = new ArrayList<>();
|
List<Integer> iconDrawableIds = new ArrayList<>();
|
||||||
for (String iconValue : TrackIconUtils.getAllIconValues()) {
|
for (ActivityType activityType : activityTypes) {
|
||||||
imageIds.add(TrackIconUtils.getIconDrawable(iconValue));
|
iconDrawableIds.add(activityType.getIconDrawableId());
|
||||||
}
|
}
|
||||||
|
|
||||||
final ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter(imageIds);
|
final ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter(iconDrawableIds);
|
||||||
int position = getPosition(getContext(), preselectedCategory);
|
int position = getPosition(getContext(), preselectedActivityType);
|
||||||
if (position != -1) {
|
if (position != -1) {
|
||||||
imageAdapter.setSelected(position);
|
imageAdapter.setSelected(position);
|
||||||
}
|
}
|
||||||
@@ -94,7 +119,7 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
|
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
|
||||||
chooseActivityTypeCaller.onChooseActivityTypeDone(TrackIconUtils.getAllIconValues().get(position));
|
chooseActivityTypeCaller.onChooseActivityTypeDone(activityTypes.get(position));
|
||||||
dismiss();
|
dismiss();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -103,6 +128,6 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements
|
|||||||
*/
|
*/
|
||||||
public interface ChooseActivityTypeCaller {
|
public interface ChooseActivityTypeCaller {
|
||||||
|
|
||||||
void onChooseActivityTypeDone(String iconValue);
|
void onChooseActivityTypeDone(ActivityType activityType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package de.dennisguse.opentracks.fragments;
|
package de.dennisguse.opentracks.fragments;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -34,6 +35,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.TrackRecordedActivity;
|
import de.dennisguse.opentracks.TrackRecordedActivity;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.DistanceFormatter;
|
import de.dennisguse.opentracks.data.models.DistanceFormatter;
|
||||||
import de.dennisguse.opentracks.data.models.SpeedFormatter;
|
import de.dennisguse.opentracks.data.models.SpeedFormatter;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
@@ -43,7 +45,6 @@ import de.dennisguse.opentracks.settings.UnitSystem;
|
|||||||
import de.dennisguse.opentracks.stats.SensorStatistics;
|
import de.dennisguse.opentracks.stats.SensorStatistics;
|
||||||
import de.dennisguse.opentracks.stats.TrackStatistics;
|
import de.dennisguse.opentracks.stats.TrackStatistics;
|
||||||
import de.dennisguse.opentracks.util.StringUtils;
|
import de.dennisguse.opentracks.util.StringUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A fragment to display track statistics to the user for a recorded {@link Track}.
|
* A fragment to display track statistics to the user for a recorded {@link Track}.
|
||||||
@@ -89,7 +90,7 @@ public class StatisticsRecordedFragment extends Fragment {
|
|||||||
|
|
||||||
if (PreferencesUtils.isKey(R.string.stats_rate_key, key) && track != null) {
|
if (PreferencesUtils.isKey(R.string.stats_rate_key, key) && track != null) {
|
||||||
updateUInecessary = true;
|
updateUInecessary = true;
|
||||||
preferenceReportSpeed = PreferencesUtils.isReportSpeed(track.getActivityType());
|
preferenceReportSpeed = PreferencesUtils.isReportSpeed(track);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key != null && updateUInecessary && isResumed()) {
|
if (key != null && updateUInecessary && isResumed()) {
|
||||||
@@ -155,7 +156,7 @@ public class StatisticsRecordedFragment extends Fragment {
|
|||||||
|
|
||||||
sensorStatistics = contentProviderUtils.getSensorStats(trackId);
|
sensorStatistics = contentProviderUtils.getSensorStats(trackId);
|
||||||
|
|
||||||
boolean prefsChanged = this.track == null || (!this.track.getActivityType().equals(track.getActivityType()));
|
boolean prefsChanged = this.track == null || (!this.track.getActivityTypeLocalized().equals(track.getActivityTypeLocalized()));
|
||||||
this.track = track;
|
this.track = track;
|
||||||
if (prefsChanged) {
|
if (prefsChanged) {
|
||||||
sharedPreferenceChangeListener.onSharedPreferenceChanged(null, getString(R.string.stats_rate_key));
|
sharedPreferenceChangeListener.onSharedPreferenceChanged(null, getString(R.string.stats_rate_key));
|
||||||
@@ -191,8 +192,12 @@ public class StatisticsRecordedFragment extends Fragment {
|
|||||||
|
|
||||||
// Set activity type
|
// Set activity type
|
||||||
{
|
{
|
||||||
String trackIconValue = TrackIconUtils.getIconValue(getContext(), track.getActivityType());
|
Context context = getContext();
|
||||||
viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), TrackIconUtils.getIconDrawable(trackIconValue)));
|
String localizedActivityType = track.getActivityTypeLocalized();
|
||||||
|
String trackIconValue = ActivityType.findByLocalizedString(context, localizedActivityType)
|
||||||
|
.getIconId();
|
||||||
|
viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), ActivityType.findBy(trackIconValue)
|
||||||
|
.getIconDrawableId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set time and start datetime
|
// Set time and start datetime
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class TrackFilenameGenerator {
|
|||||||
|
|
||||||
values.put(UUID_KEY, track.getUuid().toString().substring(0, 8));
|
values.put(UUID_KEY, track.getUuid().toString().substring(0, 8));
|
||||||
values.put(TRACKNAME_KEY, track.getName());
|
values.put(TRACKNAME_KEY, track.getName());
|
||||||
values.put(ACTIVITY_TYPE_KEY, track.getActivityType());
|
values.put(ACTIVITY_TYPE_KEY, track.getActivityTypeLocalized());
|
||||||
values.put(STARTTIME_TIME_KEY, track.getStartTime().toLocalTime().toString());
|
values.put(STARTTIME_TIME_KEY, track.getStartTime().toLocalTime().toString());
|
||||||
values.put(STARTTIME_DATE_KEY, track.getStartTime().toLocalDate().toString());
|
values.put(STARTTIME_DATE_KEY, track.getStartTime().toLocalDate().toString());
|
||||||
|
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ public class GPXTrackExporter implements TrackExporter {
|
|||||||
printWriter.println("<trk>");
|
printWriter.println("<trk>");
|
||||||
printWriter.println("<name>" + StringUtils.formatCData(track.getName()) + "</name>");
|
printWriter.println("<name>" + StringUtils.formatCData(track.getName()) + "</name>");
|
||||||
printWriter.println("<desc>" + StringUtils.formatCData(track.getDescription()) + "</desc>");
|
printWriter.println("<desc>" + StringUtils.formatCData(track.getDescription()) + "</desc>");
|
||||||
printWriter.println("<type>" + StringUtils.formatCData(track.getActivityType()) + "</type>");
|
printWriter.println("<type>" + StringUtils.formatCData(track.getActivityTypeLocalized()) + "</type>");
|
||||||
|
|
||||||
printWriter.println("<extensions>");
|
printWriter.println("<extensions>");
|
||||||
printWriter.println("<topografix:color>c0c0c0</topografix:color>");
|
printWriter.println("<topografix:color>c0c0c0</topografix:color>");
|
||||||
|
|||||||
@@ -307,11 +307,11 @@ public class KMLTrackExporter implements TrackExporter {
|
|||||||
|
|
||||||
printWriter.println("<name>" + StringUtils.formatCData(track.getName()) + "</name>");
|
printWriter.println("<name>" + StringUtils.formatCData(track.getName()) + "</name>");
|
||||||
printWriter.println("<description>" + StringUtils.formatCData(track.getDescription()) + "</description>");
|
printWriter.println("<description>" + StringUtils.formatCData(track.getDescription()) + "</description>");
|
||||||
printWriter.println("<icon>" + StringUtils.formatCData(track.getIcon()) + "</icon>");
|
printWriter.println("<icon>" + StringUtils.formatCData(track.getActivityType().getIconId()) + "</icon>");
|
||||||
printWriter.println("<opentracks:trackid>" + track.getUuid() + "</opentracks:trackid>");
|
printWriter.println("<opentracks:trackid>" + track.getUuid() + "</opentracks:trackid>");
|
||||||
|
|
||||||
printWriter.println("<styleUrl>#" + TRACK_STYLE + "</styleUrl>");
|
printWriter.println("<styleUrl>#" + TRACK_STYLE + "</styleUrl>");
|
||||||
writeActivityType(track.getActivityType());
|
writeActivityType(track.getActivityTypeLocalized());
|
||||||
printWriter.println("<MultiTrack>");
|
printWriter.println("<MultiTrack>");
|
||||||
printWriter.println("<altitudeMode>absolute</altitudeMode>");
|
printWriter.println("<altitudeMode>absolute</altitudeMode>");
|
||||||
printWriter.println("<interpolate>1</interpolate>");
|
printWriter.println("<interpolate>1</interpolate>");
|
||||||
@@ -514,12 +514,12 @@ public class KMLTrackExporter implements TrackExporter {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeActivityType(String actiivtyType) {
|
private void writeActivityType(String activityTypeLocalized) {
|
||||||
if (actiivtyType == null || actiivtyType.equals("")) {
|
if (activityTypeLocalized == null || activityTypeLocalized.equals("")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
printWriter.println("<ExtendedData>");
|
printWriter.println("<ExtendedData>");
|
||||||
printWriter.println("<Data name=\"" + EXTENDED_DATA_TYPE_ACTIVITYTYPE + "\"><value>" + StringUtils.formatCData(actiivtyType) + "</value></Data>");
|
printWriter.println("<Data name=\"" + EXTENDED_DATA_TYPE_ACTIVITYTYPE + "\"><value>" + StringUtils.formatCData(activityTypeLocalized) + "</value></Data>");
|
||||||
printWriter.println("</ExtendedData>");
|
printWriter.println("</ExtendedData>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.Marker;
|
import de.dennisguse.opentracks.data.models.Marker;
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
import de.dennisguse.opentracks.data.models.Speed;
|
||||||
@@ -30,7 +31,6 @@ import de.dennisguse.opentracks.stats.TrackStatisticsUpdater;
|
|||||||
import de.dennisguse.opentracks.ui.markers.MarkerUtils;
|
import de.dennisguse.opentracks.ui.markers.MarkerUtils;
|
||||||
import de.dennisguse.opentracks.util.FileUtils;
|
import de.dennisguse.opentracks.util.FileUtils;
|
||||||
import de.dennisguse.opentracks.util.LocationUtils;
|
import de.dennisguse.opentracks.util.LocationUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles logic to import:
|
* Handles logic to import:
|
||||||
@@ -90,7 +90,7 @@ public class TrackImporter {
|
|||||||
this.markers.addAll(markers);
|
this.markers.addAll(markers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTrack(Context context, String name, String uuid, String description, String activityType, String icon, @Nullable ZoneOffset zoneOffset) {
|
void setTrack(Context context, String name, String uuid, String description, String activityTypeLocalized, String activityTypeId, @Nullable ZoneOffset zoneOffset) {
|
||||||
track = new Track(zoneOffset != null ? zoneOffset : ZoneOffset.UTC);
|
track = new Track(zoneOffset != null ? zoneOffset : ZoneOffset.UTC);
|
||||||
track.setName(name != null ? name : "");
|
track.setName(name != null ? name : "");
|
||||||
|
|
||||||
@@ -103,15 +103,17 @@ public class TrackImporter {
|
|||||||
|
|
||||||
track.setDescription(description != null ? description : "");
|
track.setDescription(description != null ? description : "");
|
||||||
|
|
||||||
if (activityType != null) {
|
if (activityTypeLocalized != null) {
|
||||||
track.setActivityType(activityType);
|
track.setActivityTypeLocalized(activityTypeLocalized);
|
||||||
|
|
||||||
if (icon == null) {
|
|
||||||
icon = TrackIconUtils.getIconValue(context, activityType);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
track.setIcon(icon != null ? icon : "");
|
ActivityType activityType;
|
||||||
|
if (activityTypeId == null) {
|
||||||
|
activityType = ActivityType.findByLocalizedString(context, activityTypeId);
|
||||||
|
} else {
|
||||||
|
activityType = ActivityType.findBy(activityTypeId);
|
||||||
|
}
|
||||||
|
track.setActivityType(activityType);
|
||||||
}
|
}
|
||||||
|
|
||||||
void finish() {
|
void finish() {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import android.os.Bundle;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
import de.dennisguse.opentracks.services.TrackRecordingService;
|
import de.dennisguse.opentracks.services.TrackRecordingService;
|
||||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
||||||
@@ -14,8 +15,8 @@ import de.dennisguse.opentracks.util.TrackUtils;
|
|||||||
public class StartRecording extends AbstractAPIActivity {
|
public class StartRecording extends AbstractAPIActivity {
|
||||||
|
|
||||||
public static final String EXTRA_TRACK_NAME = "TRACK_NAME";
|
public static final String EXTRA_TRACK_NAME = "TRACK_NAME";
|
||||||
public static final String EXTRA_TRACK_CATEGORY = "TRACK_CATEGORY";
|
public static final String EXTRA_TRACK_ACTIVITY_TYPE_LOCALIZED = "TRACK_CATEGORY"; //TODO Update constant
|
||||||
public static final String EXTRA_TRACK_ICON = "TRACK_ICON";
|
public static final String EXTRA_TRACK_ACTIVITY_TYPE_ID = "TRACK_ICON"; //TODO Update constant
|
||||||
public static final String EXTRA_TRACK_DESCRIPTION = "TRACK_DESCRIPTION";
|
public static final String EXTRA_TRACK_DESCRIPTION = "TRACK_DESCRIPTION";
|
||||||
|
|
||||||
public static final String EXTRA_STATS_TARGET_PACKAGE = "STATS_TARGET_PACKAGE";
|
public static final String EXTRA_STATS_TARGET_PACKAGE = "STATS_TARGET_PACKAGE";
|
||||||
@@ -43,8 +44,8 @@ public class StartRecording extends AbstractAPIActivity {
|
|||||||
|
|
||||||
TrackUtils.updateTrack(this, track,
|
TrackUtils.updateTrack(this, track,
|
||||||
bundle.getString(EXTRA_TRACK_NAME, null),
|
bundle.getString(EXTRA_TRACK_NAME, null),
|
||||||
bundle.getString(EXTRA_TRACK_CATEGORY, null),
|
bundle.getString(EXTRA_TRACK_ACTIVITY_TYPE_LOCALIZED, null),
|
||||||
bundle.getString(EXTRA_TRACK_ICON, null),
|
ActivityType.findBy(bundle.getString(EXTRA_TRACK_ACTIVITY_TYPE_ID, null)),
|
||||||
bundle.getString(EXTRA_TRACK_DESCRIPTION, null),
|
bundle.getString(EXTRA_TRACK_DESCRIPTION, null),
|
||||||
contentProviderUtils);
|
contentProviderUtils);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public record RecordingData(Track track, TrackPoint latestTrackPoint, SensorData
|
|||||||
if (track == null) {
|
if (track == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return track.getActivityType();
|
return track.getActivityTypeLocalized();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import java.time.ZoneOffset;
|
|||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.Marker;
|
import de.dennisguse.opentracks.data.models.Marker;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
@@ -24,7 +25,6 @@ import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
|
|||||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
||||||
import de.dennisguse.opentracks.stats.TrackStatistics;
|
import de.dennisguse.opentracks.stats.TrackStatistics;
|
||||||
import de.dennisguse.opentracks.stats.TrackStatisticsUpdater;
|
import de.dennisguse.opentracks.stats.TrackStatisticsUpdater;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
import de.dennisguse.opentracks.util.TrackNameUtils;
|
import de.dennisguse.opentracks.util.TrackNameUtils;
|
||||||
|
|
||||||
class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChangeListener {
|
class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
@@ -72,9 +72,9 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang
|
|||||||
|
|
||||||
onNewTrackPoint(segmentStartTrackPoint);
|
onNewTrackPoint(segmentStartTrackPoint);
|
||||||
|
|
||||||
String category = PreferencesUtils.getDefaultActivity();
|
String activityTypeLocalized = PreferencesUtils.getDefaultActivityTypeLocalized();
|
||||||
track.setActivityType(category);
|
track.setActivityTypeLocalized(activityTypeLocalized);
|
||||||
track.setIcon(TrackIconUtils.getIconValue(context, category));
|
track.setActivityType(ActivityType.findByLocalizedString(context, activityTypeLocalized));
|
||||||
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
|
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
|
||||||
//TODO Pass TrackPoint
|
//TODO Pass TrackPoint
|
||||||
track.setName(TrackNameUtils.getTrackName(context, trackId, track.getStartTime()));
|
track.setName(TrackNameUtils.getTrackName(context, trackId, track.getStartTime()));
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ public class VoiceAnnouncement {
|
|||||||
sensorStatistics = contentProviderUtils.getSensorStats(track.getId());
|
sensorStatistics = contentProviderUtils.getSensorStats(track.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), PreferencesUtils.getUnitSystem(), PreferencesUtils.isReportSpeed(track.getActivityType()), lastInterval, sensorStatistics);
|
Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), PreferencesUtils.getUnitSystem(), PreferencesUtils.isReportSpeed(track), lastInterval, sensorStatistics);
|
||||||
|
|
||||||
if (announcement.length() > 0) {
|
if (announcement.length() > 0) {
|
||||||
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
|
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import androidx.preference.PreferenceDialogFragmentCompat;
|
|||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.data.models.ActivityType;
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For entering the default activity type.
|
* For entering the default activity type.
|
||||||
@@ -47,7 +46,7 @@ public class ActivityTypePreference extends DialogPreference {
|
|||||||
setDialogIcon(null);
|
setDialogIcon(null);
|
||||||
setPersistent(true);
|
setPersistent(true);
|
||||||
|
|
||||||
SummaryProvider<DialogPreference> summaryProvider = preference -> PreferencesUtils.getDefaultActivity();
|
SummaryProvider<DialogPreference> summaryProvider = preference -> PreferencesUtils.getDefaultActivityTypeLocalized();
|
||||||
setSummaryProvider(summaryProvider);
|
setSummaryProvider(summaryProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,30 +77,32 @@ public class ActivityTypePreference extends DialogPreference {
|
|||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
|
|
||||||
textView = view.findViewById(R.id.activity_type_preference_text_view);
|
textView = view.findViewById(R.id.activity_type_preference_text_view);
|
||||||
String category = PreferencesUtils.getDefaultActivity();
|
String activityTypeLocalized = PreferencesUtils.getDefaultActivityTypeLocalized();
|
||||||
textView.setText(category);
|
textView.setText(activityTypeLocalized);
|
||||||
ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(context));
|
ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(context));
|
||||||
textView.setAdapter(adapter);
|
textView.setAdapter(adapter);
|
||||||
textView.setOnItemClickListener((parent, v, position, id) -> {
|
textView.setOnItemClickListener((parent, v, position, id) -> {
|
||||||
String iconValue = TrackIconUtils.getIconValue(context, (String) textView.getAdapter().getItem(position));
|
String localizedActivityType = (String) textView.getAdapter().getItem(position);
|
||||||
updateIcon(iconValue);
|
ActivityType activityType = ActivityType.findByLocalizedString(context, localizedActivityType);
|
||||||
|
updateIcon(activityType);
|
||||||
});
|
});
|
||||||
textView.setOnFocusChangeListener((v, hasFocus) -> {
|
textView.setOnFocusChangeListener((v, hasFocus) -> {
|
||||||
if (!hasFocus) {
|
if (!hasFocus) {
|
||||||
String iconValue = TrackIconUtils.getIconValue(context, textView.getText().toString());
|
String localizedActivityType = textView.getText().toString();
|
||||||
updateIcon(iconValue);
|
ActivityType activityType = ActivityType.findByLocalizedString(context, localizedActivityType);
|
||||||
|
updateIcon(activityType);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
iconView = view.findViewById(R.id.activity_type_preference_spinner);
|
iconView = view.findViewById(R.id.activity_type_preference_spinner);
|
||||||
iconView.setOnClickListener((it) -> showIconSelectDialog());
|
iconView.setOnClickListener((it) -> showIconSelectDialog());
|
||||||
|
|
||||||
updateIcon(TrackIconUtils.getIconValue(context, category));
|
updateIcon(ActivityType.findByLocalizedString(context, activityTypeLocalized));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showIconSelectDialog() {
|
private void showIconSelectDialog() {
|
||||||
String category = PreferencesUtils.getDefaultActivity();
|
String category = PreferencesUtils.getDefaultActivityTypeLocalized();
|
||||||
ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), category);
|
ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), getContext(), category);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -109,20 +110,20 @@ public class ActivityTypePreference extends DialogPreference {
|
|||||||
if (positiveResult) {
|
if (positiveResult) {
|
||||||
String newDefaultActivity = textView.getText().toString();
|
String newDefaultActivity = textView.getText().toString();
|
||||||
if (getPreference().callChangeListener(newDefaultActivity)) {
|
if (getPreference().callChangeListener(newDefaultActivity)) {
|
||||||
PreferencesUtils.setDefaultActivity(newDefaultActivity);
|
PreferencesUtils.setDefaultActivityLocalized(newDefaultActivity);
|
||||||
HackUtils.invalidatePreference(getPreference());
|
HackUtils.invalidatePreference(getPreference());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateUI(String iconValue) {
|
public void updateUI(ActivityType activityType) {
|
||||||
updateIcon(iconValue);
|
updateIcon(activityType);
|
||||||
textView.setText(getActivity().getString(TrackIconUtils.getIconActivityType(iconValue)));
|
textView.setText(getActivity().getString(activityType.getLocalizedStringId()));
|
||||||
textView.clearFocus();
|
textView.clearFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateIcon(String iconValue) {
|
private void updateIcon(ActivityType activityType) {
|
||||||
iconView.setImageResource(TrackIconUtils.getIconDrawable(iconValue));
|
iconView.setImageResource(activityType.getIconDrawableId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import androidx.preference.Preference;
|
|||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
||||||
|
|
||||||
public class DefaultsSettingsFragment extends PreferenceFragmentCompat implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
|
public class DefaultsSettingsFragment extends PreferenceFragmentCompat implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller {
|
||||||
@@ -81,9 +82,9 @@ public class DefaultsSettingsFragment extends PreferenceFragmentCompat implement
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChooseActivityTypeDone(String iconValue) {
|
public void onChooseActivityTypeDone(ActivityType activityType) {
|
||||||
if (activityPreferenceDialog != null) {
|
if (activityPreferenceDialog != null) {
|
||||||
activityPreferenceDialog.updateUI(iconValue);
|
activityPreferenceDialog.updateUI(activityType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,18 +40,19 @@ import java.util.stream.Collectors;
|
|||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Distance;
|
import de.dennisguse.opentracks.data.models.Distance;
|
||||||
import de.dennisguse.opentracks.data.models.DistanceFormatter;
|
import de.dennisguse.opentracks.data.models.DistanceFormatter;
|
||||||
import de.dennisguse.opentracks.data.models.HeartRate;
|
import de.dennisguse.opentracks.data.models.HeartRate;
|
||||||
import de.dennisguse.opentracks.data.models.HeartRateZones;
|
import de.dennisguse.opentracks.data.models.HeartRateZones;
|
||||||
import de.dennisguse.opentracks.data.models.Speed;
|
import de.dennisguse.opentracks.data.models.Speed;
|
||||||
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
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.RecordingLayout;
|
import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout;
|
||||||
import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayoutIO;
|
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;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities to access preferences stored in {@link SharedPreferences}.
|
* Utilities to access preferences stored in {@link SharedPreferences}.
|
||||||
@@ -90,11 +91,11 @@ public class PreferencesUtils {
|
|||||||
sharedPreferences.unregisterOnSharedPreferenceChangeListener(changeListener);
|
sharedPreferences.unregisterOnSharedPreferenceChangeListener(changeListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getDefaultActivity() {
|
public static String getDefaultActivityTypeLocalized() {
|
||||||
return getString(R.string.default_activity_key, resources.getString(R.string.default_activity_default));
|
return getString(R.string.default_activity_key, resources.getString(R.string.default_activity_default));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setDefaultActivity(String newDefaultActivity) {
|
public static void setDefaultActivityLocalized(String newDefaultActivity) {
|
||||||
setString(R.string.default_activity_key, newDefaultActivity);
|
setString(R.string.default_activity_key, newDefaultActivity);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,16 +234,21 @@ public class PreferencesUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isReportSpeed(String category) {
|
public static boolean isReportSpeed(String activityTypeLocalized) {
|
||||||
final String STATS_RATE_DEFAULT = resources.getString(R.string.stats_rate_default);
|
final String STATS_RATE_DEFAULT = resources.getString(R.string.stats_rate_default);
|
||||||
String currentStatsRate = getString(R.string.stats_rate_key, STATS_RATE_DEFAULT);
|
String currentStatsRate = getString(R.string.stats_rate_key, STATS_RATE_DEFAULT);
|
||||||
if (currentStatsRate.equals(getString(R.string.stats_rate_speed_or_pace_default, STATS_RATE_DEFAULT))) {
|
if (currentStatsRate.equals(getString(R.string.stats_rate_speed_or_pace_default, STATS_RATE_DEFAULT))) {
|
||||||
return TrackIconUtils.isSpeedIcon(resources, category);
|
return ActivityType.findByLocalizedString(resources, activityTypeLocalized)
|
||||||
|
.isShowSpeedPreferred();
|
||||||
}
|
}
|
||||||
|
|
||||||
return currentStatsRate.equals(resources.getString(R.string.stats_rate_speed));
|
return currentStatsRate.equals(resources.getString(R.string.stats_rate_speed));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isReportSpeed(Track track) {
|
||||||
|
return isReportSpeed(track.getActivityTypeLocalized());
|
||||||
|
}
|
||||||
|
|
||||||
private static String getBluetoothSensorAddressNone() {
|
private static String getBluetoothSensorAddressNone() {
|
||||||
return resources.getString(R.string.sensor_type_value_none);
|
return resources.getString(R.string.sensor_type_value_none);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import androidx.preference.PreferenceFragmentCompat;
|
|||||||
|
|
||||||
import de.dennisguse.opentracks.AbstractActivity;
|
import de.dennisguse.opentracks.AbstractActivity;
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.databinding.SettingsBinding;
|
import de.dennisguse.opentracks.databinding.SettingsBinding;
|
||||||
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment;
|
||||||
|
|
||||||
@@ -104,9 +105,9 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChooseActivityTypeDone(String iconValue) {
|
public void onChooseActivityTypeDone(ActivityType activityType) {
|
||||||
try {
|
try {
|
||||||
((ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller) this.fragment).onChooseActivityTypeDone(iconValue);
|
((ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller) this.fragment).onChooseActivityTypeDone(activityType);
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
throw new ClassCastException(this.fragment.getClass().getSimpleName() + " must implement " + ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller.class.getSimpleName());
|
throw new ClassCastException(this.fragment.getClass().getSimpleName() + " must implement " + ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller.class.getSimpleName());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class DescriptionGenerator {
|
|||||||
builder.append(paragraphSeparator);
|
builder.append(paragraphSeparator);
|
||||||
|
|
||||||
writeString(track.getName(), builder, R.string.generic_name_line, lineBreak);
|
writeString(track.getName(), builder, R.string.generic_name_line, lineBreak);
|
||||||
writeString(track.getActivityType(), builder, R.string.description_activity_type, lineBreak);
|
writeString(track.getActivityTypeLocalized(), builder, R.string.description_activity_type, lineBreak);
|
||||||
writeString(track.getDescription(), builder, R.string.generic_description_line, lineBreak);
|
writeString(track.getDescription(), builder, R.string.generic_description_line, lineBreak);
|
||||||
builder.append(generateTrackStatisticsDescription(track.getTrackStatistics(), html));
|
builder.append(generateTrackStatisticsDescription(track.getTrackStatistics(), html));
|
||||||
|
|
||||||
|
|||||||
+10
-10
@@ -25,7 +25,7 @@ public class AggregatedStatistics {
|
|||||||
dataList.addAll(dataMap.values());
|
dataList.addAll(dataMap.values());
|
||||||
dataList.sort((o1, o2) -> {
|
dataList.sort((o1, o2) -> {
|
||||||
if (o1.getCountTracks() == o2.getCountTracks()) {
|
if (o1.getCountTracks() == o2.getCountTracks()) {
|
||||||
return o1.getActivityType().compareTo(o2.getActivityType());
|
return o1.getActivityTypeLocalized().compareTo(o2.getActivityTypeLocalized());
|
||||||
}
|
}
|
||||||
return (o1.getCountTracks() < o2.getCountTracks() ? 1 : -1);
|
return (o1.getCountTracks() < o2.getCountTracks() ? 1 : -1);
|
||||||
});
|
});
|
||||||
@@ -33,11 +33,11 @@ public class AggregatedStatistics {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public void aggregate(@NonNull Track track) {
|
public void aggregate(@NonNull Track track) {
|
||||||
String activityType = track.getActivityType();
|
String activityTypeLocalized = track.getActivityTypeLocalized();
|
||||||
if (dataMap.containsKey(activityType)) {
|
if (dataMap.containsKey(activityTypeLocalized)) {
|
||||||
dataMap.get(activityType).add(track.getTrackStatistics());
|
dataMap.get(activityTypeLocalized).add(track.getTrackStatistics());
|
||||||
} else {
|
} else {
|
||||||
dataMap.put(activityType, new AggregatedStatistic(activityType, track.getTrackStatistics()));
|
dataMap.put(activityTypeLocalized, new AggregatedStatistic(activityTypeLocalized, track.getTrackStatistics()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,17 +54,17 @@ public class AggregatedStatistics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class AggregatedStatistic {
|
public static class AggregatedStatistic {
|
||||||
private final String activityType;
|
private final String activityTypeLocalized;
|
||||||
private final TrackStatistics trackStatistics;
|
private final TrackStatistics trackStatistics;
|
||||||
private int countTracks = 1;
|
private int countTracks = 1;
|
||||||
|
|
||||||
public AggregatedStatistic(String activityType, TrackStatistics trackStatistics) {
|
public AggregatedStatistic(String activityTypeLocalized, TrackStatistics trackStatistics) {
|
||||||
this.activityType = activityType;
|
this.activityTypeLocalized = activityTypeLocalized;
|
||||||
this.trackStatistics = trackStatistics;
|
this.trackStatistics = trackStatistics;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getActivityType() {
|
public String getActivityTypeLocalized() {
|
||||||
return activityType;
|
return activityTypeLocalized;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TrackStatistics getTrackStatistics() {
|
public TrackStatistics getTrackStatistics() {
|
||||||
|
|||||||
+13
-6
@@ -1,6 +1,7 @@
|
|||||||
package de.dennisguse.opentracks.ui.aggregatedStatistics;
|
package de.dennisguse.opentracks.ui.aggregatedStatistics;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -13,12 +14,12 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.DistanceFormatter;
|
import de.dennisguse.opentracks.data.models.DistanceFormatter;
|
||||||
import de.dennisguse.opentracks.data.models.SpeedFormatter;
|
import de.dennisguse.opentracks.data.models.SpeedFormatter;
|
||||||
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.util.StringUtils;
|
import de.dennisguse.opentracks.util.StringUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
|
||||||
|
|
||||||
public class AggregatedStatisticsAdapter extends BaseAdapter {
|
public class AggregatedStatisticsAdapter extends BaseAdapter {
|
||||||
|
|
||||||
@@ -62,7 +63,10 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
|
|||||||
viewHolder = (ViewHolder) convertView.getTag();
|
viewHolder = (ViewHolder) convertView.getTag();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TrackIconUtils.isSpeedIcon(context.getResources(), aggregatedStatistic.getActivityType())) {
|
Resources resources = context.getResources();
|
||||||
|
String localizedActivityType = aggregatedStatistic.getActivityTypeLocalized();
|
||||||
|
if (ActivityType.findByLocalizedString(resources, localizedActivityType)
|
||||||
|
.isShowSpeedPreferred()) {
|
||||||
viewHolder.setSpeed(aggregatedStatistic);
|
viewHolder.setSpeed(aggregatedStatistic);
|
||||||
} else {
|
} else {
|
||||||
viewHolder.setPace(aggregatedStatistic);
|
viewHolder.setPace(aggregatedStatistic);
|
||||||
@@ -80,7 +84,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
|
|||||||
public List<String> getCategories() {
|
public List<String> getCategories() {
|
||||||
List<String> categories = new ArrayList<>();
|
List<String> categories = new ArrayList<>();
|
||||||
for (int i = 0; i < aggregatedStatistics.getCount(); i++) {
|
for (int i = 0; i < aggregatedStatistics.getCount(); i++) {
|
||||||
categories.add(aggregatedStatistics.getItem(i).getActivityType());
|
categories.add(aggregatedStatistics.getItem(i).getActivityTypeLocalized());
|
||||||
}
|
}
|
||||||
return categories;
|
return categories;
|
||||||
}
|
}
|
||||||
@@ -159,7 +163,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
|
|||||||
|
|
||||||
//TODO Check preference handling.
|
//TODO Check preference handling.
|
||||||
private void setCommonValues(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) {
|
private void setCommonValues(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) {
|
||||||
String activityType = aggregatedStatistic.getActivityType();
|
String activityType = aggregatedStatistic.getActivityTypeLocalized();
|
||||||
|
|
||||||
reportSpeed = PreferencesUtils.isReportSpeed(activityType);
|
reportSpeed = PreferencesUtils.isReportSpeed(activityType);
|
||||||
unitSystem = PreferencesUtils.getUnitSystem();
|
unitSystem = PreferencesUtils.getUnitSystem();
|
||||||
@@ -178,8 +182,11 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int getIcon(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) {
|
private int getIcon(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) {
|
||||||
String iconValue = TrackIconUtils.getIconValue(context, aggregatedStatistic.getActivityType());
|
String localizedActivityType = aggregatedStatistic.getActivityTypeLocalized();
|
||||||
return TrackIconUtils.getIconDrawable(iconValue);
|
String iconValue = ActivityType.findByLocalizedString(context, localizedActivityType)
|
||||||
|
.getIconId();
|
||||||
|
return ActivityType.findBy(iconValue)
|
||||||
|
.getIconDrawableId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ public class IntervalsFragment extends Fragment {
|
|||||||
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getContext());
|
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getContext());
|
||||||
Track track = contentProviderUtils.getTrack(trackId);
|
Track track = contentProviderUtils.getTrack(trackId);
|
||||||
if (track != null) {
|
if (track != null) {
|
||||||
isReportSpeed = PreferencesUtils.isReportSpeed(track.getActivityType());
|
isReportSpeed = PreferencesUtils.isReportSpeed(track);
|
||||||
}
|
}
|
||||||
|
|
||||||
viewModel = new ViewModelProvider(getActivity()).get(IntervalStatisticsModel.class);
|
viewModel = new ViewModelProvider(getActivity()).get(IntervalStatisticsModel.class);
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 Google Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
||||||
* use this file except in compliance with the License. You may obtain a copy of
|
|
||||||
* the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations under
|
|
||||||
* the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.dennisguse.opentracks.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.models.ActivityType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Utilities for track icon.
|
|
||||||
*
|
|
||||||
* @author Jimmy Shih
|
|
||||||
*/
|
|
||||||
public class TrackIconUtils {
|
|
||||||
|
|
||||||
public static int getIconDrawable(String activityTypeId) {
|
|
||||||
Optional<ActivityType> found = Arrays.stream(ActivityType.values()).filter(
|
|
||||||
it -> it.getId().equals(activityTypeId)
|
|
||||||
).findFirst();
|
|
||||||
|
|
||||||
return found.map(ActivityType::getIconId)
|
|
||||||
.orElseGet(ActivityType.UNKNOWN::getIconId);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getIconActivityType(String activityTypeId) {
|
|
||||||
Optional<ActivityType> found = Arrays.stream(ActivityType.values()).filter(
|
|
||||||
it -> it.getId().equals(activityTypeId)
|
|
||||||
).findFirst();
|
|
||||||
|
|
||||||
return found.map(ActivityType::getFirstLocalizedStringId)
|
|
||||||
.orElseGet(ActivityType.UNKNOWN::getFirstLocalizedStringId);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets all icon values.
|
|
||||||
*/
|
|
||||||
public static List<String> getAllIconValues() {
|
|
||||||
return Arrays.stream(ActivityType.values())
|
|
||||||
.map(ActivityType::getId)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the icon value.
|
|
||||||
*
|
|
||||||
* @param context the context
|
|
||||||
* @param activityTypeId the activity type
|
|
||||||
*/
|
|
||||||
@NonNull
|
|
||||||
public static String getIconValue(Context context, String activityTypeId) {
|
|
||||||
Optional<ActivityType> selected = Arrays.stream(ActivityType.values())
|
|
||||||
.filter(
|
|
||||||
it -> Arrays.stream(it.getLocalizedStringIds())
|
|
||||||
.anyMatch(id -> context.getString(id).equals(activityTypeId))
|
|
||||||
)
|
|
||||||
.findFirst();
|
|
||||||
if (selected.isEmpty()) {
|
|
||||||
return ActivityType.UNKNOWN.getId();
|
|
||||||
}
|
|
||||||
return selected.get().getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isSpeedIcon(Resources resources, String activityTypeId) {
|
|
||||||
Optional<ActivityType> selected = Arrays.stream(ActivityType.values())
|
|
||||||
.filter(
|
|
||||||
it -> Arrays.stream(it.getLocalizedStringIds())
|
|
||||||
.anyMatch(id -> resources.getString(id).equals(activityTypeId))
|
|
||||||
)
|
|
||||||
.findFirst();
|
|
||||||
|
|
||||||
return selected.map(ActivityType::isShowSpeedPreferred)
|
|
||||||
.orElse(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -19,6 +19,7 @@ package de.dennisguse.opentracks.util;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.models.ActivityType;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -26,30 +27,32 @@ import de.dennisguse.opentracks.data.models.Track;
|
|||||||
*
|
*
|
||||||
* @author Jimmy Shih
|
* @author Jimmy Shih
|
||||||
*/
|
*/
|
||||||
|
//TOOD Refactor ActivityType handling in here!
|
||||||
@Deprecated //TODO Refactor: all this should happen somewhere else (ContentProviderUtils?)
|
@Deprecated //TODO Refactor: all this should happen somewhere else (ContentProviderUtils?)
|
||||||
public class TrackUtils {
|
public class TrackUtils {
|
||||||
|
|
||||||
private TrackUtils() {
|
private TrackUtils() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateTrack(Context context, Track track, String name, String activityType, String description, ContentProviderUtils contentProviderUtils) {
|
public static void updateTrack(Context context, Track track, String name, String activityTypeLocalized, String description, ContentProviderUtils contentProviderUtils) {
|
||||||
updateTrack(context, track, name, activityType, TrackIconUtils.getIconValue(context, activityType), description, contentProviderUtils);
|
updateTrack(context, track, name, activityTypeLocalized, ActivityType.findByLocalizedString(context, activityTypeLocalized), description, contentProviderUtils);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateTrack(Context context, Track track, String name, String activityType, String iconValue, String description, ContentProviderUtils contentProviderUtils) {
|
public static void updateTrack(Context context, Track track, String name, String activityTypeLocalized, ActivityType activityType, String description, ContentProviderUtils contentProviderUtils) {
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
track.setName(name);
|
track.setName(name);
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
if (activityType != null) {
|
if (activityTypeLocalized != null) {
|
||||||
track.setActivityType(activityType);
|
track.setActivityTypeLocalized(activityTypeLocalized);
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
if (iconValue != null) {
|
if (activityType != null) {
|
||||||
track.setIcon(iconValue);
|
track.setActivityType(activityType);
|
||||||
} else if (activityType != null) {
|
} else if (activityTypeLocalized != null) {
|
||||||
track.setIcon(TrackIconUtils.getIconValue(context, activityType));
|
track.setActivityType(ActivityType.findByLocalizedString(context, activityTypeLocalized)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (description != null) {
|
if (description != null) {
|
||||||
track.setDescription(description);
|
track.setDescription(description);
|
||||||
|
|||||||
Reference in New Issue
Block a user