package bf.io.openshop.UX.adapters; import android.content.Context; import android.os.SystemClock; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import java.util.TreeSet; import bf.io.openshop.CONST; import bf.io.openshop.R; import bf.io.openshop.entities.delivery.DeliveryType; import bf.io.openshop.entities.delivery.Shipping; import bf.io.openshop.UX.dialogs.MapDialogFragment; import bf.io.openshop.UX.dialogs.ShippingDialogFragment; /** * BaseAdapter for shipping selection. */ public class ShippingSpinnerAdapter extends BaseAdapter { private static final int TYPE_ITEM = 0; private static final int TYPE_SEPARATOR = 1; private Context context; private ShippingDialogFragment fragment; private List<Shipping> shippingList = new ArrayList<>(); private TreeSet<Integer> sectionHeader = new TreeSet<>(); private LayoutInflater layoutInflater; private long selectedId = CONST.DEFAULT_EMPTY_ID; /** * Creates an adapter for shipping selection. * * @param context activity context. * @param fragment corresponding fragment used for a dialog creation. */ public ShippingSpinnerAdapter(Context context, ShippingDialogFragment fragment) { this.context = context; this.fragment = fragment; layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } /** * Set new data content. * * @param deliveryTypes List of all possible shipping types. */ public void setData(List<DeliveryType> deliveryTypes) { shippingList.clear(); sectionHeader.clear(); for (DeliveryType deliveryType : deliveryTypes) { // Add section header if (deliveryType.getId() != CONST.DEFAULT_EMPTY_ID) { shippingList.add(new Shipping(deliveryType.getName())); sectionHeader.add(shippingList.size() - 1); } // Add shipping types shippingList.addAll(deliveryType.getShippingList()); } notifyDataSetChanged(); } /** * If in data exist equals shipping, it will be highlighted. * * @param selectedShippingType selected shipping. */ public void preselectShipping(Shipping selectedShippingType) { if (selectedShippingType != null) { selectedId = selectedShippingType.getId(); } } @Override public int getItemViewType(int position) { return sectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM; } @Override public int getViewTypeCount() { return 2; } @Override public int getCount() { return shippingList.size(); } @Override public Shipping getItem(int position) { return shippingList.get(position); } @Override public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; int rowType = getItemViewType(position); if (convertView == null) { holder = new ViewHolder(); switch (rowType) { case TYPE_ITEM: convertView = layoutInflater.inflate(R.layout.list_item_shipping, parent, false); holder.title = convertView.findViewById(R.id.shipping_title); holder.description = convertView.findViewById(R.id.shipping_description); holder.price = convertView.findViewById(R.id.shipping_price); holder.isSelected = convertView.findViewById(R.id.shipping_is_selected); holder.separator = convertView.findViewById(R.id.shipping_separator); holder.shopInfo = convertView.findViewById(R.id.shipping_shop_info); break; default: convertView = layoutInflater.inflate(R.layout.list_item_shipping_section, parent, false); holder.title = convertView.findViewById(R.id.shipping_title); break; } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } final Shipping item = shippingList.get(position); if (rowType == TYPE_SEPARATOR) { holder.title.setText(item.getName()); } else { // First item without top line separator if (position == 0) { holder.separator.setVisibility(View.GONE); } else { holder.separator.setVisibility(View.VISIBLE); } // Highlight selected item if (selectedId != CONST.DEFAULT_EMPTY_ID && item.getId() == selectedId) { holder.title.setTextColor(ContextCompat.getColor(context, R.color.colorAccent)); holder.isSelected.setVisibility(View.VISIBLE); } else { holder.title.setTextColor(ContextCompat.getColor(context, R.color.textPrimary)); holder.isSelected.setVisibility(View.INVISIBLE); } holder.title.setText(item.getName()); // Set price if (item.getPrice() == 0) { holder.price.setText(R.string.free); } else { holder.price.setText(context.getResources().getString(R.string.format_plus, item.getPriceFormatted())); } if (item.getBranch() != null) { if (item.getBranch().getName() != null && !item.getBranch().getName().isEmpty()) holder.title.setText(item.getBranch().getName()); holder.description.setText(item.getBranch().getAddress()); holder.description.setVisibility(View.VISIBLE); holder.shopInfo.setVisibility(View.VISIBLE); holder.shopInfo.setOnClickListener(new View.OnClickListener() { private long mLastClickTime = 0; @Override public void onClick(View v) { if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) return; mLastClickTime = SystemClock.elapsedRealtime(); FragmentManager fm = fragment.getFragmentManager(); MapDialogFragment mapDialog = MapDialogFragment.newInstance(fragment, item, item.getBranch()); mapDialog.setRetainInstance(true); mapDialog.show(fm, MapDialogFragment.class.getSimpleName()); } }); } else { holder.shopInfo.setVisibility(View.INVISIBLE); if (item.getDescription() != null && !item.getDescription().isEmpty()) { holder.description.setText(item.getDescription()); holder.description.setVisibility(View.VISIBLE); } else holder.description.setVisibility(View.GONE); } } return convertView; } public static class ViewHolder { public TextView title; public TextView description; public TextView price; public View isSelected; public View separator; public ImageView shopInfo; } }