package org.droidplanner.android.proxy.mission.item.fragments; import android.content.Context; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.Spinner; import com.o3dr.android.client.Drone; import com.o3dr.services.android.lib.drone.attribute.AttributeType; import com.o3dr.services.android.lib.drone.mission.MissionItemType; import com.o3dr.services.android.lib.drone.mission.item.MissionItem; import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; import com.o3dr.services.android.lib.drone.mission.item.complex.StructureScanner; import com.o3dr.services.android.lib.drone.mission.item.complex.SurveyDetail; import com.o3dr.services.android.lib.drone.property.CameraProxy; import org.beyene.sius.unit.length.LengthUnit; import org.droidplanner.android.R; import org.droidplanner.android.R.id; import org.droidplanner.android.proxy.mission.MissionProxy; import org.droidplanner.android.proxy.mission.item.adapters.CamerasAdapter; import org.droidplanner.android.utils.Utils; import org.droidplanner.android.utils.unit.providers.length.LengthUnitProvider; import org.droidplanner.android.view.spinnerWheel.CardWheelHorizontalView; import org.droidplanner.android.view.spinnerWheel.adapters.LengthWheelAdapter; import org.droidplanner.android.view.spinnerWheel.adapters.NumericWheelAdapter; import org.droidplanner.android.view.spinners.SpinnerSelfSelect; import java.util.Collections; import java.util.List; public class MissionStructureScannerFragment extends MissionDetailFragment implements CardWheelHorizontalView.OnCardWheelScrollListener, CompoundButton.OnCheckedChangeListener, Drone.OnMissionItemsBuiltCallback { private final SpinnerSelfSelect.OnSpinnerItemSelectedListener cameraSpinnerListener = new SpinnerSelfSelect.OnSpinnerItemSelectedListener() { @Override public void onSpinnerItemSelected(Spinner spinner, int position) { if (spinner.getId() == id.cameraFileSpinner) { if(cameraAdapter.isEmpty()) return; CameraDetail cameraInfo = cameraAdapter.getItem(position); for (StructureScanner scan : getMissionItems()) { SurveyDetail surveyDetail = scan.getSurveyDetail(); surveyDetail.setCameraDetail(cameraInfo); } submitForBuilding(); } } }; private CamerasAdapter cameraAdapter; @Override protected int getResource() { return R.layout.fragment_editor_detail_structure_scanner; } @Override public void onApiConnected() { super.onApiConnected(); final View view = getView(); final Context context = getActivity().getApplicationContext(); typeSpinner.setSelection(commandAdapter.getPosition(MissionItemType.STRUCTURE_SCANNER)); CameraProxy camera = getDrone().getAttribute(AttributeType.CAMERA); List<CameraDetail> cameraDetails = camera == null ? Collections.<CameraDetail>emptyList() : camera.getAvailableCameraInfos(); cameraAdapter = new CamerasAdapter(getActivity(), android.R.layout.simple_spinner_dropdown_item, cameraDetails); SpinnerSelfSelect cameraSpinner = (SpinnerSelfSelect) view.findViewById(id.cameraFileSpinner); cameraSpinner.setAdapter(cameraAdapter); cameraSpinner.setOnSpinnerItemSelectedListener(cameraSpinnerListener); final LengthUnitProvider lengthUP = getLengthUnitProvider(); CardWheelHorizontalView<LengthUnit> radiusPicker = (CardWheelHorizontalView) view .findViewById(R.id.radiusPicker); radiusPicker.setViewAdapter(new LengthWheelAdapter(context, R.layout.wheel_text_centered, lengthUP.boxBaseValueToTarget(Utils.MIN_DISTANCE), lengthUP.boxBaseValueToTarget(Utils.MAX_RADIUS))); radiusPicker.addScrollListener(this); CardWheelHorizontalView<LengthUnit> startAltitudeStepPicker = (CardWheelHorizontalView) view .findViewById(R.id.startAltitudePicker); startAltitudeStepPicker.setViewAdapter(new LengthWheelAdapter(context, R.layout.wheel_text_centered, lengthUP.boxBaseValueToTarget(MIN_ALTITUDE), lengthUP.boxBaseValueToTarget(MAX_ALTITUDE))); startAltitudeStepPicker.addScrollListener(this); CardWheelHorizontalView<LengthUnit> endAltitudeStepPicker = (CardWheelHorizontalView) view .findViewById(R.id.heightStepPicker); endAltitudeStepPicker.setViewAdapter(new LengthWheelAdapter(context, R.layout.wheel_text_centered, lengthUP.boxBaseValueToTarget(MIN_ALTITUDE), lengthUP.boxBaseValueToTarget(MAX_ALTITUDE))); endAltitudeStepPicker.addScrollListener(this); CardWheelHorizontalView<Integer> numberStepsPicker = (CardWheelHorizontalView<Integer>) view .findViewById(R.id.stepsPicker); numberStepsPicker.setViewAdapter(new NumericWheelAdapter(context, R.layout.wheel_text_centered, 1, 100, "%d")); numberStepsPicker.addScrollListener(this); CheckBox checkBoxAdvanced = (CheckBox) view.findViewById(R.id.checkBoxSurveyCrossHatch); checkBoxAdvanced.setOnCheckedChangeListener(this); // Use the first one as reference. final StructureScanner firstItem = getMissionItems().get(0); final int cameraSelection = cameraAdapter.getPosition(firstItem.getSurveyDetail().getCameraDetail()); cameraSpinner.setSelection(Math.max(cameraSelection, 0)); radiusPicker.setCurrentValue(lengthUP.boxBaseValueToTarget(firstItem.getRadius())); startAltitudeStepPicker.setCurrentValue(lengthUP.boxBaseValueToTarget(firstItem.getCoordinate().getAltitude())); endAltitudeStepPicker.setCurrentValue(lengthUP.boxBaseValueToTarget(firstItem.getHeightStep())); numberStepsPicker.setCurrentValue(firstItem.getStepsCount()); checkBoxAdvanced.setChecked(firstItem.isCrossHatch()); } private void submitForBuilding() { final List<StructureScanner> scannerList = getMissionItems(); if (scannerList.isEmpty()) return; getDrone().buildMissionItemsAsync(scannerList.toArray(new MissionItem.ComplexItem[scannerList.size()]), this); } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { for (StructureScanner item : getMissionItems()) { item.setCrossHatch(isChecked); } submitForBuilding(); } @Override public void onScrollingStarted(CardWheelHorizontalView cardWheel, Object startValue) { } @Override public void onScrollingUpdate(CardWheelHorizontalView cardWheel, Object oldValue, Object newValue) { } @Override public void onScrollingEnded(CardWheelHorizontalView cardWheel, Object startValue, Object endValue) { switch (cardWheel.getId()) { case R.id.radiusPicker: { final double radius = ((LengthUnit) endValue).toBase().getValue(); for (StructureScanner item : getMissionItems()) { item.setRadius(radius); } break; } case R.id.startAltitudePicker: { final double altitude = ((LengthUnit) endValue).toBase().getValue(); for (StructureScanner item : getMissionItems()) { item.getCoordinate().setAltitude(altitude); } break; } case R.id.heightStepPicker: { final double heightStep = ((LengthUnit) endValue).toBase().getValue(); for (StructureScanner item : getMissionItems()) { item.setHeightStep(heightStep); } break; } case R.id.stepsPicker: final int stepsCount = (Integer) endValue; for (StructureScanner item : getMissionItems()) { item.setStepsCount(stepsCount); } break; } submitForBuilding(); } @Override protected List<StructureScanner> getMissionItems() { return (List<StructureScanner>) super.getMissionItems(); } @Override public void onMissionItemsBuilt(MissionItem.ComplexItem[] complexItems) { MissionProxy missionProxy = getMissionProxy(); if (missionProxy != null) missionProxy.notifyMissionUpdate(); } }