Marker is now a record.

This commit is contained in:
Dennis Guse
2025-11-29 16:44:33 +01:00
committed by Dennis Guse
parent 9c271972d2
commit 5b4b54694c
22 changed files with 515 additions and 402 deletions
@@ -67,14 +67,14 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this);
Marker marker = contentProviderUtils.getMarker(markerId);
markerAutoCloseableIterator = contentProviderUtils.getMarkerIterator(marker.getTrackId());
markerAutoCloseableIterator = contentProviderUtils.getMarkerIterator(marker.trackId());
if (markerAutoCloseableIterator == null) {
finish();
}
int markerIndex = -1;
while (markerAutoCloseableIterator.hasNext()) {
if (markerId.equals(markerAutoCloseableIterator.next().getId())) {
if (markerId.equals(markerAutoCloseableIterator.next().id())) {
markerIndex = markerAutoCloseableIterator.getPosition();
break;
}
@@ -124,7 +124,7 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
@NonNull
public Fragment createFragment(int position) {
markerAutoCloseableIterator.moveToPosition(position);
return MarkerDetailFragment.newInstance(markerAutoCloseableIterator.next().getId());
return MarkerDetailFragment.newInstance(markerAutoCloseableIterator.next().id());
}
@Override
@@ -135,7 +135,7 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
@Nullable
public CharSequence getPageTitle(int position) {
markerAutoCloseableIterator.moveToPosition(position);
return getString(R.string.marker_detail_title, position + 1, getItemCount(), markerAutoCloseableIterator.next().getName());
return getString(R.string.marker_detail_title, position + 1, getItemCount(), markerAutoCloseableIterator.next().name());
}
}
}
@@ -111,8 +111,8 @@ public class MarkerDetailFragment extends Fragment {
}
if (item.getItemId() == R.id.marker_detail_share) {
if (marker.hasPhoto()) {
Intent intent = ShareUtils.newShareFileIntent(getContext(), marker.getId());
if (marker.photoUrl() != null) {
Intent intent = ShareUtils.newShareFileIntent(getContext(), marker.id());
intent = Intent.createChooser(intent, null);
startActivity(intent);
}
@@ -180,15 +180,15 @@ public class MarkerDetailFragment extends Fragment {
}
private void updateUi() {
if (marker.hasPhoto()) {
viewBinding.markerDetailMarkerPhoto.setImageURI(marker.getPhotoUrl());
if (marker.photoUrl() != null) {
viewBinding.markerDetailMarkerPhoto.setImageURI(marker.photoUrl());
} else {
viewBinding.markerDetailMarkerPhoto.setImageDrawable(MarkerUtils.getDefaultPhoto(getContext()));
}
viewBinding.markerDetailMarkerCategory.setText(StringUtils.getCategory(marker.getCategory()));
viewBinding.markerDetailMarkerDescription.setText(marker.getDescription());
viewBinding.markerDetailMarkerCategory.setText(StringUtils.getCategory(marker.category()));
viewBinding.markerDetailMarkerDescription.setText(marker.description());
viewBinding.markerDetailMarkerLocation.setText(StringUtils.formatCoordinate(getContext(), marker.getPosition()));
viewBinding.markerDetailMarkerLocation.setText(StringUtils.formatCoordinate(getContext(), marker.position()));
}
}
@@ -47,6 +47,7 @@ import java.time.Instant;
import de.dennisguse.opentracks.AbstractActivity;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.Marker;
import de.dennisguse.opentracks.data.models.MarkerBuilder;
import de.dennisguse.opentracks.data.models.Position;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.data.models.TrackPoint;
@@ -181,11 +182,11 @@ public class MarkerEditActivity extends AbstractActivity {
private void loadMarkerData(Marker data) {
marker = data;
viewBinding.markerEditName.setText(marker.getName());
viewBinding.markerEditMarkerType.setText(marker.getCategory());
viewBinding.markerEditDescription.setText(marker.getDescription());
if (marker.hasPhoto()) {
setMarkerImageView(marker.getPhotoUrl());
viewBinding.markerEditName.setText(marker.name());
viewBinding.markerEditMarkerType.setText(marker.category());
viewBinding.markerEditDescription.setText(marker.description());
if (marker.photoUrl() != null) {
setMarkerImageView(marker.photoUrl());
} else {
viewBinding.markerEditPhoto.setImageDrawable(null);
}
@@ -247,7 +248,7 @@ public class MarkerEditActivity extends AbstractActivity {
* If a photo is set then one's options are shown, otherwise another ones are shown.
*/
private void hideAndShowOptions() {
boolean isPhotoSet = (marker != null && marker.hasPhoto());
boolean isPhotoSet = (marker != null && marker.photoUrl() != null);
if (insertPhotoMenuItem != null && insertGalleryImgMenuItem != null) {
insertPhotoMenuItem.setVisible(!isPhotoSet);
insertGalleryImgMenuItem.setVisible(!isPhotoSet);
@@ -259,7 +260,7 @@ public class MarkerEditActivity extends AbstractActivity {
* Returns the trackId; either from track or marker.
*/
private Track.Id getTrackId() {
return trackId == null ? marker.getTrackId() : trackId;
return trackId == null ? marker.trackId() : trackId;
}
private void setMarkerImageView(@NonNull Uri uri) {
@@ -20,6 +20,7 @@ import java.util.NoSuchElementException;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.ContentProviderUtils;
import de.dennisguse.opentracks.data.models.Marker;
import de.dennisguse.opentracks.data.models.MarkerBuilder;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.util.FileUtils;
@@ -40,8 +41,8 @@ public class MarkerEditViewModel extends AndroidViewModel {
markerData = new MutableLiveData<>();
Marker marker = new ContentProviderUtils(getApplication()).getMarker(markerId);
if (marker.hasPhoto()) {
photoOriginalUri = marker.getPhotoUrl();
if (marker.photoUrl() != null) {
photoOriginalUri = marker.photoUrl();
}
markerData.postValue(marker);
@@ -63,20 +64,20 @@ public class MarkerEditViewModel extends AndroidViewModel {
return;
}
File photoFile = MarkerUtils.getPhotoFileIfExists(getApplication(), markerData.getValue().getTrackId(), photoUri);
File photoFile = MarkerUtils.getPhotoFileIfExists(getApplication(), markerData.getValue().trackId(), photoUri);
if (photoFile != null) {
FileUtils.deleteDirectoryRecurse(photoFile);
}
}
private void deletePhoto(Marker marker) {
if (marker.hasPhoto()) {
deletePhoto(marker.getPhotoUrl());
if (marker.photoUrl() != null) {
deletePhoto(marker.photoUrl());
}
}
public void onPhotoDelete(String name, String category, String description) {
Marker marker = getMarker();
MarkerBuilder marker = new MarkerBuilder(getMarker());
if (marker.hasPhoto()) {
if (!marker.getPhotoUrl().equals(photoOriginalUri)) {
deletePhoto(marker.getPhotoUrl());
@@ -85,21 +86,21 @@ public class MarkerEditViewModel extends AndroidViewModel {
marker.setName(name);
marker.setCategory(category);
marker.setDescription(description);
markerData.postValue(marker);
markerData.postValue(marker.getMarker());
}
}
public void onNewCameraPhoto(@NonNull Uri photoUri, String name, String category, String description) {
Marker marker = getMarker();
MarkerBuilder marker = new MarkerBuilder(getMarker());
marker.setPhotoUrl(photoUri);
marker.setName(name);
marker.setCategory(category);
marker.setDescription(description);
markerData.postValue(marker);
markerData.postValue(marker.getMarker());
}
public void onNewGalleryPhoto(@NonNull Uri srcUri, String name, String category, String description) {
Marker marker = getMarker();
MarkerBuilder marker = new MarkerBuilder(getMarker());
try (ParcelFileDescriptor parcelFd = getApplication().getContentResolver().openFileDescriptor(srcUri, "r")) {
FileDescriptor srcFd = parcelFd.getFileDescriptor();
@@ -111,7 +112,8 @@ public class MarkerEditViewModel extends AndroidViewModel {
marker.setName(name);
marker.setCategory(category);
marker.setDescription(description);
markerData.postValue(marker);
markerData.postValue(marker.getMarker());
} catch (IOException e) {
Log.e(TAG, e.getMessage());
Toast.makeText(getApplication(), R.string.marker_add_canceled, Toast.LENGTH_LONG).show();
@@ -119,15 +121,15 @@ public class MarkerEditViewModel extends AndroidViewModel {
}
public void onDone(String name, String category, String description) {
Marker marker = getMarker();
MarkerBuilder marker = new MarkerBuilder(getMarker());
marker.setName(name);
marker.setCategory(category);
marker.setDescription(description);
if (marker.getId() == null) {
new ContentProviderUtils(getApplication()).insertMarker(marker);
new ContentProviderUtils(getApplication()).insertMarker(marker.getMarker());
} else {
new ContentProviderUtils(getApplication()).updateMarker(getApplication(), marker);
new ContentProviderUtils(getApplication()).updateMarker(getApplication(), marker.getMarker());
}
if (photoOriginalUri != null && (!marker.hasPhoto() || !photoOriginalUri.equals(marker.getPhotoUrl()))) {
@@ -143,7 +145,15 @@ public class MarkerEditViewModel extends AndroidViewModel {
String name = getApplication().getString(R.string.marker_name_format, nextMarkerNumber + 1);
String icon = getApplication().getString(R.string.marker_icon_url);
Marker marker = new Marker(trackId, trackPoint, name, "", "", icon, null);
Marker marker = new Marker(
null,
trackId,
name,
"",
icon,
"",
trackPoint.getPosition(),
null);
if (markerData == null) {
markerData = new MutableLiveData<>();
@@ -158,7 +168,7 @@ public class MarkerEditViewModel extends AndroidViewModel {
// it's new marker -> clean all photos.
deletePhoto(marker);
deletePhoto(photoOriginalUri);
} else if (photoOriginalUri == null || (marker.hasPhoto() && !marker.getPhotoUrl().equals(photoOriginalUri))) {
} else if (photoOriginalUri == null || (marker.photoUrl() != null && !marker.photoUrl().equals(photoOriginalUri))) {
// it's an edit marker -> delete photo if it was empty or it was changed (leaving the original in that case).
deletePhoto(marker);
}
@@ -137,7 +137,7 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
public void setAllSelected(boolean isSelected) {
if (isSelected) {
for (Marker marker : markers) {
selection.put((int) marker.getId().id(), true);
selection.put((int) marker.id().id(), true);
}
} else {
selection.clear();
@@ -179,24 +179,24 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
public void bind(Marker marker) {
this.marker = marker;
viewBinding.markerListItemPhoto.setVisibility(marker.hasPhoto() ? View.VISIBLE : View.GONE);
if (marker.hasPhoto()) {
viewBinding.markerListItemPhoto.setVisibility(marker.photoUrl() != null ? View.VISIBLE : View.GONE);
if (marker.photoUrl() != null) {
int height = ThemeUtils.getPhotoHeight(context);
ViewGroup.LayoutParams params = viewBinding.markerListItemPhoto.getLayoutParams();
params.height = height;
viewBinding.markerListItemPhoto.setLayoutParams(params);
asyncLoadPhoto(viewBinding.markerListItemPhoto, marker.getPhotoUrl(), marker.getId());
asyncLoadPhoto(viewBinding.markerListItemPhoto, marker.photoUrl(), marker.id());
}
viewBinding.markerListItemName.setText(marker.getName());
viewBinding.markerListItemName.setText(marker.name());
{
ZoneOffset timeZone = new ContentProviderUtils(context).getTrack(marker.getTrackId()).zoneOffset();
ListItemUtils.setDateAndTime(context, viewBinding.markerListItemDate, viewBinding.markerListItemTime, marker.getTime(), timeZone);
ZoneOffset timeZone = new ContentProviderUtils(context).getTrack(marker.trackId()).zoneOffset();
ListItemUtils.setDateAndTime(context, viewBinding.markerListItemDate, viewBinding.markerListItemTime, marker.position().time(), timeZone);
}
String categoryDescription = StringUtils.getCategoryDescription(marker.getCategory(), marker.getDescription());
String categoryDescription = StringUtils.getCategoryDescription(marker.category(), marker.description());
viewBinding.markerListItemTimeDistance.setText(categoryDescription);
setSelected(selection.get((int) getId()));
@@ -208,7 +208,7 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
}
public long getId() {
return marker.getId().id();
return marker.id().id();
}
@Override
@@ -218,7 +218,7 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
actionMode.invalidate();
} else {
Intent intent = IntentUtils.newIntent(context, MarkerDetailActivity.class)
.putExtra(MarkerDetailActivity.EXTRA_MARKER_ID, marker.getId());
.putExtra(MarkerDetailActivity.EXTRA_MARKER_ID, marker.id());
context.startActivity(intent);
}
}