package com.gaiagps.iburn.adapters; import android.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.gaiagps.iburn.Constants; import com.gaiagps.iburn.CurrentDateProvider; import com.gaiagps.iburn.DateUtil; import com.gaiagps.iburn.R; import com.gaiagps.iburn.database.DataProvider; import com.gaiagps.iburn.database.EventTable; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * Bind a playa item (camp, art, event) database row to a view with a simple name & distance display, * using the device's location and date when the adapter was constructed. */ public class PlayaSearchResponseCursorAdapter extends SectionedCursorAdapter<PlayaSearchResponseCursorAdapter.ViewHolder> { private static int typeCol; private static int startTimeCol; private static int startTimePrettyCol; private static int allDayCol; private static int eventTypeCol; private static int endTimeCol; private static int endTimePrettyCol; public static class ViewHolder extends PlayaItemCursorAdapter.ViewHolder { TextView typeView; TextView timeView; public ViewHolder(View view) { super(view); typeView = (TextView) view.findViewById(R.id.type); timeView = (TextView) view.findViewById(R.id.time); } } Calendar nowPlusOneHrDate = Calendar.getInstance(); Calendar nowDate = Calendar.getInstance(); public PlayaSearchResponseCursorAdapter(Context context, Cursor cursor, AdapterListener listener) { super(context, cursor, listener); this.listener = listener; Date now = CurrentDateProvider.getCurrentDate(); nowDate.setTime(now); nowPlusOneHrDate.setTime(now); nowPlusOneHrDate.add(Calendar.HOUR, 1); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewHolder holder = null; if (viewType == VIEW_TYPE_HEADER) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.listview_header_item, parent, false); holder = new ViewHolder(itemView); } else if (viewType == VIEW_TYPE_CONTENT) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.event_list_view_item, parent, false); holder = new ViewHolder(itemView); itemView.setOnClickListener(view -> { int modelId = (int) view.getTag(R.id.list_item_related_model); int modelType = (int) view.getTag(R.id.list_item_related_model_type); listener.onItemSelected(modelId, DataProvider.getTypeValue(modelType)); }); itemView.findViewById(R.id.heart).setOnClickListener(v -> { int modelId = (int) ((View) v.getParent()).getTag(R.id.list_item_related_model); int modelType = (int) ((View) v.getParent()).getTag(R.id.list_item_related_model_type); listener.onItemFavoriteButtonSelected(modelId, DataProvider.getTypeValue(modelType)); }); } return holder; } @Override protected List<Integer> createHeadersForCursor(Cursor cursor) { ArrayList<Integer> headers = new ArrayList<>(); cacheCursorColumns(cursor); int lastType = cursor.getInt(typeCol); headers.add(0); // We begin at position 2. 0 is first header, 1 is first item for (int idx = 2; cursor.moveToNext(); idx++) { int thisType = cursor.getInt(typeCol); if (thisType != lastType) { headers.add(idx); idx++; // We must account for the position occupied by the header lastType = thisType; } } return headers; } @Override protected void onBindViewHolder(ViewHolder viewHolder, Cursor cursor, int position) { super.onBindViewHolder(viewHolder, cursor); cacheCursorColumns(cursor); setLinearSlmParameters(viewHolder, position); viewHolder.itemView.setTag(R.id.list_item_related_model, cursor.getInt(idCol)); viewHolder.itemView.setTag(R.id.list_item_related_model_type, cursor.getInt(typeCol)); viewHolder.descView.setVisibility(View.VISIBLE); Constants.PlayaItemType type = DataProvider.getTypeValue(cursor.getInt(typeCol)); switch (type) { case POI: viewHolder.descView.setVisibility(View.GONE); case CAMP: case ART: viewHolder.timeView.setVisibility(View.GONE); viewHolder.typeView.setVisibility(View.GONE); break; case EVENT: viewHolder.timeView.setVisibility(View.VISIBLE); if (cursor.getInt(cursor.getColumnIndexOrThrow(EventTable.allDay)) == 1) { viewHolder.timeView.setText("All " + cursor.getString(cursor.getColumnIndexOrThrow(EventTable.startTimePrint))); } else { viewHolder.timeView.setText(DateUtil.getDateString(context, nowDate.getTime(), nowPlusOneHrDate.getTime(), cursor.getString(startTimeCol), cursor.getString(startTimePrettyCol), cursor.getString(endTimeCol), cursor.getString(endTimePrettyCol))); } viewHolder.typeView.setVisibility(View.VISIBLE); viewHolder.typeView.setText(AdapterUtils.getStringForEventType(cursor.getString(eventTypeCol))); break; } } @Override protected void onBindViewHolderHeader(ViewHolder holder, Cursor firstSectionItem, int position) { setLinearSlmParameters(holder, position); cacheCursorColumns(firstSectionItem); Constants.PlayaItemType type = DataProvider.getTypeValue(firstSectionItem.getInt(typeCol)); String headerTitle = null; switch (type) { case CAMP: headerTitle = context.getString(R.string.camps_tab); break; case ART: headerTitle = context.getString(R.string.art_tab); break; case EVENT: headerTitle = context.getString(R.string.events_tab); break; case POI: headerTitle = "YOUR MAP MARKERS"; break; } ((TextView) holder.itemView).setText(headerTitle); } @Override public String[] getRequiredProjection() { return PlayaItemCursorAdapter.Projection; } private void cacheCursorColumns(Cursor cursor) { typeCol = cursor.getColumnIndexOrThrow(DataProvider.VirtualType); // This is a virtual column created during UNION queries of multiple tables eventTypeCol = cursor.getColumnIndexOrThrow(EventTable.eventType); startTimeCol = cursor.getColumnIndexOrThrow(EventTable.startTime); startTimePrettyCol = cursor.getColumnIndexOrThrow(EventTable.startTimePrint); endTimeCol = cursor.getColumnIndexOrThrow(EventTable.endTime); endTimePrettyCol = cursor.getColumnIndexOrThrow(EventTable.endTimePrint); allDayCol = cursor.getColumnIndexOrThrow(EventTable.allDay); } }