package com.lemoulinstudio.bikefriend;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.lemoulinstudio.bikefriend.db.BikeStation;
import com.lemoulinstudio.bikefriend.db.DataSourceEnum;
import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import org.androidannotations.annotations.res.StringRes;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@EBean
public class FavoriteStationsAdapter extends BaseAdapter {
@Bean
protected BikeStationProviderRepository bikeStationProviderRepository;
protected LayoutInflater inflater;
@RootContext
protected Context context;
@StringRes(R.string.map_popup_station_data_age_sec_format)
protected String dataAgeSecondFormat;
@StringRes(R.string.map_popup_station_data_age_min_format)
protected String dataAgeMinuteFormat;
@StringRes(R.string.map_popup_station_data_age_hour_format)
protected String dataAgeHourFormat;
@StringRes(R.string.map_popup_station_data_age_day_format)
protected String dataAgeDayFormat;
// end
protected List<Object> items;
protected Set<BikeStationProvider> listedProviders;
protected List<Class> itemClasses;
@AfterInject
protected void setupViews() {
inflater = LayoutInflater.from(context);
items = new ArrayList<Object>();
listedProviders = new HashSet<BikeStationProvider>();
itemClasses = Arrays.<Class>asList(BikeStation.class, BikeStationProvider.class);
selectItemsToList();
}
private void selectItemsToList() {
// Lists all the favorite items and their provider.
items.clear();
listedProviders.clear();
for (BikeStationProvider provider : bikeStationProviderRepository.getBikeStationProviders()) {
boolean providerAlreadyAdded = false;
for (BikeStation station : provider.getBikeStations()) {
if (station.isPreferred) {
if (!providerAlreadyAdded) {
items.add(provider);
listedProviders.add(provider);
providerAlreadyAdded = true;
}
items.add(station);
}
}
}
}
public Collection<BikeStationProvider> getListedBikeStationProviders() {
return listedProviders;
}
public void refreshData() {
// We do not reset our selection of stations to show in the list.
// Instead, we just let the observers know that their value (and their view)
// has changed and that they need to fetch it from this adapter.
notifyDataSetChanged();
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int i) {
return i;
}
public int getViewTypeCount () {
return itemClasses.size();
}
@Override
public int getItemViewType(int position) {
return itemClasses.indexOf(items.get(position).getClass());
}
private static class SectionViewHolder {
public TextView header;
public ImageView dataSourceImageView;
}
private static class ItemViewHolder {
//public ImageView dataSourceImageView;
public TextView chineseNameView;
public TextView englishNameView;
public ImageView favoriteImageView;
public TextView nbBicycleView;
public TextView nbParkingView;
public TextView stationDataAgeView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Fetch data at position
Object obj = getItem(position);
// Create view
if (obj instanceof BikeStation) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.fragment_favorite_station, parent, false);
ItemViewHolder holder = new ItemViewHolder();
holder.chineseNameView = (TextView) convertView.findViewById(R.id.chinese_name);
holder.englishNameView = (TextView) convertView.findViewById(R.id.english_name);
holder.favoriteImageView = (ImageView) convertView.findViewById(R.id.favorite_image_view);
holder.nbBicycleView = (TextView) convertView.findViewById(R.id.nb_bicycle);
holder.nbParkingView = (TextView) convertView.findViewById(R.id.nb_parking);
holder.stationDataAgeView = (TextView) convertView.findViewById(R.id.station_data_age);
convertView.setTag(holder);
}
ItemViewHolder holder = (ItemViewHolder) convertView.getTag();
// Station
final BikeStation station = (BikeStation) obj;
holder.chineseNameView.setVisibility(station.chineseName != null ? View.VISIBLE : View.GONE);
holder.chineseNameView.setText(station.chineseName);
holder.englishNameView.setVisibility(station.englishName != null ? View.VISIBLE : View.GONE);
holder.englishNameView.setText(station.englishName);
holder.favoriteImageView.setImageResource(station.isPreferred ?
R.drawable.ic_action_star_yellow : R.drawable.ic_action_star_grey);
holder.nbBicycleView.setText("" + station.nbBicycles);
holder.nbParkingView.setText("" + station.nbEmptySlots);
String ageString;
long age = new Date().getTime() - station.lastUpdate.getTime();
if (age < 60 * 1000) {
ageString = String.format(dataAgeSecondFormat, age / 1000);
}
else if (age < 60 * 60 * 1000) {
ageString = String.format(dataAgeMinuteFormat, age / (60 * 1000));
}
else if (age < 24 * 60 * 60 * 1000) {
ageString = String.format(dataAgeHourFormat, age / (60 * 60 * 1000));
}
else {
ageString = String.format(dataAgeDayFormat, age / (24 * 60 * 60 * 1000));
}
holder.stationDataAgeView.setText(ageString);
View.OnClickListener favoriteImageViewListener = new View.OnClickListener(){
public void onClick(android.view.View view) {
station.isPreferred = !station.isPreferred;
try {
bikeStationProviderRepository.updateDbFromMem(station);
((ImageView)view).setImageResource(station.isPreferred ?
R.drawable.ic_action_star_yellow : R.drawable.ic_action_star_grey);
} catch (SQLException e) {
Log.e(BikefriendApplication.TAG, "Error when deselecting favorite station" + station, e);
}
}
};
holder.favoriteImageView.setOnClickListener(favoriteImageViewListener);
}
else {
if (convertView == null) {
convertView = inflater.inflate(R.layout.fragment_favorite_station_header, parent, false);
SectionViewHolder holder = new SectionViewHolder();
holder.header = (TextView) convertView.findViewById(R.id.fragment_favorite_station_region_separator);
holder.dataSourceImageView = (ImageView) convertView.findViewById(R.id.data_source_image);
convertView.setTag(holder);
}
SectionViewHolder holder = (SectionViewHolder) convertView.getTag();
// Provider
BikeStationProvider provider = (BikeStationProvider) obj;
DataSourceEnum dataSource = provider.getDataSourceEnum();
holder.header.setText(dataSource.placeNameRes);
holder.dataSourceImageView.setImageResource(dataSource.bikeSystem.mapMarkerResource);
}
return convertView;
}
}