package net.naonedbus.widget.adapter.impl;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import net.naonedbus.R;
import net.naonedbus.utils.FormatUtils;
import net.naonedbus.widget.adapter.impl.AddressArrayAdapter.AddressWrapper;
import android.content.Context;
import android.content.res.ColorStateList;
import android.location.Address;
import android.location.Geocoder;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;
public class AddressArrayAdapter extends ArrayAdapter<AddressWrapper> {
private final static double LOWER_LEFT_LATITUDE = 47.081d;
private final static double LOWER_LEFT_LONGITUDE = -1.843d;
private final static double UPPER_RIGHT_LATITUDE = 47.346d;
private final static double UPPER_RIGHT_LONGITUDE = -1.214d;
private final StringBuilder mSb = new StringBuilder();
private final Geocoder mGeocoder;
private final AddressWrapper mCurrenPositionWrapper;
private final ColorStateList mHoloBlueColor;
private final ColorStateList mTextColorColor;
private final int mPadding;
public AddressArrayAdapter(final Context context) {
super(context, android.R.layout.simple_dropdown_item_1line);
mGeocoder = new Geocoder(context);
mCurrenPositionWrapper = AddressWrapper.createLocateMe(context.getString(R.string.itineraire_current_location));
mHoloBlueColor = context.getResources().getColorStateList(R.color.card_selectable_text);
mTextColorColor = context.getResources().getColorStateList(android.R.color.primary_text_light);
mPadding = context.getResources().getDimensionPixelSize(R.dimen.padding_small);
add(mCurrenPositionWrapper);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final TextView view = (TextView) super.getView(position, convertView, parent);
final AddressWrapper item = getItem(position);
view.setText(item.getTitle());
if (item.isLocateMe()) {
view.setTextColor(mHoloBlueColor);
view.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_action_locate_selector, 0, 0, 0);
view.setCompoundDrawablePadding(mPadding);
} else {
view.setTextColor(mTextColorColor);
view.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}
return view;
}
@Override
public Filter getFilter() {
final Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(final CharSequence constraint) {
List<Address> addressList = null;
if (constraint != null) {
try {
addressList = mGeocoder.getFromLocationName(constraint.toString(), 5, LOWER_LEFT_LATITUDE,
LOWER_LEFT_LONGITUDE, UPPER_RIGHT_LATITUDE, UPPER_RIGHT_LONGITUDE);
} catch (final IOException e) {
}
}
if (addressList == null) {
addressList = new ArrayList<Address>();
}
final FilterResults filterResults = new FilterResults();
filterResults.values = addressList;
filterResults.count = addressList.size();
return filterResults;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(final CharSequence contraint, final FilterResults results) {
clear();
add(mCurrenPositionWrapper);
for (final Address address : (List<Address>) results.values) {
add(AddressWrapper.createAddressWrapper(address, FormatUtils.formatAddress(address, mSb)));
}
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
@Override
public CharSequence convertResultToString(final Object resultValue) {
return resultValue == null ? "" : ((AddressWrapper) resultValue).title;
}
};
return myFilter;
}
public static class AddressWrapper {
private boolean locateMe;
private String title;
private Address address;
private AddressWrapper() {
}
public static AddressWrapper createAddressWrapper(final Address address, final String title) {
final AddressWrapper wrapper = new AddressWrapper();
wrapper.title = title;
wrapper.address = address;
wrapper.locateMe = false;
return wrapper;
}
public static AddressWrapper createLocateMe(final String title) {
final AddressWrapper wrapper = new AddressWrapper();
wrapper.title = title;
wrapper.locateMe = true;
return wrapper;
}
public boolean isLocateMe() {
return locateMe;
}
public String getTitle() {
return title;
}
public Address getAddress() {
return address;
}
}
}