/*******************************************************************************
* Copyright (c) 2011 Michel DAVID mimah35-at-gmail.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package fr.gotorennes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.location.Location;
import android.os.Bundle;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import fr.gotorennes.domain.Arret;
import fr.gotorennes.domain.Circuit;
import fr.gotorennes.domain.Ligne;
import fr.gotorennes.domain.Station;
import fr.gotorennes.domain.StationGroup;
import fr.gotorennes.util.BackgroundTask;
import fr.gotorennes.util.LocationUtils;
public class BusStationActivity extends AbstractActivity {
private StationGroup busStation;
private List<Passage> passages;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.busstation);
}
@Override
protected String getTrackingName() {
return "stationBus";
}
@Override
protected void init(Intent intent) {
busStation = intent.getParcelableExtra("stationGroup");
Station station = intent.getParcelableExtra("station");
if(station != null) {
busStation = goToRennes.getBusDao().getStationGroup(station);
}
addCalendrier(intent);
latitude = busStation.latitude;
longitude = busStation.longitude;
TextView stationName = (TextView) findViewById(R.id.stationName);
stationName.setText(busStation.nom);
BackgroundTask<List<Passage>> backgroundTask = new BackgroundTask<List<Passage>>(true) {
@Override
protected List<Passage> execute() {
passages = new ArrayList<Passage>();
List<Station> stations = goToRennes.getBusDao().getStations(busStation);
for(Station station : stations) {
for(Ligne ligne : goToRennes.getBusDao().getLignes(station)) {
Passage passage = new Passage();
passage.station = station;
passage.ligne = ligne;
passage.arret = goToRennes.getBusDao().getPassage(station.id, ligne.id, calendrier, ligne.isLigneDeNuit());
if(passage.arret != null) {
passage.circuit = goToRennes.getBusDao().getCircuitByIdTrajet(passage.arret.idTrajet);
}
else {
passage.circuit = goToRennes.getBusDao().getCircuit(passage.ligne, passage.station);
}
passages.add(passage);
}
}
Collections.sort(passages);
return passages;
}
@Override
protected void callback(List<Passage> result) {
populateListView();
}
};
backgroundTask.start(this);
TextView distance = (TextView) findViewById(R.id.distance);
final Location location = LocationUtils.getLocation(this);
if(location != null) {
distance.setText(Html.fromHtml("<u>" + AbstractMapActivity.getFormattedDistance(location.getLatitude(), location.getLongitude(), busStation.latitude, busStation.longitude) + "</u>"));
distance.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(BusStationActivity.this, ItineraireMapActivity.class);
intent.putExtra("latitude", location.getLatitude());
intent.putExtra("longitude", location.getLongitude());
intent.putExtra("latitudeDest", busStation.latitude);
intent.putExtra("longitudeDest", busStation.longitude);
intent.putExtra("iconDest", getMapIcon());
startActivity(intent);
}
});
}
else {
distance.setText("--");
distance.setOnClickListener(null);
distance.setClickable(false);
}
}
protected void populateListView() {
ListView listView = (ListView) findViewById(R.id.passages);
listView.setAdapter(getPassageAdapter(passages));
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
Passage passage = (Passage) adapter.getItemAtPosition(position);
Intent intent = new Intent(BusStationActivity.this, BusArretActivity.class);
intent.putExtra("station", passage.station);
intent.putExtra("ligne", passage.ligne);
intent.putExtra("date", calendrier.getTimeInMillis());
startActivity(intent);
}
});
}
protected void updatePassages() {
for(Passage passage : passages) {
passage.arret = goToRennes.getBusDao().getPassage(passage.station.id, passage.ligne.id, calendrier, passage.ligne.isLigneDeNuit() );
if(passage.arret != null) {
passage.circuit = goToRennes.getBusDao().getCircuitByIdTrajet(passage.arret.idTrajet);
}
else {
passage.circuit = goToRennes.getBusDao().getCircuit(passage.ligne, passage.station);
}
}
ListView listView = (ListView) findViewById(R.id.passages);
listView.setAdapter(getPassageAdapter(passages));
}
protected ListAdapter getPassageAdapter(List<Passage> passages) {
return new ArrayAdapter<Passage>(this, 0, passages) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(R.layout.busstop_detail_listitem, null);
}
Passage passage = getItem(position);
Ligne ligne = passage.ligne;
Arret arret = passage.arret;
Circuit circuit = passage.circuit;
ImageView lineIcon = (ImageView) view.findViewById(R.id.icon);
Bitmap icon = goToRennes.getBusStationService().getBitmapIcon(BusStationActivity.this, ligne.id);
lineIcon.setImageBitmap(icon);
TextView name = (TextView) view.findViewById(R.id.name);
name.setText(circuit.nom);
TextView nextStop = (TextView) view.findViewById(R.id.nextStopTime);
if(arret != null) {
nextStop.setText(arret.getDepart());
}
else {
nextStop.setText("--");
}
TextView nextStopMinutes = (TextView) view.findViewById(R.id.nextStopTimeInMinutes);
nextStopMinutes.setVisibility(View.GONE);
return view;
}
};
}
class Passage implements Comparable<Passage> {
Station station;
Ligne ligne;
Circuit circuit;
Arret arret;
@Override
public int compareTo(Passage another) {
return ligne.compareTo(another.ligne);
}
}
@Override
protected void onCalendrierChanged() {
updatePassages();
}
@Override
protected int getMapIcon() {
return R.drawable.bus;
}
}