package com.gaiagps.iburn.view; import android.content.Context; import android.support.v7.app.AlertDialog; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.RelativeLayout; import android.widget.TextView; import com.gaiagps.iburn.R; import com.gaiagps.iburn.adapters.AdapterUtils; import java.util.ArrayList; /** * A ListView header presenting filter options for day and type * <p> * Clients register for feedback with * {@link #setReceiver(com.gaiagps.iburn.view.EventListHeader.PlayaListViewHeaderReceiver)} * <p> * Created by davidbrodsky on 8/2/14. */ public class EventListHeader extends RelativeLayout { protected TextView mTypeFilter; protected TextView mDayFilter; protected String mDaySelection; protected ArrayList<String> mTypeSelection = new ArrayList<>(); protected int mDaySelectionIndex; protected boolean[] mTypeSelectionIndexes = new boolean[100]; protected PlayaListViewHeaderReceiver mReceiver; public EventListHeader(Context context) { super(context); init(context); } public EventListHeader(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public EventListHeader(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } /** * Interface for users to receive feedback from this view */ public interface PlayaListViewHeaderReceiver { void onSelectionChanged(String day, ArrayList<String> types); } /** * Click listener for Sort buttons */ protected OnClickListener mOnClickListener = new OnClickListener() { @Override public void onClick(final View v) { if (!v.isSelected()) { v.setSelected(true); if (v.getTag().equals("type")) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.Theme_Iburn_Dialog); builder.setTitle(getContext().getString(R.string.filter_by_type)); builder.setMultiChoiceItems(AdapterUtils.sEventTypeNames.toArray(new CharSequence[AdapterUtils.sEventTypeNames.size()]), mTypeSelectionIndexes, (dialog, which, isChecked) -> { CharSequence selection = AdapterUtils.sEventTypeAbbreviations.toArray(new CharSequence[AdapterUtils.sEventTypeAbbreviations.size()])[which]; String tabTitle = null; if (isChecked) { mTypeSelectionIndexes[which] = true; mTypeSelection.add((selection == null) ? null : selection.toString()); tabTitle = (selection == null) ? getResources().getString(R.string.any_type) : AdapterUtils.sEventTypeNames.toArray(new CharSequence[AdapterUtils.sEventTypeNames.size()])[which].toString(); } else { mTypeSelectionIndexes[which] = false; mTypeSelection.remove((selection == null) ? null : selection.toString()); tabTitle = (mTypeSelection.size() == 0) ? getResources().getString(R.string.any_type) : AdapterUtils.sEventTypeNames.get(AdapterUtils.sEventTypeAbbreviations.indexOf(mTypeSelection.get(mTypeSelection.size() - 1))); } if (mTypeSelection.size() > 1) tabTitle += "+" + String.valueOf(mTypeSelection.size() - 1); ((TextView) v).setText(tabTitle.toUpperCase()); dispatchSelection(); }); builder.setPositiveButton(getContext().getString(R.string.done), null); builder.show(); } else if (v.getTag().equals("day")) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.Theme_Iburn_Dialog); builder.setTitle(getContext().getString(R.string.filter_by_day)); builder.setSingleChoiceItems(AdapterUtils.sDayNames.toArray(new CharSequence[AdapterUtils.sDayNames.size()]), mDaySelectionIndex, (dialog, which) -> { mDaySelectionIndex = which; CharSequence selection = AdapterUtils.sDayAbbreviations.toArray(new CharSequence[AdapterUtils.sDayAbbreviations.size()])[which]; mDaySelection = (selection == null) ? null : selection.toString(); String tabTitle = (selection == null) ? getResources().getString(R.string.any_day) : AdapterUtils.sDayNames.toArray(new CharSequence[AdapterUtils.sDayNames.size()])[which].toString(); ((TextView) v).setText(tabTitle.toUpperCase()); dispatchSelection(); dialog.dismiss(); } ); builder.setPositiveButton("Cancel", null); builder.show(); } v.setSelected(false); } } }; protected void init(Context context) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.list_view_header_two, this, false); mTypeFilter = (TextView) v.findViewById(R.id.typeFilter); mDayFilter = (TextView) v.findViewById(R.id.dateFilter); mDayFilter.setText(AdapterUtils.sDayNames.get(AdapterUtils.sDayAbbreviations.indexOf(AdapterUtils.getCurrentOrFirstDayAbbreviation())).toUpperCase()); setupTouchListeners(); addView(v); } public void setReceiver(PlayaListViewHeaderReceiver receiver) { mReceiver = receiver; } protected void setupTouchListeners() { mTypeFilter.setTag("type"); mDayFilter.setTag("day"); mTypeFilter.setOnClickListener(mOnClickListener); mDayFilter.setOnClickListener(mOnClickListener); } protected void dispatchSelection() { if (mReceiver != null) { mReceiver.onSelectionChanged(mDaySelection, mTypeSelection); } } }