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.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import com.o3dr.services.android.lib.drone.attribute.AttributeEvent;
import org.droidplanner.android.R;
import org.droidplanner.android.fragments.helpers.ApiListenerFragment;
import org.droidplanner.android.view.checklist.CheckListAdapter;
import org.droidplanner.android.view.checklist.CheckListAdapter.OnCheckListItemUpdateListener;
import org.droidplanner.android.view.checklist.CheckListItem;
import org.droidplanner.android.view.checklist.CheckListSysLink;
import org.droidplanner.android.view.checklist.CheckListXmlParser;
import org.droidplanner.android.view.checklist.xml.ListXmlParser.OnXmlParserError;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class ChecklistFragment extends ApiListenerFragment implements
OnXmlParserError,
OnCheckListItemUpdateListener {
private final static IntentFilter intentFilter = new IntentFilter();
static {
intentFilter.addAction(AttributeEvent.BATTERY_UPDATED);
intentFilter.addAction(AttributeEvent.GPS_COUNT);
intentFilter.addAction(AttributeEvent.GPS_FIX);
intentFilter.addAction(AttributeEvent.GPS_POSITION);
intentFilter.addAction(AttributeEvent.STATE_CONNECTED);
intentFilter.addAction(AttributeEvent.STATE_DISCONNECTED);
intentFilter.addAction(AttributeEvent.STATE_UPDATED);
intentFilter.addAction(AttributeEvent.STATE_ARMING);
}
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
onInfoUpdate();
}
};
private Context context;
private ExpandableListView expListView;
private List<String> listDataHeader;
private List<CheckListItem> checklistItems;
private HashMap<String, List<CheckListItem>> listDataChild;
private CheckListAdapter listAdapter;
private CheckListSysLink sysLink;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_checklist, container, false);
expListView = (ExpandableListView) view.findViewById(R.id.expListView);
createListAdapter(inflater);
expListView.setAdapter(listAdapter);
listViewAutoExpand(true, true);
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.context = activity;
loadXMLChecklist();
prepareListData();
}
@Override
public void onDetach() {
sysLink = null;
listAdapter = null;
listDataHeader = null;
listDataChild = null;
checklistItems = null;
super.onDetach();
}
@Override
public void onApiConnected(){
sysLink = new CheckListSysLink(getActivity().getApplicationContext(), getDrone());
getBroadcastManager().registerReceiver(broadcastReceiver, intentFilter);
}
@Override
public void onApiDisconnected(){
getBroadcastManager().unregisterReceiver(broadcastReceiver);
}
public void onInfoUpdate() {
if(checklistItems != null && !checklistItems.isEmpty()) {
for (CheckListItem item : checklistItems) {
if (item.getSys_tag() != null) {
sysLink.getSystemData(item, item.getSys_tag());
}
}
}
if (listAdapter != null)
listAdapter.notifyDataSetChanged();
}
// Load checklist from file
private void loadXMLChecklist() {
CheckListXmlParser xml = new CheckListXmlParser("checklist_ext.xml", context,
R.xml.checklist_default);
xml.setOnXMLParserError(this);
listDataHeader = xml.getCategories();
checklistItems = xml.getCheckListItems();
}
// create hash list
private void prepareListData() {
listDataChild = new HashMap<String, List<CheckListItem>>();
List<CheckListItem> cli;
for (int h = 0; h < listDataHeader.size(); h++) {
cli = new ArrayList<CheckListItem>();
for (CheckListItem c : checklistItems) {
if (c.getCategoryIndex() == h)
cli.add(c);
}
listDataChild.put(listDataHeader.get(h), cli);
}
}
// create listAdapter
private void createListAdapter(LayoutInflater layoutInflater) {
listAdapter = new CheckListAdapter(layoutInflater, listDataHeader, listDataChild);
listAdapter.setHeaderLayout(R.layout.list_group_header);
listAdapter.setOnCheckListItemUpdateListener(this);
}
private void listViewAutoExpand(boolean autoExpand, boolean autoCollapse) {
boolean allVerified;
for (int h = 0; h < listDataHeader.size(); h++) {
allVerified = listAdapter.areAllVerified(h);
if (!allVerified && autoExpand)
expListView.expandGroup(h);
else if (allVerified && autoCollapse)
expListView.collapseGroup(h);
}
}
@Override
public void onError() {
// TODO Auto-generated method stub
}
@Override
public void onRowItemChanged(CheckListItem checkListItem) {
if(sysLink != null) {
sysLink.setSystemData(checkListItem);
listAdapter.notifyDataSetChanged();
listViewAutoExpand(false, true);
}
}
@Override
public void onRowItemGetData(CheckListItem checkListItem, String mSysTag) {
if(sysLink != null) {
sysLink.getSystemData(checkListItem, mSysTag);
}
}
}