/** * Copyright (C) 2013 Romain Guefveneu. * * This file is part of naonedbus. * * Naonedbus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Naonedbus is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.naonedbus.widget.adapter.impl; import java.util.HashMap; import java.util.List; import java.util.Map; import net.naonedbus.R; import net.naonedbus.bean.Equipement; import net.naonedbus.bean.Ligne; import net.naonedbus.bean.async.AsyncTaskInfo; import net.naonedbus.bean.async.LignesTaskInfo; import net.naonedbus.bean.async.ParkingPublicTaskInfo; import net.naonedbus.bean.parking.pub.ParkingPublic; import net.naonedbus.bean.parking.pub.ParkingPublicStatut; import net.naonedbus.manager.Unschedulable; import net.naonedbus.manager.impl.EquipementManager.SousType; import net.naonedbus.manager.impl.LigneManager; import net.naonedbus.manager.impl.ParkingPublicManager; import net.naonedbus.utils.ColorUtils; import net.naonedbus.utils.DistanceUtils; import net.naonedbus.utils.ParkingUtils; import net.naonedbus.widget.adapter.ArraySectionAdapter; import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.TextView; public class EquipementArrayAdapter extends ArraySectionAdapter<Equipement> { private SparseArray<EquipementTypeAdapter> adapters; private Map<Class<? extends AsyncTaskInfo<?>>, Unschedulable<?>> unschedulers; public EquipementArrayAdapter(final Context context, final List<Equipement> objects) { super(context, R.layout.list_item_equipement, objects); initUnschedulers(); initAdapters(); } private void initAdapters() { final EquipementTypeAdapter defaultTypeAdapter = new DefaultTypeAdapter(this); adapters = new SparseArray<EquipementTypeAdapter>(); adapters.append(Equipement.Type.TYPE_ARRET.getId(), new ArretTypeAdapter(this)); adapters.append(Equipement.Type.TYPE_PARKING.getId(), new ParkingTypeAdapter(this)); adapters.append(Equipement.Type.TYPE_BICLOO.getId(), defaultTypeAdapter); } private void initUnschedulers() { unschedulers = new HashMap<Class<? extends AsyncTaskInfo<?>>, Unschedulable<?>>(); unschedulers.put(LignesTaskInfo.class, LigneManager.getInstance()); unschedulers.put(ParkingPublicTaskInfo.class, ParkingPublicManager.getInstance()); } @Override public void bindView(final View view, final Context context, final int position) { final ViewHolder holder = (ViewHolder) view.getTag(); final Equipement equipement = getItem(position); final Equipement.Type type = equipement.getType(); final EquipementTypeAdapter adapter = adapters.get(type.getId()); // Définir le fond de l'icone. if (equipement.getSousType() != 0) { final SousType sousType = SousType.getTypeByValue(equipement.getSousType()); holder.itemSymbole.setImageResource(sousType.getDrawableRes()); } else { holder.itemSymbole.setImageResource(type.getDrawableRes()); } holder.itemSymbole.setBackgroundDrawable(ColorUtils.getCircle(context.getResources().getColor( type.getBackgroundColorRes()))); // Définir la distance. if (equipement.getDistance() == null) { holder.itemDistance.setText(""); } else { holder.itemDistance.setText(DistanceUtils.formatDist(equipement.getDistance())); } if (adapter != null) { adapter.bindView(context, holder, equipement); } bindHeaderView(view, position); } @Override public void bindViewHolder(final View view) { final ViewHolder holder = new ViewHolder(); holder.itemTitle = (TextView) view.findViewById(R.id.itemTitle); holder.itemDescription = (TextView) view.findViewById(R.id.itemDescription); holder.itemSymbole = (ImageView) view.findViewById(R.id.itemSymbole); holder.itemDistance = (TextView) view.findViewById(R.id.itemDistance); holder.itemLignes = (ViewGroup) view.findViewById(R.id.itemLignes); holder.itemSecondLine = view.findViewById(R.id.secondLine); view.setTag(holder); } private void bindHeaderView(final View view, final int position) { final int section = getSectionForPosition(position); if (getPositionForSection(section) == position) { final TextView headerText = (TextView) view.findViewById(R.id.headerTitle); headerText.setText(getSections()[section].toString()); } } @SuppressWarnings("unchecked") public <T extends AsyncTaskInfo<?>> void unschedule(final T task) { final Unschedulable<T> unschedulable = (Unschedulable<T>) unschedulers.get(task.getClass()); unschedulable.unschedule(task); } } class ViewHolder { TextView itemTitle; TextView itemDescription; TextView itemDistance; ViewGroup itemLignes; View itemSecondLine; ImageView itemSymbole; AsyncTaskInfo<?> task; } abstract class EquipementTypeAdapter { private final EquipementArrayAdapter adapter; public EquipementTypeAdapter(final EquipementArrayAdapter equipementArrayAdapter) { adapter = equipementArrayAdapter; } protected EquipementArrayAdapter getAdapter() { return adapter; } public abstract void bindView(Context context, ViewHolder holder, Equipement equipement); } class DefaultTypeAdapter extends EquipementTypeAdapter { public DefaultTypeAdapter(final EquipementArrayAdapter equipementArrayAdapter) { super(equipementArrayAdapter); } @Override public void bindView(final Context context, final ViewHolder holder, final Equipement equipement) { final String details = equipement.getDetails(); final String adresse = equipement.getAdresse(); if (holder.task != null) { getAdapter().unschedule(holder.task); } holder.itemTitle.setText(equipement.getNom()); if (details == null && adresse == null) { holder.itemSecondLine.setVisibility(View.GONE); } else { holder.itemDescription.setText((details != null) ? details : adresse); holder.itemDescription.setVisibility(View.VISIBLE); holder.itemSecondLine.setVisibility(View.VISIBLE); } holder.itemLignes.setVisibility(View.GONE); } } class ArretTypeAdapter extends EquipementTypeAdapter { private final LigneManager mLigneManager; public ArretTypeAdapter(final EquipementArrayAdapter equipementArrayAdapter) { super(equipementArrayAdapter); mLigneManager = LigneManager.getInstance(); } @SuppressWarnings("unchecked") @Override public void bindView(final Context context, final ViewHolder holder, final Equipement equipement) { final LayoutInflater layoutInflater = LayoutInflater.from(context); holder.itemTitle.setText(equipement.getNom()); holder.itemLignes.removeAllViews(); holder.itemDescription.setVisibility(View.GONE); if (holder.task != null) { getAdapter().unschedule(holder.task); } if (equipement.getTag() == null) { final Handler handler = new Handler() { @Override public void handleMessage(final Message msg) { super.handleMessage(msg); holder.itemLignes.removeAllViews(); final List<Ligne> lignes = (List<Ligne>) msg.obj; equipement.setTag(lignes); bindLignes(lignes, holder, layoutInflater); holder.itemLignes.startAnimation(AnimationUtils.loadAnimation(context, R.anim.slide_in_from_left)); holder.task = null; } }; holder.task = mLigneManager.scheduleGetLignesFromStation(context, equipement.getId(), handler); } else { bindLignes((List<Ligne>) equipement.getTag(), holder, layoutInflater); } } private void bindLignes(final List<Ligne> lignes, final ViewHolder holder, final LayoutInflater layoutInflater) { holder.itemSecondLine.setVisibility(View.VISIBLE); holder.itemDescription.setVisibility(View.GONE); holder.itemLignes.setVisibility(View.VISIBLE); for (final Ligne ligne : lignes) { final TextView textView = (TextView) layoutInflater.inflate(R.layout.ligne_code_item, holder.itemLignes, false); textView.setBackgroundDrawable(ColorUtils.getCircle(ligne.getCouleur())); textView.setText(ligne.getLettre()); textView.setTextColor(ligne.getCouleurTexte()); holder.itemLignes.addView(textView); } } } class ParkingTypeAdapter extends EquipementTypeAdapter { private final ParkingPublicManager parkingPublicManager; public ParkingTypeAdapter(final EquipementArrayAdapter equipementArrayAdapter) { super(equipementArrayAdapter); parkingPublicManager = ParkingPublicManager.getInstance(); } @Override public void bindView(final Context context, final ViewHolder holder, final Equipement equipement) { holder.itemTitle.setText(equipement.getNom()); holder.itemDescription.setVisibility(View.GONE); holder.itemLignes.setVisibility(View.GONE); if (holder.task != null) { getAdapter().unschedule(holder.task); } if (equipement.getTag() == null) { final Handler handler = new Handler() { @Override public void handleMessage(final Message msg) { super.handleMessage(msg); holder.itemLignes.removeAllViews(); final ParkingPublic parkingPublic = (ParkingPublic) msg.obj; equipement.setTag(parkingPublic); bindParking(context, holder, parkingPublic); holder.itemDescription .startAnimation(AnimationUtils.loadAnimation(context, android.R.anim.fade_in)); } }; holder.task = parkingPublicManager.scheduleGetParkingPublic(context, equipement.getId(), handler); } else { bindParking(context, holder, (ParkingPublic) equipement.getTag()); } } private void bindParking(final Context context, final ViewHolder holder, final ParkingPublic parkingPublic) { if (parkingPublic != null) { int couleur; String detail; if (parkingPublic.getStatut() == ParkingPublicStatut.OUVERT) { final int placesDisponibles = parkingPublic.getPlacesDisponibles(); couleur = context.getResources().getColor(ParkingUtils.getSeuilCouleurId(placesDisponibles)); if (placesDisponibles > 0) { detail = context.getResources().getQuantityString(R.plurals.parking_places_disponibles, placesDisponibles, placesDisponibles); } else { detail = context.getString(R.string.parking_places_disponibles_zero); } } else { detail = context.getString(parkingPublic.getStatut().getTitleRes()); couleur = context.getResources().getColor(parkingPublic.getStatut().getColorRes()); } holder.itemSymbole.setBackgroundDrawable(ColorUtils.getCircle(couleur)); holder.itemDescription.setText(detail); holder.itemDescription.setVisibility(View.VISIBLE); holder.itemSecondLine.setVisibility(View.VISIBLE); } else { holder.itemSecondLine.setVisibility(View.GONE); } } }