From 8744724c0f2df6dcda6e784a5bb8381949cf81fd Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Tue, 24 Jun 2025 11:36:44 +0200 Subject: [PATCH] Enable to edit timezone offset for recorded tracks. Fixes #2014. --- .../opentracks/TrackEditActivity.java | 10 ++++++++-- .../opentracks/data/models/Track.java | 8 ++++++-- .../opentracks/ui/ZoneOffsetAdapter.java | 19 +++++++++++++++++++ src/main/res/layout/track_edit.xml | 19 +++++++++++++++++++ src/main/res/values/strings.xml | 1 + 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/main/java/de/dennisguse/opentracks/ui/ZoneOffsetAdapter.java diff --git a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java index da3969bf3..b6035d705 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java @@ -23,11 +23,14 @@ import android.widget.ArrayAdapter; import androidx.annotation.NonNull; +import java.time.ZoneOffset; + import de.dennisguse.opentracks.data.ContentProviderUtils; import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.databinding.TrackEditBinding; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; +import de.dennisguse.opentracks.ui.ZoneOffsetAdapter; import de.dennisguse.opentracks.util.TrackUtils; /** @@ -71,7 +74,6 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit viewBinding.trackEditName.setText(track.getName()); 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) -> { @@ -92,12 +94,16 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit if (activityType == null) { activityType = track.getActivityType(); } - setActivityTypeIcon(activityType); viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), this, viewBinding.trackEditActivityType.getText().toString())); viewBinding.trackEditDescription.setText(track.getDescription()); + final ArrayAdapter zoneOffsetAdapter = new ZoneOffsetAdapter(this, android.R.layout.simple_dropdown_item_1line); + viewBinding.trackEditTimeOffset.setText(track.getZoneOffset().toString()); + viewBinding.trackEditTimeOffset.setAdapter(zoneOffsetAdapter); + viewBinding.trackEditTimeOffset.setOnItemClickListener((parent, view, position, id) -> track.setZoneOffset(zoneOffsetAdapter.getItem(position))); + viewBinding.trackEditSave.setOnClickListener(v -> { TrackUtils.updateTrack(TrackEditActivity.this, track, viewBinding.trackEditName.getText().toString(), viewBinding.trackEditActivityType.getText().toString(), viewBinding.trackEditDescription.getText().toString(), 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 625f276cd..9703de43d 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Track.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Track.java @@ -48,7 +48,7 @@ public class Track { private ActivityType activityType; - private final ZoneOffset zoneOffset; + private ZoneOffset zoneOffset; private TrackStatistics trackStatistics = new TrackStatistics(); @@ -58,7 +58,7 @@ public class Track { } public Track(@NonNull ZoneOffset zoneOffset) { - this.zoneOffset = zoneOffset; + setZoneOffset(zoneOffset); } /** @@ -117,6 +117,10 @@ public class Track { return zoneOffset; } + public void setZoneOffset(@NonNull ZoneOffset zoneOffset) { + this.zoneOffset = zoneOffset; + } + public OffsetDateTime getStartTime() { return trackStatistics .getStartTime().atOffset(zoneOffset); diff --git a/src/main/java/de/dennisguse/opentracks/ui/ZoneOffsetAdapter.java b/src/main/java/de/dennisguse/opentracks/ui/ZoneOffsetAdapter.java new file mode 100644 index 000000000..9ae5148b0 --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/ui/ZoneOffsetAdapter.java @@ -0,0 +1,19 @@ +package de.dennisguse.opentracks.ui; + + +import android.content.Context; +import android.widget.ArrayAdapter; + +import androidx.annotation.NonNull; + +import java.time.ZoneOffset; +import java.util.stream.IntStream; + +public class ZoneOffsetAdapter extends ArrayAdapter { + public ZoneOffsetAdapter(@NonNull Context context, int resource) { + super(context, resource, IntStream.range(-12, +12) + .boxed() + .map(ZoneOffset::ofHours) + .toList()); + } +} diff --git a/src/main/res/layout/track_edit.xml b/src/main/res/layout/track_edit.xml index 42e90a66d..cb4d630fe 100644 --- a/src/main/res/layout/track_edit.xml +++ b/src/main/res/layout/track_edit.xml @@ -79,6 +79,25 @@ limitations under the License. android:layout_gravity="bottom" /> + + + + + Activity type (e.g. hiking) Activity type + Timezone Offset Start recording your next adventure here