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 //TODO Use MarkerIterator instead
public Cursor getMarkerCursor(@NonNull Track.Id trackId) { Cursor getMarkerCursor(@NonNull Track.Id trackId) {
return getMarkerCursor(trackId, -1); return getMarkerCursor(trackId, -1);
} }
@@ -455,7 +455,19 @@ public class ContentProviderUtils {
return getMarkerCursor(null, selection, selectionArgs, MarkerColumns._ID, maxCount); 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) { public Marker.Id insertMarker(@NonNull Marker marker) {
marker.setId(null); marker.setId(null);
Uri uri = contentResolver.insert(MarkerColumns.CONTENT_URI, createContentValues(marker)); 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 createContentValues(@NonNull Marker marker) {
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
@@ -47,6 +47,11 @@ class MarkerIterator extends AutoCloseableIterator<Marker> {
return cursor.getPosition(); return cursor.getPosition();
} }
@Override
public boolean moveToPosition(int position) {
return cursor.moveToPosition(position);
}
@VisibleForTesting @VisibleForTesting
public int getCount() { public int getCount() {
return cursor.getCount(); return cursor.getCount();
@@ -47,6 +47,11 @@ class TrackPointIterator extends AutoCloseableIterator<TrackPoint> {
return cursor.getPosition(); return cursor.getPosition();
} }
@Override
public boolean moveToPosition(int position) {
return cursor.moveToPosition(position);
}
@VisibleForTesting @VisibleForTesting
public int getCount() { public int getCount() {
return cursor.getCount(); return cursor.getCount();
@@ -16,7 +16,6 @@
package de.dennisguse.opentracks.ui.markers; package de.dennisguse.opentracks.ui.markers;
import android.database.Cursor;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; 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.data.tables.MarkerColumns;
import de.dennisguse.opentracks.databinding.MarkerDetailActivityBinding; import de.dennisguse.opentracks.databinding.MarkerDetailActivityBinding;
import de.dennisguse.opentracks.ui.markers.DeleteMarkerDialogFragment.DeleteMarkerCaller; import de.dennisguse.opentracks.ui.markers.DeleteMarkerDialogFragment.DeleteMarkerCaller;
import de.dennisguse.opentracks.util.AutoCloseableIterator;
/** /**
* An activity to display marker detail info. * An activity to display marker detail info.
@@ -51,7 +51,7 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
private MarkerDetailActivityBinding viewBinding; private MarkerDetailActivityBinding viewBinding;
private Cursor cursor; private AutoCloseableIterator<Marker> markerAutoCloseableIterator;
@Override @Override
protected void onCreate(Bundle bundle) { protected void onCreate(Bundle bundle) {
@@ -67,23 +67,19 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this); ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this);
Marker marker = contentProviderUtils.getMarker(markerId); Marker marker = contentProviderUtils.getMarker(markerId);
//TODO only load used data: ID + name markerAutoCloseableIterator = contentProviderUtils.getMarkerIterator(marker.getTrackId());
cursor = contentProviderUtils.getMarkerCursor(marker.getTrackId()); if (markerAutoCloseableIterator == null) {
if (cursor == null) {
finish(); finish();
} }
int markerIndex = -1; int markerIndex = -1;
if (cursor != null && cursor.moveToFirst()) { while (markerAutoCloseableIterator.hasNext()) {
while (markerIndex == -1 && cursor.moveToNext()) { if (markerId.equals(markerAutoCloseableIterator.next().getId())) {
Marker.Id currentId = new Marker.Id(cursor.getLong(cursor.getColumnIndexOrThrow(MarkerColumns._ID))); markerIndex = markerAutoCloseableIterator.getPosition();
if (markerId.equals(currentId)) { break;
markerIndex = cursor.getPosition();
}
} }
} }
final MarkerDetailPagerAdapter markerAdapter = new MarkerDetailPagerAdapter(this); final MarkerDetailPagerAdapter markerAdapter = new MarkerDetailPagerAdapter(this);
viewBinding.makerDetailActivityViewPager.setAdapter(markerAdapter); viewBinding.makerDetailActivityViewPager.setAdapter(markerAdapter);
viewBinding.makerDetailActivityViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { viewBinding.makerDetailActivityViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@@ -109,8 +105,8 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
super.onDestroy(); super.onDestroy();
viewBinding = null; viewBinding = null;
if (cursor != null) cursor.close(); if (markerAutoCloseableIterator != null) markerAutoCloseableIterator.close();
cursor = null; markerAutoCloseableIterator = null;
} }
@Override @Override
@@ -127,19 +123,19 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
@Override @Override
@NonNull @NonNull
public Fragment createFragment(int position) { public Fragment createFragment(int position) {
cursor.moveToPosition(position); markerAutoCloseableIterator.moveToPosition(position);
return MarkerDetailFragment.newInstance(new Marker.Id(cursor.getLong(cursor.getColumnIndexOrThrow(MarkerColumns._ID)))); return MarkerDetailFragment.newInstance(markerAutoCloseableIterator.next().getId());
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
return cursor.getCount(); return markerAutoCloseableIterator.getCount();
} }
@Nullable @Nullable
public CharSequence getPageTitle(int position) { public CharSequence getPageTitle(int position) {
cursor.moveToPosition(position); markerAutoCloseableIterator.moveToPosition(position);
return getString(R.string.marker_detail_title, position + 1, getItemCount(), cursor.getString(cursor.getColumnIndexOrThrow(MarkerColumns.NAME))); 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 int getPosition();
public abstract boolean moveToPosition(int position);
public abstract int getCount(); public abstract int getCount();
} }