package org.rudirect.android.adapter; import android.content.Context; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import org.rudirect.android.R; import org.rudirect.android.data.constants.RUDirectApplication; import org.rudirect.android.data.model.BusStop; import org.rudirect.android.data.model.BusStopTime; import org.rudirect.android.interfaces.ViewHolderClickListener; import org.rudirect.android.ui.holder.BusTimesViewHolder; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; public class BusTimesAdapter extends RecyclerView.Adapter<BusTimesViewHolder> { private static boolean expToggleRequest; // Whether or not the bus stop should be expanded/retracted private BusStop[] busStops; public BusTimesAdapter(BusStop[] busStops) { this.busStops = busStops; } public BusTimesAdapter() { this.busStops = null; } // Create new views @Override public BusTimesViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_bus_times, parent, false); return new BusTimesViewHolder(v, new ViewHolderClickListener() { public void onClick(View v, int position) { expToggleRequest = true; BusStop stop = busStops[position]; TextView titleTextView = (TextView) v.findViewById(R.id.bus_stop_name); TextView timesTextView = (TextView) v.findViewById(R.id.bus_stop_times); timesTextView.setText(getBusStopTimes(stop, titleTextView, timesTextView)); } }); } // Replace the contents of a view @Override public void onBindViewHolder(BusTimesViewHolder viewHolder, int position) { BusStop stop = busStops[position]; TextView titleTextView = viewHolder.title; TextView timesTextView = viewHolder.times; titleTextView.setText(stop.getTitle()); timesTextView.setText(getBusStopTimes(stop, titleTextView, timesTextView)); } // Return the number of posts @Override public int getItemCount() { if (busStops != null) { return busStops.length; } return 0; } // Return the bus stop times private String getBusStopTimes(BusStop busStop, TextView titleTextView, TextView timesTextView) { ArrayList<BusStopTime> times = busStop.getTimes(); setTextColor(titleTextView, timesTextView, times); if (expToggleRequest && busStop.isActive() && !busStop.isExpanded() || !expToggleRequest && busStop.isExpanded()) { expToggleRequest = false; busStop.setIsExpanded(true); return expandedTimes(times); } else { expToggleRequest = false; busStop.setIsExpanded(false); return normalTimes(times); } } // Sets up the expanded view of the bus stop times private String expandedTimes(ArrayList<BusStopTime> times) { long currentTime = new Date().getTime(); // Build string of times StringBuilder builder = new StringBuilder(); builder.append("Arriving at "); for (int i = 0; i < times.size(); i++) { Date stopTime = new Date(currentTime + (times.get(i).getMinutes() * DateUtils.MINUTE_IN_MILLIS)); String time = DateFormat.getTimeInstance(DateFormat.SHORT).format(stopTime); builder.append(time); if (i != times.size() - 1) { builder.append(", "); } } builder.append("."); return builder.toString(); } // Sets up the normal view of the bus stop times private String normalTimes(ArrayList<BusStopTime> times) { // Bus stop is offline if (times == null) { return "Offline"; } // Format bus stop times StringBuilder builder = new StringBuilder(); builder.append("Arriving in "); for (int i = 0; i < times.size(); i++) { // Append time int minutes = times.get(i).getMinutes(); if (minutes == 0) { builder.append("<1"); } else { builder.append(Integer.toString(minutes)); } // Append comma if (i != times.size() - 1) { builder.append(", "); } } builder.append(" minutes."); return builder.toString(); } // Change text color of the ListView items private void setTextColor(TextView busStopName, TextView busStopTimes, ArrayList<BusStopTime> times) { Context context = RUDirectApplication.getContext(); busStopName.setTextColor(ContextCompat.getColor(context, android.R.color.black)); if (times == null) { busStopName.setTextColor(ContextCompat.getColor(context, R.color.medium_gray)); busStopTimes.setTextColor(ContextCompat.getColor(context, R.color.medium_gray)); } else { int minutes = times.get(0).getMinutes(); if (minutes == 0 || minutes == 1) { busStopTimes.setTextColor(ContextCompat.getColor(context, R.color.primary_color)); } else if (minutes > 1 && minutes <= 5) { busStopTimes.setTextColor(ContextCompat.getColor(context, R.color.orange)); } else { busStopTimes.setTextColor(ContextCompat.getColor(context, R.color.blue)); } } } // Sets expanded toggle request boolean public static void setExpToggleRequest(boolean expToggleRequest) { BusTimesAdapter.expToggleRequest = expToggleRequest; } // Sets the bus stops public void setBusStops(BusStop[] busStops) { this.busStops = busStops; } }