From 1e9a0abb49ccc7fb218ab9fda92273d1308fa7e3 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sun, 1 Oct 2023 19:48:59 +0200 Subject: [PATCH 1/7] KMLTrackExporter: remove unused icon export. Part of #1608. --- .../dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java | 1 - 1 file changed, 1 deletion(-) 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 f741518e0..b9264ee62 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 @@ -295,7 +295,6 @@ private void writeBeginTrack(Track track) { printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); - printWriter.println("" + StringUtils.formatCData(track.getActivityType().getIconId()) + ""); printWriter.println("" + track.getUuid() + ""); printWriter.println("#" + TRACK_STYLE + ""); From 2e76458b62e7038f44c33dcdc1df72d3a82f6b5e Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sun, 1 Oct 2023 20:07:28 +0200 Subject: [PATCH 2/7] Bugfix: TrackImporter needs to lookup activityTypeLocalized if no activityType is present. Part of #1608. --- .../dennisguse/opentracks/io/file/importer/TrackImporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 765fdd247..72530d0f5 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 @@ -109,7 +109,7 @@ void setTrack(Context context, String name, String uuid, String description, Str ActivityType activityType; if (activityTypeId == null) { - activityType = ActivityType.findByLocalizedString(context, activityTypeId); + activityType = ActivityType.findByLocalizedString(context, activityTypeLocalized); } else { activityType = ActivityType.findBy(activityTypeId); } From 8c8a7d9496f77b1d8616fa918b434b1a4e7f7796 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sun, 1 Oct 2023 20:10:50 +0200 Subject: [PATCH 3/7] Cleanup: use stream.toList(). --- .../opentracks/data/CustomContentProviderUtilsTest.java | 5 ++--- .../de/dennisguse/opentracks/data/models/ActivityType.java | 3 +-- .../opentracks/io/file/exporter/ExportActivity.java | 5 ++--- .../opentracks/io/file/importer/ImportActivity.java | 3 +-- .../opentracks/io/file/importer/ImportViewModel.java | 3 +-- .../opentracks/io/file/importer/TrackImporter.java | 5 ++--- .../de/dennisguse/opentracks/settings/PreferencesUtils.java | 4 ++-- .../settings/bluetooth/BluetoothLeSensorPreference.java | 5 ++--- .../opentracks/ui/customRecordingLayout/RecordingLayout.java | 2 +- src/main/java/de/dennisguse/opentracks/util/ExportUtils.java | 3 +-- 10 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java index 94dc1238d..158e5fc91 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java @@ -47,7 +47,6 @@ import java.util.List; import java.util.Random; import java.util.UUID; -import java.util.stream.Collectors; import de.dennisguse.opentracks.content.data.TestDataUtil; import de.dennisguse.opentracks.content.data.TestSensorDataUtil; @@ -860,7 +859,7 @@ public void testGetTrackPointCursor_asc() { List trackpointIds = track.second.stream() .map(it -> ContentUris.parseId(contentProviderUtils.insertTrackPoint(it, track.first.getId()))) - .map(TrackPoint.Id::new).collect(Collectors.toList()); + .map(TrackPoint.Id::new).toList(); // when try (Cursor cursor = contentProviderUtils.getTrackPointCursor(trackId, trackpointIds.get(8))) { @@ -878,7 +877,7 @@ public void testGetTrackPointLocationIterator_asc() { List trackpointIds = track.second.stream() .map(it -> ContentUris.parseId(contentProviderUtils.insertTrackPoint(it, track.first.getId()))) - .map(TrackPoint.Id::new).collect(Collectors.toList()); + .map(TrackPoint.Id::new).toList(); TrackPoint.Id startTrackPointId = trackpointIds.get(0); 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 5adc23dec..2c8bf6e35 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java @@ -7,7 +7,6 @@ import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import de.dennisguse.opentracks.R; @@ -123,7 +122,7 @@ public static List getLocalizedStrings(Context context) { return Arrays.stream(values()) .map(ActivityType::getLocalizedStringId) .map(context::getString) - .collect(Collectors.toList()); + .toList(); } @NonNull diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/ExportActivity.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/ExportActivity.java index ec8eb1461..d1a2335da 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/ExportActivity.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/ExportActivity.java @@ -32,7 +32,6 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; -import java.util.stream.Collectors; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.ContentProviderUtils; @@ -231,9 +230,9 @@ private void createExportTasks(boolean allInOneFile) { exportTasks = new ArrayList<>(); if (allInOneFile) { String filename = "OpenTracks-Backup"; - exportTasks.add(new ExportTask(filename, trackFileFormat, tracks.stream().map(Track::getId).collect(Collectors.toList()))); + exportTasks.add(new ExportTask(filename, trackFileFormat, tracks.stream().map(Track::getId).toList())); } else { - exportTasks.addAll(tracks.stream().map(it -> new ExportTask(null, trackFileFormat, List.of(it.getId()))).collect(Collectors.toList())); + exportTasks.addAll(tracks.stream().map(it -> new ExportTask(null, trackFileFormat, List.of(it.getId()))).toList()); } trackExportTotalCount = exportTasks.size(); } diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportActivity.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportActivity.java index fbf8ac554..e739c8268 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportActivity.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportActivity.java @@ -32,7 +32,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.TrackRecordedActivity; @@ -100,7 +99,7 @@ public void onCreate(Bundle savedInstanceState) { documentFiles = new ArrayList<>(); documentFiles.add(DocumentFile.fromTreeUri(this, documentUris.get(0))); } else { - documentFiles = documentUris.stream().map(it -> DocumentFile.fromSingleUri(this, it)).collect(Collectors.toList()); + documentFiles = documentUris.stream().map(it -> DocumentFile.fromSingleUri(this, it)).toList(); } initViews(); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportViewModel.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportViewModel.java index 41281b083..746c02238 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportViewModel.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/ImportViewModel.java @@ -12,7 +12,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.models.Track; @@ -50,7 +49,7 @@ private void loadData(List documentFiles) { List> nestedFileList = documentFiles.stream() .map(FileUtils::getFiles) // TODO flatMap(Collection::stream) fails with ClassCastException; try in the future again - .collect(Collectors.toList()); + .toList(); List fileList = new ArrayList<>(); nestedFileList.forEach(fileList::addAll); 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 72530d0f5..ac6030594 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 @@ -16,7 +16,6 @@ import java.util.LinkedList; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.ContentProviderUtils; @@ -223,7 +222,7 @@ private void adjustTrackPoints() { private void matchMarkers2TrackPoints(Track.Id trackId) { List trackPointsWithLocation = trackPoints.stream() .filter(TrackPoint::hasLocation) - .collect(Collectors.toList()); + .toList(); List todoMarkers = new LinkedList<>(markers); List doneMarkers = new LinkedList<>(); @@ -241,7 +240,7 @@ private void matchMarkers2TrackPoints(Track.Id trackId) { && trackPoint.getLongitude() == it.getLongitude() && trackPoint.getTime().equals(it.getTime()) ) - .collect(Collectors.toList()); + .toList(); TrackStatistics statistics = updater.getTrackStatistics(); for (Marker marker : matchedMarkers) { diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java index 9c40c4805..c4f42fab2 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java @@ -724,7 +724,7 @@ private static List getMultiTypedArray() { R.array.stats_custom_layout_fields_default_value_16, R.array.stats_custom_layout_fields_default_value_17, R.array.stats_custom_layout_fields_default_value_18 - ).map(id -> resources.obtainTypedArray(id)).collect(Collectors.toList()); + ).map(id -> resources.obtainTypedArray(id)).toList(); } @SuppressLint("ResourceType") @@ -799,7 +799,7 @@ public static List getAllCustomLayouts() { } public static List getAllCustomLayoutNames() { - return getAllCustomLayouts().stream().map(RecordingLayout::getName).collect(Collectors.toList()); + return getAllCustomLayouts().stream().map(RecordingLayout::getName).toList(); } public static void resetCustomLayoutPreferences() { diff --git a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeSensorPreference.java b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeSensorPreference.java index fc0ed34ef..588dd107b 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeSensorPreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/bluetooth/BluetoothLeSensorPreference.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.sensors.BluetoothUtils; @@ -136,7 +135,7 @@ public static BluetoothLeSensorPreferenceDialog newInstance(String preferenceKey b.putParcelableArrayList(ARG_BLE_SERVICE_UUIDS, new ArrayList<>(sensorUUIDs.stream() .map(ServiceMeasurementUUID::serviceUUID) .map(ParcelUuid::new) - .collect(Collectors.toList()))); + .toList())); fragment.setArguments(b); return fragment; } @@ -202,7 +201,7 @@ private void startBluetoothScan() { if (PreferencesUtils.getBluetoothFilterEnabled()) { scanFilter = serviceUUIDs.stream() .map(it -> new ScanFilter.Builder().setServiceUuid(it).build()) - .collect(Collectors.toList()); + .toList(); } ScanSettings.Builder scanSettingsBuilder = new ScanSettings.Builder(); diff --git a/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayout.java b/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayout.java index bc05ffd10..2cbaa2db5 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayout.java +++ b/src/main/java/de/dennisguse/opentracks/ui/customRecordingLayout/RecordingLayout.java @@ -68,7 +68,7 @@ public List getFields() { public RecordingLayout toRecordingLayout(boolean visibility) { RecordingLayout result = new RecordingLayout(this.getName()); - result.addFields(dataFields.stream().filter(f -> f.isVisible() == visibility).collect(Collectors.toList())); + result.addFields(dataFields.stream().filter(f -> f.isVisible() == visibility).toList()); return result; } diff --git a/src/main/java/de/dennisguse/opentracks/util/ExportUtils.java b/src/main/java/de/dennisguse/opentracks/util/ExportUtils.java index 5883cf14f..7b7ee9284 100644 --- a/src/main/java/de/dennisguse/opentracks/util/ExportUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/ExportUtils.java @@ -16,7 +16,6 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import de.dennisguse.opentracks.data.ContentProviderUtils; import de.dennisguse.opentracks.data.models.Track; @@ -54,7 +53,7 @@ public void onExportError(ExportTask unused, String errorMessage) { public static void exportTrack(Context context, DocumentFile directory, ExportTask exportTask) { ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context); - List tracks = exportTask.getTrackIds().stream().map(contentProviderUtils::getTrack).collect(Collectors.toList()); + List tracks = exportTask.getTrackIds().stream().map(contentProviderUtils::getTrack).toList(); Uri exportDocumentFileUri; if (tracks.size() == 1) { exportDocumentFileUri = getExportDocumentFileUri(context, tracks.get(0), exportTask.getTrackFileFormat(), directory); From 1f96283080d01948c11801e4a17209ed73bc762e Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Mon, 2 Oct 2023 22:30:49 +0200 Subject: [PATCH 4/7] Cleanup: StatisticsRecordedFragment loaded ActivityType weird. --- .../opentracks/fragments/StatisticsRecordedFragment.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index 6118d32a6..5c5ce6639 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -188,10 +188,9 @@ private void updateUI() { { Context context = getContext(); String localizedActivityType = track.getActivityTypeLocalized(); - String trackIconValue = ActivityType.findByLocalizedString(context, localizedActivityType) - .getIconId(); - viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), ActivityType.findBy(trackIconValue) - .getIconDrawableId())); + int iconDrawableId = ActivityType.findByLocalizedString(context, localizedActivityType) + .getIconDrawableId(); + viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), iconDrawableId)); } // Set time and start datetime From e69bf31976b1f5e90f8494efb616a9f70a703f46 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Mon, 2 Oct 2023 22:32:12 +0200 Subject: [PATCH 5/7] ActivityType non-localized: store in database. Includes migration of existing data from ActivityType localized or icon. Part of #1608. --- .../opentracks/data/ContentProviderUtils.java | 30 ++-- .../data/CustomSQLiteOpenHelper.java | 87 +++++++++- .../opentracks/data/models/ActivityIcon.java | 31 +--- .../opentracks/data/models/ActivityType.java | 162 +++++++++--------- .../opentracks/data/models/Track.java | 4 +- .../opentracks/data/tables/TracksColumns.java | 8 +- 6 files changed, 189 insertions(+), 133 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index 5e24f1027..bc6875850 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -101,6 +101,7 @@ public static Track createTrack(Cursor cursor) { int uuidIndex = cursor.getColumnIndexOrThrow(TracksColumns.UUID); int nameIndex = cursor.getColumnIndexOrThrow(TracksColumns.NAME); int descriptionIndex = cursor.getColumnIndexOrThrow(TracksColumns.DESCRIPTION); + int activityTypeIndex = 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); @@ -113,7 +114,6 @@ public static Track createTrack(Cursor cursor) { int maxAltitudeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAX_ALTITUDE); int altitudeGainIndex = cursor.getColumnIndexOrThrow(TracksColumns.ALTITUDE_GAIN); int altitudeLossIndex = cursor.getColumnIndexOrThrow(TracksColumns.ALTITUDE_LOSS); - int iconIndex = cursor.getColumnIndexOrThrow(TracksColumns.ICON); Track track = new Track(ZoneOffset.ofTotalSeconds(cursor.getInt(startTimeOffsetIndex))); TrackStatistics trackStatistics = track.getTrackStatistics(); @@ -129,6 +129,9 @@ public static Track createTrack(Cursor cursor) { if (!cursor.isNull(descriptionIndex)) { track.setDescription(cursor.getString(descriptionIndex)); } + if (!cursor.isNull(activityTypeIndex)) { + track.setActivityType(ActivityType.findBy(cursor.getString(activityTypeIndex))); + } if (!cursor.isNull(activityTypeLocalizedIndex)) { track.setActivityTypeLocalized(cursor.getString(activityTypeLocalizedIndex)); } @@ -163,9 +166,7 @@ public static Track createTrack(Cursor cursor) { if (!cursor.isNull(altitudeLossIndex)) { trackStatistics.setTotalAltitudeLoss(cursor.getFloat(altitudeLossIndex)); } - if (!cursor.isNull(iconIndex)) { - track.setActivityType(ActivityType.findBy(cursor.getString(iconIndex))); - } + return track; } @@ -230,13 +231,18 @@ public List getTracks(ContentProviderSelectionInterface selection) { public Cursor searchTracks(String searchQuery) { // Needed, because MARKER_COUNT is a virtual column and has to be explicitly requested. - final String[] PROJECTION = new String[]{TracksColumns._ID, TracksColumns.UUID, TracksColumns.NAME, - TracksColumns.DESCRIPTION, TracksColumns.ACTIVITY_TYPE_LOCALIZED, TracksColumns.STARTTIME, - TracksColumns.STARTTIME_OFFSET, TracksColumns.STOPTIME, TracksColumns.MARKER_COUNT, - TracksColumns.TOTALDISTANCE, TracksColumns.TOTALTIME, TracksColumns.MOVINGTIME, - TracksColumns.AVGSPEED, TracksColumns.AVGMOVINGSPEED, TracksColumns.MAXSPEED, - TracksColumns.MIN_ALTITUDE, TracksColumns.MAX_ALTITUDE, TracksColumns.ALTITUDE_GAIN, - TracksColumns.ALTITUDE_LOSS, TracksColumns.ICON + // Used only be TrackListAdapter + final String[] PROJECTION = new String[]{ + TracksColumns._ID, + TracksColumns.NAME, + TracksColumns.DESCRIPTION, //TODO Needed? + TracksColumns.ACTIVITY_TYPE, + TracksColumns.ACTIVITY_TYPE_LOCALIZED, + TracksColumns.STARTTIME, + TracksColumns.STARTTIME_OFFSET, + TracksColumns.TOTALDISTANCE, + TracksColumns.TOTALTIME, + TracksColumns.MARKER_COUNT, }; String selection = null; @@ -316,6 +322,7 @@ private ContentValues createContentValues(Track track) { 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() != null ? track.getActivityType().getId() : null); values.put(TracksColumns.ACTIVITY_TYPE_LOCALIZED, track.getActivityTypeLocalized()); values.put(TracksColumns.STARTTIME_OFFSET, track.getZoneOffset().getTotalSeconds()); if (trackStatistics.getStartTime() != null) { @@ -334,7 +341,6 @@ private ContentValues createContentValues(Track track) { 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.getActivityType() != null ? track.getActivityType().getIconId() : ""); return values; } diff --git a/src/main/java/de/dennisguse/opentracks/data/CustomSQLiteOpenHelper.java b/src/main/java/de/dennisguse/opentracks/data/CustomSQLiteOpenHelper.java index 5674b1666..a31d2fa64 100644 --- a/src/main/java/de/dennisguse/opentracks/data/CustomSQLiteOpenHelper.java +++ b/src/main/java/de/dennisguse/opentracks/data/CustomSQLiteOpenHelper.java @@ -12,9 +12,11 @@ import java.time.Instant; import java.time.ZoneOffset; import java.time.zone.ZoneRules; +import java.util.Map; import java.util.UUID; import de.dennisguse.opentracks.Startup; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.tables.MarkerColumns; import de.dennisguse.opentracks.data.tables.TrackPointsColumns; @@ -28,7 +30,9 @@ public class CustomSQLiteOpenHelper extends SQLiteOpenHelper { private static final String TAG = CustomSQLiteOpenHelper.class.getSimpleName(); - private static final int DATABASE_VERSION = 36; + private static final int DATABASE_VERSION = 37; + + private final Context context; public CustomSQLiteOpenHelper(Context context) { this(context, ((Startup) context.getApplicationContext()).getDatabaseName()); @@ -37,11 +41,13 @@ public CustomSQLiteOpenHelper(Context context) { @VisibleForTesting public CustomSQLiteOpenHelper(Context context, String databaseName) { super(context, databaseName, null, DATABASE_VERSION); + this.context = context; } @VisibleForTesting public CustomSQLiteOpenHelper(Context context, String databaseName, int databaseVersion) { super(context, databaseName, null, databaseVersion); + this.context = context; } @Override @@ -75,6 +81,7 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { case 34 -> upgradeFrom33to34(db); case 35 -> upgradeFrom34to35(db); case 36 -> upgradeFrom35to36(db); + case 37 -> upgradeFrom36to37(db); default -> throw new RuntimeException("Not implemented: upgrade to " + toVersion); } } @@ -98,6 +105,7 @@ public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { case 33 -> downgradeFrom34to33(db); case 34 -> downgradeFrom35to34(db); case 35 -> downgradeFrom36to35(db); + case 36 -> downgradeFrom37to36(db); default -> throw new RuntimeException("Not implemented: downgrade to " + toVersion); } } @@ -170,7 +178,7 @@ private void upgradeFrom25to26(SQLiteDatabase db) { db.beginTransaction(); db.execSQL("ALTER TABLE tracks ADD COLUMN uuid BLOB"); - try (Cursor cursor = db.query("tracks", new String[]{"_id" }, null, null, null, null, null)) { + try (Cursor cursor = db.query("tracks", new String[]{"_id"}, null, null, null, null, null)) { if (cursor.moveToFirst()) { int trackIdIndex = cursor.getColumnIndexOrThrow("_id"); do { @@ -445,7 +453,7 @@ private void upgradeFrom32to33(SQLiteDatabase db) { ZoneRules zoneRules = ZoneOffset.systemDefault().getRules(); - try (Cursor cursor = db.query("tracks", new String[]{"_id", "starttime" }, null, null, null, null, null)) { + try (Cursor cursor = db.query("tracks", new String[]{"_id", "starttime"}, null, null, null, null, null)) { if (cursor.moveToFirst()) { int trackIdIndex = cursor.getColumnIndexOrThrow("_id"); int startTimeIndex = cursor.getColumnIndexOrThrow("starttime"); @@ -564,4 +572,77 @@ private void downgradeFrom36to35(SQLiteDatabase db) { db.setTransactionSuccessful(); db.endTransaction(); } + + private void upgradeFrom36to37(SQLiteDatabase db) { + Map activityIcon2ActivityTypeId = Map.ofEntries( + Map.entry("AIRPLANE", "airplane"), + Map.entry("BIKE", "biking"), + Map.entry("MOUNTAIN_BIKE", "mountain biking"), + Map.entry("MOTOR_BIKE", "motor bike"), + Map.entry("KAYAK", "kayaking"), + Map.entry("BOAT", "boat"), + Map.entry("SAILING", "sailing"), + Map.entry("DRIVE", "driving"), + Map.entry("RUN", "running"), + Map.entry("SKI", "skiing"), + Map.entry("SNOW_BOARDING", "snowboarding"), + Map.entry("WALK", "walking"), + Map.entry("ESCOOTER", "escooter"), + Map.entry("KICKSCOOTER", "kickscooter"), + Map.entry("INLINES_SKATING", "inline skating"), + Map.entry("SKATE_BOARDING", "skateboarding"), + Map.entry("CLIMBING", "climbing"), + Map.entry("SWIMMING", "swimming"), + Map.entry("SWIMMING_OPEN", "swimming in open water"), + Map.entry("WORKOUT", "workout"), + Map.entry("UNKNOWN", "unknown") + ); + + db.beginTransaction(); + + db.execSQL("ALTER TABLE tracks ADD COLUMN activity_type TEXT"); + + try (Cursor cursor = db.query("tracks", new String[]{"_id", "icon", "category"}, null, null, null, null, null)) { + if (cursor.moveToFirst()) { + int trackIdIndex = cursor.getColumnIndexOrThrow("_id"); + int iconIndex = cursor.getColumnIndexOrThrow("icon"); + int activityTypeLocalizedIndex = cursor.getColumnIndexOrThrow("category"); + do { + Track.Id trackId = new Track.Id(cursor.getLong(trackIdIndex)); + String iconId = cursor.getString(iconIndex); + String activityTypeLocalized = cursor.getString(activityTypeLocalizedIndex); + + ActivityType activityType = ActivityType.findByLocalizedString(context, activityTypeLocalized); + if (activityType.equals(ActivityType.UNKNOWN)) { + String activityTypeId = activityIcon2ActivityTypeId.get(iconId); + activityType = ActivityType.findBy(activityTypeId); + } + + ContentValues cv = new ContentValues(); + cv.put("activity_type", activityType.getId()); + db.update("tracks", cv, "_id = ?", new String[]{String.valueOf(trackId.id())}); + } while (cursor.moveToNext()); + } + } + + db.setTransactionSuccessful(); + db.endTransaction(); + } + + private void downgradeFrom37to36(SQLiteDatabase db) { + db.beginTransaction(); + + db.execSQL("DROP INDEX tracks_uuid_index"); + + db.execSQL("ALTER TABLE tracks RENAME TO tracks_old"); + db.execSQL("CREATE TABLE tracks (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, description TEXT, category TEXT, starttime INTEGER, stoptime INTEGER, numpoints INTEGER, totaldistance FLOAT, totaltime INTEGER, movingtime INTEGER, avgspeed FLOAT, avgmovingspeed FLOAT, maxspeed FLOAT, minelevation FLOAT, maxelevation FLOAT, elevationgain FLOAT, icon TEXT, uuid BLOB, elevationloss FLOAT, starttime_offset INTEGER)"); + db.execSQL("INSERT INTO tracks SELECT _id, name, description, category, starttime, stoptime, numpoints, totaldistance, totaltime, movingtime, avgspeed, avgmovingspeed, maxspeed, minelevation, maxelevation, elevationgain, icon, uuid, elevationloss, starttime_offset FROM tracks_old"); + db.execSQL("DROP TABLE tracks_old"); + + db.execSQL("CREATE UNIQUE INDEX tracks_uuid_index ON tracks(uuid)"); + + db.setTransactionSuccessful(); + db.endTransaction(); + } + } diff --git a/src/main/java/de/dennisguse/opentracks/data/models/ActivityIcon.java b/src/main/java/de/dennisguse/opentracks/data/models/ActivityIcon.java index 02011ec1d..5f659a371 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/ActivityIcon.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/ActivityIcon.java @@ -2,35 +2,8 @@ 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), - KICKSCOOTER("KICKSCOOTER", R.drawable.ic_activity_scooter_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); +public class ActivityIcon { - @Deprecated //TODO should be removed. - final String iconId; - final int iconDrawableId; + static final int ICON_UNKNOWN = R.drawable.ic_logo_24dp; - 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 2c8bf6e35..5a5468c55 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java @@ -12,88 +12,88 @@ public enum ActivityType { - 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), - KICKSCOOTER("kickscooter", R.string.activity_type_kickscooter, ActivityIcon.KICKSCOOTER, 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); + AIRPLANE("airplane", R.string.activity_type_airplane, R.drawable.ic_activity_flight_24dp, true), + ATV("ATV", R.string.activity_type_atv, R.drawable.ic_activity_drive_24dp, true), + BIKING("biking", R.string.activity_type_biking, R.drawable.ic_activity_bike_24dp, true), + BLIMP("blimp", R.string.activity_type_blimp, ActivityIcon.ICON_UNKNOWN, true), + BOAT("boat", R.string.activity_type_boat, R.drawable.ic_activity_boat_24dp, true), + CLIMBING("climbing", R.string.activity_type_climbing, R.drawable.ic_activity_climbing_24dp, false), + COMMERCIAL_AIRPLANE("commercial airplane", R.string.activity_type_commercial_airplane, R.drawable.ic_activity_flight_24dp, true), + CROSS_COUNTRY_SKIING("cross-country skiing", R.string.activity_type_cross_country_skiing, R.drawable.ic_activity_skiing_24dp, true), + CYCLING("cycling", R.string.activity_type_cycling, R.drawable.ic_activity_bike_24dp, true), + DIRT_BIKE("dirt bike", R.string.activity_type_dirt_bike, R.drawable.ic_activity_mtb_24dp, true), + DONKEY_BACK_RIDING("donkey back riding", R.string.activity_type_donkey_back_riding, ActivityIcon.ICON_UNKNOWN, true), + DRIVING("driving", R.string.activity_type_driving, R.drawable.ic_activity_drive_24dp, true), + DRIVING_BUS("driving bus", R.string.activity_type_driving_bus, R.drawable.ic_activity_drive_24dp, true), + DRIVING_CAR("driving car", R.string.activity_type_driving_car, R.drawable.ic_activity_drive_24dp, true), + ESCOOTER("escooter", R.string.activity_type_escooter, R.drawable.ic_activity_escooter_24dp, true), + FERRY("ferry", R.string.activity_type_ferry, R.drawable.ic_activity_boat_24dp, true), + FRISBEE("frisbee", R.string.activity_type_frisbee, ActivityIcon.ICON_UNKNOWN, true), + GLIDING("gliding", R.string.activity_type_gliding, ActivityIcon.ICON_UNKNOWN, true), + HANG_GLIDING("hang gliding", R.string.activity_type_hang_gliding, ActivityIcon.ICON_UNKNOWN, true), + HELICOPTER("helicopter", R.string.activity_type_helicopter, ActivityIcon.ICON_UNKNOWN, true), + HIKING("hiking", R.string.activity_type_hiking, R.drawable.ic_activity_walk_24dp, false), + HORSE_BACK_RIDING("horse back riding", R.string.activity_type_horse_back_riding, ActivityIcon.ICON_UNKNOWN, true), + HOT_AIR_BALLOON("hot air balloon", R.string.activity_type_hot_air_balloon, ActivityIcon.ICON_UNKNOWN, true), + ICE_SAILING("ice sailing", R.string.activity_type_ice_sailing, ActivityIcon.ICON_UNKNOWN, true), + INLINE_SKATING("inline skating", R.string.activity_type_inline_skating, R.drawable.ic_activity_inline_skating_24dp, true), + KAYAKING("kayaking", R.string.activity_type_kayaking, R.drawable.ic_activity_mtb_24dp, true), + KITE_SURFING("kite surfing", R.string.activity_type_kite_surfing, ActivityIcon.ICON_UNKNOWN, true), + LAND_SAILING("land sailing", R.string.activity_type_land_sailing, ActivityIcon.ICON_UNKNOWN, true), + MIXED_TYPE("mixed type", R.string.activity_type_mixed_type, ActivityIcon.ICON_UNKNOWN, true), + MOTOR_BIKE("motor bike", R.string.activity_type_motor_bike, R.drawable.ic_activity_mtb_24dp, true), + MOTOR_BOATING("motor boating", R.string.activity_type_motor_boating, R.drawable.ic_activity_boat_24dp, true), + MOUNTAIN_BIKING("mountain biking", R.string.activity_type_mountain_biking, R.drawable.ic_activity_mtb_24dp, true), + OFF_TRAIL_HIKING("off trail hiking", R.string.activity_type_hiking, R.drawable.ic_activity_walk_24dp, false), + OTHER("other", R.string.activity_type_other, ActivityIcon.ICON_UNKNOWN, true), + PADDLING("paddling", R.string.activity_type_paddling, ActivityIcon.ICON_UNKNOWN, true), + PARA_GLIDING("para gliding", R.string.activity_type_para_gliding, ActivityIcon.ICON_UNKNOWN, true), + RC_AIRPLANE("RC airplane", R.string.activity_type_rc_airplane, R.drawable.ic_activity_flight_24dp, true), + RC_BOAT("RC boat", R.string.activity_type_rc_boat, R.drawable.ic_activity_boat_24dp, true), + RC_HELICOPTER("RC helicopter", R.string.activity_type_rc_helicopter, ActivityIcon.ICON_UNKNOWN, true), + RIDING("riding", R.string.activity_type_horse_back_riding, ActivityIcon.ICON_UNKNOWN, true), + ROAD_BIKING("road biking", R.string.activity_type_road_biking, R.drawable.ic_activity_bike_24dp, true), + ROLLER_SKIING("roller skiing", R.string.activity_type_roller_skiing, ActivityIcon.ICON_UNKNOWN, true), + ROWING("rowing", R.string.activity_type_rowing, ActivityIcon.ICON_UNKNOWN, true), + RUNNING("running", R.string.activity_type_running, R.drawable.ic_activity_run_24dp, false), + SAILING("sailing", R.string.activity_type_sailing, R.drawable.ic_activity_sailing_24dp, true), + KICKSCOOTER("kickscooter", R.string.activity_type_kickscooter, R.drawable.ic_activity_scooter_24dp, true), + SEAPLANE("seaplane", R.string.activity_type_seaplane, R.drawable.ic_activity_flight_24dp, true), + SKATE_BOARDING("skateboarding", R.string.activity_type_skate_boarding, R.drawable.ic_activity_skateboarding_24dp, true), + SKATING("skating", R.string.activity_type_skating, ActivityIcon.ICON_UNKNOWN, true), + SKIING("skiing", R.string.activity_type_skiing, R.drawable.ic_activity_skiing_24dp, true), + SKY_JUMPING("sky jumping", R.string.activity_type_sky_jumping, ActivityIcon.ICON_UNKNOWN, true), + SLED("sled", R.string.activity_type_sled, ActivityIcon.ICON_UNKNOWN, true), + SNOW_BOARDING("snowboarding", R.string.activity_type_snow_boarding, R.drawable.ic_activity_snowboarding_24dp, true), + SNOW_SHOEING("snow shoeing", R.string.activity_type_snow_shoeing, ActivityIcon.ICON_UNKNOWN, true), + SPEED_WALKING("speed walking", R.string.activity_type_speed_walking, R.drawable.ic_activity_walk_24dp, false), + STREET_RUNNING("street running", R.string.activity_type_street_running, R.drawable.ic_activity_run_24dp, false), + SURFING("surfing", R.string.activity_type_surfing, ActivityIcon.ICON_UNKNOWN, true), + TRACK_CYCLING("track cycling", R.string.activity_type_track_cycling, R.drawable.ic_activity_bike_24dp, true), + TRACK_RUNNING("track running", R.string.activity_type_trail_running, R.drawable.ic_activity_run_24dp, false), + TRAIL_HIKING("trail hiking", R.string.activity_type_trail_hiking, R.drawable.ic_activity_walk_24dp, false), + TRAIL_RUNNING("trail running", R.string.activity_type_trail_running, R.drawable.ic_activity_run_24dp, false), + TRAIN("train", R.string.activity_type_train, ActivityIcon.ICON_UNKNOWN, true), + ULTIMATE_FRISBEE("ultimate frisbee", R.string.activity_type_ultimate_frisbee, ActivityIcon.ICON_UNKNOWN, true), + WAKEBOARDING("wakeboarding", R.string.activity_type_wakeboarding, ActivityIcon.ICON_UNKNOWN, true), + WALKING("walking", R.string.activity_type_walking, R.drawable.ic_activity_walk_24dp, false), + WATER_SKIING("water skiing", R.string.activity_type_water_skiing, ActivityIcon.ICON_UNKNOWN, true), + WIND_SURFING("wind surfing", R.string.activity_type_wind_surfing, ActivityIcon.ICON_UNKNOWN, true), + SWIMMING("swimming", R.string.activity_type_swimming, R.drawable.ic_activity_swimming_24dp, false), + SWIMMING_OPEN("swimming in open water", R.string.activity_type_swimming_open, R.drawable.ic_activity_swimming_open_24dp, false), + WORKOUT("workout", R.string.activity_type_workout, R.drawable.ic_activity_workout_24dp, false), + UNKNOWN("unknown", R.string.activity_type_unknown, ActivityIcon.ICON_UNKNOWN, true); final String id; - final ActivityIcon icon; + final int iconDrawableId; final boolean showSpeedPreferred; final int localizedStringId; - ActivityType(String id, int localizedStringId, ActivityIcon icon, boolean showSpeedPreferred) { + ActivityType(String id, int localizedStringId, int iconDrawableId, boolean showSpeedPreferred) { this.id = id; this.localizedStringId = localizedStringId; - this.icon = icon; + this.iconDrawableId = iconDrawableId; this.showSpeedPreferred = showSpeedPreferred; } @@ -101,13 +101,8 @@ public String getId() { return id; } - @Deprecated - public String getIconId() { - return icon.iconId; - } - public int getIconDrawableId() { - return icon.iconDrawableId; + return iconDrawableId; } public int getLocalizedStringId() { @@ -126,12 +121,9 @@ public static List getLocalizedStrings(Context context) { } @NonNull - public static ActivityType findBy(String iconId) { - if (ActivityIcon.UNKNOWN.iconId.equals(iconId)) { - return ActivityType.UNKNOWN; - } + public static ActivityType findBy(String activityTypeId) { return Arrays.stream(ActivityType.values()).filter( - it -> it.icon.iconId.equals(iconId) + it -> it.id.equals(activityTypeId) ).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 c072d86c9..7dcaa44c9 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Track.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Track.java @@ -101,8 +101,8 @@ public String getActivityTypeLocalized() { return activityTypeLocalized; } - public void setActivityTypeLocalized(String activityType) { - this.activityTypeLocalized = activityType; + public void setActivityTypeLocalized(String activityTypeLocalized) { + this.activityTypeLocalized = activityTypeLocalized; } public ActivityType getActivityType() { 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 10f0730ff..41c6d2656 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,11 @@ 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 + /** see {@link de.dennisguse.opentracks.data.models.ActivityType}.id */ + String ACTIVITY_TYPE = "activity_type"; String ACTIVITY_TYPE_LOCALIZED = "category"; // track activity type + @Deprecated + String ICON = "icon"; // track activity type icon String STARTTIME = "starttime"; // track start time String STARTTIME_OFFSET = "starttime_offset"; // in plus/minus in seconds String STOPTIME = "stoptime"; // track stop time @@ -57,7 +61,6 @@ 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 //TODO DEPRECATED String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " @@ -79,7 +82,8 @@ public interface TracksColumns extends BaseColumns { + ICON + " TEXT, " + UUID + " BLOB, " + ALTITUDE_LOSS + " FLOAT, " - + STARTTIME_OFFSET + " INTEGER)"; + + STARTTIME_OFFSET + " INTEGER, " + + ACTIVITY_TYPE + " TEXT)"; String CREATE_TABLE_INDEX = "CREATE UNIQUE INDEX " + TABLE_NAME + "_" + UUID + "_index ON " + TABLE_NAME + "(" + UUID + ")"; From ea37e2852bf6a038189745497eb2fef9b363f88e Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Mon, 2 Oct 2023 21:48:20 +0200 Subject: [PATCH 6/7] Cleanup: TrackListAdapter cursor renamed. --- .../opentracks/ui/TrackListAdapter.java | 80 ++++++++----------- 1 file changed, 34 insertions(+), 46 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/ui/TrackListAdapter.java b/src/main/java/de/dennisguse/opentracks/ui/TrackListAdapter.java index 4fff2612d..d8eb0e574 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/TrackListAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/ui/TrackListAdapter.java @@ -46,7 +46,7 @@ public class TrackListAdapter extends RecyclerView.Adapter Date: Tue, 3 Oct 2023 16:41:31 +0200 Subject: [PATCH 7/7] ActivityType non-localized: import and export for GPX, KML, and KMZ. Fixes #1608. --- doc/opentracks-schema-1.0.xsd | 9 +++++ .../io/file/importer/ExportImportTest.java | 6 +-- .../file/importer/GPXTrackImporterTest.java | 1 + src/androidTest/res/raw/gpx_timezone.gpx | 3 +- .../io/file/exporter/GPXTrackExporter.java | 8 +++- .../io/file/exporter/KMLTrackExporter.java | 27 +++++++++---- .../io/file/importer/GpxTrackImporter.java | 28 +++++++------ .../io/file/importer/KmlTrackImporter.java | 39 +++++++++---------- .../io/file/importer/TrackImporter.java | 1 - 9 files changed, 75 insertions(+), 47 deletions(-) diff --git a/doc/opentracks-schema-1.0.xsd b/doc/opentracks-schema-1.0.xsd index 9b9ed8e36..89b187fb1 100644 --- a/doc/opentracks-schema-1.0.xsd +++ b/doc/opentracks-schema-1.0.xsd @@ -51,4 +51,13 @@ + + + + User-defined translation of GPX's ]]>. + Only used in GPX. + + + \ No newline at end of file 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 59464b9af..7065be17d 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 @@ -309,10 +309,10 @@ public void kmz_with_trackdetail_and_sensordata() throws TimeoutException, IOExc // 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.getActivityType(), importedTrack.getActivityType()); // 2. trackpoints TrackPointAssert a = new TrackPointAssert(); @@ -380,13 +380,11 @@ public void gpx() throws TimeoutException, IOException { // 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()); - //TODO exporting and importing a track icon is not yet supported by GpxTrackWriter. - //assertEquals(track.getIcon(), importedTrack.getIcon()); - // 2. trackpoints // The GPX exporter does not support exporting TrackPoints without lat/lng. // Therefore, the track segmentation is changes. 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 df1624d2f..6d7fcc15d 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 @@ -80,6 +80,7 @@ public void gpx_with_pause_resume() throws IOException { // 2. track Track importedTrack = contentProviderUtils.getTrack(importTrackId); assertNotNull(importedTrack); + assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType()); assertEquals("the category", importedTrack.getActivityTypeLocalized()); assertEquals("the description", importedTrack.getDescription()); assertEquals("2021-01-07 22:51", importedTrack.getName()); diff --git a/src/androidTest/res/raw/gpx_timezone.gpx b/src/androidTest/res/raw/gpx_timezone.gpx index 23d754843..a9946060f 100644 --- a/src/androidTest/res/raw/gpx_timezone.gpx +++ b/src/androidTest/res/raw/gpx_timezone.gpx @@ -21,10 +21,11 @@ xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/ - + c0c0c0 7002101e-4198-4613-8c24-544e01ca3981 + 0.0 0 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 7a7362a05..535d14486 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 @@ -261,7 +261,7 @@ public void writeMarker(ZoneOffset zoneOffset, Marker marker) { printWriter.println(""); printWriter.println("" + StringUtils.formatCData(marker.getName()) + ""); printWriter.println("" + StringUtils.formatCData(marker.getDescription()) + ""); - printWriter.println("" + StringUtils.formatCData(marker.getCategory()) + ""); + printWriter.println("" + StringUtils.formatCData(marker.getCategory()) + ""); //TODO This is localized; may be better to export in English only. See #1608 printWriter.println(""); } @@ -269,12 +269,16 @@ public void writeBeginTrack(Track track) { printWriter.println(""); printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); - printWriter.println("" + StringUtils.formatCData(track.getActivityTypeLocalized()) + ""); + printWriter.println("" + StringUtils.formatCData(track.getActivityType().getId()) + ""); printWriter.println(""); printWriter.println("c0c0c0"); printWriter.println("" + track.getUuid() + ""); + if (track.getActivityTypeLocalized() != null || !track.getActivityTypeLocalized().isBlank()) { + printWriter.println("" + StringUtils.formatCData(track.getActivityTypeLocalized()) + ""); + } + TrackStatistics trackStatistics = track.getTrackStatistics(); printWriter.println(""); printWriter.println("" + trackStatistics.getTotalDistance().toM() + ""); 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 b9264ee62..b76dd3305 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 @@ -37,6 +37,7 @@ import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.ContentProviderUtils; import de.dennisguse.opentracks.data.TrackPointIterator; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; @@ -59,7 +60,8 @@ public class KMLTrackExporter implements TrackExporter { private static final String TRACK_STYLE = "track"; private static final String SCHEMA_ID = "schema"; - public static final String EXTENDED_DATA_TYPE_ACTIVITYTYPE = "type"; + public static final String EXTENDED_DATA_TYPE_LOCALIZED = "type"; + public static final String EXTENDED_DATA_ACTIVITY_TYPE = "activityType"; public static final String EXTENDED_DATA_TYPE_TRACKPOINT = "trackpoint_type"; public static final String EXTENDED_DATA_TYPE_SPEED = "speed"; @@ -298,13 +300,13 @@ private void writeBeginTrack(Track track) { printWriter.println("" + track.getUuid() + ""); printWriter.println("#" + TRACK_STYLE + ""); - writeActivityType(track.getActivityTypeLocalized()); + writeActivityType(track.getActivityType()); + writeTypeLocalized(track.getActivityTypeLocalized()); printWriter.println(""); printWriter.println("absolute"); printWriter.println("1"); } - private void writeEndTrack() { printWriter.println(""); printWriter.println(""); @@ -416,7 +418,7 @@ private void writePlacemark(String name, String activityType, String description printWriter.println("" + StringUtils.formatCData(description) + ""); printWriter.println("" + getTime(zoneOffset, location) + ""); printWriter.println("#" + KMLTrackExporter.MARKER_STYLE + ""); - writeActivityType(activityType); + writeTypeLocalized(activityType); printWriter.println(""); printWriter.println("" + getCoordinates(location, ",") + ""); printWriter.println(""); @@ -437,7 +439,7 @@ private void writePhotoOverlay(Marker marker, float heading, ZoneOffset zoneOffs printWriter.println(""); printWriter.println("" + getTime(zoneOffset, marker.getLocation()) + ""); printWriter.println("#" + MARKER_STYLE + ""); - writeActivityType(marker.getCategory()); + writeTypeLocalized(marker.getCategory()); if (exportPhotos) { printWriter.println("" + KmzTrackExporter.buildKmzImageFilePath(marker) + ""); @@ -492,12 +494,21 @@ private static String getCoordinates(Location location, String separator) { return result; } - private void writeActivityType(String activityTypeLocalized) { - if (activityTypeLocalized == null || "".equals(activityTypeLocalized)) { + private void writeTypeLocalized(String localizedValue) { + if (localizedValue == null || localizedValue.equals("")) { + return; + } + printWriter.println(""); + printWriter.println("" + StringUtils.formatCData(localizedValue) + ""); + printWriter.println(""); + } + + private void writeActivityType(ActivityType value) { + if (value == null) { return; } printWriter.println(""); - printWriter.println("" + StringUtils.formatCData(activityTypeLocalized) + ""); + printWriter.println("" + StringUtils.formatCData(value.getId()) + ""); printWriter.println(""); } diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/GpxTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/GpxTrackImporter.java index 7d7cc5cd3..91b8f6d33 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/GpxTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/GpxTrackImporter.java @@ -55,7 +55,6 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac private static final String TAG = GpxTrackImporter.class.getSimpleName(); private static final String TAG_DESCRIPTION = "desc"; - private static final String TAG_COMMENT = "cmt"; private static final String TAG_ALTITUDE = "ele"; private static final String TAG_GPX = "gpx"; private static final String TAG_NAME = "name"; @@ -64,6 +63,7 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac private static final String TAG_TRACK_POINT = "trkpt"; private static final String TAG_TRACK_SEGMENT = "trkseg"; private static final String TAG_TYPE = "type"; + private static final String TAG_TYPE_LOCALIZED = "opentracks:typeTranslated"; private static final String TAG_MARKER = "wpt"; private static final String TAG_ID = "opentracks:trackid"; @@ -99,6 +99,7 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac private String name; private String description; private String activityType; + private String activityTypeLocalized; private String latitude; private String longitude; private String altitude; @@ -159,7 +160,11 @@ public void endElement(String uri, String localName, String tag) { case TAG_GPX -> onFileEnd(); case TAG_MARKER -> onMarkerEnd(); case TAG_TRACK -> { - trackImporter.setTrack(context, name, uuid, description, activityType, null, zoneOffset); + if (activityTypeLocalized == null ) { + // Backward compatibility: up v4.9.1 as contained localized content. + activityTypeLocalized = activityType; + } + trackImporter.setTrack(context, name, uuid, description, activityTypeLocalized, activityType, zoneOffset); zoneOffset = null; } case TAG_TRACK_SEGMENT -> onTrackSegmentEnd(); @@ -174,9 +179,16 @@ public void endElement(String uri, String localName, String tag) { description = content.trim(); } } - case TAG_TYPE -> { + case TAG_TYPE -> { //Track or Marker/WPT if (content != null) { + // In older version this might be localized content. activityType = content.trim(); + markerType = content.trim(); + } + } + case TAG_TYPE_LOCALIZED -> { + if (content != null) { + activityTypeLocalized = content.trim(); } } case TAG_TIME -> { @@ -189,11 +201,6 @@ public void endElement(String uri, String localName, String tag) { altitude = content.trim(); } } - case TAG_COMMENT -> { - if (content != null) { - markerType = content.trim(); - } - } case TAG_EXTENSION_SPEED, TAG_EXTENSION_SPEED_COMPAT -> { if (content != null) { speed = content.trim(); @@ -385,7 +392,6 @@ private void onTrackPointStart(Attributes attributes) { private void onMarkerStart(Attributes attributes) { name = null; description = null; - activityType = null; photoUrl = null; latitude = attributes.getValue(ATTRIBUTE_LAT); longitude = attributes.getValue(ATTRIBUTE_LON); @@ -415,8 +421,8 @@ private void onMarkerEnd() { if (description != null) { marker.setDescription(description); } - if (activityType != null) { - marker.setCategory(activityType); + if (markerType != null) { + marker.setCategory(markerType); } if (photoUrl != null) { diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/KmlTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/KmlTrackImporter.java index e6b097f4d..1d278f126 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/KmlTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/KmlTrackImporter.java @@ -53,7 +53,6 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac private static final String TAG_COORDINATES = "coordinates"; private static final String TAG_DESCRIPTION = "description"; - private static final String TAG_ICON = "icon"; private static final String TAG_COORD = "coord"; private static final String TAG_KML22_COORD = "gx:coord"; @@ -61,7 +60,7 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac private static final String TAG_MULTI_TRACK = "MultiTrack"; private static final String TAG_KML22_MULTI_TRACK = "gx:MultiTrack"; - private static final String TAG_DATA_ACTIVITYTYPE = "Data"; + private static final String TAG_EXTENDED_DATA = "Data"; private static final String TAG_SIMPLE_ARRAY_DATA = "SimpleArrayData"; private static final String TAG_KML22_SIMPLE_ARRAY_DATA = "gx:SimpleArrayData"; @@ -94,7 +93,7 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac private final ArrayList whenList = new ArrayList<>(); private final ArrayList locationList = new ArrayList<>(); - private String dataType; //Could be converted to an ENUM + private String dataType; private final ArrayList trackpointTypeList = new ArrayList<>(); private final ArrayList sensorSpeedList = new ArrayList<>(); @@ -112,10 +111,10 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac // The current element content private String content = ""; - private String icon; private String name; private String description; private String activityType; + private String activityTypeLocalized; private String latitude; private String longitude; private String altitude; @@ -148,7 +147,7 @@ public void startElement(String uri, String localName, String tag, Attributes at } onTrackSegmentStart(); } - case TAG_DATA_ACTIVITYTYPE, TAG_SIMPLE_ARRAY_DATA, TAG_KML22_SIMPLE_ARRAY_DATA -> + case TAG_EXTENDED_DATA, TAG_SIMPLE_ARRAY_DATA, TAG_KML22_SIMPLE_ARRAY_DATA -> dataType = attributes.getValue(ATTRIBUTE_NAME); } } @@ -167,18 +166,24 @@ public void endElement(String uri, String localName, String tag) throws SAXExcep onMarkerEnd(); case TAG_COORDINATES -> onMarkerLocationEnd(); case TAG_MULTI_TRACK, TAG_KML22_MULTI_TRACK -> { - trackImporter.setTrack(context, name, uuid, description, activityType, icon, zoneOffset); + trackImporter.setTrack(context, name, uuid, description, activityTypeLocalized, activityType, zoneOffset); zoneOffset = null; } case TAG_TRACK, TAG_KML22_TRACK -> onTrackSegmentEnd(); case TAG_COORD, TAG_KML22_COORD -> onCoordEnded(); case TAG_VALUE, TAG_KML22_VALUE -> { - if (KMLTrackExporter.EXTENDED_DATA_TYPE_ACTIVITYTYPE.equals(dataType)) { - if (content != null) { - activityType = content.trim(); + switch (dataType) { + case KMLTrackExporter.EXTENDED_DATA_ACTIVITY_TYPE -> { + if (content != null) { + activityType = content.trim(); + } } - } else { - onExtendedDataValueEnd(); + case KMLTrackExporter.EXTENDED_DATA_TYPE_LOCALIZED -> { + if (content != null) { + activityTypeLocalized = content.trim(); + } + } + default -> onExtendedDataValueEnd(); } } case TAG_NAME -> { @@ -196,11 +201,6 @@ public void endElement(String uri, String localName, String tag) throws SAXExcep description = content.trim(); } } - case TAG_ICON -> { - if (content != null) { - icon = content.trim(); - } - } case TAG_WHEN -> { if (content != null) { try { @@ -233,9 +233,8 @@ public void endElement(String uri, String localName, String tag) throws SAXExcep private void onMarkerStart() { // Reset all Placemark variables name = null; - icon = null; description = null; - activityType = null; + activityTypeLocalized = null; photoUrl = null; latitude = null; longitude = null; @@ -262,13 +261,13 @@ private void onMarkerEnd() { Marker marker = new Marker(null, new TrackPoint(TrackPoint.Type.TRACKPOINT, location, whenList.get(0))); //TODO Creating marker without need marker.setName(name != null ? name : ""); marker.setDescription(description != null ? description : ""); - marker.setCategory(activityType != null ? activityType : ""); + marker.setCategory(activityTypeLocalized != null ? activityTypeLocalized : ""); marker.setPhotoUrl(photoUrl); markers.add(marker); name = null; description = null; - activityType = null; + activityTypeLocalized = null; photoUrl = null; whenList.clear(); } 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 ac6030594..10145a96e 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 @@ -105,7 +105,6 @@ void setTrack(Context context, String name, String uuid, String description, Str if (activityTypeLocalized != null) { track.setActivityTypeLocalized(activityTypeLocalized); } - ActivityType activityType; if (activityTypeId == null) { activityType = ActivityType.findByLocalizedString(context, activityTypeLocalized);