/*******************************************************************************
* 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.List;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import fr.gotorennes.domain.Circuit;
import fr.gotorennes.domain.Equipement;
import fr.gotorennes.domain.MetroStation;
import fr.gotorennes.domain.NextDeparture;
import fr.gotorennes.domain.NextMetroDeparture;
import fr.gotorennes.remote.NextDepartureService;
import fr.gotorennes.remote.NextMetroDepartureService;
import fr.gotorennes.util.BackgroundTask;
import fr.gotorennes.util.LocationUtils;
public class MetroStationActivity extends AbstractActivity {
private MetroStation metroStation;
private TimerTask timerTask = null;
private Timer timer = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.metrostation);
}
@Override
protected String getTrackingName() {
return "stationMetro";
}
@Override
protected void init(Intent intent) {
metroStation = intent.getParcelableExtra("metroStation");
latitude = metroStation.latitude;
longitude = metroStation.longitude;
scheduleTimer();
TextView stationName = (TextView) findViewById(R.id.stationName);
stationName.setText(metroStation.name);
TextView statut = (TextView) findViewById(R.id.statut);
statut.setText(metroStation.status);
if ("JFK".equals(metroStation.id)) {
findViewById(R.id.nextDeparture1Layout).setVisibility(View.GONE);
}
if ("POT".equals(metroStation.id)) {
findViewById(R.id.nextDeparture2Layout).setVisibility(View.GONE);
}
CheckBox favoris = (CheckBox) findViewById(R.id.favoris);
SharedPreferences prefs = getSharedPreferences("fr.gotorennes.Application", 0);
favoris.setChecked(prefs.contains("metro-" + metroStation.id));
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(), metroStation.latitude, metroStation.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", metroStation.latitude);
intent.putExtra("longitudeDest", metroStation.longitude);
intent.putExtra("iconDest", getMapIcon());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});
}
else {
distance.setText("--");
distance.setOnClickListener(null);
distance.setClickable(false);
}
BackgroundTask<?> task = getEquipementsBackgroundTask();
task.start(MetroStationActivity.this);
}
@Override
protected void onPause() {
super.onPause();
timer.cancel();
}
@Override
protected void onResume() {
super.onResume();
if (metroStation != null) {
scheduleTimer();
}
}
@Override
protected int getMapIcon() {
return R.drawable.metro;
}
protected BackgroundTask<List<Equipement>> getEquipementsBackgroundTask() {
return new BackgroundTask<List<Equipement>>(false) {
@Override
protected List<Equipement> execute() {
List<Equipement> equipements = goToRennes.getEquipementService().getEquipements(metroStation);
List<Equipement> equipementsDefectueux = new ArrayList<Equipement>();
if(equipements != null) {
for(Equipement equipement : equipements) {
if(!goToRennes.getEquipementStatusService().getEquipementStatus(equipement)) {
equipementsDefectueux.add(equipement);
}
}
}
return equipementsDefectueux;
}
@Override
protected void callback(List<Equipement> result) {
View equipementsText = findViewById(R.id.equipementsText);
LinearLayout equipements = (LinearLayout) findViewById(R.id.equipements);
equipements.removeAllViews();
if (result != null && !result.isEmpty()) {
equipementsText.setVisibility(View.VISIBLE);
equipements.setVisibility(View.VISIBLE);
for (Equipement equipement : result) {
RelativeLayout view = (RelativeLayout) getLayoutInflater().inflate(R.layout.equipement_listitem, null);
ImageView lineIcon = (ImageView) view.findViewById(R.id.icon);
switch (equipement.type) {
case ASCENSEUR:
lineIcon.setImageResource(R.drawable.ascenseur);
break;
case ESCALATOR:
lineIcon.setImageResource(R.drawable.escalator);
break;
case DISTRIBUTEUR:
lineIcon.setImageResource(R.drawable.distributeur);
}
TextView text = (TextView) view.findViewById(R.id.name);
text.setText(equipement.name);
equipements.addView(view);
}
}
else {
equipementsText.setVisibility(View.GONE);
equipements.setVisibility(View.GONE);
}
}
};
}
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("metro-" + metroStation.id, metroStation.name);
Toast.makeText(getApplicationContext(), getString(R.string.metroAjoutFavoris), Toast.LENGTH_SHORT).show();
} else {
editor.remove("metro-" + metroStation.id);
Toast.makeText(getApplicationContext(), getString(R.string.metroSupprimeFavoris), Toast.LENGTH_SHORT).show();
}
editor.commit();
}
protected void scheduleTimer() {
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
AsyncTask<String, Void, List<NextMetroDeparture>> task = new AsyncTask<String, Void, List<NextMetroDeparture>>() {
@Override
protected List<NextMetroDeparture> doInBackground(String... params) {
return NextMetroDepartureService.getInstance(getBaseContext()).getNextDeparture(metroStation.name);
}
@Override
protected void onPostExecute(List<NextMetroDeparture> result) {
boolean sens0Done = false;
boolean sens1Done = false;
for (NextMetroDeparture nextDeparture : result) {
//Log.d("GoToRennes", nextDeparture.getMinutesBeforeDeparture() + " " + nextDeparture.direction + " " + nextDeparture.name);
TextView nextDeparture1 = (TextView) findViewById(R.id.nextDeparture1);
if (nextDeparture.direction == 1 && !sens1Done) {
int minutes = nextDeparture.getMinutesBeforeDeparture();
if (minutes == 0) {
nextDeparture1.setText("< 1 min");
} else if (minutes > 0) {
nextDeparture1.setText(minutes + " min");
} else {
nextDeparture1.setText("??? min");
}
sens1Done = true;
}
TextView nextDeparture2 = (TextView) findViewById(R.id.nextDeparture2);
if (nextDeparture.direction == 0 && !sens0Done) {
int minutes = nextDeparture.getMinutesBeforeDeparture();
if (minutes == 0) {
nextDeparture2.setText("< 1 min");
} else if (minutes > 0) {
nextDeparture2.setText(minutes + " min");
} else {
nextDeparture2.setText("??? min");
}
sens0Done = true;
}
}
}
};
task.execute();
}
};
timer.scheduleAtFixedRate(timerTask, 0, 30000);
}
public void helpRealtime(View view) {
Toast.makeText(this, getString(R.string.realtime), Toast.LENGTH_LONG).show();
}
}