Use MarkerIterator for MarkerDetailActivity.

This commit is contained in:
Dennis Guse
2025-11-26 22:04:38 +01:00
parent 28d49de047
commit a1da53864e
5 changed files with 41 additions and 34 deletions
@@ -435,7 +435,7 @@ public class ContentProviderUtils {
}
//TODO Use MarkerIterator instead
public Cursor getMarkerCursor(@NonNull Track.Id trackId) {
Cursor getMarkerCursor(@NonNull Track.Id trackId) {
return getMarkerCursor(trackId, -1);
}
@@ -455,7 +455,19 @@ public class ContentProviderUtils {
return getMarkerCursor(null, selection, selectionArgs, MarkerColumns._ID, maxCount);
}
// TODO Merge with updateMarker
/**
* @param updateMarker the marker with updated data.
* @return true if successful.
*/
public boolean updateMarker(Context context, Marker updateMarker) {
Marker savedMarker = getMarker(updateMarker.getId());
if (!updateMarker.hasPhoto()) {
deleteMarkerPhoto(context, savedMarker);
}
int rows = contentResolver.update(MarkerColumns.CONTENT_URI, createContentValues(updateMarker), MarkerColumns._ID + "=?", new String[]{Long.toString(updateMarker.getId().id())});
return rows == 1;
}
public Marker.Id insertMarker(@NonNull Marker marker) {
marker.setId(null);
Uri uri = contentResolver.insert(MarkerColumns.CONTENT_URI, createContentValues(marker));
@@ -476,19 +488,6 @@ public class ContentProviderUtils {
}
}
/**
* @param updateMarker the marker with updated data.
* @return true if successful.
*/
public boolean updateMarker(Context context, Marker updateMarker) {
Marker savedMarker = getMarker(updateMarker.getId());
if (!updateMarker.hasPhoto()) {
deleteMarkerPhoto(context, savedMarker);
}
int rows = contentResolver.update(MarkerColumns.CONTENT_URI, createContentValues(updateMarker), MarkerColumns._ID + "=?", new String[]{Long.toString(updateMarker.getId().id())});
return rows == 1;
}
ContentValues createContentValues(@NonNull Marker marker) {
ContentValues values = new ContentValues();
@@ -47,6 +47,11 @@ class MarkerIterator extends AutoCloseableIterator<Marker> {
return cursor.getPosition();
}
@Override
public boolean moveToPosition(int position) {
return cursor.moveToPosition(position);
}
@VisibleForTesting
public int getCount() {
return cursor.getCount();
@@ -47,6 +47,11 @@ class TrackPointIterator extends AutoCloseableIterator<TrackPoint> {
return cursor.getPosition();
}
@Override
public boolean moveToPosition(int position) {
return cursor.moveToPosition(position);
}
@VisibleForTesting
public int getCount() {
return cursor.getCount();
@@ -16,7 +16,6 @@
package de.dennisguse.opentracks.ui.markers;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
@@ -35,6 +34,7 @@ import de.dennisguse.opentracks.data.models.Marker;
import de.dennisguse.opentracks.data.tables.MarkerColumns;
import de.dennisguse.opentracks.databinding.MarkerDetailActivityBinding;
import de.dennisguse.opentracks.ui.markers.DeleteMarkerDialogFragment.DeleteMarkerCaller;
import de.dennisguse.opentracks.util.AutoCloseableIterator;
/**
* An activity to display marker detail info.
@@ -51,7 +51,7 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
private MarkerDetailActivityBinding viewBinding;
private Cursor cursor;
private AutoCloseableIterator<Marker> markerAutoCloseableIterator;
@Override
protected void onCreate(Bundle bundle) {
@@ -67,23 +67,19 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this);
Marker marker = contentProviderUtils.getMarker(markerId);
//TODO only load used data: ID + name
cursor = contentProviderUtils.getMarkerCursor(marker.getTrackId());
if (cursor == null) {
markerAutoCloseableIterator = contentProviderUtils.getMarkerIterator(marker.getTrackId());
if (markerAutoCloseableIterator == null) {
finish();
}
int markerIndex = -1;
if (cursor != null && cursor.moveToFirst()) {
while (markerIndex == -1 && cursor.moveToNext()) {
Marker.Id currentId = new Marker.Id(cursor.getLong(cursor.getColumnIndexOrThrow(MarkerColumns._ID)));
if (markerId.equals(currentId)) {
markerIndex = cursor.getPosition();
}
while (markerAutoCloseableIterator.hasNext()) {
if (markerId.equals(markerAutoCloseableIterator.next().getId())) {
markerIndex = markerAutoCloseableIterator.getPosition();
break;
}
}
final MarkerDetailPagerAdapter markerAdapter = new MarkerDetailPagerAdapter(this);
viewBinding.makerDetailActivityViewPager.setAdapter(markerAdapter);
viewBinding.makerDetailActivityViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@@ -109,8 +105,8 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
super.onDestroy();
viewBinding = null;
if (cursor != null) cursor.close();
cursor = null;
if (markerAutoCloseableIterator != null) markerAutoCloseableIterator.close();
markerAutoCloseableIterator = null;
}
@Override
@@ -127,19 +123,19 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
@Override
@NonNull
public Fragment createFragment(int position) {
cursor.moveToPosition(position);
return MarkerDetailFragment.newInstance(new Marker.Id(cursor.getLong(cursor.getColumnIndexOrThrow(MarkerColumns._ID))));
markerAutoCloseableIterator.moveToPosition(position);
return MarkerDetailFragment.newInstance(markerAutoCloseableIterator.next().getId());
}
@Override
public int getItemCount() {
return cursor.getCount();
return markerAutoCloseableIterator.getCount();
}
@Nullable
public CharSequence getPageTitle(int position) {
cursor.moveToPosition(position);
return getString(R.string.marker_detail_title, position + 1, getItemCount(), cursor.getString(cursor.getColumnIndexOrThrow(MarkerColumns.NAME)));
markerAutoCloseableIterator.moveToPosition(position);
return getString(R.string.marker_detail_title, position + 1, getItemCount(), markerAutoCloseableIterator.next().getName());
}
}
}
@@ -11,5 +11,7 @@ public abstract class AutoCloseableIterator<T> implements Iterator<T>, AutoClose
public abstract int getPosition();
public abstract boolean moveToPosition(int position);
public abstract int getCount();
}