Nearby: Avoid reloading entire map upon cache clear (#6089)

This commit is contained in:
Tanmay Gupta 2024-12-29 07:14:47 +05:30 committed by GitHub
parent a6444968fa
commit 5bc58284aa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 36 additions and 23 deletions

View file

@ -92,6 +92,7 @@ import fr.free.nrw.commons.nearby.NearbyFilterSearchRecyclerViewAdapter;
import fr.free.nrw.commons.nearby.NearbyFilterState;
import fr.free.nrw.commons.nearby.Place;
import fr.free.nrw.commons.nearby.PlacesRepository;
import fr.free.nrw.commons.nearby.Sitelinks;
import fr.free.nrw.commons.nearby.WikidataFeedback;
import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract;
import fr.free.nrw.commons.nearby.fragments.AdvanceQueryFragment.Callback;
@ -1173,27 +1174,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
}
/**
* Reloads the Nearby map
* Clears all location markers, refreshes them, reinserts them into the map.
*
*/
private void reloadMap() {
clearAllMarkers(); // Clear the list of markers
binding.map.getController().setZoom(ZOOM_LEVEL); // Reset the zoom level
binding.map.getController().setCenter(lastMapFocus); // Recenter the focus
if (locationPermissionsHelper.checkLocationPermission(getActivity())) {
locationPermissionGranted(); // Reload map with user's location
} else {
startMapWithoutPermission(); // Reload map without user's location
}
binding.map.invalidate(); // Invalidate the map
presenter.updateMapAndList(LOCATION_SIGNIFICANTLY_CHANGED); // Restart the map
Timber.d("Reloaded Map Successfully");
}
/**
* Clears the Nearby local cache and then calls for the map to be reloaded
* Clears the Nearby local cache and then calls for pin details to be fetched afresh.
*
*/
private void emptyCache() {
@ -1202,7 +1183,22 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment
placesRepository.clearCache()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.andThen(Completable.fromAction(this::reloadMap))
.andThen(Completable.fromAction(() -> {
// reload only the pin details, by making all loaded pins gray:
ArrayList<MarkerPlaceGroup> newPlaceGroups = new ArrayList<>(
NearbyController.markerLabelList.size());
for (final MarkerPlaceGroup placeGroup : NearbyController.markerLabelList) {
final Place place = new Place("", "", placeGroup.getPlace().getLabel(), "",
placeGroup.getPlace().getLocation(), "",
placeGroup.getPlace().siteLinks, "", placeGroup.getPlace().exists,
placeGroup.getPlace().entityID);
place.setDistance(placeGroup.getPlace().distance);
place.setMonument(placeGroup.getPlace().isMonument());
newPlaceGroups.add(
new MarkerPlaceGroup(placeGroup.getIsBookmarked(), place));
}
presenter.loadPlacesDataAsync(newPlaceGroups, scope);
}))
.subscribe(
() -> {
Timber.d("Nearby Cache cleared successfully.");

View file

@ -300,10 +300,27 @@ class NearbyParentFragmentPresenter
}
?: return
loadPlacesDataAyncJob?.cancel()
lockUnlockNearby(false) // So that new location updates wont come
nearbyParentFragmentView.setProgressBarVisibility(false)
loadPlacesDataAsync(nearbyPlaceGroups, scope)
}
/**
* Load the places' details from cache and Wikidata query, and update these details on the map
* as and when they arrive.
*
* @param nearbyPlaceGroups The list of `MarkerPlaceGroup` objects to be rendered on the map.
* Note that the supplied objects' `isBookmarked` property can be set false as the actual
* value is retrieved from the bookmarks db eventually.
* @param scope the lifecycle scope of `nearbyParentFragment`'s `viewLifecycleOwner`
*
* @see LoadPlacesAsyncOptions
*/
fun loadPlacesDataAsync(
nearbyPlaceGroups: List<MarkerPlaceGroup>,
scope: LifecycleCoroutineScope?
) {
loadPlacesDataAyncJob?.cancel()
loadPlacesDataAyncJob = scope?.launch(Dispatchers.IO) {
// clear past clicks and bookmarkChanged queues
clickedPlaces.clear()