package org.droidplanner.android.fragments; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.o3dr.services.android.lib.drone.mission.MissionItemType; import org.droidplanner.android.R; import org.droidplanner.android.activities.interfaces.OnEditorInteraction; import org.droidplanner.android.fragments.helpers.ApiListenerFragment; import org.droidplanner.android.proxy.mission.MissionProxy; import org.droidplanner.android.proxy.mission.MissionSelection; import org.droidplanner.android.proxy.mission.item.MissionItemProxy; import org.droidplanner.android.view.adapterViews.MissionItemListAdapter; import java.util.List; public class EditorListFragment extends ApiListenerFragment implements MissionSelection.OnSelectionUpdateListener { private static final long MISSION_UPDATE_BROADCAST_DELAY = 250L; //ms private final static IntentFilter eventFilter = new IntentFilter(MissionProxy.ACTION_MISSION_PROXY_UPDATE); private final BroadcastReceiver eventReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { recyclerAdapter.notifyDataSetChanged(); updateViewVisibility(); } }; private final Runnable broadcastMissionUpdate = new Runnable() { @Override public void run() { if (missionProxy != null) { missionProxy.selection.notifySelectionUpdate(); missionProxy.notifyMissionUpdate(); } handler.removeCallbacks(this); } }; private final Handler handler = new Handler(); private MissionProxy missionProxy; private OnEditorInteraction editorListener; private RecyclerView recyclerView; private MissionItemListAdapter recyclerAdapter; @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 View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_editor_list, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); recyclerView = (RecyclerView) view.findViewById(R.id.mission_item_recycler_view); // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView recyclerView.setHasFixedSize(true); final RecyclerView.LayoutManager recyclerLayoutMgr = new LinearLayoutManager(getActivity() .getApplicationContext(), LinearLayoutManager.HORIZONTAL, false); recyclerView.setLayoutManager(recyclerLayoutMgr); ItemTouchHelper itHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback( ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT, ItemTouchHelper.UP|ItemTouchHelper.DOWN) { @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { recyclerAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition()); return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // Item was deleted, so let's remove it. int deletedPosition = viewHolder.getAdapterPosition(); recyclerAdapter.dismiss(deletedPosition); } @Override public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target){ // Retrieve the matching mission item int currentPosition = current.getAdapterPosition(); MissionItemType currentMissionItemType = missionProxy.getItems().get(currentPosition).getMissionItem().getType(); int targetPosition = target.getAdapterPosition(); MissionItemType targetMissionItemType = missionProxy.getItems().get(targetPosition).getMissionItem().getType(); return currentMissionItemType != MissionItemType.TAKEOFF && currentMissionItemType != MissionItemType.LAND && currentMissionItemType != MissionItemType.RETURN_TO_LAUNCH && targetMissionItemType != MissionItemType.TAKEOFF && targetMissionItemType != MissionItemType.LAND && targetMissionItemType != MissionItemType.RETURN_TO_LAUNCH; } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState); switch(actionState){ case ItemTouchHelper.ACTION_STATE_DRAG: case ItemTouchHelper.ACTION_STATE_SWIPE: handler.removeCallbacks(broadcastMissionUpdate); break; } } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); handler.postDelayed(broadcastMissionUpdate, MISSION_UPDATE_BROADCAST_DELAY); } }); itHelper.attachToRecyclerView(recyclerView); } public void enableDeleteMode(boolean isEnabled){ if(isEnabled) recyclerView.setBackgroundResource(android.R.color.holo_red_light); else recyclerView.setBackgroundResource(android.R.color.transparent); } @Override public void onStart() { super.onStart(); updateViewVisibility(); } @Override public void onApiConnected() { missionProxy = getMissionProxy(); recyclerAdapter = new MissionItemListAdapter(getContext(), missionProxy, editorListener); recyclerView.setAdapter(recyclerAdapter); missionProxy.selection.addSelectionUpdateListener(this); getBroadcastManager().registerReceiver(eventReceiver, eventFilter); } @Override public void onApiDisconnected() { getBroadcastManager().unregisterReceiver(eventReceiver); if (missionProxy != null) missionProxy.selection.removeSelectionUpdateListener(this); handler.removeCallbacksAndMessages(null); } /** * Updates the fragment view visibility based on the count of stored mission * items. */ public void updateViewVisibility() { View view = getView(); if (recyclerAdapter != null && view != null) { if (recyclerAdapter.getItemCount() > 0) view.setVisibility(View.VISIBLE); else view.setVisibility(View.INVISIBLE); editorListener.onListVisibilityChanged(); } } @Override public void onSelectionUpdate(List<MissionItemProxy> selected) { recyclerAdapter.notifyDataSetChanged(); } }