package co.createch.MetroRappid.ui;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
import co.createch.MetroRappid.MetroRapidApp;
import co.createch.MetroRappid.data.RouteRepository;
import co.createch.MetroRappid.data.StopRepository;
import co.createch.MetroRappid.model.CapStopCollection;
import co.createch.MetroRappid.model.RealtimeInfoResponseEnvelope;
import co.createch.MetroRappid.model.RouteDirection;
import co.createch.MetroRappid.model.RoutePath;
import co.createch.MetroRappid.model.StopService;
import co.createch.MetroRappid.model.TripInfoCollection;
import co.createch.MetroRappid.service.MetroRapidService;
import co.createch.MetroRappidAndroid.R;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.Style;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class RouteViewActivity extends BaseLocationActivity implements RouteMapFragment.OnStopClickListener, ActionBar.OnNavigationListener {
public final static String TAG = RouteViewActivity.class.getName();
public static final String ARG_ROUTE_ID = "ROUTE_ID";
private String[] mRouteValues;
private Activity activity = this;
private String mRouteId;
private RouteDirection mRouteDirection;
private RouteMapFragment mMapFragment;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.activity_route_view);
Bundle extras = getIntent().getExtras();
getActionBar().setDisplayShowTitleEnabled(false);
if (extras != null) {
mRouteId = extras.getString(ARG_ROUTE_ID);
}
mRouteId = "801";
mRouteDirection = RouteDirection.North;
setupActionBar();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupActionBar() {
mRouteValues = getResources().getStringArray(R.array.routes_array);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
mRouteValues);
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getActionBar().setListNavigationCallbacks(adapter, this);
}
private void loadRoute() {
final RouteRepository pathRepo = MetroRapidApp.from(this).getRouteRepository();
final StopRepository stopRepo = MetroRapidApp.from(this).getStopRepository();
final RoutePath path = pathRepo.getShapesForRoute(mRouteId, mRouteDirection);
final CapStopCollection stops = stopRepo.getStopsForRoute(mRouteId, mRouteDirection);
mMapFragment.loadRouteData(path, stops);
}
private void loadRealtimeInfo(String stopId) {
MetroRapidService service = MetroRapidApp.from(this).getCapMetroService();
setProgressBarIndeterminateVisibility(true);
service.getRealtimeInfo(mRouteId, stopId, "xml", "X", "NB", new Callback<RealtimeInfoResponseEnvelope>() {
@Override
public void success(RealtimeInfoResponseEnvelope responseEnvelope, Response response) {
if (responseEnvelope != null &&
responseEnvelope.body != null &&
responseEnvelope.body.response != null)
{
ArrayList<StopService> services = responseEnvelope.body.response.stop.services;
StopService stopService = services.get(0);
for (StopService s : services) {
if (s.getRouteDirection() == mRouteDirection) {
stopService = s;
break;
}
}
TripInfoCollection trips = stopService.getTripInfoCollection();
if(trips == null || trips.size() < 1)
{
Crouton.makeText(activity,"No vehicles currently available", Style.ALERT).show();
}
mMapFragment.loadTrips(trips);
}
setProgressBarIndeterminateVisibility(false);
}
@Override
public void failure(RetrofitError error) {
Log.e(TAG,error.getMessage());
if(error.getCause().getMessage().contains("Fault")) {
Crouton.makeText(activity, String.format("Unable to get vehicles for this location."), Style.ALERT).show();
}else {
Crouton.makeText(activity, String.format("Error: %s", error.getMessage()), Style.ALERT).show();
}
setProgressBarIndeterminateVisibility(false);
}
});
// service.getBusLocations(mRouteId, mRouteDirection.getDirectionString(), new Callback<BusLocationResponseEnvelope>() {
// @Override
// public void success(BusLocationResponseEnvelope responseEnvelope, Response response) {
// if (responseEnvelope != null &&
// responseEnvelope.body != null &&
// responseEnvelope.body.response != null)
// {
// CapVehicleCollection vehicles = responseEnvelope.body.response.vehicles;
// if(vehicles== null || vehicles.size() < 1)
// {
// Crouton.makeText(activity,"No vehicles currently available", Style.ALERT).show();
// }
//// mMapFragment.loadTrips(trips);
// }
// setProgressBarIndeterminateVisibility(false);
// }
//
// @Override
// public void failure(RetrofitError error) {
// Crouton.makeText(activity, String.format("Error: %s", error.getMessage()), Style.ALERT).show();
// setProgressBarIndeterminateVisibility(false);
// }
// });
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onResumeFragments() {
super.onResumeFragments();
mMapFragment = (RouteMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapFragment);
mMapFragment.setOnStopClickListener(this);
loadRoute();
}
@Override
public void onConnected(Bundle dataBundle) {
mMapFragment.setLocation(mLocationClient.getLastLocation());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.route_view, menu);
MenuItem direction = menu.findItem(R.id.action_direction);
direction.setTitle(mRouteDirection == RouteDirection.North ? "North" : "South");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_direction) {
mRouteDirection = mRouteDirection == RouteDirection.North ? RouteDirection.South : RouteDirection.North;
invalidateOptionsMenu();
loadRoute();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onStopClicked(String stopId) {
loadRealtimeInfo(stopId);
mMapFragment.selectStop(stopId);
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
switch (itemPosition) {
case 0:
mRouteId = "801";
break;
default:
mRouteId = "550";
break;
}
mMapFragment.selectStop("");
loadRoute();
return true;
}
}