package org.droidplanner.android.fragments;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.o3dr.services.android.lib.coordinate.LatLong;
import com.o3dr.services.android.lib.drone.attribute.AttributeType;
import com.o3dr.services.android.lib.drone.mission.item.MissionItem;
import com.o3dr.services.android.lib.drone.property.Home;
import org.droidplanner.android.activities.interfaces.OnEditorInteraction;
import org.droidplanner.android.maps.DPMap;
import org.droidplanner.android.maps.MarkerInfo;
import org.droidplanner.android.proxy.mission.MissionSelection;
import org.droidplanner.android.proxy.mission.item.MissionItemProxy;
import org.droidplanner.android.proxy.mission.item.markers.MissionItemMarkerInfo;
import org.droidplanner.android.proxy.mission.item.markers.PolygonMarkerInfo;
import org.droidplanner.android.utils.prefs.AutoPanMode;
import java.util.ArrayList;
import java.util.List;
public class EditorMapFragment extends DroneMap implements DPMap.OnMapLongClickListener,
DPMap.OnMarkerDragListener, DPMap.OnMapClickListener, DPMap.OnMarkerClickListener,
MissionSelection.OnSelectionUpdateListener{
private OnEditorInteraction editorListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) {
View view = super.onCreateView(inflater, viewGroup, bundle);
mMapFragment.setOnMarkerDragListener(this);
mMapFragment.setOnMarkerClickListener(this);
mMapFragment.setOnMapClickListener(this);
mMapFragment.setOnMapLongClickListener(this);
return view;
}
@Override
public void onMapLongClick(LatLong point) {
}
@Override
public void onMarkerDrag(MarkerInfo markerInfo) {
checkForWaypointMarkerMoving(markerInfo);
}
@Override
public void onMarkerDragStart(MarkerInfo markerInfo) {
checkForWaypointMarkerMoving(markerInfo);
}
private void checkForWaypointMarkerMoving(MarkerInfo markerInfo) {
if (markerInfo instanceof MissionItem.SpatialItem) {
LatLong position = markerInfo.getPosition();
// update marker source
MissionItem.SpatialItem waypoint = (MissionItem.SpatialItem) markerInfo;
LatLong waypointPosition = waypoint.getCoordinate();
waypointPosition.setLatitude(position.getLatitude());
waypointPosition.setLongitude(position.getLongitude());
// update flight path
mMapFragment.updateMissionPath(missionProxy);
}
}
@Override
public void onMarkerDragEnd(MarkerInfo markerInfo) {
checkForWaypointMarker(markerInfo);
}
private void checkForWaypointMarker(MarkerInfo markerInfo) {
if ((markerInfo instanceof MissionItemMarkerInfo)) {
missionProxy.move(((MissionItemMarkerInfo) markerInfo).getMarkerOrigin(),
markerInfo.getPosition());
}else if ((markerInfo instanceof PolygonMarkerInfo)) {
PolygonMarkerInfo marker = (PolygonMarkerInfo) markerInfo;
missionProxy.movePolygonPoint(marker.getSurvey(), marker.getIndex(), markerInfo.getPosition());
}
}
@Override
public void onApiConnected(){
super.onApiConnected();
missionProxy.selection.addSelectionUpdateListener(this);
zoomToFit();
}
@Override
public void onApiDisconnected(){
super.onApiDisconnected();
missionProxy.selection.removeSelectionUpdateListener(this);
}
@Override
public void onMapClick(LatLong point) {
editorListener.onMapClick(point);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if(!(activity instanceof OnEditorInteraction)){
throw new IllegalStateException("Parent activity must implement " +
OnEditorInteraction.class.getName());
}
editorListener = (OnEditorInteraction) activity;
}
@Override
public boolean setAutoPanMode(AutoPanMode target) {
if (target == AutoPanMode.DISABLED)
return true;
Toast.makeText(getActivity(), "Auto pan is not supported on this map.", Toast.LENGTH_LONG)
.show();
return false;
}
@Override
public boolean onMarkerClick(MarkerInfo info) {
if (info instanceof MissionItemMarkerInfo) {
editorListener.onItemClick(((MissionItemMarkerInfo) info).getMarkerOrigin(), false);
return true;
} else {
return false;
}
}
@Override
protected boolean isMissionDraggable() {
return true;
}
public void zoomToFit() {
// get visible mission coords
final List<LatLong> visibleCoords = missionProxy == null ? new ArrayList<LatLong>() : missionProxy.getVisibleCoords();
// add home coord if visible
if(drone != null) {
Home home = drone.getAttribute(AttributeType.HOME);
if (home != null && home.isValid()) {
final LatLong homeCoord = home.getCoordinate();
if (homeCoord.getLongitude() != 0 && homeCoord.getLatitude() != 0)
visibleCoords.add(homeCoord);
}
}
if (!visibleCoords.isEmpty())
zoomToFit(visibleCoords);
}
public void zoomToFit(List<LatLong> itemsToFit){
if(!itemsToFit.isEmpty()){
mMapFragment.zoomToFit(itemsToFit);
}
}
@Override
public void onSelectionUpdate(List<MissionItemProxy> selected) {
onMissionUpdate();
}
}