package com.njtransit.ui.adapter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import com.njtransit.domain.IService; import com.njtransit.domain.Stop; import com.njtransit.domain.TrainStatus; import com.njtransit.rail.R; public class StopAdapter extends ArrayAdapter<Stop> { static DateFormat f = new SimpleDateFormat("hh:mm aa"); static DateFormat dateFormat = new SimpleDateFormat("MM/dd/yy"); private Map<Integer,IService> services; private Map<Stop, TrainStatus> statuses = new HashMap<Stop,TrainStatus>(); private Calendar departDate; private Calendar today; public StopAdapter(Context context, Calendar departDate, Map<Integer,IService> services, List<Stop> objects) { super(context, 1, objects); this.services = services; this.departDate = departDate; today = Calendar.getInstance(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View str = null; str = getOrInflateRow(convertView); str.setId(position); TextView time = (TextView) str.findViewById(R.id.time); TextView duration = (TextView) str.findViewById(R.id.duration); TextView minutesAway = (TextView) str.findViewById(R.id.away); TextView timeDesc = (TextView) str.findViewById(R.id.time_descriptor); Stop stop = getItem(position); time.setText(format(stop)); duration.setText(duration(stop)); int awayTimeInMinutes = awayTimeInMinutes(stop); Calendar _departDate = Calendar.getInstance(); _departDate.setTimeInMillis(departDate.getTimeInMillis()); int hourOfDay = _departDate.get(Calendar.HOUR_OF_DAY); int scheduleDepartDay = _departDate.get(Calendar.DAY_OF_YEAR); int scheduleDepartYear = _departDate.get(Calendar.YEAR); Calendar nextDay = Calendar.getInstance(); nextDay.setTimeInMillis(_departDate.getTimeInMillis()); nextDay.add(Calendar.DAY_OF_YEAR, 1); Calendar depart = stop.getDepart(); int departYear = depart.get(Calendar.YEAR); int departDay = depart.get(Calendar.DAY_OF_YEAR); int nextDayYear = nextDay.get(Calendar.YEAR); int nextDayDay = nextDay.get(Calendar.DAY_OF_YEAR); int todayDayDay = today.get(Calendar.DAY_OF_YEAR); int todayDayYear = today.get(Calendar.YEAR); TrainStatus status = statuses.get(stop); boolean hasTrackOrStatus = false; if(status!=null) { String txt = status.getStatus() ==null ? "" : status.getStatus(); if(status.getTrack()!=null && status.getTrack().trim().length()>0) { txt.trim(); txt+=" on track"; txt+=" "; txt+=(status.getTrack().trim()); } if(txt.length()!=0) { hasTrackOrStatus=true; timeDesc.setVisibility(View.VISIBLE); timeDesc.setText(txt); } } if(scheduleDepartDay!=todayDayDay || scheduleDepartYear!=todayDayYear) { if(!hasTrackOrStatus) { timeDesc.setText(dateFormat.format(depart.getTime())); } timeDesc.setVisibility(View.VISIBLE); minutesAway.setVisibility(View.GONE); } else { if(departYear==nextDayYear && departDay == nextDayDay) { if(!hasTrackOrStatus) { timeDesc.setText("next day"); timeDesc.setVisibility(View.VISIBLE); } minutesAway.setVisibility(View.GONE); } else { timeDesc.setVisibility(View.GONE); } if(awayTimeInMinutes>=0 && (awayTimeInMinutes<=100 || ((hourOfDay<4 || hourOfDay>18) && awayTimeInMinutes<=200))) { minutesAway.setVisibility(View.VISIBLE); minutesAway.setText(String.format("departs in %s minutes",awayTimeInMinutes)); } else { if(awayTimeInMinutes<-2) { if(status!=null && status.getStatus()!=null) { if(status.getStatus().toLowerCase().contains("DELAYED")) { try { String[] d = status.getStatus().split(" "); int mins = Integer.parseInt(d[1]); if(-mins<awayTimeInMinutes) { timeDesc.setVisibility(View.VISIBLE); } else { timeDesc.setVisibility(View.GONE); } } catch (Exception e) { timeDesc.setVisibility(View.GONE); } } else { timeDesc.setVisibility(View.GONE); } } } minutesAway.setVisibility(View.GONE); } } return str; } public static int awayTimeInMinutes(Stop stop) { long diff = stop.getDepart().getTimeInMillis() - System.currentTimeMillis(); int mins = (int) diff / 60000; return mins; } public String duration(Stop stop) { final long diff = stop.getArrive().getTimeInMillis() - stop.getDepart().getTimeInMillis(); long mins = diff / 60000; Long departureInSeconds = System.currentTimeMillis() - (stop.getDepart().getTimeInMillis() / 1000) / 60; if (departureInSeconds < 0 || departureInSeconds > 60) { departureInSeconds = null; } return String.format("%s minutes", mins); } private View getOrInflateRow(View current) { return (View) (current == null ? ((LayoutInflater) getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate( R.layout.stop_time_row, null) : current); } private String format(Stop stop) { DateFormat f = new SimpleDateFormat("hh:mm aa"); String depart = f.format(stop.getDepart().getTime()); String arrive = f.format(stop.getArrive().getTime()); return String.format("%s - %s", depart, arrive) .toLowerCase(); } public Map<Stop, TrainStatus> getStatuses() { return statuses; } }