diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index 968f13c93..7aa7757da 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -46,6 +46,7 @@ import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.TimezoneRule; import de.dennisguse.opentracks.content.data.TestDataUtil; 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.Distance; import de.dennisguse.opentracks.data.models.HeartRate; @@ -95,8 +96,8 @@ public class ExportImportTest { private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context); - private static final String TRACK_ICON = "the track icon"; - private static final String TRACK_ACTIVITY_TYPE = "the activity type"; + private static final ActivityType TRACK_ACTIVITY_TYPE = ActivityType.MOUNTAIN_BIKING; + private static final String TRACK_ACTIVITY_TYPE_LOCALIZED = "the activity type"; private static final String TRACK_DESCRIPTION = "the description"; private File tmpFile; @@ -180,8 +181,8 @@ public class ExportImportTest { service.endCurrentTrack(); Track track = contentProviderUtils.getTrack(trackId); - track.setIcon(TRACK_ICON); track.setActivityType(TRACK_ACTIVITY_TYPE); + track.setActivityTypeLocalized(TRACK_ACTIVITY_TYPE_LOCALIZED); track.setDescription(TRACK_DESCRIPTION); contentProviderUtils.updateTrack(track); @@ -192,7 +193,7 @@ public class ExportImportTest { assertEquals(2, markers.size()); } - //TODO Does not test images + //TODO Does not test marker images @LargeTest @Test public void kmz_with_trackdetail_and_sensordata() throws TimeoutException, IOException { @@ -216,10 +217,10 @@ public class ExportImportTest { // 1. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); - assertEquals(track.getActivityType(), importedTrack.getActivityType()); + assertEquals(track.getActivityTypeLocalized(), importedTrack.getActivityTypeLocalized()); assertEquals(track.getDescription(), importedTrack.getDescription()); assertEquals(track.getName(), importedTrack.getName()); - assertEquals(track.getIcon(), importedTrack.getIcon()); + assertEquals(track.getActivityType(), importedTrack.getActivityType()); // 2. trackpoints TrackPointAssert a = new TrackPointAssert(); @@ -323,7 +324,7 @@ public class ExportImportTest { // 1. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); - assertEquals(track.getActivityType(), importedTrack.getActivityType()); + assertEquals(track.getActivityTypeLocalized(), importedTrack.getActivityTypeLocalized()); assertEquals(track.getDescription(), importedTrack.getDescription()); assertEquals(track.getName(), importedTrack.getName()); diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporterTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporterTest.java index c63bb4c49..09a35936f 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporterTest.java @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import de.dennisguse.opentracks.content.data.TestDataUtil; 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.Speed; import de.dennisguse.opentracks.data.models.Track; @@ -79,10 +80,10 @@ public class GPXTrackImporterTest { // 2. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); - assertEquals("the category", importedTrack.getActivityType()); + assertEquals("the category", importedTrack.getActivityTypeLocalized()); assertEquals("the description", importedTrack.getDescription()); assertEquals("2021-01-07 22:51", importedTrack.getName()); - assertEquals("UNKNOWN", importedTrack.getIcon()); + assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); //TODO Check trackstatistics @@ -133,10 +134,10 @@ public class GPXTrackImporterTest { // 2. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); - assertEquals("", importedTrack.getActivityType()); + assertEquals("", importedTrack.getActivityTypeLocalized()); assertEquals("", importedTrack.getDescription()); assertEquals("20210907_213924.gpx", importedTrack.getName()); - assertEquals("", importedTrack.getIcon()); + assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); // 3. trackstatistics TrackStatistics trackStatistics = importedTrack.getTrackStatistics(); @@ -181,10 +182,10 @@ public class GPXTrackImporterTest { // 2. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); - assertEquals("", importedTrack.getActivityType()); + assertEquals("", importedTrack.getActivityTypeLocalized()); assertEquals("", importedTrack.getDescription()); assertEquals("20210907_213924.gpx", importedTrack.getName()); - assertEquals("", importedTrack.getIcon()); + assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); // 3. trackstatistics TrackStatistics trackStatistics = importedTrack.getTrackStatistics(); diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/KMLTrackImporterTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/KMLTrackImporterTest.java index b7acb8f92..64a3d16b0 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/KMLTrackImporterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/KMLTrackImporterTest.java @@ -22,6 +22,7 @@ import java.util.List; import de.dennisguse.opentracks.content.data.TestDataUtil; 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.Speed; import de.dennisguse.opentracks.data.models.Track; @@ -70,10 +71,10 @@ public class KMLTrackImporterTest { // 1. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); - assertEquals("", importedTrack.getActivityType()); + assertEquals("", importedTrack.getActivityTypeLocalized()); assertEquals("", importedTrack.getDescription()); assertEquals("", importedTrack.getName()); - assertEquals("", importedTrack.getIcon()); + assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); // 2. markers assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size()); @@ -119,10 +120,10 @@ public class KMLTrackImporterTest { // 1. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); - assertEquals("", importedTrack.getActivityType()); + assertEquals("", importedTrack.getActivityTypeLocalized()); assertEquals("", importedTrack.getDescription()); assertEquals("", importedTrack.getName()); - assertEquals("", importedTrack.getIcon()); + assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); // 2. markers assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size()); @@ -159,10 +160,10 @@ public class KMLTrackImporterTest { // 1. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); - assertEquals("unknown", importedTrack.getActivityType()); + assertEquals("unknown", importedTrack.getActivityTypeLocalized()); assertEquals("Test Track", importedTrack.getDescription()); assertEquals("2020-11-28 18:06", importedTrack.getName()); - assertEquals("UNKNOWN", importedTrack.getIcon()); + assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); // 2. markers assertEquals(0, contentProviderUtils.getMarkers(importTrackId).size()); diff --git a/src/androidTest/java/de/dennisguse/opentracks/share/DescriptionGeneratorTest.java b/src/androidTest/java/de/dennisguse/opentracks/share/DescriptionGeneratorTest.java index 142d49221..1a6d8ca69 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/share/DescriptionGeneratorTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/share/DescriptionGeneratorTest.java @@ -80,7 +80,7 @@ public class DescriptionGeneratorTest { stats.setTotalAltitudeLoss(6000f); stats.setStartTime(START_TIME); track.setTrackStatistics(stats); - track.setActivityType("hiking"); + track.setActivityTypeLocalized("hiking"); String expected = //"Created by" "OpenTracks (Debug)

" + "Name: -
" @@ -118,7 +118,7 @@ public class DescriptionGeneratorTest { stats.setTotalAltitudeLoss(6000f); stats.setStartTime(START_TIME); track.setTrackStatistics(stats); - track.setActivityType("hiking"); + track.setActivityTypeLocalized("hiking"); String expected = //"Created by" "OpenTracks (Debug)

" + "Name: -
" diff --git a/src/androidTest/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsTest.java b/src/androidTest/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsTest.java index 7d65cf6a2..f6bbdee6c 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsTest.java @@ -16,18 +16,18 @@ import java.time.Instant; import java.util.List; 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.Speed; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.stats.TrackStatistics; -import de.dennisguse.opentracks.util.TrackIconUtils; @RunWith(JUnit4.class) public class AggregatedStatisticsTest { 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(); statistics.setStartTime(Instant.ofEpochMilli(1000L)); // Resulting start time statistics.setStopTime(statistics.getStartTime().plus(totalTime)); @@ -40,8 +40,8 @@ public class AggregatedStatisticsTest { statistics.setMinAltitude(1200.0); // Resulting min altitude Track track = new Track(); - track.setIcon(TrackIconUtils.getIconValue(context, category)); - track.setActivityType(category); + track.setActivityType(ActivityType.findByLocalizedString(context, activityTypeLocalized)); + track.setActivityTypeLocalized(activityTypeLocalized); track.setTrackStatistics(statistics); return track; } @@ -243,8 +243,8 @@ public class AggregatedStatisticsTest { // Check order { - assertEquals(biking, aggregatedStatistics.getItem(0).getActivityType()); - assertEquals(driving, aggregatedStatistics.getItem(3).getActivityType()); + assertEquals(biking, aggregatedStatistics.getItem(0).getActivityTypeLocalized()); + assertEquals(driving, aggregatedStatistics.getItem(3).getActivityTypeLocalized()); } } } diff --git a/src/androidTest/java/de/dennisguse/opentracks/ui/aggregatedStatistics/EspressoAggregatedFilterTest.java b/src/androidTest/java/de/dennisguse/opentracks/ui/aggregatedStatistics/EspressoAggregatedFilterTest.java index 33b73f270..68b7b2930 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/ui/aggregatedStatistics/EspressoAggregatedFilterTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/ui/aggregatedStatistics/EspressoAggregatedFilterTest.java @@ -51,7 +51,7 @@ public class EspressoAggregatedFilterTest { @Before public void setUp() { Pair> 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); } diff --git a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java index cb8c1b3a3..1288ac547 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java @@ -29,7 +29,6 @@ import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.databinding.TrackEditBinding; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; import de.dennisguse.opentracks.services.TrackRecordingServiceConnection; -import de.dennisguse.opentracks.util.TrackIconUtils; import de.dennisguse.opentracks.util.TrackUtils; /** @@ -48,7 +47,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit private TrackRecordingServiceConnection trackRecordingServiceConnection; private ContentProviderUtils contentProviderUtils; private Track track; - private String iconValue; + private ActivityType activityType; private TrackEditBinding viewBinding; @@ -74,28 +73,31 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit viewBinding.fields.trackEditName.setText(track.getName()); - viewBinding.fields.trackEditActivityType.setText(track.getActivityType()); + viewBinding.fields.trackEditActivityType.setText(track.getActivityTypeLocalized()); ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this)); 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) -> { if (!hasFocus) { - setActivityTypeIcon(TrackIconUtils.getIconValue( - TrackEditActivity.this, viewBinding.fields.trackEditActivityType.getText().toString())); + String localizedActivityType = viewBinding.fields.trackEditActivityType.getText().toString(); + setActivityTypeIcon(ActivityType.findByLocalizedString(this, localizedActivityType)); } }); - iconValue = null; + activityType = null; if (bundle != null) { - iconValue = bundle.getString(ICON_VALUE_KEY); + activityType = (ActivityType) bundle.getSerializable(ICON_VALUE_KEY); } - if (iconValue == null) { - iconValue = track.getIcon(); + if (activityType == null) { + activityType = track.getActivityType(); } - setActivityTypeIcon(iconValue); - viewBinding.fields.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.fields.trackEditActivityType.getText().toString())); + setActivityTypeIcon(activityType); + viewBinding.fields.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), this, viewBinding.fields.trackEditActivityType.getText().toString())); viewBinding.fields.trackEditDescription.setText(track.getDescription()); @@ -127,7 +129,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - outState.putString(ICON_VALUE_KEY, iconValue); + outState.putSerializable(ICON_VALUE_KEY, activityType); } @Override @@ -136,14 +138,14 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit return viewBinding.getRoot(); } - private void setActivityTypeIcon(String iconValue) { - this.iconValue = iconValue; - viewBinding.fields.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue)); + private void setActivityTypeIcon(ActivityType activityType) { + this.activityType = activityType; + viewBinding.fields.trackEditActivityTypeIcon.setImageResource(activityType.getIconDrawableId()); } @Override - public void onChooseActivityTypeDone(String value) { - setActivityTypeIcon(value); - viewBinding.fields.trackEditActivityType.setText(getString(TrackIconUtils.getIconActivityType(value))); + public void onChooseActivityTypeDone(ActivityType activityType) { + setActivityTypeIcon(activityType); + viewBinding.fields.trackEditActivityType.setText(getString(activityType.getLocalizedStringId())); } } diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index cbdd95af9..02ec08e92 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -50,6 +50,7 @@ import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneOffset; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.DistanceFormatter; 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.PermissionRequester; import de.dennisguse.opentracks.util.StringUtils; -import de.dennisguse.opentracks.util.TrackIconUtils; /** * 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 startTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME); 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 markerCountIndex = cursor.getColumnIndexOrThrow(TracksColumns.MARKER_COUNT); Track.Id trackId = new Track.Id(cursor.getLong(idIndex)); boolean isRecording = trackId.equals(recordingStatus.getTrackId()); String icon = cursor.getString(iconIndex); - int iconId = TrackIconUtils.getIconDrawable(icon); + int iconId = ActivityType.findBy(icon) + .getIconDrawableId(); String name = cursor.getString(nameIndex); String totalTime = StringUtils.formatElapsedTime(Duration.ofMillis(cursor.getLong(totalTimeIndex))); String totalDistance = DistanceFormatter.Builder() @@ -516,7 +517,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co @Override public Loader onCreateLoader(int arg0, Bundle arg1) { 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}; final String sortOrder = TracksColumns.STARTTIME + " DESC"; @@ -526,7 +527,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co } else { final String SEARCH_QUERY = TracksColumns.NAME + " LIKE ? OR " + TracksColumns.DESCRIPTION + " LIKE ? OR " + - TracksColumns.ACTIVITY_TYPE + " LIKE ?"; + TracksColumns.ACTIVITY_TYPE_LOCALIZED + " LIKE ?"; final String[] selectionArgs = new String[]{"%" + searchQuery + "%", "%" + searchQuery + "%", "%" + searchQuery + "%"}; return new CursorLoader(TrackListActivity.this, TracksColumns.CONTENT_URI, PROJECTION, SEARCH_QUERY, selectionArgs, sortOrder); } diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java index f8fb0c00b..d6e686008 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java @@ -30,6 +30,7 @@ import de.dennisguse.opentracks.chart.ChartFragment; import de.dennisguse.opentracks.chart.TrackDataHubInterface; import de.dennisguse.opentracks.data.ContentProviderUtils; import de.dennisguse.opentracks.data.TrackDataHub; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.databinding.TrackRecordingBinding; 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.util.IntentDashboardUtils; import de.dennisguse.opentracks.util.IntentUtils; -import de.dennisguse.opentracks.util.TrackIconUtils; import de.dennisguse.opentracks.util.TrackUtils; /** @@ -317,10 +317,10 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc } @Override - public void onChooseActivityTypeDone(String iconValue) { + public void onChooseActivityTypeDone(ActivityType activityType) { Track track = contentProviderUtils.getTrack(trackId); - String activityType = getString(TrackIconUtils.getIconActivityType(iconValue)); - TrackUtils.updateTrack(this, track, null, activityType, null, contentProviderUtils); + String activityTypeLocalized = getString(activityType.getLocalizedStringId()); + TrackUtils.updateTrack(this, track, null, activityTypeLocalized, null, contentProviderUtils); } private class CustomFragmentPagerAdapter extends FragmentStateAdapter { diff --git a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java index 977f03f2e..14becbb88 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java @@ -20,7 +20,6 @@ import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragm import de.dennisguse.opentracks.util.ExportUtils; import de.dennisguse.opentracks.util.IntentUtils; import de.dennisguse.opentracks.util.StringUtils; -import de.dennisguse.opentracks.util.TrackIconUtils; import de.dennisguse.opentracks.util.TrackUtils; public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller { @@ -50,22 +49,23 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements viewBinding.trackEditName.setText(track.getName()); - viewBinding.trackEditActivityType.setText(track.getActivityType()); + viewBinding.trackEditActivityType.setText(track.getActivityTypeLocalized()); ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this)); 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) -> { if (!hasFocus) { - setActivityTypeIcon(TrackIconUtils.getIconValue( - TrackStoppedActivity.this, viewBinding.trackEditActivityType.getText().toString())); + String localizedActivityType = viewBinding.trackEditActivityType.getText().toString(); + setActivityTypeIcon(ActivityType.findByLocalizedString(this, localizedActivityType)); } }); - String iconValue = track.getIcon(); - - setActivityTypeIcon(iconValue); - viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.trackEditActivityType.getText().toString())); + setActivityTypeIcon(track.getActivityType()); + viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), this, viewBinding.trackEditActivityType.getText().toString())); viewBinding.trackEditDescription.setText(track.getDescription()); @@ -74,7 +74,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements { Pair parts = SpeedFormatter.Builder() .setUnit(PreferencesUtils.getUnitSystem()) - .setReportSpeedOrPace(PreferencesUtils.isReportSpeed(track.getActivityType())) + .setReportSpeedOrPace(PreferencesUtils.isReportSpeed(track)) .build(this) .getSpeedParts(track.getTrackStatistics().getAverageMovingSpeed()); viewBinding.speed.setText(parts.first); @@ -125,14 +125,14 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements return viewBinding.getRoot(); } - private void setActivityTypeIcon(String iconValue) { - viewBinding.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue)); + private void setActivityTypeIcon(ActivityType activityType) { + viewBinding.trackEditActivityTypeIcon.setImageResource(activityType.getIconDrawableId()); } @Override - public void onChooseActivityTypeDone(String iconValue) { - setActivityTypeIcon(iconValue); - viewBinding.trackEditActivityType.setText(getString(TrackIconUtils.getIconActivityType(iconValue))); + public void onChooseActivityTypeDone(ActivityType activityType) { + setActivityTypeIcon(activityType); + viewBinding.trackEditActivityType.setText(getString(activityType.getLocalizedStringId())); } private void resumeTrackAndFinish() { diff --git a/src/main/java/de/dennisguse/opentracks/chart/ChartFragment.java b/src/main/java/de/dennisguse/opentracks/chart/ChartFragment.java index 727cd3681..bea47c7fe 100644 --- a/src/main/java/de/dennisguse/opentracks/chart/ChartFragment.java +++ b/src/main/java/de/dennisguse/opentracks/chart/ChartFragment.java @@ -65,7 +65,7 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener { // Stats gathered from the received data private final List pendingPoints = new ArrayList<>(); - private String category = ""; + private String activityTypeLocalized = ""; // Modes of operation private boolean chartByDistance; @@ -87,7 +87,7 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener { } } if (PreferencesUtils.isKey(R.string.stats_rate_key, key)) { - boolean reportSpeed = PreferencesUtils.isReportSpeed(category); + boolean reportSpeed = PreferencesUtils.isReportSpeed(activityTypeLocalized); if (reportSpeed != viewBinding.chartView.getReportSpeed()) { viewBinding.chartView.setReportSpeed(reportSpeed); viewBinding.chartView.applyReportSpeed(); @@ -160,12 +160,12 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener { public void onTrackUpdated(Track track) { if (isResumed()) { if (track == null) { - category = ""; + activityTypeLocalized = ""; return; } - category = track.getActivityType(); - boolean reportSpeed = PreferencesUtils.isReportSpeed(category); + activityTypeLocalized = track.getActivityTypeLocalized(); + boolean reportSpeed = PreferencesUtils.isReportSpeed(activityTypeLocalized); if (reportSpeed != viewBinding.chartView.getReportSpeed()) { viewBinding.chartView.setReportSpeed(reportSpeed); viewBinding.chartView.applyReportSpeed(); diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index ae12513ce..cd59fc763 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -40,6 +40,7 @@ import java.util.List; import java.util.UUID; 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.Cadence; import de.dennisguse.opentracks.data.models.Distance; @@ -100,7 +101,7 @@ public class ContentProviderUtils { int uuidIndex = cursor.getColumnIndexOrThrow(TracksColumns.UUID); int nameIndex = cursor.getColumnIndexOrThrow(TracksColumns.NAME); 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 startTimeOffsetIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME_OFFSET); int stopTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STOPTIME); @@ -128,8 +129,8 @@ public class ContentProviderUtils { if (!cursor.isNull(descriptionIndex)) { track.setDescription(cursor.getString(descriptionIndex)); } - if (!cursor.isNull(categoryIndex)) { - track.setActivityType(cursor.getString(categoryIndex)); + if (!cursor.isNull(activityTypeLocalizedIndex)) { + track.setActivityTypeLocalized(cursor.getString(activityTypeLocalizedIndex)); } if (!cursor.isNull(startTimeIndex)) { @@ -163,7 +164,7 @@ public class ContentProviderUtils { trackStatistics.setTotalAltitudeLoss(cursor.getFloat(altitudeLossIndex)); } if (!cursor.isNull(iconIndex)) { - track.setIcon(cursor.getString(iconIndex)); + track.setActivityType(ActivityType.findBy(cursor.getString(iconIndex))); } return track; } @@ -290,7 +291,7 @@ public class ContentProviderUtils { values.put(TracksColumns.UUID, UUIDUtils.toBytes(track.getUuid())); values.put(TracksColumns.NAME, track.getName()); 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()); if (trackStatistics.getStartTime() != null) { values.put(TracksColumns.STARTTIME, trackStatistics.getStartTime().toEpochMilli()); @@ -308,7 +309,7 @@ public class ContentProviderUtils { values.put(TracksColumns.MAX_ALTITUDE, trackStatistics.getMaxAltitude()); values.put(TracksColumns.ALTITUDE_GAIN, trackStatistics.getTotalAltitudeGain()); 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; } diff --git a/src/main/java/de/dennisguse/opentracks/data/TrackSelection.java b/src/main/java/de/dennisguse/opentracks/data/TrackSelection.java index 712cb6282..9afc0d1f3 100644 --- a/src/main/java/de/dennisguse/opentracks/data/TrackSelection.java +++ b/src/main/java/de/dennisguse/opentracks/data/TrackSelection.java @@ -53,7 +53,7 @@ public class TrackSelection implements ContentProviderUtils.ContentProviderSelec } if (!categories.isEmpty()) { 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) { selection += selection.isEmpty() ? "" : " AND "; diff --git a/src/main/java/de/dennisguse/opentracks/data/models/ActivityIcon.java b/src/main/java/de/dennisguse/opentracks/data/models/ActivityIcon.java new file mode 100644 index 000000000..23b339b5b --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/data/models/ActivityIcon.java @@ -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; + } +} diff --git a/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java b/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java index 6cd2f0c59..9e607c5c3 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java @@ -1,8 +1,10 @@ package de.dennisguse.opentracks.data.models; import android.content.Context; +import android.content.res.Resources; + +import androidx.annotation.NonNull; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -10,70 +12,138 @@ import java.util.stream.Collectors; import de.dennisguse.opentracks.R; 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), - MOUNTAIN_BIKE("MOUNTAIN_BIKE", R.drawable.ic_activity_mtb_24dp, true, R.string.activity_type_mountain_biking), - MOTOR_BIKE("MOTOR_BIKE", R.drawable.ic_activity_motorbike_24dp, true, R.string.activity_type_motor_bike), - KAYAK("KAYAK", R.drawable.ic_activity_kayaking_24dp, true, R.string.activity_type_kayaking), - 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), - SAILING("SAILING", R.drawable.ic_activity_sailing_24dp, true, R.string.activity_type_sailing), - 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), - 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), - SKI("SKI", R.drawable.ic_activity_skiing_24dp, true, R.string.activity_type_cross_country_skiing, R.string.activity_type_skiing), - SNOW_BOARDING("SNOW_BOARDING", R.drawable.ic_activity_snowboarding_24dp, true, R.string.activity_type_snow_boarding), - UNKNOWN("UNKNOWN", R.drawable.ic_logo_24dp, true, R.string.activity_type_unknown), - 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), - ESCOOTER("ESCOOTER", R.drawable.ic_activity_escooter_24dp, true, R.string.activity_type_escooter), - INLINE_SKATING("INLINES_SKATING", R.drawable.ic_activity_inline_skating_24dp, true, R.string.activity_type_inline_skating), - SKATE_BOARDING("SKATE_BOARDING", R.drawable.ic_activity_skateboarding_24dp, true, R.string.activity_type_skate_boarding), - CLIMBING("CLIMBING", R.drawable.ic_activity_climbing_24dp, false, R.string.activity_type_climbing), - SWIMMING("SWIMMING", R.drawable.ic_activity_swimming_24dp, false, R.string.activity_type_swimming), - SWIMMING_OPEN("SWIMMING_OPEN", R.drawable.ic_activity_swimming_open_24dp, false, R.string.activity_type_swimming_open), - WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp, false, R.string.activity_type_workout); + + AIRPLANE("airplane", R.string.activity_type_airplane, ActivityIcon.AIRPLANE, true), + ATV("ATV", R.string.activity_type_atv, ActivityIcon.DRIVE, true), + BIKING("biking", R.string.activity_type_biking, ActivityIcon.BIKE, true), + BLIMP("blimp", R.string.activity_type_blimp, ActivityIcon.UNKNOWN, true), + BOAT("boat", R.string.activity_type_boat, ActivityIcon.BOAT, true), + CLIMBING("climbing", R.string.activity_type_climbing, ActivityIcon.CLIMBING, false), + COMMERCIAL_AIRPLANE("commercial airplane", R.string.activity_type_commercial_airplane, ActivityIcon.AIRPLANE, true), + CROSS_COUNTRY_SKIING("cross-country skiing", R.string.activity_type_cross_country_skiing, ActivityIcon.SKI, true), + CYCLING("cycling", R.string.activity_type_cycling, ActivityIcon.BIKE, true), + DIRT_BIKE("dirt bike", R.string.activity_type_dirt_bike, ActivityIcon.MOTOR_BIKE, true), + DONKEY_BACK_RIDING("donkey back riding", R.string.activity_type_donkey_back_riding, ActivityIcon.UNKNOWN, true), + DRIVING("driving", R.string.activity_type_driving, ActivityIcon.DRIVE, true), + DRIVING_BUS("driving bus", R.string.activity_type_driving_bus, ActivityIcon.DRIVE, true), + DRIVING_CAR("driving car", R.string.activity_type_driving_car, ActivityIcon.DRIVE, true), + ESCOOTER("escooter", R.string.activity_type_escooter, ActivityIcon.ESCOOTER, true), + FERRY("ferry", R.string.activity_type_ferry, ActivityIcon.BOAT, true), + FRISBEE("frisbee", R.string.activity_type_frisbee, ActivityIcon.UNKNOWN, true), + GLIDING("gliding", R.string.activity_type_gliding, ActivityIcon.UNKNOWN, true), + 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 int iconId; + + final ActivityIcon icon; final boolean showSpeedPreferred; - final int[] localizedStringIds; + final int localizedStringId; - //isSpeed? - - ActivityType(String id, int iconId, boolean showSpeedPreferred, int... localizedStringIds) { + ActivityType(String id, int localizedStringId, ActivityIcon icon, boolean showSpeedPreferred) { this.id = id; - this.iconId = iconId; + this.localizedStringId = localizedStringId; + this.icon = icon; this.showSpeedPreferred = showSpeedPreferred; - this.localizedStringIds = localizedStringIds; } public String getId() { return id; } - public int getIconId() { - return iconId; + @Deprecated + public String getIconId() { + return icon.iconId; + } + + public int getIconDrawableId() { + return icon.iconDrawableId; + } + + public int getLocalizedStringId() { + return localizedStringId; } public boolean isShowSpeedPreferred() { return showSpeedPreferred; } - public int[] getLocalizedStringIds() { - return localizedStringIds; - } - - public int getFirstLocalizedStringId() { - return localizedStringIds[0]; - } - public static List getLocalizedStrings(Context context) { - List result = new ArrayList<>(); - for (ActivityType activityType : values()) { - List strings = Arrays.stream(activityType.localizedStringIds) - .mapToObj(context::getString) - .collect(Collectors.toList()); - result.addAll(strings); - } + return Arrays.stream(values()) + .map(ActivityType::getLocalizedStringId) + .map(context::getString) + .collect(Collectors.toList()); + } - 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); } } diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Track.java b/src/main/java/de/dennisguse/opentracks/data/models/Track.java index b1bae70a6..054ea8cf0 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Track.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Track.java @@ -44,9 +44,9 @@ public class Track { private String name = ""; private String description = ""; - private String activityType = ""; + private String activityTypeLocalized = ""; - private String icon = ""; + private ActivityType activityType; private final ZoneOffset zoneOffset; @@ -54,7 +54,7 @@ public class Track { @VisibleForTesting public Track() { - this.zoneOffset = ZoneOffset.UTC; + this(ZoneOffset.UTC); } public Track(@NonNull ZoneOffset zoneOffset) { @@ -97,22 +97,22 @@ public class Track { this.description = description; } - public String getActivityType() { + public String getActivityTypeLocalized() { + return activityTypeLocalized; + } + + public void setActivityTypeLocalized(String activityType) { + this.activityTypeLocalized = activityType; + } + + public ActivityType getActivityType() { return activityType; } - public void setActivityType(String activityType) { + public void setActivityType(ActivityType activityType) { this.activityType = activityType; } - public String getIcon() { - return icon; - } - - public void setIcon(String icon) { - this.icon = icon; - } - public ZoneOffset getZoneOffset() { return zoneOffset; } diff --git a/src/main/java/de/dennisguse/opentracks/data/tables/TracksColumns.java b/src/main/java/de/dennisguse/opentracks/data/tables/TracksColumns.java index ac5347957..10f0730ff 100644 --- a/src/main/java/de/dennisguse/opentracks/data/tables/TracksColumns.java +++ b/src/main/java/de/dennisguse/opentracks/data/tables/TracksColumns.java @@ -39,7 +39,7 @@ public interface TracksColumns extends BaseColumns { String UUID = "uuid"; // identifier to make tracks globally unique (prevent re-import) String NAME = "name"; // track name 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_OFFSET = "starttime_offset"; // in plus/minus in seconds 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 ALTITUDE_GAIN = "elevationgain"; // altitude gain //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 + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " TEXT, " + DESCRIPTION + " TEXT, " - + ACTIVITY_TYPE + " TEXT, " + + ACTIVITY_TYPE_LOCALIZED + " TEXT, " + STARTTIME + " INTEGER, " + STOPTIME + " INTEGER, " + NUMPOINTS + " INTEGER, " diff --git a/src/main/java/de/dennisguse/opentracks/fragments/ChooseActivityTypeDialogFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/ChooseActivityTypeDialogFragment.java index e9bae577d..1aacf353f 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/ChooseActivityTypeDialogFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/ChooseActivityTypeDialogFragment.java @@ -16,37 +16,62 @@ import java.util.ArrayList; import java.util.List; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.data.models.ActivityType; 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 { private static final String CHOOSE_ACTIVITY_TYPE_DIALOG_TAG = "chooseActivityType"; - public static void showDialog(FragmentManager fragmentManager, String preselectedCategory) { - new ChooseActivityTypeDialogFragment(preselectedCategory).show(fragmentManager, ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG); + @Deprecated + 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) { - if (category == null) { + public static void showDialog(FragmentManager fragmentManager, ActivityType activityType) { + new ChooseActivityTypeDialogFragment(activityType).show(fragmentManager, ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG); + } + + private static final List 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; } - String iconValue = TrackIconUtils.getIconValue(context, category); - return TrackIconUtils.getAllIconValues().indexOf(iconValue); + return activityTypes.indexOf(activityType); } private ChooseActivityTypeBinding viewBinding; - private final String preselectedCategory; + private final ActivityType preselectedActivityType; private ChooseActivityTypeCaller chooseActivityTypeCaller; - private ChooseActivityTypeDialogFragment(String preselectedCategory) { - this.preselectedCategory = preselectedCategory; + private ChooseActivityTypeDialogFragment(ActivityType activityType) { + this.preselectedActivityType = activityType; } @NonNull @@ -61,13 +86,13 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewBinding = ChooseActivityTypeBinding.inflate(inflater, container, false); - List imageIds = new ArrayList<>(); - for (String iconValue : TrackIconUtils.getAllIconValues()) { - imageIds.add(TrackIconUtils.getIconDrawable(iconValue)); + List iconDrawableIds = new ArrayList<>(); + for (ActivityType activityType : activityTypes) { + iconDrawableIds.add(activityType.getIconDrawableId()); } - final ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter(imageIds); - int position = getPosition(getContext(), preselectedCategory); + final ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter(iconDrawableIds); + int position = getPosition(getContext(), preselectedActivityType); if (position != -1) { imageAdapter.setSelected(position); } @@ -94,7 +119,7 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements @Override public void onItemClick(AdapterView adapterView, View view, int position, long id) { - chooseActivityTypeCaller.onChooseActivityTypeDone(TrackIconUtils.getAllIconValues().get(position)); + chooseActivityTypeCaller.onChooseActivityTypeDone(activityTypes.get(position)); dismiss(); } @@ -103,6 +128,6 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements */ public interface ChooseActivityTypeCaller { - void onChooseActivityTypeDone(String iconValue); + void onChooseActivityTypeDone(ActivityType activityType); } } diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index a054f45f2..98029379f 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -16,6 +16,7 @@ package de.dennisguse.opentracks.fragments; +import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; @@ -34,6 +35,7 @@ import androidx.recyclerview.widget.RecyclerView; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.TrackRecordedActivity; 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.SpeedFormatter; 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.TrackStatistics; 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}. @@ -89,7 +90,7 @@ public class StatisticsRecordedFragment extends Fragment { if (PreferencesUtils.isKey(R.string.stats_rate_key, key) && track != null) { updateUInecessary = true; - preferenceReportSpeed = PreferencesUtils.isReportSpeed(track.getActivityType()); + preferenceReportSpeed = PreferencesUtils.isReportSpeed(track); } if (key != null && updateUInecessary && isResumed()) { @@ -155,7 +156,7 @@ public class StatisticsRecordedFragment extends Fragment { 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; if (prefsChanged) { sharedPreferenceChangeListener.onSharedPreferenceChanged(null, getString(R.string.stats_rate_key)); @@ -191,8 +192,12 @@ public class StatisticsRecordedFragment extends Fragment { // Set activity type { - String trackIconValue = TrackIconUtils.getIconValue(getContext(), track.getActivityType()); - viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), TrackIconUtils.getIconDrawable(trackIconValue))); + Context context = getContext(); + 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 diff --git a/src/main/java/de/dennisguse/opentracks/io/file/TrackFilenameGenerator.java b/src/main/java/de/dennisguse/opentracks/io/file/TrackFilenameGenerator.java index 1257d47ad..0e940db06 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/TrackFilenameGenerator.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/TrackFilenameGenerator.java @@ -44,7 +44,7 @@ public class TrackFilenameGenerator { values.put(UUID_KEY, track.getUuid().toString().substring(0, 8)); 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_DATE_KEY, track.getStartTime().toLocalDate().toString()); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java index f1d466e5a..c4485417d 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java @@ -268,7 +268,7 @@ public class GPXTrackExporter implements TrackExporter { printWriter.println(""); printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); - printWriter.println("" + StringUtils.formatCData(track.getActivityType()) + ""); + printWriter.println("" + StringUtils.formatCData(track.getActivityTypeLocalized()) + ""); printWriter.println(""); printWriter.println("c0c0c0"); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java index dc3938672..c38f21e31 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java @@ -307,11 +307,11 @@ public class KMLTrackExporter implements TrackExporter { printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); - printWriter.println("" + StringUtils.formatCData(track.getIcon()) + ""); + printWriter.println("" + StringUtils.formatCData(track.getActivityType().getIconId()) + ""); printWriter.println("" + track.getUuid() + ""); printWriter.println("#" + TRACK_STYLE + ""); - writeActivityType(track.getActivityType()); + writeActivityType(track.getActivityTypeLocalized()); printWriter.println(""); printWriter.println("absolute"); printWriter.println("1"); @@ -514,12 +514,12 @@ public class KMLTrackExporter implements TrackExporter { return result; } - private void writeActivityType(String actiivtyType) { - if (actiivtyType == null || actiivtyType.equals("")) { + private void writeActivityType(String activityTypeLocalized) { + if (activityTypeLocalized == null || activityTypeLocalized.equals("")) { return; } printWriter.println(""); - printWriter.println("" + StringUtils.formatCData(actiivtyType) + ""); + printWriter.println("" + StringUtils.formatCData(activityTypeLocalized) + ""); printWriter.println(""); } diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java index cee18aae6..765fdd247 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import de.dennisguse.opentracks.R; 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.Marker; 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.util.FileUtils; import de.dennisguse.opentracks.util.LocationUtils; -import de.dennisguse.opentracks.util.TrackIconUtils; /** * Handles logic to import: @@ -90,7 +90,7 @@ public class TrackImporter { 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.setName(name != null ? name : ""); @@ -103,15 +103,17 @@ public class TrackImporter { track.setDescription(description != null ? description : ""); - if (activityType != null) { - track.setActivityType(activityType); - - if (icon == null) { - icon = TrackIconUtils.getIconValue(context, activityType); - } + if (activityTypeLocalized != null) { + track.setActivityTypeLocalized(activityTypeLocalized); } - 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() { diff --git a/src/main/java/de/dennisguse/opentracks/publicapi/StartRecording.java b/src/main/java/de/dennisguse/opentracks/publicapi/StartRecording.java index 90d68b391..a40d83ae5 100644 --- a/src/main/java/de/dennisguse/opentracks/publicapi/StartRecording.java +++ b/src/main/java/de/dennisguse/opentracks/publicapi/StartRecording.java @@ -5,6 +5,7 @@ import android.os.Bundle; import androidx.annotation.NonNull; import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.settings.PreferencesUtils; @@ -14,8 +15,8 @@ import de.dennisguse.opentracks.util.TrackUtils; public class StartRecording extends AbstractAPIActivity { public static final String EXTRA_TRACK_NAME = "TRACK_NAME"; - public static final String EXTRA_TRACK_CATEGORY = "TRACK_CATEGORY"; - public static final String EXTRA_TRACK_ICON = "TRACK_ICON"; + public static final String EXTRA_TRACK_ACTIVITY_TYPE_LOCALIZED = "TRACK_CATEGORY"; //TODO Update constant + 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_STATS_TARGET_PACKAGE = "STATS_TARGET_PACKAGE"; @@ -43,8 +44,8 @@ public class StartRecording extends AbstractAPIActivity { TrackUtils.updateTrack(this, track, bundle.getString(EXTRA_TRACK_NAME, null), - bundle.getString(EXTRA_TRACK_CATEGORY, null), - bundle.getString(EXTRA_TRACK_ICON, null), + bundle.getString(EXTRA_TRACK_ACTIVITY_TYPE_LOCALIZED, null), + ActivityType.findBy(bundle.getString(EXTRA_TRACK_ACTIVITY_TYPE_ID, null)), bundle.getString(EXTRA_TRACK_DESCRIPTION, null), contentProviderUtils); } diff --git a/src/main/java/de/dennisguse/opentracks/services/RecordingData.java b/src/main/java/de/dennisguse/opentracks/services/RecordingData.java index 6ebab6866..8d95e9de0 100644 --- a/src/main/java/de/dennisguse/opentracks/services/RecordingData.java +++ b/src/main/java/de/dennisguse/opentracks/services/RecordingData.java @@ -16,7 +16,7 @@ public record RecordingData(Track track, TrackPoint latestTrackPoint, SensorData if (track == null) { return ""; } - return track.getActivityType(); + return track.getActivityTypeLocalized(); } @NonNull diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index ba85691a6..d660c7c21 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -15,6 +15,7 @@ import java.time.ZoneOffset; import de.dennisguse.opentracks.R; 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.Marker; 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.stats.TrackStatistics; import de.dennisguse.opentracks.stats.TrackStatisticsUpdater; -import de.dennisguse.opentracks.util.TrackIconUtils; import de.dennisguse.opentracks.util.TrackNameUtils; class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -72,9 +72,9 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang onNewTrackPoint(segmentStartTrackPoint); - String category = PreferencesUtils.getDefaultActivity(); - track.setActivityType(category); - track.setIcon(TrackIconUtils.getIconValue(context, category)); + String activityTypeLocalized = PreferencesUtils.getDefaultActivityTypeLocalized(); + track.setActivityTypeLocalized(activityTypeLocalized); + track.setActivityType(ActivityType.findByLocalizedString(context, activityTypeLocalized)); track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics()); //TODO Pass TrackPoint track.setName(TrackNameUtils.getTrackName(context, trackId, track.getStartTime())); diff --git a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncement.java b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncement.java index 75f4fa98f..bc8594d61 100644 --- a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncement.java +++ b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncement.java @@ -182,7 +182,7 @@ public class VoiceAnnouncement { 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) { // We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called. diff --git a/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java b/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java index 5eb1a2225..088874e92 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java @@ -30,7 +30,6 @@ import androidx.preference.PreferenceDialogFragmentCompat; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; -import de.dennisguse.opentracks.util.TrackIconUtils; /** * For entering the default activity type. @@ -47,7 +46,7 @@ public class ActivityTypePreference extends DialogPreference { setDialogIcon(null); setPersistent(true); - SummaryProvider summaryProvider = preference -> PreferencesUtils.getDefaultActivity(); + SummaryProvider summaryProvider = preference -> PreferencesUtils.getDefaultActivityTypeLocalized(); setSummaryProvider(summaryProvider); } @@ -78,30 +77,32 @@ public class ActivityTypePreference extends DialogPreference { final Context context = getActivity(); textView = view.findViewById(R.id.activity_type_preference_text_view); - String category = PreferencesUtils.getDefaultActivity(); - textView.setText(category); + String activityTypeLocalized = PreferencesUtils.getDefaultActivityTypeLocalized(); + textView.setText(activityTypeLocalized); ArrayAdapter adapter = new ArrayAdapter<>(context, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(context)); textView.setAdapter(adapter); textView.setOnItemClickListener((parent, v, position, id) -> { - String iconValue = TrackIconUtils.getIconValue(context, (String) textView.getAdapter().getItem(position)); - updateIcon(iconValue); + String localizedActivityType = (String) textView.getAdapter().getItem(position); + ActivityType activityType = ActivityType.findByLocalizedString(context, localizedActivityType); + updateIcon(activityType); }); textView.setOnFocusChangeListener((v, hasFocus) -> { if (!hasFocus) { - String iconValue = TrackIconUtils.getIconValue(context, textView.getText().toString()); - updateIcon(iconValue); + String localizedActivityType = textView.getText().toString(); + ActivityType activityType = ActivityType.findByLocalizedString(context, localizedActivityType); + updateIcon(activityType); } }); iconView = view.findViewById(R.id.activity_type_preference_spinner); iconView.setOnClickListener((it) -> showIconSelectDialog()); - updateIcon(TrackIconUtils.getIconValue(context, category)); + updateIcon(ActivityType.findByLocalizedString(context, activityTypeLocalized)); } private void showIconSelectDialog() { - String category = PreferencesUtils.getDefaultActivity(); - ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), category); + String category = PreferencesUtils.getDefaultActivityTypeLocalized(); + ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), getContext(), category); } @Override @@ -109,20 +110,20 @@ public class ActivityTypePreference extends DialogPreference { if (positiveResult) { String newDefaultActivity = textView.getText().toString(); if (getPreference().callChangeListener(newDefaultActivity)) { - PreferencesUtils.setDefaultActivity(newDefaultActivity); + PreferencesUtils.setDefaultActivityLocalized(newDefaultActivity); HackUtils.invalidatePreference(getPreference()); } } } - public void updateUI(String iconValue) { - updateIcon(iconValue); - textView.setText(getActivity().getString(TrackIconUtils.getIconActivityType(iconValue))); + public void updateUI(ActivityType activityType) { + updateIcon(activityType); + textView.setText(getActivity().getString(activityType.getLocalizedStringId())); textView.clearFocus(); } - private void updateIcon(String iconValue) { - iconView.setImageResource(TrackIconUtils.getIconDrawable(iconValue)); + private void updateIcon(ActivityType activityType) { + iconView.setImageResource(activityType.getIconDrawableId()); } } } diff --git a/src/main/java/de/dennisguse/opentracks/settings/DefaultsSettingsFragment.java b/src/main/java/de/dennisguse/opentracks/settings/DefaultsSettingsFragment.java index 59a6ab64e..7565cb43c 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/DefaultsSettingsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/settings/DefaultsSettingsFragment.java @@ -9,6 +9,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; public class DefaultsSettingsFragment extends PreferenceFragmentCompat implements ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller { @@ -81,9 +82,9 @@ public class DefaultsSettingsFragment extends PreferenceFragmentCompat implement } @Override - public void onChooseActivityTypeDone(String iconValue) { + public void onChooseActivityTypeDone(ActivityType activityType) { if (activityPreferenceDialog != null) { - activityPreferenceDialog.updateUI(iconValue); + activityPreferenceDialog.updateUI(activityType); } } } diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java index 1835b1f42..be7cea61e 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java @@ -40,18 +40,19 @@ import java.util.stream.Collectors; import java.util.stream.Stream; 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.DistanceFormatter; import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.data.models.HeartRateZones; 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.TrackFilenameGenerator; import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayout; import de.dennisguse.opentracks.ui.customRecordingLayout.RecordingLayoutIO; import de.dennisguse.opentracks.util.IntentDashboardUtils; -import de.dennisguse.opentracks.util.TrackIconUtils; /** * Utilities to access preferences stored in {@link SharedPreferences}. @@ -90,11 +91,11 @@ public class PreferencesUtils { 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)); } - public static void setDefaultActivity(String newDefaultActivity) { + public static void setDefaultActivityLocalized(String 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); 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))) { - return TrackIconUtils.isSpeedIcon(resources, category); + return ActivityType.findByLocalizedString(resources, activityTypeLocalized) + .isShowSpeedPreferred(); } return currentStatsRate.equals(resources.getString(R.string.stats_rate_speed)); } + public static boolean isReportSpeed(Track track) { + return isReportSpeed(track.getActivityTypeLocalized()); + } + private static String getBluetoothSensorAddressNone() { return resources.getString(R.string.sensor_type_value_none); } diff --git a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java index be8446f02..f1f9cfc70 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java +++ b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java @@ -10,6 +10,7 @@ import androidx.preference.PreferenceFragmentCompat; import de.dennisguse.opentracks.AbstractActivity; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.databinding.SettingsBinding; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; @@ -104,9 +105,9 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity } @Override - public void onChooseActivityTypeDone(String iconValue) { + public void onChooseActivityTypeDone(ActivityType activityType) { try { - ((ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller) this.fragment).onChooseActivityTypeDone(iconValue); + ((ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller) this.fragment).onChooseActivityTypeDone(activityType); } catch (ClassCastException e) { throw new ClassCastException(this.fragment.getClass().getSimpleName() + " must implement " + ChooseActivityTypeDialogFragment.ChooseActivityTypeCaller.class.getSimpleName()); } diff --git a/src/main/java/de/dennisguse/opentracks/share/DescriptionGenerator.java b/src/main/java/de/dennisguse/opentracks/share/DescriptionGenerator.java index 45d086a7d..2058a0fe5 100644 --- a/src/main/java/de/dennisguse/opentracks/share/DescriptionGenerator.java +++ b/src/main/java/de/dennisguse/opentracks/share/DescriptionGenerator.java @@ -72,7 +72,7 @@ public class DescriptionGenerator { builder.append(paragraphSeparator); 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); builder.append(generateTrackStatisticsDescription(track.getTrackStatistics(), html)); diff --git a/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatistics.java b/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatistics.java index 897dc382e..8de17659d 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatistics.java +++ b/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatistics.java @@ -25,7 +25,7 @@ public class AggregatedStatistics { dataList.addAll(dataMap.values()); dataList.sort((o1, o2) -> { if (o1.getCountTracks() == o2.getCountTracks()) { - return o1.getActivityType().compareTo(o2.getActivityType()); + return o1.getActivityTypeLocalized().compareTo(o2.getActivityTypeLocalized()); } return (o1.getCountTracks() < o2.getCountTracks() ? 1 : -1); }); @@ -33,11 +33,11 @@ public class AggregatedStatistics { @VisibleForTesting public void aggregate(@NonNull Track track) { - String activityType = track.getActivityType(); - if (dataMap.containsKey(activityType)) { - dataMap.get(activityType).add(track.getTrackStatistics()); + String activityTypeLocalized = track.getActivityTypeLocalized(); + if (dataMap.containsKey(activityTypeLocalized)) { + dataMap.get(activityTypeLocalized).add(track.getTrackStatistics()); } 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 { - private final String activityType; + private final String activityTypeLocalized; private final TrackStatistics trackStatistics; private int countTracks = 1; - public AggregatedStatistic(String activityType, TrackStatistics trackStatistics) { - this.activityType = activityType; + public AggregatedStatistic(String activityTypeLocalized, TrackStatistics trackStatistics) { + this.activityTypeLocalized = activityTypeLocalized; this.trackStatistics = trackStatistics; } - public String getActivityType() { - return activityType; + public String getActivityTypeLocalized() { + return activityTypeLocalized; } public TrackStatistics getTrackStatistics() { diff --git a/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsAdapter.java b/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsAdapter.java index 25fe32766..63ee7b3eb 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/ui/aggregatedStatistics/AggregatedStatisticsAdapter.java @@ -1,6 +1,7 @@ package de.dennisguse.opentracks.ui.aggregatedStatistics; import android.content.Context; +import android.content.res.Resources; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; @@ -13,12 +14,12 @@ import java.util.ArrayList; import java.util.List; 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.SpeedFormatter; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.settings.UnitSystem; import de.dennisguse.opentracks.util.StringUtils; -import de.dennisguse.opentracks.util.TrackIconUtils; public class AggregatedStatisticsAdapter extends BaseAdapter { @@ -62,7 +63,10 @@ public class AggregatedStatisticsAdapter extends BaseAdapter { 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); } else { viewHolder.setPace(aggregatedStatistic); @@ -80,7 +84,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter { public List getCategories() { List categories = new ArrayList<>(); for (int i = 0; i < aggregatedStatistics.getCount(); i++) { - categories.add(aggregatedStatistics.getItem(i).getActivityType()); + categories.add(aggregatedStatistics.getItem(i).getActivityTypeLocalized()); } return categories; } @@ -159,7 +163,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter { //TODO Check preference handling. private void setCommonValues(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) { - String activityType = aggregatedStatistic.getActivityType(); + String activityType = aggregatedStatistic.getActivityTypeLocalized(); reportSpeed = PreferencesUtils.isReportSpeed(activityType); unitSystem = PreferencesUtils.getUnitSystem(); @@ -178,8 +182,11 @@ public class AggregatedStatisticsAdapter extends BaseAdapter { } private int getIcon(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) { - String iconValue = TrackIconUtils.getIconValue(context, aggregatedStatistic.getActivityType()); - return TrackIconUtils.getIconDrawable(iconValue); + String localizedActivityType = aggregatedStatistic.getActivityTypeLocalized(); + String iconValue = ActivityType.findByLocalizedString(context, localizedActivityType) + .getIconId(); + return ActivityType.findBy(iconValue) + .getIconDrawableId(); } } } diff --git a/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalsFragment.java b/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalsFragment.java index d44b038c4..96f6aea58 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/ui/intervals/IntervalsFragment.java @@ -151,7 +151,7 @@ public class IntervalsFragment extends Fragment { ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getContext()); Track track = contentProviderUtils.getTrack(trackId); if (track != null) { - isReportSpeed = PreferencesUtils.isReportSpeed(track.getActivityType()); + isReportSpeed = PreferencesUtils.isReportSpeed(track); } viewModel = new ViewModelProvider(getActivity()).get(IntervalStatisticsModel.class); diff --git a/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java b/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java deleted file mode 100644 index 6299bd4cf..000000000 --- a/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java +++ /dev/null @@ -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 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 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 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 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 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); - - } -} diff --git a/src/main/java/de/dennisguse/opentracks/util/TrackUtils.java b/src/main/java/de/dennisguse/opentracks/util/TrackUtils.java index 8f142e62f..e68f3260c 100644 --- a/src/main/java/de/dennisguse/opentracks/util/TrackUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/TrackUtils.java @@ -19,6 +19,7 @@ package de.dennisguse.opentracks.util; import android.content.Context; import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Track; /** @@ -26,30 +27,32 @@ import de.dennisguse.opentracks.data.models.Track; * * @author Jimmy Shih */ +//TOOD Refactor ActivityType handling in here! @Deprecated //TODO Refactor: all this should happen somewhere else (ContentProviderUtils?) public class TrackUtils { private TrackUtils() { } - public static void updateTrack(Context context, Track track, String name, String activityType, String description, ContentProviderUtils contentProviderUtils) { - updateTrack(context, track, name, activityType, TrackIconUtils.getIconValue(context, activityType), description, contentProviderUtils); + public static void updateTrack(Context context, Track track, String name, String activityTypeLocalized, String description, ContentProviderUtils 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; if (name != null) { track.setName(name); update = true; } - if (activityType != null) { - track.setActivityType(activityType); + if (activityTypeLocalized != null) { + track.setActivityTypeLocalized(activityTypeLocalized); update = true; } - if (iconValue != null) { - track.setIcon(iconValue); - } else if (activityType != null) { - track.setIcon(TrackIconUtils.getIconValue(context, activityType)); + if (activityType != null) { + track.setActivityType(activityType); + } else if (activityTypeLocalized != null) { + track.setActivityType(ActivityType.findByLocalizedString(context, activityTypeLocalized) + ); } if (description != null) { track.setDescription(description);