package com.neuron.trafikanten.dataSets.realtime; import java.util.ArrayList; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; import com.neuron.trafikanten.dataSets.DeviData; import com.neuron.trafikanten.dataSets.RealtimeData; import com.neuron.trafikanten.dataSets.StationData; 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; /* * This is GenericRealtimeListAdapter's list. Aka GenericRealtimeListAdapter.items */ public class GenericRealtimeList implements Parcelable { private static final String TAG = "Trafikanten-GenericRealtimeListAdapter"; public static final int RENDERER_REALTIME = 1; public static final int RENDERER_PLATFORM = 2; public static final int RENDERER_STATION = 3; private ArrayList<GenericRealtimeRenderer> items; private int groupBy; public GenericRealtimeList(int groupBy) { super(); this.groupBy = groupBy; items = new ArrayList<GenericRealtimeRenderer>(); } public void clear() { items.clear(); } public int size() { return items.size(); } public GenericRealtimeRenderer get(int pos) { return items.get(pos); } public void addData(RealtimeData data, StationData station) { int i = 0; final int size = items.size(); if (groupBy != RENDERER_STATION) { Log.e(TAG, "Error, groupBy expected RENDERER_STATION"); } /* * This will convert a flat list of RealtimeData to: * station -> * realtimeData line,departure -> * realtimeData.nextDepartures if line.departure matches previous find. */ for (;i < size;i++) { //Log.d("DEBUGTrafikanten", "List iteration " + i + " / " + size); final GenericRealtimeRenderer renderer = items.get(i); if (renderer.renderType == RENDERER_STATION) { StationRenderer stationRenderer = (StationRenderer) renderer; /* * Found our station */ if (stationRenderer.station.stationId == station.stationId) { // we're in the right station, keep going until we find the end of it. i++; while (i < size) { final GenericRealtimeRenderer subRenderer = items.get(i); //Log.d("DEBUGTrafikanten", "sub list iteration " + i + " / " + size); if (subRenderer.renderType == RENDERER_STATION) { //Log.d("DEBUGTrafikanten", "Position " + i + " contains next station, must insert above"); // ok we just ran into the next station, break and insert break; } else if (subRenderer.renderType == RENDERER_REALTIME) { /* * This is the same departure as us, merge */ if (data != null) { final RealtimeRenderer realtimeRenderer = (RealtimeRenderer) subRenderer; if (realtimeRenderer.data.lineId == data.lineId && realtimeRenderer.data.destination.equals(data.destination)) { realtimeRenderer.data.addDeparture(data); return; } } } i++; } // insert item here! //Log.d("DEBUGTrafikanten", "Inserting data at " + i); if (data != null) { items.add(i, new RealtimeRenderer(data)); } return; } if (stationRenderer.station.stationId > station.stationId) { /* * Should insert before this, and include the header */ //Log.d("DEBUGTrafikanten", "Inserting data at " + i + " due to station insertion"); items.add(i, new StationRenderer(station)); if (data != null) { items.add(i + 1, new RealtimeRenderer(data)); } return; } } } /* * We never found it, append to the end */ //Log.d("DEBUGTrafikanten", "Appending data at end of list" + size); items.add(size, new StationRenderer(station)); if (data != null) { items.add(size + 1, new RealtimeRenderer(data)); } } public void addData(RealtimeData data) { int i = 0; final int size = items.size(); if (groupBy != RENDERER_PLATFORM) { Log.e(TAG, "Error, groupBy expected RENDER_PLATFORM"); } /* * This will convert a flat list of RealtimeData to: * platform -> * realtimeData line,departure -> * realtimeData.nextDepartures if line.departure matches previous find. */ for (;i < size;i++) { //Log.d("DEBUGTrafikanten", "List iteration " + i + " / " + size); final GenericRealtimeRenderer renderer = items.get(i); if (renderer.renderType == RENDERER_PLATFORM) { PlatformRenderer platformRenderer = (PlatformRenderer) renderer; /* * Found our platform */ if (platformRenderer.platform.equals(data.departurePlatform)) { // we're in the right platform, keep going until we find the end of it. i++; while (i < size) { final GenericRealtimeRenderer subRenderer = items.get(i); //Log.d("DEBUGTrafikanten", "sub list iteration " + i + " / " + size); if (subRenderer.renderType == RENDERER_PLATFORM) { //Log.d("DEBUGTrafikanten", "Position " + i + " contains next platform, must insert above"); // ok we just ran into the next platform, break and insert break; } else if (subRenderer.renderType == RENDERER_REALTIME) { /* * This is the same departure as us, merge */ final RealtimeRenderer realtimeRenderer = (RealtimeRenderer) subRenderer; if (realtimeRenderer.data.lineId == data.lineId && realtimeRenderer.data.destination.equals(data.destination)) { realtimeRenderer.data.addDeparture(data); return; } } i++; } // insert item here! //Log.d("DEBUGTrafikanten", "Inserting data at " + i); items.add(i, new RealtimeRenderer(data)); return; } /* * Sorting based on string platform. */ if (platformRenderer.compareTo(data) > 0) { /* * Should insert before this, and include the header */ //Log.d("DEBUGTrafikanten", "Inserting data at " + i + " due to platform insertion"); items.add(i, new PlatformRenderer(data.departurePlatform)); items.add(i + 1, new RealtimeRenderer(data)); return; } } } /* * We never found it, append to the end */ //Log.d("DEBUGTrafikanten", "Appending data at end of list" + size); items.add(size, new PlatformRenderer(data.departurePlatform)); items.add(size + 1, new RealtimeRenderer(data)); } /* * Add devi data to the tree. */ public boolean addData(DeviData deviData) { /* * Add devi to tree, ignore station devi, that's handled elsewhere. */ boolean addedData = false; for(GenericRealtimeRenderer renderer : items) { switch(renderer.renderType) { case RENDERER_REALTIME: final RealtimeRenderer realtimeRenderer = (RealtimeRenderer) renderer; final RealtimeData realtimeData = realtimeRenderer.data; if (deviData.lines.contains(realtimeData.lineId)) { realtimeData.devi.add(deviData); } addedData = true; break; case RENDERER_STATION: final StationRenderer stationRenderer = (StationRenderer) renderer; final StationData station = stationRenderer.station; if (deviData.stops.contains(station.stationId)) { station.devi.add(deviData); } addedData = true; break; } } return addedData; } /** * Parcel code */ @Override public int describeContents() { return 0; } public GenericRealtimeList(Parcel in) { groupBy = in.readInt(); int size = in.readInt(); items = new ArrayList<GenericRealtimeRenderer>(); while (size > 0) { size--; final int renderType = in.readInt(); switch(renderType) { case GenericRealtimeList.RENDERER_REALTIME: items.add(new RealtimeRenderer(in)); break; case GenericRealtimeList.RENDERER_PLATFORM: items.add(new PlatformRenderer(in)); break; case GenericRealtimeList.RENDERER_STATION: items.add(new StationRenderer(in)); break; default: Log.e(TAG,"Error, unmatched renderType when unpacking realtime list"); } } } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(groupBy); dest.writeInt(items.size()); for(GenericRealtimeRenderer item : items) { dest.writeInt(item.renderType); item.writeToParcel(dest, 0); /*switch(item.renderType) { case GenericRealtimeListAdapter.RENDERER_REALTIME: final RealtimeRenderer realtimeRenderer = (RealtimeRenderer) item; dest.writeParcelable(realtimeRenderer, 0); break; case GenericRealtimeListAdapter.RENDERER_PLATFORM: final PlatformRenderer platformRenderer = (PlatformRenderer) item; dest.writeParcelable(platformRenderer, 0); break; }*/ } } /* * Used for bundle.getParcel */ public static final Parcelable.Creator<GenericRealtimeList> CREATOR = new Parcelable.Creator<GenericRealtimeList>() { public GenericRealtimeList createFromParcel(Parcel in) { return new GenericRealtimeList(in); } public GenericRealtimeList[] newArray(int size) { return new GenericRealtimeList[size]; } }; }