From f19352b451255d16bf4279eae9ee5f3ffe6c77a4 Mon Sep 17 00:00:00 2001 From: savsch Date: Fri, 20 Dec 2024 00:26:53 +0530 Subject: [PATCH] Add place bookmarking logic, Remove all old code --- .../NearbyParentFragmentContract.java | 2 + .../fragments/NearbyParentFragment.java | 39 ++--------------- .../NearbyParentFragmentPresenter.kt | 43 ++++++++++++++++++- 3 files changed, 46 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java b/app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java index 9cc06fe8e..e1c22edf5 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/contract/NearbyParentFragmentContract.java @@ -128,5 +128,7 @@ public interface NearbyParentFragmentContract { void setCheckboxUnknown(); void setAdvancedQuery(String query); + + void toggleBookmarkedStatus(Place place); } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java index 76301e0a1..c452406c7 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/fragments/NearbyParentFragment.java @@ -597,8 +597,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment return Unit.INSTANCE; }, (place, isBookmarked) -> { - updateMarker(isBookmarked, place, null); - binding.map.invalidate(); + presenter.toggleBookmarkedStatus(place); return Unit.INSTANCE; }, commonPlaceClickActions, @@ -1795,21 +1794,6 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment return binding.map == null ? null : getMapFocus(); } - /** - * Sets marker icon according to marker status. Sets title and distance. - * - * @param isBookmarked true if place is bookmarked - * @param place - * @param currentLatLng current location - */ - public void updateMarker(final boolean isBookmarked, final Place place, - @Nullable final LatLng currentLatLng) { - if (true) { - return; // TODO move this method to new overlay mangement logic - } - addMarkerToMap(place, isBookmarked); - } - /** * Highlights nearest place when user clicks on home nearby banner * @@ -1863,16 +1847,6 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment ); } - /** - * Adds a marker representing a place to the map with optional bookmark icon. - * - * @param place The Place object containing information about the location. - * @param isBookMarked A Boolean flag indicating whether the place is bookmarked or not. - */ - private void addMarkerToMap(Place place, Boolean isBookMarked) { - binding.map.getOverlays().add(convertToMarker(place, isBookMarked)); - } - public Marker convertToMarker(Place place, Boolean isBookMarked) { Drawable icon = ContextCompat.getDrawable(getContext(), getIconFor(place, isBookMarked)); GeoPoint point = new GeoPoint(place.location.getLatitude(), place.location.getLongitude()); @@ -2301,21 +2275,14 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment @Override public void onBottomSheetItemClick(@Nullable View view, int position) { BottomSheetItem item = dataList.get(position); - boolean isBookmarked = bookmarkLocationDao.findBookmarkLocation(selectedPlace); switch (item.getImageResourceId()) { case R.drawable.ic_round_star_border_24px: - bookmarkLocationDao.updateBookmarkLocation(selectedPlace); + presenter.toggleBookmarkedStatus(selectedPlace); updateBookmarkButtonImage(selectedPlace); - isBookmarked = bookmarkLocationDao.findBookmarkLocation(selectedPlace); - updateMarker(isBookmarked, selectedPlace, locationManager.getLastLocation()); - binding.map.invalidate(); break; case R.drawable.ic_round_star_filled_24px: - bookmarkLocationDao.updateBookmarkLocation(selectedPlace); + presenter.toggleBookmarkedStatus(selectedPlace); updateBookmarkButtonImage(selectedPlace); - isBookmarked = bookmarkLocationDao.findBookmarkLocation(selectedPlace); - updateMarker(isBookmarked, selectedPlace, locationManager.getLastLocation()); - binding.map.invalidate(); break; case R.drawable.ic_directions_black_24dp: Utils.handleGeoCoordinates(this.getContext(), selectedPlace.getLocation()); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/presenter/NearbyParentFragmentPresenter.kt b/app/src/main/java/fr/free/nrw/commons/nearby/presenter/NearbyParentFragmentPresenter.kt index 434821a92..bd42fe948 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/presenter/NearbyParentFragmentPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/nearby/presenter/NearbyParentFragmentPresenter.kt @@ -70,7 +70,9 @@ class NearbyParentFragmentPresenter val skipDelayMs = 500L } - suspend fun schedulePlacesUpdate(markerPlaceGroups: List) = + private var bookmarkChangedPlaces = CopyOnWriteArrayList() + + private suspend fun schedulePlacesUpdate(markerPlaceGroups: List) = withContext(Dispatchers.Main) { if (markerPlaceGroups.isEmpty()) return@withContext schedulePlacesUpdateJob?.cancel() @@ -83,6 +85,19 @@ class NearbyParentFragmentPresenter } } + override fun toggleBookmarkedStatus(place: Place?) { + if (place == null) return + val nowBookmarked = bookmarkLocationDao.updateBookmarkLocation(place) + bookmarkChangedPlaces.add(place) + val placeIndex = + NearbyController.markerLabelList.indexOfFirst { it.place.location == place.location } + NearbyController.markerLabelList[placeIndex] = MarkerPlaceGroup( + nowBookmarked, + NearbyController.markerLabelList[placeIndex].place + ) + nearbyParentFragmentView.setFilterState() + } + override fun attachView(view: NearbyParentFragmentContract.View) { this.nearbyParentFragmentView = view } @@ -241,8 +256,12 @@ class NearbyParentFragmentPresenter updatePlaceGroupsToControllerAndRender(nearbyPlaceGroups) loadPlacesDataAyncJob = scope?.launch(Dispatchers.IO) { - clickedPlaces.clear() // clear past clicks + // clear past clicks and bookmarkChanged queues + clickedPlaces.clear() + bookmarkChangedPlaces.clear() var clickedPlacesIndex = 0 + var bookmarkChangedPlacesIndex = 0 + val updatedGroups = nearbyPlaceGroups.toMutableList() // first load cached places: val indicesToUpdate = mutableListOf() @@ -333,6 +352,26 @@ class NearbyParentFragmentPresenter } } } + // handle any bookmarks toggled + if (bookmarkChangedPlacesIndex < bookmarkChangedPlaces.size) { + val bookmarkChangedPlacesBacklog = hashMapOf() + while (bookmarkChangedPlacesIndex < bookmarkChangedPlaces.size) { + bookmarkChangedPlacesBacklog.put( + bookmarkChangedPlaces[bookmarkChangedPlacesIndex].location, + bookmarkChangedPlaces[bookmarkChangedPlacesIndex] + ) + ++bookmarkChangedPlacesIndex + } + for ((index, group) in updatedGroups.withIndex()) { + if (bookmarkChangedPlacesBacklog.containsKey(group.place.location)) { + updatedGroups[index] = MarkerPlaceGroup( + bookmarkLocationDao + .findBookmarkLocation(updatedGroups[index].place), + updatedGroups[index].place + ) + } + } + } schedulePlacesUpdate(updatedGroups) if (collectCount++ == totalBatches) { break