package com.neuron.trafikanten.views.realtime; import android.app.Activity; import android.os.Parcelable; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TableLayout; import android.widget.TextView; import com.neuron.trafikanten.R; import com.neuron.trafikanten.dataSets.DeviData; import com.neuron.trafikanten.dataSets.RealtimeData; import com.neuron.trafikanten.dataSets.StationData; import com.neuron.trafikanten.dataSets.realtime.GenericRealtimeList; import com.neuron.trafikanten.dataSets.realtime.renderers.GenericRealtimeRenderer; import com.neuron.trafikanten.dataSets.realtime.renderers.PlatformRenderer; import com.neuron.trafikanten.dataSets.realtime.renderers.RealtimeRenderer; import com.neuron.trafikanten.dataSets.realtime.renderers.StationRenderer; import com.neuron.trafikanten.hacks.StationIcons; import com.neuron.trafikanten.views.GenericDeviCreator; /* * This list adapter is shared between favorites and realtime views */ public class GenericRealtimeListAdapter extends BaseAdapter { private GenericRealtimeView parent; private LayoutInflater inflater; public GenericRealtimeList items; private boolean dirty = false; private Activity activity; public GenericRealtimeListAdapter(GenericRealtimeView parent, Activity activity, int groupBy) { super(); this.parent = parent; inflater = LayoutInflater.from(parent); this.activity = activity; items = new GenericRealtimeList(groupBy); } public boolean addData(DeviData deviData) { boolean added = items.addData(deviData); dirty = true; return added; } public void addData(RealtimeData data) { items.addData(data); dirty = true; } public void addData(RealtimeData data, StationData station) { items.addData(data, station); dirty = true; } public void clear() { items.clear(); notifyDataSetChanged(); } @Override public int getCount() { if (dirty) { dirty = false; notifyDataSetChanged(); } return items.size(); } @Override public GenericRealtimeRenderer getItem(int pos) { return items.get(pos); } public RealtimeData getRealtimeItem(int pos) { final GenericRealtimeRenderer renderer = getItem(pos); if (renderer.renderType == GenericRealtimeList.RENDERER_REALTIME) { final RealtimeRenderer realtimeRenderer = (RealtimeRenderer) renderer; return realtimeRenderer.data; } return null; } /* * This finds a station belonging to a realtime item position. It does it by looking up until it finds a station. */ public StationData getStationForRealtimeItem(int pos) { while (pos >= 0) { final GenericRealtimeRenderer renderer = getItem(pos); if (renderer.renderType == GenericRealtimeList.RENDERER_STATION) { return ((StationRenderer) renderer).station; } pos--; } return null; } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); dirty = false; } @Override public void notifyDataSetInvalidated() { super.notifyDataSetInvalidated(); dirty = false; } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int pos) { final GenericRealtimeRenderer renderer = getItem(pos); return renderer.renderType - 1; // view types are 0 indexed. } @Override public int getViewTypeCount() { return 3; } /* * Workaround for clickable bug, onListItemClick does not trigger at all if ScrollingMovementMethod is being used. * TODO : Check if this workaround is still needed, HACK */ private void onClickHack(final View convertView, final TextView departures, final TableLayout tableLayout, final RealtimeRenderer realtimeRenderer) { final OnClickListener onClickListener = new OnClickListener() { @Override public void onClick(View v) { convertView.showContextMenu(); } }; tableLayout.setOnClickListener(onClickListener); departures.setOnClickListener(onClickListener); } /* * Setup the view * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup) */ @Override public View getView(int pos, View convertView, ViewGroup arg2) { final GenericRealtimeRenderer renderer = getItem(pos); /* * Setup holder, for performance and readability. */ if (convertView == null) { /* * New view, inflate and setup holder. */ switch(renderer.renderType) { case GenericRealtimeList.RENDERER_REALTIME: final RealtimeRenderer realtimeRenderer = (RealtimeRenderer) renderer; final ViewHolderRealtime holderRealtime = new ViewHolderRealtime(); convertView = inflater.inflate(R.layout.realtime_list, null); holderRealtime.line = (TextView) convertView.findViewById(R.id.line); holderRealtime.icon = (ImageView) convertView.findViewById(R.id.icon); holderRealtime.destination = (TextView) convertView.findViewById(R.id.destination); holderRealtime.departures = (TextView) convertView.findViewById(R.id.departures); holderRealtime.tableLayout = (TableLayout) convertView.findViewById(R.id.tablelayout); // Needed for onclickhack holderRealtime.departureInfo = (LinearLayout) convertView.findViewById(R.id.departureInfo); renderRealtimeView(holderRealtime, realtimeRenderer.data); convertView.setTag(R.layout.realtime_list, holderRealtime); onClickHack(convertView, holderRealtime.departures, holderRealtime.tableLayout, realtimeRenderer); return convertView; case GenericRealtimeList.RENDERER_PLATFORM: final ViewHolderPlatform holderPlatform = new ViewHolderPlatform(); final PlatformRenderer platformRenderer = (PlatformRenderer) renderer; convertView = inflater.inflate(R.layout.realtime_list_platform, null); holderPlatform.header = (TextView) convertView.findViewById(R.id.header); renderPlatformView(holderPlatform, platformRenderer.platform); convertView.setTag(R.layout.realtime_list_platform, holderPlatform); return convertView; case GenericRealtimeList.RENDERER_STATION: final ViewHolderStation holderStation = new ViewHolderStation(); final StationRenderer stationRenderer = (StationRenderer) renderer; convertView = inflater.inflate(R.layout.realtime_list_station, null); holderStation.header = (TextView) convertView.findViewById(R.id.header); holderStation.devi = (LinearLayout) convertView.findViewById(R.id.devi); renderStationView(holderStation, stationRenderer.station); convertView.setTag(R.layout.realtime_list_station, holderStation); return convertView; } } else { switch(renderer.renderType) { case GenericRealtimeList.RENDERER_REALTIME: final ViewHolderRealtime holderRealtime = (ViewHolderRealtime) convertView.getTag(R.layout.realtime_list); final RealtimeRenderer realtimeRenderer = (RealtimeRenderer) renderer; renderRealtimeView(holderRealtime, realtimeRenderer.data); //onClickHack(convertView, holderRealtime.departures, holderRealtime.tableLayout, realtimeRenderer); return convertView; case GenericRealtimeList.RENDERER_PLATFORM: final ViewHolderPlatform holderPlatform = (ViewHolderPlatform) convertView.getTag(R.layout.realtime_list_platform); final PlatformRenderer platformRenderer = (PlatformRenderer) renderer; renderPlatformView(holderPlatform, platformRenderer.platform); return convertView; case GenericRealtimeList.RENDERER_STATION: final ViewHolderStation holderStation = (ViewHolderStation) convertView.getTag(R.layout.realtime_list_station); final StationRenderer stationRenderer = (StationRenderer) renderer; renderStationView(holderStation, stationRenderer.station); return convertView; } } return convertView; } private void renderPlatformView(ViewHolderPlatform holder, final String platform) { if (platform != null) { if (platform.length() == 0) { holder.header.setText("Plattform " + activity.getString(R.string.unknown)); } else { holder.header.setText("Plattform " + platform); } holder.header.setVisibility(View.VISIBLE); } else { holder.header.setVisibility(View.GONE); } } /* * This is used in favorites */ private void renderStationView(ViewHolderStation holder, StationData station) { holder.header.setText(station.stopName); holder.devi.removeAllViews(); if (station.devi.size() > 0) { holder.devi.setVisibility(View.VISIBLE); for (final DeviData deviData : station.devi) { holder.devi.addView(GenericDeviCreator.createDefaultDeviText(activity, deviData.title, deviData, true), new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); } } else { holder.devi.setVisibility(View.GONE); } } private void renderRealtimeView(ViewHolderRealtime holder, final RealtimeData data) { /* * Render data to view. */ data.renderDepartures(holder.departures, parent, System.currentTimeMillis() - parent.timeDifference); holder.destination.setText(data.destination); if (data.destination.equals(data.lineName)) { holder.line.setText("-"); } else { holder.line.setText(data.lineName); } holder.icon.setImageResource(data.getImageResource()); /* * Setup devi */ if (data.devi.size() > 0) { holder.departureInfo.setVisibility(View.VISIBLE); holder.departureInfo.removeAllViews(); for (DeviData devi : data.devi) { /* * Add all devi items. */ holder.departureInfo.addView(GenericDeviCreator.createDefaultDeviText(parent, devi.title, devi, false), new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); } } else { holder.departureInfo.setVisibility(View.GONE); } } /* * Classes for caching the view. */ static class ViewHolderPlatform { TextView header; } static class ViewHolderStation { TextView header; LinearLayout devi; } static class ViewHolderRealtime { TextView line; TextView destination; ImageView icon; TextView departures; LinearLayout departureInfo; TableLayout tableLayout; // Needed for onclickhack } public Parcelable getParcelable() { return items; } public void setItems(Parcelable items) { this.items = (GenericRealtimeList) items; dirty = true; } }