package org.azavea.otm.adapters;
import android.content.Context;
import android.location.Location;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.azavea.otm.data.InstanceInfo;
import org.azavea.otm.R;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
public class InstanceInfoArrayAdapter extends LinkedHashMapAdapter<InstanceInfo> {
private final Location userLocation;
private final LayoutInflater inflator;
public InstanceInfoArrayAdapter(LinkedHashMap<CharSequence, List<InstanceInfo>> instances,
Context context, Location userLocation) {
super(context, instances);
this.inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.userLocation = userLocation;
}
@Override
public View getSeparatorView(int position, View convertView, ViewGroup parent) {
CharSequence key = getItem(position).key;
return createViewFromResource(convertView, parent, R.layout.instance_switcher_separator_row, R.id.text, key);
}
@Override
public View getElementView(int position, View convertView, ViewGroup parent) {
InstanceInfo element = this.getItem(position).value;
InstanceHolder holder;
if (convertView == null) {
convertView = inflator.inflate(R.layout.instance_switcher_element_row, parent, false);
holder = new InstanceHolder();
holder.textView = (TextView) convertView.findViewById(R.id.text);
holder.subtextView = (TextView) convertView.findViewById(R.id.subtext);
convertView.setTag(holder);
} else {
holder = (InstanceHolder) convertView.getTag();
}
// gather data from instanceInfo in scope to use in subviews
Location instanceLocation = new Location("");
instanceLocation.setLatitude(element.getLat());
instanceLocation.setLongitude(element.getLon());
String distance = userLocation == null ? "" : distanceToString(userLocation.distanceTo(instanceLocation), true) + " away";
// populate subviews for the instance in scope
holder.textView.setText(element.getName());
holder.subtextView.setText(distance);
return convertView;
}
private static class InstanceHolder {
TextView textView;
TextView subtextView;
}
// TODO: backport/refactor to helper lib
private static String distanceToString(float distance) {
return distanceToString(distance, false);
}
// TODO: backport/refactor to helper lib
private static String distanceToString(float distance, boolean convertFeetToMiles) {
String unit = "m";
String text;
Locale locale;
if (distance < 0) {
// caused by an exception
text = "Distance unknown";
} else {
locale = Locale.getDefault();
if (locale != null && locale.equals(Locale.US)) {
distance = (float) (distance * 3.38084);
if (convertFeetToMiles) {
distance = distance / 5280;
unit = "mi";
} else {
unit = "ft";
}
}
text = Math.round(distance) + unit;
}
return text;
}
}