package org.commcare.adapters;
import android.content.Context;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import org.commcare.cases.entity.Entity;
import org.commcare.interfaces.ModifiableEntityDetailAdapter;
import org.commcare.suite.model.Detail;
import org.commcare.views.EntityView;
import org.javarosa.core.model.instance.TreeReference;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jschweers on 8/24/2015.
* <p/>
* Adapter for taking a nodeset, contextualizing it against an entity,
* and then displaying one item for each node in the resulting set.
*/
public class EntitySubnodeDetailAdapter implements ListAdapter, ModifiableEntityDetailAdapter {
private final Context context;
private final Detail detail;
private List<TreeReference> references;
private List<Entity<TreeReference>> entities;
private ListItemViewModifier modifier;
public EntitySubnodeDetailAdapter(Context context, Detail detail,
List<TreeReference> references,
List<Entity<TreeReference>> entities,
ListItemViewModifier modifier) {
this.context = context;
this.detail = detail;
this.modifier = modifier;
this.initializeData(references, entities);
}
/**
* Populate entities and references. Will ignore any entities (and their
* associated references) without any valid fields.
*/
private void initializeData(List<TreeReference> referenceList,
List<Entity<TreeReference>> entityList) {
this.references = new ArrayList<>(referenceList.size());
this.entities = new ArrayList<>(entityList.size());
int entityIndex = 0;
for (Entity<TreeReference> e : entityList) {
for (int i = 0; i < e.getNumFields(); i++) {
if (e.isValidField(i)) {
this.entities.add(e);
this.references.add(referenceList.get(entityIndex));
break;
}
}
entityIndex++;
}
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
@Override
public int getCount() {
return references.size();
}
@Override
public Object getItem(int position) {
return references.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
EntityView view = (EntityView)convertView;
Entity entity = this.entities.get(position);
if (view == null) {
view = EntityView.buildEntryEntityView(context, detail, entity, null, position, false, null);
} else {
view.refreshViewsForNewEntity(entity, false, position);
}
if (modifier != null) {
modifier.modify(view, position);
}
return view;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isEmpty() {
return getCount() > 0;
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
}
@Override
public void setModifier(ListItemViewModifier modifier) {
this.modifier = modifier;
}
}