package org.commcare.fragments;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import org.commcare.activities.CommCareActivity;
import org.commcare.adapters.EntitySubnodeDetailAdapter;
import org.commcare.cases.entity.Entity;
import org.commcare.cases.entity.NodeEntityFactory;
import org.commcare.dalvik.R;
import org.commcare.suite.model.Detail;
import org.commcare.tasks.EntityLoaderListener;
import org.commcare.tasks.EntityLoaderTask;
import org.commcare.views.EntityView;
import org.javarosa.core.model.instance.TreeReference;
import java.util.List;
/**
* Created by jschweers on 8/26/2015.
* <p/>
* An EntityDetailSubnodeFragment displays a detail with a row for each of a set of
* nodes generated by expanding a given nodeset expression in the context of a given entity.
*/
public class EntitySubnodeDetailFragment extends EntityDetailFragment implements EntityLoaderListener {
private EntityLoaderTask loader;
private ListView listView;
public EntitySubnodeDetailFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (savedInstanceState != null) {
this.modifier = savedInstanceState.getParcelable(MODIFIER_KEY);
}
Detail detailToDisplay = getDetailToUseForDisplay();
TreeReference referenceToDisplay = getReferenceToDisplay();
View rootView = inflater.inflate(R.layout.entity_detail_list, container, false);
final Activity thisActivity = getActivity();
this.listView = ((ListView)rootView.findViewById(R.id.screen_entity_detail_list));
if (this.adapter == null && this.loader == null && !EntityLoaderTask.attachToActivity(this)) {
// Set up task to fetch entity data
EntityLoaderTask theLoader =
new EntityLoaderTask(detailToDisplay, getFactoryContextForRef(referenceToDisplay));
theLoader.attachListener(this);
theLoader.executeParallel(detailToDisplay.getNodeset().contextualize(referenceToDisplay));
// Add header row
final LinearLayout headerLayout = ((LinearLayout)rootView.findViewById(R.id.entity_detail_header));
String[] headers = new String[detailToDisplay.getFields().length];
for (int i = 0; i < headers.length; ++i) {
headers[i] = detailToDisplay.getFields()[i].getHeader().evaluate();
}
EntityView headerView = EntityView.buildHeadersEntityView(thisActivity, detailToDisplay,
headers, false);
headerLayout.removeAllViews();
headerLayout.addView(headerView);
headerLayout.setVisibility(View.VISIBLE);
}
return rootView;
}
@Override
public void attachLoader(EntityLoaderTask task) {
this.loader = task;
}
@Override
public void deliverLoadResult(List<Entity<TreeReference>> entities,
List<TreeReference> references,
NodeEntityFactory factory, int focusTargetIndex) {
Bundle args = getArguments();
Detail childDetail = asw.getSession().getDetail(args.getString(DETAIL_ID));
final int thisIndex = args.getInt(CHILD_DETAIL_INDEX, -1);
final boolean detailCompound = thisIndex != -1;
if (detailCompound) {
childDetail = childDetail.getDetails()[thisIndex];
}
this.loader = null;
this.adapter = new EntitySubnodeDetailAdapter(getActivity(), childDetail, references, entities, modifier);
this.listView.setAdapter((ListAdapter)this.adapter);
if (focusTargetIndex != -1) {
listView.setSelection(focusTargetIndex);
}
}
@Override
public void deliverLoadError(Exception e) {
((CommCareActivity)getActivity()).displayCaseListFilterException(e);
}
}