package org.droidplanner.android.fragments.mode;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.o3dr.android.client.Drone;
import com.o3dr.services.android.lib.drone.attribute.AttributeEvent;
import com.o3dr.services.android.lib.drone.attribute.AttributeType;
import com.o3dr.services.android.lib.drone.property.State;
import com.o3dr.services.android.lib.drone.property.VehicleMode;
import com.o3dr.services.android.lib.gcs.follow.FollowState;
import org.droidplanner.android.R;
import org.droidplanner.android.fragments.helpers.ApiListenerFragment;
/**
* Implements the flight/apm mode panel description.
*/
public class FlightModePanel extends ApiListenerFragment{
private final static IntentFilter eventFilter = new IntentFilter();
static {
eventFilter.addAction(AttributeEvent.STATE_CONNECTED);
eventFilter.addAction(AttributeEvent.STATE_DISCONNECTED);
eventFilter.addAction(AttributeEvent.STATE_VEHICLE_MODE);
eventFilter.addAction(AttributeEvent.TYPE_UPDATED);
eventFilter.addAction(AttributeEvent.FOLLOW_START);
eventFilter.addAction(AttributeEvent.FOLLOW_STOP);
}
private final BroadcastReceiver eventReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(getActivity() == null)
return;
onModeUpdate(getDrone());
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_flight_mode_panel, container, false);
}
@Override
public void onApiConnected() {
// Update the mode info panel based on the current mode.
onModeUpdate(getDrone());
getBroadcastManager().registerReceiver(eventReceiver, eventFilter);
}
@Override
public void onApiDisconnected() {
getBroadcastManager().unregisterReceiver(eventReceiver);
}
private void onModeUpdate(Drone drone) {
// Update the info panel fragment
final State droneState = drone.getAttribute(AttributeType.STATE);
Fragment infoPanel;
if (droneState == null || !droneState.isConnected()) {
infoPanel = new ModeDisconnectedFragment();
} else {
VehicleMode mode = droneState.getVehicleMode();
if(mode == null){
infoPanel = new ModeDisconnectedFragment();
}
else {
switch (mode) {
case COPTER_RTL:
case PLANE_RTL:
case ROVER_RTL:
infoPanel = new ModeRTLFragment();
break;
case COPTER_AUTO:
case PLANE_AUTO:
case ROVER_AUTO:
infoPanel = new ModeAutoFragment();
break;
case COPTER_LAND:
infoPanel = new ModeLandFragment();
break;
case COPTER_LOITER:
case PLANE_LOITER:
infoPanel = new ModeLoiterFragment();
break;
case COPTER_STABILIZE:
case PLANE_STABILIZE:
infoPanel = new ModeStabilizeFragment();
break;
case COPTER_ACRO:
infoPanel = new ModeAcroFragment();
break;
case COPTER_ALT_HOLD:
infoPanel = new ModeAltholdFragment();
break;
case COPTER_CIRCLE:
case PLANE_CIRCLE:
infoPanel = new ModeCircleFragment();
break;
case COPTER_GUIDED:
case PLANE_GUIDED:
case ROVER_GUIDED:
case ROVER_HOLD:
final FollowState followState = drone.getAttribute(AttributeType.FOLLOW_STATE);
if (followState.isEnabled()) {
infoPanel = new ModeFollowFragment();
} else {
infoPanel = new ModeGuidedFragment();
}
break;
case COPTER_DRIFT:
infoPanel = new ModeDriftFragment();
break;
case COPTER_SPORT:
infoPanel = new ModeSportFragment();
break;
case COPTER_POSHOLD:
infoPanel = new ModePosHoldFragment();
break;
default:
infoPanel = new ModeDisconnectedFragment();
break;
}
}
}
getChildFragmentManager().beginTransaction().replace(R.id.modeInfoPanel, infoPanel).commitAllowingStateLoss();
}
}