package org.droidplanner.android.fragments.control; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import com.google.android.gms.analytics.HitBuilders; 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 org.droidplanner.android.R; import org.droidplanner.android.activities.helpers.SuperUI; import org.droidplanner.android.fragments.helpers.ApiListenerFragment; import org.droidplanner.android.utils.analytics.GAUtils; /** * Created by Fredia Huya-Kouadio on 3/4/15. */ public class RoverFlightControlFragment extends ApiListenerFragment implements FlightControlManagerFragment.SlidingUpHeader, View.OnClickListener { private static final String ACTION_FLIGHT_ACTION_BUTTON = "Rover flight action button"; private static final IntentFilter intentFilter = new IntentFilter(); static { intentFilter.addAction(AttributeEvent.STATE_ARMING); intentFilter.addAction(AttributeEvent.STATE_CONNECTED); intentFilter.addAction(AttributeEvent.STATE_DISCONNECTED); intentFilter.addAction(AttributeEvent.STATE_UPDATED); intentFilter.addAction(AttributeEvent.STATE_VEHICLE_MODE); } private final BroadcastReceiver eventReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); switch (action) { case AttributeEvent.STATE_ARMING: case AttributeEvent.STATE_CONNECTED: case AttributeEvent.STATE_DISCONNECTED: case AttributeEvent.STATE_UPDATED: setupButtonsByFlightState(); break; case AttributeEvent.STATE_VEHICLE_MODE: updateFlightModeButtons(); break; } } }; private View mDisconnectedButtons; private View mActiveButtons; private Button homeBtn; private Button pauseBtn; private Button autoBtn; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_rover_mission_control, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mDisconnectedButtons = view.findViewById(R.id.mc_disconnected_buttons); mActiveButtons = view.findViewById(R.id.mc_connected_buttons); final Button connectBtn = (Button) view.findViewById(R.id.mc_connectBtn); connectBtn.setOnClickListener(this); homeBtn = (Button) view.findViewById(R.id.mc_homeBtn); homeBtn.setOnClickListener(this); pauseBtn = (Button) view.findViewById(R.id.mc_pause); pauseBtn.setOnClickListener(this); autoBtn = (Button) view.findViewById(R.id.mc_autoBtn); autoBtn.setOnClickListener(this); } private void updateFlightModeButtons() { resetFlightModeButtons(); final Drone drone = getDrone(); final State droneState = drone.getAttribute(AttributeType.STATE); final VehicleMode flightMode = droneState.getVehicleMode(); if (flightMode != null) { switch (flightMode) { case ROVER_AUTO: autoBtn.setActivated(true); break; case ROVER_HOLD: case ROVER_GUIDED: pauseBtn.setActivated(true); break; case ROVER_RTL: homeBtn.setActivated(true); break; } } } private void resetFlightModeButtons() { homeBtn.setActivated(false); pauseBtn.setActivated(false); autoBtn.setActivated(false); } private void setupButtonsByFlightState() { final State droneState = getDrone().getAttribute(AttributeType.STATE); if (droneState != null && droneState.isConnected()) { setupButtonsForConnected(); } else { setupButtonsForDisconnected(); } } private void resetButtonsContainerVisibility() { mDisconnectedButtons.setVisibility(View.GONE); mActiveButtons.setVisibility(View.GONE); } private void setupButtonsForDisconnected() { resetButtonsContainerVisibility(); mDisconnectedButtons.setVisibility(View.VISIBLE); } private void setupButtonsForConnected() { resetButtonsContainerVisibility(); mActiveButtons.setVisibility(View.VISIBLE); } @Override public void onApiConnected() { setupButtonsByFlightState(); updateFlightModeButtons(); getBroadcastManager().registerReceiver(eventReceiver, intentFilter); } @Override public void onApiDisconnected() { getBroadcastManager().unregisterReceiver(eventReceiver); } @Override public boolean isSlidingUpPanelEnabled(Drone drone) { final State droneState = drone.getAttribute(AttributeType.STATE); return droneState.isConnected(); } @Override public void onClick(View v) { final Drone drone = getDrone(); HitBuilders.EventBuilder eventBuilder = new HitBuilders.EventBuilder() .setCategory(GAUtils.Category.FLIGHT); switch (v.getId()) { case R.id.mc_connectBtn: ((SuperUI) getActivity()).toggleDroneConnection(); break; case R.id.mc_homeBtn: drone.changeVehicleMode(VehicleMode.ROVER_RTL); eventBuilder.setAction(ACTION_FLIGHT_ACTION_BUTTON).setLabel(VehicleMode.ROVER_RTL.getLabel()); break; case R.id.mc_pause: { drone.changeVehicleMode(VehicleMode.ROVER_HOLD); eventBuilder.setAction(ACTION_FLIGHT_ACTION_BUTTON).setLabel(VehicleMode.ROVER_HOLD.getLabel()); break; } case R.id.mc_autoBtn: drone.changeVehicleMode(VehicleMode.ROVER_AUTO); eventBuilder.setAction(ACTION_FLIGHT_ACTION_BUTTON).setLabel(VehicleMode.ROVER_AUTO.getLabel()); break; default: eventBuilder = null; break; } if (eventBuilder != null) { GAUtils.sendEvent(eventBuilder); } } }