mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 04:43:54 +01:00
Explore: Fix crashes caused by unattached map fragment
This commit is contained in:
parent
da086454c0
commit
4be35d0784
1 changed files with 106 additions and 91 deletions
|
|
@ -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) {
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue