diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index bd221e536..8095245cd 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -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(); diff --git a/src/main/java/de/dennisguse/opentracks/data/MarkerIterator.java b/src/main/java/de/dennisguse/opentracks/data/MarkerIterator.java index a989b3d23..aa8474936 100644 --- a/src/main/java/de/dennisguse/opentracks/data/MarkerIterator.java +++ b/src/main/java/de/dennisguse/opentracks/data/MarkerIterator.java @@ -47,6 +47,11 @@ class MarkerIterator extends AutoCloseableIterator { return cursor.getPosition(); } + @Override + public boolean moveToPosition(int position) { + return cursor.moveToPosition(position); + } + @VisibleForTesting public int getCount() { return cursor.getCount(); diff --git a/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java b/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java index f0090dc37..eac0ca919 100644 --- a/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java +++ b/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java @@ -47,6 +47,11 @@ class TrackPointIterator extends AutoCloseableIterator { return cursor.getPosition(); } + @Override + public boolean moveToPosition(int position) { + return cursor.moveToPosition(position); + } + @VisibleForTesting public int getCount() { return cursor.getCount(); diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerDetailActivity.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerDetailActivity.java index eb9c365a6..563d2f0be 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerDetailActivity.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerDetailActivity.java @@ -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 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()); } } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java b/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java index 7eb0b7326..7605c789f 100644 --- a/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java +++ b/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java @@ -11,5 +11,7 @@ public abstract class AutoCloseableIterator implements Iterator, AutoClose public abstract int getPosition(); + public abstract boolean moveToPosition(int position); + public abstract int getCount(); }