package org.droidplanner.android.proxy.mission.item; import java.util.ArrayList; import java.util.List; import org.droidplanner.android.maps.MarkerInfo; import org.droidplanner.android.proxy.mission.MissionProxy; import org.droidplanner.android.proxy.mission.item.fragments.MissionDetailFragment; import org.droidplanner.android.proxy.mission.item.markers.MissionItemMarkerInfo; import com.o3dr.android.client.Drone; import com.o3dr.services.android.lib.coordinate.LatLong; import com.o3dr.services.android.lib.drone.mission.item.MissionItem; import com.o3dr.services.android.lib.drone.mission.item.complex.StructureScanner; import com.o3dr.services.android.lib.drone.mission.item.complex.Survey; import com.o3dr.services.android.lib.drone.mission.item.spatial.Circle; import com.o3dr.services.android.lib.util.MathUtils; /** * This class is responsible for providing logic to access and interpret the * {@link com.o3dr.services.android.lib.drone.mission.item.MissionItem} class on the Android layer, * as well as providing methods for rendering it on the Android UI. */ public class MissionItemProxy { private final Drone.OnMissionItemsBuiltCallback missionItemBuiltListener = new Drone.OnMissionItemsBuiltCallback() { @Override public void onMissionItemsBuilt(MissionItem.ComplexItem[] complexItems) { mMission.notifyMissionUpdate(false); } }; /** * This is the mission item object this class is built around. */ private final MissionItem mMissionItem; /** * This is the mission render to which this item belongs. */ private final MissionProxy mMission; /** * This is the marker source for this mission item render. */ private final List<MarkerInfo> mMarkerInfos; /** * Used by the mission item list adapter to provide drag and drop support. */ private final long stableId; public MissionItemProxy(MissionProxy mission, MissionItem missionItem) { this.stableId = System.nanoTime(); mMission = mission; mMissionItem = missionItem; mMarkerInfos = MissionItemMarkerInfo.newInstance(this); if(mMissionItem instanceof Survey){ mMission.getDrone().buildMissionItemsAsync(missionItemBuiltListener, (Survey) mMissionItem); } else if(mMissionItem instanceof StructureScanner){ mMission.getDrone().buildMissionItemsAsync(missionItemBuiltListener, (StructureScanner) mMissionItem); } } /** * Provides access to the owning mission render instance. * * @return */ public MissionProxy getMissionProxy() { return mMission; } public MissionProxy getMission(){return mMission;} /** * Provides access to the mission item instance. * * @return {@link com.o3dr.services.android.lib.drone.mission.item.MissionItem} object */ public MissionItem getMissionItem() { return mMissionItem; } public MissionDetailFragment getDetailFragment() { return MissionDetailFragment.newInstance(mMissionItem.getType()); } public List<MarkerInfo> getMarkerInfos() { return mMarkerInfos; } /** * @param previousPoint * Previous point on the path, null if there wasn't a previous * point * @return the set of points/coords making up this mission item. */ public List<LatLong> getPath(LatLong previousPoint) { List<LatLong> pathPoints = new ArrayList<LatLong>(); switch (mMissionItem.getType()) { case LAND: case WAYPOINT: case SPLINE_WAYPOINT: pathPoints.add(((MissionItem.SpatialItem) mMissionItem).getCoordinate()); break; case CIRCLE: for (int i = 0; i <= 360; i += 10) { Circle circle = (Circle) mMissionItem; double startHeading = 0; if (previousPoint != null) { startHeading = MathUtils.getHeadingFromCoordinates(circle.getCoordinate(), previousPoint); } pathPoints.add(MathUtils.newCoordFromBearingAndDistance(circle.getCoordinate(), startHeading + i, circle.getRadius())); } break; case SURVEY: List<LatLong> gridPoints = ((Survey)mMissionItem).getGridPoints(); if (gridPoints != null && !gridPoints.isEmpty()) { pathPoints.addAll(gridPoints); } break; case STRUCTURE_SCANNER: StructureScanner survey = (StructureScanner)mMissionItem; pathPoints.addAll(survey.getPath()); break; default: break; } return pathPoints; } /** * @return stable id used by the recycler view adapter to provide drag and drop support. */ public long getStableId(){ return stableId; } }