/*******************************************************************************
* 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.List;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Bitmap;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
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.CheckBox;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import fr.gotorennes.domain.Arret;
import fr.gotorennes.domain.Circuit;
import fr.gotorennes.domain.Ligne;
import fr.gotorennes.domain.LineAlert;
import fr.gotorennes.domain.NextDeparture;
import fr.gotorennes.domain.Station;
import fr.gotorennes.remote.NextDepartureService;
import fr.gotorennes.util.BackgroundTask;
import fr.gotorennes.util.LocationUtils;
public class BusArretActivity extends AbstractActivity {
private Station station;
private Ligne ligne;
private List<LineAlert> alertes;
private TimerTask timerTask = null;
private Timer timer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.busarret);
}
@Override
protected String getTrackingName() {
return "arretBus";
}
@Override
protected void init(Intent intent) {
station = intent.getParcelableExtra("station");
latitude = station.latitude;
longitude = station.longitude;
ligne = intent.getParcelableExtra("ligne");
scheduleTimer();
addCalendrier(intent);
TextView stationName = (TextView) findViewById(R.id.stationName);
stationName.setText(Html.fromHtml("<u>" + station.nom + "</u>"));
stationName.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), BusStationActivity.class);
intent.putExtra("station", station);
startActivity(intent);
}
});
CheckBox favoris = (CheckBox) findViewById(R.id.favoris);
SharedPreferences prefs = getSharedPreferences("fr.gotorennes.Application", 0);
favoris.setChecked(prefs.contains("arretbus-" + station.code + ";" + ligne.code));
ImageView lineIcon = (ImageView) findViewById(R.id.icon);
Bitmap icon = goToRennes.getBusStationService().getBitmapIcon(BusArretActivity.this, ligne.id);
lineIcon.setImageBitmap(icon);
TextView name = (TextView) findViewById(R.id.directionName);
name.setVisibility(View.GONE);
ListView g = (ListView) findViewById(R.id.passages);
g.setAdapter(getStopTimeAdapter(goToRennes.getBusDao().getPassagesDuJour(station.id, ligne.id, calendrier, ligne.isLigneDeNuit(), true), true));
g.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
Arret arret = (Arret) adapter.getItemAtPosition(position);
Intent intent = new Intent(getApplicationContext(), BusTripActivity.class);
intent.putExtra("ligne", ligne);
intent.putExtra("station", station);
intent.putExtra("arret", arret);
startActivity(intent);
}
});
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(), station.latitude, station.longitude)
+ "</u>"));
distance.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), ItineraireMapActivity.class);
intent.putExtra("latitude", location.getLatitude());
intent.putExtra("longitude", location.getLongitude());
intent.putExtra("latitudeDest", station.latitude);
intent.putExtra("longitudeDest", station.longitude);
intent.putExtra("iconDest", getMapIcon());
startActivity(intent);
}
});
}
else {
distance.setText("--");
distance.setOnClickListener(null);
distance.setClickable(false);
}
View alertesText = findViewById(R.id.alerte);
alertesText.setVisibility(View.GONE);
BackgroundTask<?> backgroundTask = getLineAlertBackgroundTask(ligne);
backgroundTask.start(this);
}
@Override
protected void onPause() {
super.onPause();
timer.cancel();
}
@Override
protected void onResume() {
super.onResume();
if (station != null && ligne != null) {
scheduleTimer();
}
}
protected ListAdapter getStopTimeAdapter(List<Arret> stopTimes, final boolean showMinutes) {
return new ArrayAdapter<Arret>(this, 0, stopTimes) {
@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.bustrip_stop, null);
}
Arret arret = getItem(position);
Circuit circuit = goToRennes.getBusDao().getCircuitByIdTrajet(arret.idTrajet);
TextView name = (TextView) view.findViewById(R.id.stopname);
name.setText(circuit.nom);
TextView nextStop = (TextView) view.findViewById(R.id.stoptime);
nextStop.setText(arret.getDepart());
return view;
}
};
}
@Override
protected int getMapIcon() {
return R.drawable.bus;
}
protected BackgroundTask<List<LineAlert>> getLineAlertBackgroundTask(final Ligne ligne) {
return new BackgroundTask<List<LineAlert>>(false) {
@Override
protected List<LineAlert> execute() {
return goToRennes.getLineAlertService().getAlerts(ligne.longCode);
}
@Override
protected void callback(List<LineAlert> result) {
if (result != null && !result.isEmpty()) {
View alertesText = findViewById(R.id.alerte);
alertesText.setVisibility(View.VISIBLE);
alertes = result;
}
}
};
}
public void updateFavoris(View view) {
CheckBox checkbox = (CheckBox) view;
SharedPreferences prefs = getSharedPreferences("fr.gotorennes.Application", 0);
Editor editor = prefs.edit();
if (checkbox.isChecked()) {
editor.putString("arretbus-" + station.code + ";" + ligne.code, station.nom );
Toast.makeText(getApplicationContext(), getString(R.string.busAjoutFavoris), Toast.LENGTH_SHORT).show();
} else {
editor.remove("arretbus-" + station.code + ";" + ligne.code);
Toast.makeText(getApplicationContext(), getString(R.string.busSupprimeFavoris), Toast.LENGTH_SHORT).show();
}
editor.commit();
}
public void showAlerte(View view) {
StringBuffer buffer = new StringBuffer();
for (LineAlert alert : alertes) {
buffer.append(Html.fromHtml(alert.detail.replaceAll("\\r\\n", "<br/>")));
}
showError(buffer.toString());
}
@Override
protected void onCalendrierChanged() {
ListView g = (ListView) findViewById(R.id.passages);
g.setAdapter(getStopTimeAdapter(goToRennes.getBusDao().getPassagesDuJour(station.id, ligne.id, calendrier, ligne.isLigneDeNuit(), true), true));
}
protected void scheduleTimer() {
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
AsyncTask<String, Void, NextDeparture> task = new AsyncTask<String, Void, NextDeparture>() {
@Override
protected NextDeparture doInBackground(String... params) {
Circuit circuit = goToRennes.getBusDao().getCircuit(ligne, station);
if (circuit == null) {
Log.d("GoToRennes", "Pas de circuit pour " + ligne.id + " " + station.id);
return null;
}
return NextDepartureService.getInstance(getBaseContext()).getNextDeparture(station.code, ligne.longCode, circuit.sens);
}
@Override
protected void onPostExecute(NextDeparture result) {
TextView nextDeparture = (TextView) findViewById(R.id.nextDeparture);
if (result != null && result.departure != null) {
int minutes = result.getMinutesBeforeDeparture();
if (minutes == 0) {
nextDeparture.setText("< 1 min");
}
else {
nextDeparture.setText(minutes + " min");
}
}
else {
nextDeparture.setText("??? min");
}
}
};
task.execute();
}
};
timer.scheduleAtFixedRate(timerTask, 0, 30000);
}
public void helpRealtime(View view) {
Toast.makeText(this, getString(R.string.realtime), Toast.LENGTH_LONG).show();
}
}