package io.homeassistant.android.view;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import io.homeassistant.android.R;
import io.homeassistant.android.api.EntityType;
import io.homeassistant.android.api.HassUtils;
import io.homeassistant.android.api.results.Entity;
import io.homeassistant.android.view.viewholders.BaseViewHolder;
import io.homeassistant.android.view.viewholders.GroupViewHolder;
public class ViewAdapter extends RecyclerView.Adapter<GroupViewHolder> {
public final RecyclerView.RecycledViewPool recycledViewPool = new RecyclerView.RecycledViewPool();
private final Context context;
private final List<Pair<Entity, List<Entity>>> entities;
public ViewAdapter(Context c) {
context = c;
entities = new ArrayList<>();
}
private static <T extends BaseViewHolder> T createViewHolder(EntityType type, LayoutInflater inflater, ViewGroup parent) {
BaseViewHolder viewHolder;
View itemView = inflater.inflate(type.layoutRes, parent, false);
try {
viewHolder = type.viewHolderClass.getConstructor(View.class).newInstance(itemView);
} catch (ReflectiveOperationException e) {
viewHolder = null;
}
//noinspection unchecked
return (T) viewHolder;
}
public void updateEntities(Map<String, Entity> entityMap) {
HassUtils.extractGroups(entityMap, entities);
notifyDataSetChanged();
}
@Override
public GroupViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Only group items
GroupViewHolder holder = createViewHolder(EntityType.GROUP, LayoutInflater.from(context), parent);
holder.childRecycler.setRecycledViewPool(recycledViewPool);
return holder;
}
@Override
public void onBindViewHolder(GroupViewHolder holder, int position) {
holder.bind(entities.get(position).first);
holder.adapter.updateChildren(entities.get(position).second);
holder.space.setVisibility(position >= getItemCount() - holder.itemView.getResources().getInteger(R.integer.view_columns) ? View.GONE : View.VISIBLE);
}
@Override
public int getItemViewType(int position) {
return EntityType.GROUP.ordinal();
}
@Override
public int getItemCount() {
return entities.size();
}
public static class ChildViewAdapter extends RecyclerView.Adapter<BaseViewHolder> {
private List<Entity> children = Collections.emptyList();
void updateChildren(List<Entity> c) {
children = c;
notifyDataSetChanged();
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return ViewAdapter.createViewHolder(EntityType.values()[viewType], LayoutInflater.from(parent.getContext()), parent);
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
holder.bind(children.get(position));
}
@Override
public int getItemViewType(int position) {
return children.get(position).type.ordinal();
}
@Override
public int getItemCount() {
return children.size();
}
}
}