Explore: Fix crashes caused by unattached map fragment

This commit is contained in:
Ifeoluwa Andrew Omole 2025-01-29 19:44:50 +01:00
parent da086454c0
commit 4be35d0784

View file

@ -701,40 +701,43 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
* @param nearbyBaseMarker The NearbyBaseMarker object representing the marker to be added. * @param nearbyBaseMarker The NearbyBaseMarker object representing the marker to be added.
*/ */
private void addMarkerToMap(BaseMarker nearbyBaseMarker) { private void addMarkerToMap(BaseMarker nearbyBaseMarker) {
ArrayList<OverlayItem> items = new ArrayList<>(); if (isAttachedToActivity()) {
Bitmap icon = nearbyBaseMarker.getIcon(); ArrayList<OverlayItem> items = new ArrayList<>();
Drawable d = new BitmapDrawable(getResources(), icon); Bitmap icon = nearbyBaseMarker.getIcon();
GeoPoint point = new GeoPoint( Drawable d = new BitmapDrawable(getResources(), icon);
nearbyBaseMarker.getPlace().location.getLatitude(), GeoPoint point = new GeoPoint(
nearbyBaseMarker.getPlace().location.getLongitude()); nearbyBaseMarker.getPlace().location.getLatitude(),
OverlayItem item = new OverlayItem(nearbyBaseMarker.getPlace().name, null, nearbyBaseMarker.getPlace().location.getLongitude());
point); OverlayItem item = new OverlayItem(nearbyBaseMarker.getPlace().name, null,
item.setMarker(d); point);
items.add(item); item.setMarker(d);
ItemizedOverlayWithFocus overlay = new ItemizedOverlayWithFocus(items, items.add(item);
new OnItemGestureListener<OverlayItem>() { ItemizedOverlayWithFocus overlay = new ItemizedOverlayWithFocus(items,
@Override new OnItemGestureListener<OverlayItem>() {
public boolean onItemSingleTapUp(int index, OverlayItem item) { @Override
final Place place = nearbyBaseMarker.getPlace(); public boolean onItemSingleTapUp(int index, OverlayItem item) {
if (clickedMarker != null) { final Place place = nearbyBaseMarker.getPlace();
removeMarker(clickedMarker); if (clickedMarker != null) {
addMarkerToMap(clickedMarker); removeMarker(clickedMarker);
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); addMarkerToMap(clickedMarker);
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
bottomSheetDetailsBehavior.setState(
BottomSheetBehavior.STATE_COLLAPSED);
}
clickedMarker = nearbyBaseMarker;
passInfoToSheet(place);
return true;
} }
clickedMarker = nearbyBaseMarker;
passInfoToSheet(place);
return true;
}
@Override @Override
public boolean onItemLongPress(int index, OverlayItem item) { public boolean onItemLongPress(int index, OverlayItem item) {
return false; return false;
} }
}, getContext()); }, getContext());
overlay.setFocusItemsOnTap(true); overlay.setFocusItemsOnTap(true);
binding.mapView.getOverlays().add(overlay); // Add the overlay to the map binding.mapView.getOverlays().add(overlay); // Add the overlay to the map
}
} }
/** /**
@ -768,68 +771,72 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
*/ */
@Override @Override
public void clearAllMarkers() { public void clearAllMarkers() {
binding.mapView.getOverlayManager().clear(); if (isAttachedToActivity()) {
GeoPoint geoPoint = mapCenter; binding.mapView.getOverlayManager().clear();
if (geoPoint != null) { GeoPoint geoPoint = mapCenter;
List<Overlay> overlays = binding.mapView.getOverlays(); if (geoPoint != null) {
ScaleDiskOverlay diskOverlay = List<Overlay> overlays = binding.mapView.getOverlays();
new ScaleDiskOverlay(this.getContext(), ScaleDiskOverlay diskOverlay =
geoPoint, 2000, GeoConstants.UnitOfMeasure.foot); new ScaleDiskOverlay(this.getContext(),
Paint circlePaint = new Paint(); geoPoint, 2000, GeoConstants.UnitOfMeasure.foot);
circlePaint.setColor(Color.rgb(128, 128, 128)); Paint circlePaint = new Paint();
circlePaint.setStyle(Paint.Style.STROKE); circlePaint.setColor(Color.rgb(128, 128, 128));
circlePaint.setStrokeWidth(2f); circlePaint.setStyle(Paint.Style.STROKE);
diskOverlay.setCirclePaint2(circlePaint); circlePaint.setStrokeWidth(2f);
Paint diskPaint = new Paint(); diskOverlay.setCirclePaint2(circlePaint);
diskPaint.setColor(Color.argb(40, 128, 128, 128)); Paint diskPaint = new Paint();
diskPaint.setStyle(Paint.Style.FILL_AND_STROKE); diskPaint.setColor(Color.argb(40, 128, 128, 128));
diskOverlay.setCirclePaint1(diskPaint); diskPaint.setStyle(Paint.Style.FILL_AND_STROKE);
diskOverlay.setDisplaySizeMin(900); diskOverlay.setCirclePaint1(diskPaint);
diskOverlay.setDisplaySizeMax(1700); diskOverlay.setDisplaySizeMin(900);
binding.mapView.getOverlays().add(diskOverlay); diskOverlay.setDisplaySizeMax(1700);
org.osmdroid.views.overlay.Marker startMarker = new org.osmdroid.views.overlay.Marker( binding.mapView.getOverlays().add(diskOverlay);
binding.mapView); org.osmdroid.views.overlay.Marker startMarker = new org.osmdroid.views.overlay.Marker(
startMarker.setPosition(geoPoint); binding.mapView);
startMarker.setAnchor(org.osmdroid.views.overlay.Marker.ANCHOR_CENTER, startMarker.setPosition(geoPoint);
org.osmdroid.views.overlay.Marker.ANCHOR_BOTTOM); startMarker.setAnchor(org.osmdroid.views.overlay.Marker.ANCHOR_CENTER,
startMarker.setIcon( org.osmdroid.views.overlay.Marker.ANCHOR_BOTTOM);
ContextCompat.getDrawable(this.getContext(), R.drawable.current_location_marker)); startMarker.setIcon(
startMarker.setTitle("Your Location"); ContextCompat.getDrawable(this.getContext(),
startMarker.setTextLabelFontSize(24); R.drawable.current_location_marker));
binding.mapView.getOverlays().add(startMarker); startMarker.setTitle("Your Location");
} startMarker.setTextLabelFontSize(24);
ScaleBarOverlay scaleBarOverlay = new ScaleBarOverlay(binding.mapView); binding.mapView.getOverlays().add(startMarker);
scaleBarOverlay.setScaleBarOffset(15, 25);
Paint barPaint = new Paint();
barPaint.setARGB(200, 255, 250, 250);
scaleBarOverlay.setBackgroundPaint(barPaint);
scaleBarOverlay.enableScaleBar();
binding.mapView.getOverlays().add(scaleBarOverlay);
binding.mapView.getOverlays().add(new MapEventsOverlay(new MapEventsReceiver() {
@Override
public boolean singleTapConfirmedHelper(GeoPoint p) {
if (clickedMarker != null) {
removeMarker(clickedMarker);
addMarkerToMap(clickedMarker);
binding.mapView.invalidate();
} else {
Timber.e("CLICKED MARKER IS NULL");
}
if (bottomSheetDetailsBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
// Back should first hide the bottom sheet if it is expanded
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
} else if (isDetailsBottomSheetVisible()) {
hideBottomDetailsSheet();
}
return true;
} }
ScaleBarOverlay scaleBarOverlay = new ScaleBarOverlay(binding.mapView);
scaleBarOverlay.setScaleBarOffset(15, 25);
Paint barPaint = new Paint();
barPaint.setARGB(200, 255, 250, 250);
scaleBarOverlay.setBackgroundPaint(barPaint);
scaleBarOverlay.enableScaleBar();
binding.mapView.getOverlays().add(scaleBarOverlay);
binding.mapView.getOverlays().add(new MapEventsOverlay(new MapEventsReceiver() {
@Override
public boolean singleTapConfirmedHelper(GeoPoint p) {
if (clickedMarker != null) {
removeMarker(clickedMarker);
addMarkerToMap(clickedMarker);
binding.mapView.invalidate();
} else {
Timber.e("CLICKED MARKER IS NULL");
}
if (bottomSheetDetailsBehavior.getState()
== BottomSheetBehavior.STATE_EXPANDED) {
// Back should first hide the bottom sheet if it is expanded
bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
} else if (isDetailsBottomSheetVisible()) {
hideBottomDetailsSheet();
}
return true;
}
@Override @Override
public boolean longPressHelper(GeoPoint p) { public boolean longPressHelper(GeoPoint p) {
return false; return false;
} }
})); }));
binding.mapView.setMultiTouchControls(true); binding.mapView.setMultiTouchControls(true);
}
} }
/** /**
@ -986,6 +993,14 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment
}; };
} }
/**
* helper function to confirm that this fragment has been attached.
**/
public boolean isAttachedToActivity() {
boolean attached = isVisible() && getActivity() != null;
return attached;
}
@Override @Override
public void onLocationPermissionDenied(String toastMessage) { public void onLocationPermissionDenied(String toastMessage) {
} }